@crowdstrike/glide-core 0.5.2 → 0.6.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/README.md +11 -1
- package/dist/accordion.styles.js +1 -0
- package/dist/button-group.button.js +1 -1
- package/dist/button-group.button.styles.js +2 -1
- package/dist/button.d.ts +3 -2
- package/dist/button.js +1 -1
- package/dist/button.styles.js +1 -1
- package/dist/button.test.basics.js +6 -0
- package/dist/checkbox.js +1 -1
- package/dist/checkbox.styles.js +4 -1
- package/dist/drawer.js +1 -1
- package/dist/drawer.styles.js +1 -5
- package/dist/drawer.test.floating-components.d.ts +1 -0
- package/dist/drawer.test.floating-components.js +51 -0
- package/dist/dropdown.js +1 -1
- package/dist/dropdown.option.js +1 -1
- package/dist/dropdown.option.test.interactions.multiple.js +1 -6
- package/dist/dropdown.styles.js +1 -0
- package/dist/dropdown.test.focus.js +11 -1
- package/dist/dropdown.test.interactions.filterable.js +64 -0
- package/dist/icon-button.d.ts +3 -2
- package/dist/icon-button.js +1 -1
- package/dist/icon-button.styles.js +9 -9
- package/dist/icon-button.test.basics.js +13 -6
- package/dist/input.js +1 -1
- package/dist/input.styles.js +1 -0
- package/dist/label.js +1 -1
- package/dist/label.styles.js +11 -13
- package/dist/library/localize.d.ts +17 -0
- package/dist/library/localize.js +1 -0
- package/dist/library/set-containing-block.d.ts +15 -0
- package/dist/library/set-containing-block.js +1 -0
- package/dist/menu.button.js +1 -1
- package/dist/menu.d.ts +5 -4
- package/dist/menu.js +1 -1
- package/dist/menu.link.js +1 -1
- package/dist/menu.options.d.ts +22 -0
- package/dist/menu.options.js +1 -0
- package/dist/menu.options.styles.d.ts +2 -0
- package/dist/menu.options.styles.js +33 -0
- package/dist/menu.options.test.basics.d.ts +2 -0
- package/dist/menu.options.test.basics.js +43 -0
- package/dist/menu.stories.d.ts +1 -0
- package/dist/menu.styles.js +3 -27
- package/dist/menu.test.basics.d.ts +1 -0
- package/dist/menu.test.basics.js +67 -45
- package/dist/menu.test.focus.js +34 -16
- package/dist/menu.test.interactions.d.ts +1 -0
- package/dist/menu.test.interactions.js +315 -173
- package/dist/modal.js +1 -1
- package/dist/modal.styles.js +1 -4
- package/dist/modal.tertiary-icon.d.ts +1 -0
- package/dist/modal.tertiary-icon.js +1 -1
- package/dist/modal.test.floating-components.d.ts +1 -0
- package/dist/modal.test.floating-components.js +62 -0
- package/dist/radio-group.js +1 -1
- package/dist/radio-group.styles.js +18 -22
- package/dist/radio.styles.js +11 -28
- package/dist/split-button.d.ts +3 -0
- package/dist/split-button.js +1 -1
- package/dist/split-button.styles.js +0 -1
- package/dist/split-button.test.basics.js +16 -1
- package/dist/split-container.d.ts +1 -0
- package/dist/split-container.js +1 -1
- package/dist/split-container.styles.js +2 -0
- package/dist/split-container.test.basics.js +11 -16
- package/dist/styles/focus-outline.js +1 -1
- package/dist/styles/variables.css +1 -1
- package/dist/tab.js +1 -1
- package/dist/tab.styles.js +79 -54
- package/dist/tag.js +1 -1
- package/dist/tag.styles.js +1 -0
- package/dist/tag.test.basics.js +1 -1
- package/dist/tag.test.translations.d.ts +1 -0
- package/dist/tag.test.translations.js +25 -0
- package/dist/textarea.styles.js +2 -1
- package/dist/toasts.js +1 -1
- package/dist/toasts.toast.js +1 -1
- package/dist/toggle.js +1 -1
- package/dist/toggle.test.basics.js +4 -0
- package/dist/toggle.test.states.js +8 -0
- package/dist/tooltip.d.ts +2 -0
- package/dist/tooltip.js +1 -1
- package/dist/tooltip.styles.js +2 -0
- package/dist/translations/en.d.ts +3 -0
- package/dist/translations/en.js +1 -0
- package/dist/translations/fr.d.ts +3 -0
- package/dist/translations/fr.js +1 -0
- package/dist/translations/ja.d.ts +3 -0
- package/dist/translations/ja.js +1 -0
- package/dist/tree.d.ts +1 -0
- package/dist/tree.item.d.ts +3 -1
- 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 +6 -7
- package/dist/tree.item.styles.js +22 -7
- package/dist/tree.js +1 -1
- package/dist/tree.stories.d.ts +1 -0
- package/package.json +19 -13
package/dist/tab.styles.js
CHANGED
@@ -1,4 +1,14 @@
|
|
1
|
-
import{css}from"lit";export default[css`
|
1
|
+
import{css}from"lit";import focusOutline from"./styles/focus-outline.js";export default[css`
|
2
|
+
:host {
|
3
|
+
outline: none;
|
4
|
+
}
|
5
|
+
|
6
|
+
/* Using nesting creates an issue on Safari with :host */
|
7
|
+
/* stylelint-disable-next-line csstools/use-nesting */
|
8
|
+
:host(:focus-visible) .component .container {
|
9
|
+
${focusOutline};
|
10
|
+
}
|
11
|
+
|
2
12
|
.component {
|
3
13
|
align-items: center;
|
4
14
|
cursor: pointer;
|
@@ -11,73 +21,88 @@ import{css}from"lit";export default[css`
|
|
11
21
|
line-height: 1.1875rem;
|
12
22
|
padding-block: var(--glide-core-spacing-xs);
|
13
23
|
padding-inline: var(--glide-core-spacing-md);
|
14
|
-
}
|
15
24
|
|
16
|
-
|
17
|
-
|
18
|
-
.primary {
|
19
|
-
border: 1px solid transparent;
|
20
|
-
border-block-end-width: 0;
|
21
|
-
border-end-end-radius: 0;
|
22
|
-
border-end-start-radius: 0;
|
23
|
-
border-start-end-radius: var(--glide-core-spacing-sm);
|
24
|
-
border-start-start-radius: var(--glide-core-spacing-sm);
|
25
|
-
font-weight: var(--glide-core-heading-xxs-font-weight);
|
26
|
-
|
27
|
-
&.active,
|
28
|
-
&.tab:hover:not(.disabled) {
|
29
|
-
background-color: var(--glide-core-surface-base);
|
30
|
-
border: 1px solid var(--glide-core-border-primary);
|
31
|
-
|
32
|
-
/* hide the outer tab-group bottom border */
|
33
|
-
border-block-end: 1px solid var(--glide-core-surface-base);
|
34
|
-
margin-block-end: -1px;
|
25
|
+
&:hover {
|
26
|
+
color: var(--glide-core-text-primary);
|
35
27
|
}
|
36
|
-
}
|
37
28
|
|
38
|
-
|
39
|
-
|
40
|
-
|
29
|
+
&.disabled {
|
30
|
+
border: none;
|
31
|
+
color: var(--glide-core-text-tertiary-disabled);
|
32
|
+
pointer-events: none;
|
33
|
+
}
|
41
34
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
35
|
+
& .container {
|
36
|
+
border-radius: 0.0625rem;
|
37
|
+
display: flex;
|
38
|
+
gap: var(--glide-core-spacing-xs);
|
39
|
+
}
|
40
|
+
|
41
|
+
/* Primary */
|
42
|
+
|
43
|
+
&.primary {
|
44
|
+
border: 1px solid transparent;
|
45
|
+
border-block-end-width: 0;
|
46
|
+
border-end-end-radius: 0;
|
47
|
+
border-end-start-radius: 0;
|
48
|
+
border-start-end-radius: var(--glide-core-spacing-sm);
|
49
|
+
border-start-start-radius: var(--glide-core-spacing-sm);
|
50
|
+
font-weight: var(--glide-core-heading-xxs-font-weight);
|
47
51
|
|
48
|
-
|
52
|
+
&.active,
|
53
|
+
&:hover:not(.disabled) {
|
54
|
+
background-color: var(--glide-core-surface-base);
|
55
|
+
border: 1px solid var(--glide-core-border-primary);
|
49
56
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
font-weight: var(--glide-core-body-sm-font-weight);
|
57
|
+
/* hide the outer tab-group bottom border */
|
58
|
+
border-block-end: 1px solid var(--glide-core-surface-base);
|
59
|
+
margin-block-end: -1px;
|
60
|
+
}
|
55
61
|
|
56
|
-
|
57
|
-
|
62
|
+
& .active.default-slot {
|
63
|
+
background-color: red;
|
64
|
+
}
|
58
65
|
}
|
59
|
-
}
|
60
66
|
|
61
|
-
|
67
|
+
/* Secondary */
|
62
68
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
69
|
+
&.secondary {
|
70
|
+
border-color: transparent;
|
71
|
+
border-style: solid;
|
72
|
+
border-width: 1px;
|
73
|
+
font-weight: var(--glide-core-body-sm-font-weight);
|
67
74
|
|
68
|
-
|
69
|
-
|
70
|
-
|
75
|
+
&.active {
|
76
|
+
border-block-end: 2px solid var(--glide-core-border-focus);
|
77
|
+
}
|
71
78
|
}
|
72
79
|
|
73
|
-
|
74
|
-
|
75
|
-
|
80
|
+
/* Vertical */
|
81
|
+
|
82
|
+
&.vertical {
|
83
|
+
flex-direction: column;
|
84
|
+
font-weight: var(--glide-core-body-sm-font-weight);
|
85
|
+
padding-inline: var(--glide-core-spacing-xxs);
|
86
|
+
|
87
|
+
& .default-slot {
|
88
|
+
transform: rotate(180deg);
|
89
|
+
writing-mode: vertical-lr;
|
90
|
+
}
|
91
|
+
|
92
|
+
&.active {
|
93
|
+
border-inline-start: 2px solid var(--glide-core-border-focus);
|
94
|
+
}
|
95
|
+
|
96
|
+
&.active,
|
97
|
+
&.disabled {
|
98
|
+
background-color: var(--glide-core-surface-base);
|
99
|
+
}
|
76
100
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
101
|
+
& .container {
|
102
|
+
display: flex;
|
103
|
+
flex-direction: column;
|
104
|
+
gap: var(--glide-core-spacing-xs);
|
105
|
+
}
|
81
106
|
}
|
82
107
|
}
|
83
108
|
`];
|
package/dist/tag.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
var __decorate=this&&this.__decorate||function(e,t,o,l){var r
|
1
|
+
var __decorate=this&&this.__decorate||function(e,t,o,l){var i,r=arguments.length,s=r<3?t:null===l?l=Object.getOwnPropertyDescriptor(t,o):l;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,o,l);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(s=(r<3?i(s):r>3?i(t,o,s):i(t,o))||s);return r>3&&s&&Object.defineProperty(t,o,s),s};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}from"lit/decorators.js";import{owSlot}from"./library/ow.js";import{when}from"lit/directives/when.js";import styles from"./tag.styles.js";let GlideCoreTag=class GlideCoreTag extends LitElement{constructor(){super(...arguments),this.size="medium",this.removableLabel="",this.#e=createRef(),this.#t=createRef(),this.#o=createRef(),this.#l=new LocalizeController(this),this.#i=createRef(),this.#r=200,this.#s=()=>{new Promise((()=>setTimeout((()=>{this.remove()}),this.#r))),this.#t.value?.classList.toggle("activate"),this.#t.value?.classList.toggle("deactivate"),this.dispatchEvent(new Event("remove"))}}static{this.shadowRootOptions={...LitElement.shadowRootOptions,delegatesFocus:!0,mode:"closed"}}static{this.styles=styles}click(){this.#e.value?.click()}firstUpdated(){owSlot(this.#o.value)}render(){return html`<div class="${classMap({component:!0,activate:!0,[this.size]:!0})}" ${ref(this.#t)}><slot name="prefix" ${ref(this.#i)}></slot><slot @slotchange="${this.#a}" ${ref(this.#o)}></slot>${when(this.removableLabel,(()=>html`<button type="button" class="${classMap({[this.size]:!0})}" aria-label="${this.#l.term("removeTag",this.removableLabel)}" data-test="button" ${ref(this.#e)} @click="${this.#s}"><svg width="12" height="12" viewBox="0 0 24 24" fill="none"><path d="M6 6L18 18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M18 6L6 18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></button>`))}</div>`}#e;#t;#o;#l;#i;#r;#s;#a(){owSlot(this.#o.value)}};__decorate([property({reflect:!0})],GlideCoreTag.prototype,"size",void 0),__decorate([property({attribute:"removable-label"})],GlideCoreTag.prototype,"removableLabel",void 0),GlideCoreTag=__decorate([customElement("glide-core-tag")],GlideCoreTag);export default GlideCoreTag;
|
package/dist/tag.styles.js
CHANGED
@@ -96,6 +96,7 @@ import{css}from"lit";import focusOutline from"./styles/focus-outline.js";export
|
|
96
96
|
background-color: transparent;
|
97
97
|
block-size: var(--glide-core-spacing-sm);
|
98
98
|
border: none;
|
99
|
+
border-radius: 0.0625rem;
|
99
100
|
color: var(--glide-core-icon-display);
|
100
101
|
cursor: pointer;
|
101
102
|
display: flex;
|
package/dist/tag.test.basics.js
CHANGED
@@ -36,7 +36,7 @@ it('renders an icon button with aria-label when "removable-label" attribute is s
|
|
36
36
|
expect(element).to.have.attribute('removable-label', 'test-aria-label');
|
37
37
|
const iconButton = element.shadowRoot?.querySelector('button');
|
38
38
|
expect(iconButton).to.be.not.null;
|
39
|
-
expect(iconButton).to.have.attribute('aria-label', `Remove test-aria-label`);
|
39
|
+
expect(iconButton).to.have.attribute('aria-label', `Remove tag: test-aria-label`);
|
40
40
|
expect(iconButton).to.have.attribute('type', 'button');
|
41
41
|
});
|
42
42
|
it('renders the "prefix" slot and its content', async () => {
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,25 @@
|
|
1
|
+
import { elementUpdated, expect, fixture, html } from '@open-wc/testing';
|
2
|
+
import GlideCoreTag from './tag.js';
|
3
|
+
GlideCoreTag.shadowRootOptions.mode = 'open';
|
4
|
+
it('renders dynamic string in Japanese', async () => {
|
5
|
+
const element = await fixture(html `<glide-core-tag removable-label="test-aria-label"
|
6
|
+
><span slot="prefix">Prefix</span
|
7
|
+
><span data-content>Tag</span></glide-core-tag
|
8
|
+
>`);
|
9
|
+
document.documentElement.setAttribute('lang', 'ja');
|
10
|
+
await elementUpdated(element);
|
11
|
+
const iconButton = element.shadowRoot?.querySelector('button');
|
12
|
+
expect(iconButton).to.have.attribute('aria-label', `タグを削除: test-aria-label`);
|
13
|
+
expect(iconButton).to.have.attribute('type', 'button');
|
14
|
+
});
|
15
|
+
it('renders dynamic string in French', async () => {
|
16
|
+
const element = await fixture(html `<glide-core-tag removable-label="test-aria-label"
|
17
|
+
><span slot="prefix">Prefix</span
|
18
|
+
><span data-content>Tag</span></glide-core-tag
|
19
|
+
>`);
|
20
|
+
document.documentElement.setAttribute('lang', 'fr');
|
21
|
+
await elementUpdated(element);
|
22
|
+
const iconButton = element.shadowRoot?.querySelector('button');
|
23
|
+
expect(iconButton).to.have.attribute('aria-label', `Supprimer la balise : test-aria-label`);
|
24
|
+
expect(iconButton).to.have.attribute('type', 'button');
|
25
|
+
});
|
package/dist/textarea.styles.js
CHANGED
package/dist/toasts.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
var __decorate=this&&this.__decorate||function(e,t,o,
|
1
|
+
var __decorate=this&&this.__decorate||function(e,t,o,r){var s,i=arguments.length,l=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,o):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)l=Reflect.decorate(e,t,o,r);else for(var a=e.length-1;a>=0;a--)(s=e[a])&&(l=(i<3?s(l):i>3?s(t,o,l):s(t,o))||l);return i>3&&l&&Object.defineProperty(t,o,l),l};import"./toasts.toast.js";import{LitElement,html}from"lit";import{LocalizeController}from"./library/localize.js";import{createRef,ref}from"lit/directives/ref.js";import{customElement}from"lit/decorators.js";import styles from"./toasts.styles.js";let GlideCoreToasts=class GlideCoreToasts extends LitElement{static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}add(e){const{variant:t,label:o,description:r,duration:s}=e,i=Object.assign(document.createElement("glide-core-toast"),{variant:t,label:o,description:r,duration:s});return this.#e.value.append(i),i.addEventListener("close",(()=>{i.remove()}),{once:!0}),i}render(){return html`<div class="component" role="region" tabindex="-1" aria-label="${this.#t.term("notifications")}" ${ref(this.#e)}></div>`}#e=createRef();#t=new LocalizeController(this)};GlideCoreToasts=__decorate([customElement("glide-core-toasts")],GlideCoreToasts);export default GlideCoreToasts;
|
package/dist/toasts.toast.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
var __decorate=this&&this.__decorate||function(t,
|
1
|
+
var __decorate=this&&this.__decorate||function(e,t,o,i){var s,r=arguments.length,l=r<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 a=e.length-1;a>=0;a--)(s=e[a])&&(l=(r<3?s(l):r>3?s(t,o,l):s(t,o))||l);return r>3&&l&&Object.defineProperty(t,o,l),l};import"./icon-button.js";import"./status-indicator.js";import"./tooltip.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}from"lit/decorators.js";import styles from"./toasts.toast.styles.js";let GlideCoreToast=class GlideCoreToast extends LitElement{constructor(){super(...arguments),this.duration=5e3,this.#e=createRef(),this.#t=new LocalizeController(this)}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}close(){const e=this.#e?.value;e?.addEventListener("transitionend",(()=>{e?.classList?.remove("open"),e?.classList?.remove("closing"),e?.classList?.add("closed"),this.dispatchEvent(new Event("close",{bubbles:!0}))}),{once:!0}),e?.classList?.add("closing")}firstUpdated(){requestAnimationFrame((()=>{this.open()}))}open(){const e=Math.max(this.duration??0,5e3);e<Number.POSITIVE_INFINITY&&setTimeout((()=>{this.close()}),e),this.#e?.value?.classList?.add("open")}render(){return html`<div class="${classMap({component:!0,[this.variant]:!0})}" role="alert" aria-labelledby="label description" ${ref(this.#e)}><glide-core-status-indicator style="--size: 1.25rem;" class="icon" variant="${this.#o}"></glide-core-status-indicator><div class="label" id="label">${this.label}</div><glide-core-icon-button label="${this.#t.term("close")}" variant="tertiary" class="close-button" @click="${this.#i}"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><path d="M6 6L18 18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M18 6L6 18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></glide-core-icon-button><div class="description" id="description">${this.description}</div></div>`}#e;#t;#i(){this.close()}get#o(){return{informational:"warning-informational",success:"success"}[this.variant]}};__decorate([property({reflect:!0})],GlideCoreToast.prototype,"label",void 0),__decorate([property({reflect:!0})],GlideCoreToast.prototype,"description",void 0),__decorate([property()],GlideCoreToast.prototype,"variant",void 0),__decorate([property({type:Number})],GlideCoreToast.prototype,"duration",void 0),GlideCoreToast=__decorate([customElement("glide-core-toast")],GlideCoreToast);export default GlideCoreToast;
|
package/dist/toggle.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
var __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 d=e.length-1;d>=0;d--)(l=e[d])&&(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"./label.js";import{LitElement,html}from"lit";import{createRef,ref}from"lit/directives/ref.js";import{customElement,property}from"lit/decorators.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-label orientation="${this.orientation}" ?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-describedby="summary description" data-test="input" id="input" type="checkbox" ?checked="${this.checked}" ?disabled="${this.disabled}" @change="${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-label></div>`}#e;#t(e){e.target instanceof HTMLInputElement&&(this.checked=e.target.checked),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({reflect:!0})],GlideCoreToggle.prototype,"summary",void 0),GlideCoreToggle=__decorate([customElement("glide-core-toggle")],GlideCoreToggle);export default GlideCoreToggle;
|
1
|
+
var __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 d=e.length-1;d>=0;d--)(l=e[d])&&(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"./label.js";import{LitElement,html}from"lit";import{createRef,ref}from"lit/directives/ref.js";import{customElement,property}from"lit/decorators.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-label orientation="${this.orientation}" ?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}" ${ref(this.#e)}></div><div slot="summary" id="summary">${this.summary}</div><slot class="description" id="description" name="description" slot="description"></slot></glide-core-label></div>`}#e;#t(e){e.target instanceof HTMLInputElement&&(this.checked=e.target.checked),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({reflect:!0})],GlideCoreToggle.prototype,"summary",void 0),GlideCoreToggle=__decorate([customElement("glide-core-toggle")],GlideCoreToggle);export default GlideCoreToggle;
|
@@ -8,6 +8,8 @@ it('has defaults', async () => {
|
|
8
8
|
const component = await fixture(html `<glide-core-toggle label="Label"></glide-core-toggle>`);
|
9
9
|
expect(component.hasAttribute('checked')).to.be.false;
|
10
10
|
expect(component.checked).to.be.false;
|
11
|
+
const input = component.shadowRoot?.querySelector('[data-test="input"]');
|
12
|
+
expect(input?.getAttribute('aria-checked')).to.equal('false');
|
11
13
|
expect(component.hasAttribute('disabled')).to.be.false;
|
12
14
|
expect(component.disabled).to.be.false;
|
13
15
|
expect(component.hasAttribute('hide-label')).to.be.false;
|
@@ -56,6 +58,8 @@ it('can be checked', async () => {
|
|
56
58
|
const component = await fixture(html `<glide-core-toggle checked></glide-core-toggle> `);
|
57
59
|
expect(component.hasAttribute('checked')).to.be.true;
|
58
60
|
expect(component.checked).to.equal(true);
|
61
|
+
const input = component.shadowRoot?.querySelector('[data-test="input"]');
|
62
|
+
expect(input?.getAttribute('aria-checked')).to.equal('true');
|
59
63
|
});
|
60
64
|
it('can be disabled', async () => {
|
61
65
|
const component = await fixture(html `<glide-core-toggle disabled></glide-core-toggle> `);
|
@@ -7,6 +7,8 @@ it('is checked after being clicked', async () => {
|
|
7
7
|
await elementUpdated(component);
|
8
8
|
expect(component.checked).to.equal(true);
|
9
9
|
expect(component.hasAttribute('checked')).to.be.false;
|
10
|
+
const input = component.shadowRoot?.querySelector('[data-test="input"]');
|
11
|
+
expect(input?.getAttribute('aria-checked')).to.equal('true');
|
10
12
|
});
|
11
13
|
it('is unchecked after being clicked', async () => {
|
12
14
|
const component = await fixture(html `<glide-core-toggle label="Label" checked></glide-core-toggle>`);
|
@@ -14,6 +16,8 @@ it('is unchecked after being clicked', async () => {
|
|
14
16
|
await elementUpdated(component);
|
15
17
|
expect(component.checked).to.equal(false);
|
16
18
|
expect(component.hasAttribute('checked')).to.be.true;
|
19
|
+
const input = component.shadowRoot?.querySelector('[data-test="input"]');
|
20
|
+
expect(input?.getAttribute('aria-checked')).to.equal('false');
|
17
21
|
});
|
18
22
|
it('is still checked after being clicked when checked but disabled', async () => {
|
19
23
|
const component = await fixture(html `<glide-core-toggle
|
@@ -25,6 +29,8 @@ it('is still checked after being clicked when checked but disabled', async () =>
|
|
25
29
|
await elementUpdated(component);
|
26
30
|
expect(component.checked).to.equal(true);
|
27
31
|
expect(component.hasAttribute('checked')).to.be.true;
|
32
|
+
const input = component.shadowRoot?.querySelector('[data-test="input"]');
|
33
|
+
expect(input?.getAttribute('aria-checked')).to.equal('true');
|
28
34
|
});
|
29
35
|
it('is still unchecked after being clicked when unchecked and disabled', async () => {
|
30
36
|
const component = await fixture(html `<glide-core-toggle label="Label" disabled></glide-core-toggle>`);
|
@@ -32,4 +38,6 @@ it('is still unchecked after being clicked when unchecked and disabled', async (
|
|
32
38
|
await elementUpdated(component);
|
33
39
|
expect(component.hasAttribute('checked')).to.be.false;
|
34
40
|
expect(component.checked).to.equal(false);
|
41
|
+
const input = component.shadowRoot?.querySelector('[data-test="input"]');
|
42
|
+
expect(input?.getAttribute('aria-checked')).to.equal('false');
|
35
43
|
});
|
package/dist/tooltip.d.ts
CHANGED
@@ -13,9 +13,11 @@ export default class GlideCoreTooltip extends LitElement {
|
|
13
13
|
static shadowRootOptions: ShadowRootInit;
|
14
14
|
static styles: import("lit").CSSResult[];
|
15
15
|
placement?: 'bottom' | 'left' | 'right' | 'top';
|
16
|
+
containingBlock?: Element;
|
16
17
|
firstUpdated(): void;
|
17
18
|
private get isVisible();
|
18
19
|
private set isVisible(value);
|
19
20
|
render(): import("lit").TemplateResult<1>;
|
21
|
+
setContainingBlock(containingBlock: Element): void;
|
20
22
|
private effectivePlacement?;
|
21
23
|
}
|
package/dist/tooltip.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
var __decorate=this&&this.__decorate||function(e,
|
1
|
+
var __decorate=this&&this.__decorate||function(t,e,o,i){var l,s=arguments.length,a=s<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,o):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(t,e,o,i);else for(var r=t.length-1;r>=0;r--)(l=t[r])&&(a=(s<3?l(a):s>3?l(e,o,a):l(e,o))||a);return s>3&&a&&Object.defineProperty(e,o,a),a};import{LitElement,html}from"lit";import{arrow,autoUpdate,computePosition,flip,offset,platform,shift}from"@floating-ui/dom";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{offsetParent}from"composed-offset-position";import{owSlot}from"./library/ow.js";import styles from"./tooltip.styles.js";let GlideCoreTooltip=class GlideCoreTooltip extends LitElement{static{this.shadowRootOptions={...LitElement.shadowRootOptions,delegatesFocus:!0,mode:"closed"}}static{this.styles=styles}firstUpdated(){owSlot(this.#t.value),owSlot(this.#e.value),this.#o()}get isVisible(){return this.#i}set isVisible(t){this.#i=t,this.isVisible?this.#o():this.#l?.()}render(){return html`<div class="component" @mouseover="${this.#s}" @mouseout="${this.#a}"><div aria-labelledby="tooltip" class="target" slot="target" @focusin="${this.#r}" @focusout="${this.#n}" @keydown="${this.#f}" ${ref(this.#c)}><slot @slotchange="${this.#p}" ${ref(this.#e)} name="target"></slot></div><div class="${classMap({tooltip:!0,visible:this.isVisible})}" id="tooltip" role="tooltip" ${ref(this.#m)}><span aria-label="Tooltip: "></span><slot @slotchange="${this.#h}" ${ref(this.#t)}></slot><div class="arrow" ${ref(this.#d)}></div></div></div>`}setContainingBlock(t){this.containingBlock=t}#d=createRef();#l;#u;#t=createRef();#i=!1;#c=createRef();#e=createRef();#m=createRef();#g(){clearTimeout(this.#u)}#h(){owSlot(this.#t.value)}#r(){this.isVisible=!0}#n(){this.isVisible=!1}#f(t){"Escape"===t.key&&(this.isVisible=!1)}#a(){this.#v()}#s(){this.#g(),this.isVisible=!0}#p(){owSlot(this.#e.value)}#v(){this.#u=setTimeout((()=>{this.isVisible=!1}),200)}#o(){this.#c.value&&this.#m.value&&(this.#l=autoUpdate(this.#c.value,this.#m.value,(()=>{(async()=>{if(this.#c.value&&this.#m.value){const t=this.#d.value,{placement:e,x:o,y:i,middlewareData:l}=await computePosition(this.#c.value,this.#m.value,{platform:{...platform,getOffsetParent:t=>this.containingBlock&&t!==this.#d.value?this.containingBlock:platform.getOffsetParent(t,offsetParent)},placement:this.placement,strategy:"fixed",middleware:[offset(6),flip({fallbackStrategy:"initialPlacement"}),shift(),arrow({element:t})]});Object.assign(this.#m.value.style,{left:`${o}px`,top:`${i}px`});const s=l.arrow?.x??null,a=l.arrow?.y??null,r={top:"bottom",right:"left",bottom:"top",left:"right"}[e.split("-")[0]];Object.assign(t.style,{left:null===s?"":`${s}px`,top:null===a?"":`${a}px`,right:"",bottom:"",[r]:"-3px"}),this.effectivePlacement=e}})()})))}};__decorate([property()],GlideCoreTooltip.prototype,"placement",void 0),__decorate([state()],GlideCoreTooltip.prototype,"containingBlock",void 0),__decorate([state()],GlideCoreTooltip.prototype,"isVisible",null),__decorate([state()],GlideCoreTooltip.prototype,"effectivePlacement",void 0),GlideCoreTooltip=__decorate([customElement("glide-core-tooltip")],GlideCoreTooltip);export default GlideCoreTooltip;
|
package/dist/tooltip.styles.js
CHANGED
@@ -39,6 +39,8 @@ import{css}from"lit";import focusOutline from"./styles/focus-outline.js";export
|
|
39
39
|
inset-block-start: 50%;
|
40
40
|
inset-block-start: 0;
|
41
41
|
inset-inline-start: 0;
|
42
|
+
max-inline-size: 11.25rem;
|
43
|
+
overflow-wrap: break-word;
|
42
44
|
padding: var(--glide-core-spacing-xs) var(--glide-core-spacing-sm);
|
43
45
|
position: fixed;
|
44
46
|
z-index: 1;
|
@@ -0,0 +1 @@
|
|
1
|
+
const translation={$code:"en",$name:"English",$dir:"ltr",close:"Close",dismiss:"Dismiss",open:"Open",selectAll:"Select all",clearEntry:"Clear entry",moreInformation:"More information",notifications:"Notifications",removeTag:e=>`Remove tag: ${e}`};export default translation;
|
@@ -0,0 +1 @@
|
|
1
|
+
const translation={$code:"fr",$name:"French",$dir:"ltr",close:"Fermer",dismiss:"Congédier",open:"Ouvrir",selectAll:"Tout sélectionner",clearEntry:"Effacer l’entrée",moreInformation:"Plus d’informations",notifications:"Notifications",removeTag:e=>`Supprimer la balise : ${e}`};export default translation;
|
@@ -0,0 +1 @@
|
|
1
|
+
const translation={$code:"ja",$name:"Japanese",$dir:"ltr",close:"閉じる",dismiss:"無視",open:"オープン",selectAll:"すべて選択",clearEntry:"入力のクリア",moreInformation:"詳細情報",notifications:"通知",removeTag:e=>`タグを削除: ${e}`};export default translation;
|
package/dist/tree.d.ts
CHANGED
package/dist/tree.item.d.ts
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
import './tree.item.menu.js';
|
2
2
|
import { LitElement } from 'lit';
|
3
|
+
import GlideCoreMenu from './menu.js';
|
3
4
|
declare global {
|
4
5
|
interface HTMLElementTagNameMap {
|
5
6
|
'glide-core-tree-item': GlideCoreTreeItem;
|
@@ -21,7 +22,7 @@ export default class GlideCoreTreeItem extends LitElement {
|
|
21
22
|
label: string;
|
22
23
|
level: number;
|
23
24
|
selected: boolean;
|
24
|
-
menuSlotAssignedElements:
|
25
|
+
menuSlotAssignedElements: GlideCoreMenu[];
|
25
26
|
prefixSlotAssignedElements: HTMLElement[];
|
26
27
|
slotElements: GlideCoreTreeItem[];
|
27
28
|
suffixSlotAssignedElements: HTMLElement[];
|
@@ -35,6 +36,7 @@ export default class GlideCoreTreeItem extends LitElement {
|
|
35
36
|
* Returns the selected item
|
36
37
|
*/
|
37
38
|
selectItem(item: GlideCoreTreeItem): GlideCoreTreeItem | undefined;
|
39
|
+
setContainingBlock(containingBlock: Element): void;
|
38
40
|
toggleExpand(): void;
|
39
41
|
private childTreeItems;
|
40
42
|
private hasMenuSlot;
|
package/dist/tree.item.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
var __decorate=this&&this.__decorate||function(e,t,s,i){var o,r=arguments.length,l=r<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,s):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)l=Reflect.decorate(e,t,s,i);else for(var
|
1
|
+
var __decorate=this&&this.__decorate||function(e,t,s,i){var o,r=arguments.length,l=r<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,s):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)l=Reflect.decorate(e,t,s,i);else for(var n=e.length-1;n>=0;n--)(o=e[n])&&(l=(r<3?o(l):r>3?o(t,s,l):o(t,s))||l);return r>3&&l&&Object.defineProperty(t,s,l),l};import"./tree.item.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,queryAssignedElements,state}from"lit/decorators.js";import{ifDefined}from"lit/directives/if-defined.js";import GlideCoreMenu from"./menu.js";import{when}from"lit/directives/when.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.childTreeItems=[],this.hasMenuSlot=!1,this.hasPrefixSlot=!1,this.hasSuffixSlot=!1,this.#e=createRef()}static{this.shadowRootOptions={...LitElement.shadowRootOptions,delegatesFocus:!0,mode:"closed"}}static{this.styles=styles}firstUpdated(){this.#t()}focus(){this.#e.value?.focus()}get hasChildTreeItems(){return this.childTreeItems.length>0}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.#i)}"><div class="${classMap({"label-container":!0})}" tabindex="-1" ${ref(this.#e)}><div style="flex-shrink: 0; width:${this.#o};"></div><div class="expand-icon-container">${when(this.hasChildTreeItems,(()=>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" @slotchange="${this.#r}"></slot><div class="label">${this.label}</div><div class="icon-container"><slot name="menu" @slotchange="${this.#l}"></slot><slot name="suffix" @slotchange="${this.#n}"></slot></div></div><div class="child-items" role="group"><slot></slot></div></div>`}selectItem(e){let t;for(const s of this.slotElements)if(e===s)s.setAttribute("selected","true"),t=s;else{s.removeAttribute("selected");const i=s.selectItem(e);i&&(t=i)}return t}setContainingBlock(e){for(const t of this.menuSlotAssignedElements)t.setContainingBlock(e)}toggleExpand(){this.expanded=!this.expanded}#e;get#i(){return this.hasChildTreeItems?this.expanded?"true":"false":void 0}get#s(){return this.hasChildTreeItems?void 0:this.selected?"true":"false"}get#o(){return 20*(this.level-1)+"px"}#l(){this.hasMenuSlot=this.menuSlotAssignedElements.length>0}#r(){this.hasPrefixSlot=this.prefixSlotAssignedElements.length>0}#n(){this.hasSuffixSlot=this.suffixSlotAssignedElements.length>0}#t(){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([queryAssignedElements({slot:"menu"})],GlideCoreTreeItem.prototype,"menuSlotAssignedElements",void 0),__decorate([queryAssignedElements({slot:"prefix"})],GlideCoreTreeItem.prototype,"prefixSlotAssignedElements",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,"hasMenuSlot",void 0),__decorate([state()],GlideCoreTreeItem.prototype,"hasPrefixSlot",void 0),__decorate([state()],GlideCoreTreeItem.prototype,"hasSuffixSlot",void 0),GlideCoreTreeItem=__decorate([customElement("glide-core-tree-item")],GlideCoreTreeItem);export default GlideCoreTreeItem;
|
package/dist/tree.item.menu.d.ts
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
import './icon-button.js';
|
2
2
|
import './menu.js';
|
3
|
+
import './menu.options.js';
|
3
4
|
import { LitElement } from 'lit';
|
4
5
|
declare global {
|
5
6
|
interface HTMLElementTagNameMap {
|
@@ -18,4 +19,5 @@ export default class GlideCoreTreeItemMenu extends LitElement {
|
|
18
19
|
static styles: import("lit").CSSResult[];
|
19
20
|
firstUpdated(): void;
|
20
21
|
render(): import("lit").TemplateResult<1>;
|
22
|
+
setContainingBlock(containingBlock: Element): void;
|
21
23
|
}
|
package/dist/tree.item.menu.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
var __decorate=this&&this.__decorate||function(e,t,o,l){var r
|
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}from"lit/decorators.js";import{owSlot,owSlotType}from"./library/ow.js";import GlideCoreMenu from"./menu.js";import GlideCoreMenuButton from"./menu.button.js";import GlideCoreMenuLink from"./menu.link.js";import styles from"./tree.item.menu.styles.js";let GlideCoreTreeItemMenu=class GlideCoreTreeItemMenu extends LitElement{static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}firstUpdated(){owSlot(this.#e.value),owSlotType(this.#e.value,[GlideCoreMenuButton,GlideCoreMenuLink])}render(){return html`<glide-core-menu class="component" ${ref(this.#t)}><glide-core-menu-options><slot @slotchange="${this.#o}" ${ref(this.#e)}></slot></glide-core-menu-options><glide-core-icon-button slot="target" variant="tertiary"><svg 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>`}setContainingBlock(e){this.#t.value.setContainingBlock(e)}#e=createRef();#t=createRef();#o(){owSlot(this.#e.value),owSlotType(this.#e.value,[GlideCoreMenuButton,GlideCoreMenuLink])}};GlideCoreTreeItemMenu=__decorate([customElement("glide-core-tree-item-menu")],GlideCoreTreeItemMenu);export default GlideCoreTreeItemMenu;
|
@@ -22,13 +22,12 @@ it('throws if the default slot is the incorrect type', async () => {
|
|
22
22
|
});
|
23
23
|
// Menu is rendered asynchronously outside of Tree Menu Item's lifecycle
|
24
24
|
// and asserts against its default slot. That assertion, which is expected
|
25
|
-
// to fail, results in an unhandled rejection that gets logged.
|
25
|
+
// to fail in this case, results in an unhandled rejection that gets logged.
|
26
|
+
// `console.error` is stubbed so the logs aren't muddied.
|
26
27
|
const stub = sinon.stub(console, 'error');
|
27
|
-
// Menu asserts against its default slot once on `firstUpdated` and
|
28
|
-
//
|
29
|
-
//
|
30
|
-
await waitUntil(() => stub.
|
28
|
+
// Menu asserts against its default slot once on `firstUpdated` and again
|
29
|
+
// on "slotchange". So we wait until the stub is called twice before restoring
|
30
|
+
// it.
|
31
|
+
await waitUntil(() => stub.calledTwice);
|
31
32
|
stub.restore();
|
32
|
-
// eslint-disable-next-line unicorn/prefer-add-event-listener
|
33
|
-
window.onerror = onerror;
|
34
33
|
});
|
package/dist/tree.item.styles.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import{css}from"lit";export default[css`
|
1
|
+
import{css}from"lit";import focusOutline from"./styles/focus-outline.js";export default[css`
|
2
2
|
:host {
|
3
3
|
cursor: pointer;
|
4
4
|
display: flex;
|
@@ -20,6 +20,7 @@ import{css}from"lit";export default[css`
|
|
20
20
|
}
|
21
21
|
|
22
22
|
.expand-icon-container {
|
23
|
+
flex-shrink: 0;
|
23
24
|
min-inline-size: 1.5625rem;
|
24
25
|
}
|
25
26
|
|
@@ -43,7 +44,7 @@ import{css}from"lit";export default[css`
|
|
43
44
|
|
44
45
|
.label-container {
|
45
46
|
align-items: center;
|
46
|
-
border-radius: 0.
|
47
|
+
border-radius: 0.5rem;
|
47
48
|
color: var(--color);
|
48
49
|
display: flex;
|
49
50
|
font-size: var(--glide-core-body-sm-font-size);
|
@@ -63,10 +64,15 @@ import{css}from"lit";export default[css`
|
|
63
64
|
}
|
64
65
|
|
65
66
|
&:focus-visible {
|
66
|
-
|
67
|
-
|
68
|
-
outline
|
69
|
-
outline-
|
67
|
+
${focusOutline};
|
68
|
+
|
69
|
+
/* The outline is inside the component since children have overflow hidden */
|
70
|
+
outline-offset: -2px;
|
71
|
+
|
72
|
+
.component.selected & {
|
73
|
+
outline: 1px solid var(--glide-core-icon-selected);
|
74
|
+
outline-offset: -3px;
|
75
|
+
}
|
70
76
|
}
|
71
77
|
|
72
78
|
.component.selected & {
|
@@ -112,7 +118,10 @@ import{css}from"lit";export default[css`
|
|
112
118
|
}
|
113
119
|
|
114
120
|
.label {
|
115
|
-
|
121
|
+
min-inline-size: 0;
|
122
|
+
overflow: hidden;
|
123
|
+
text-overflow: ellipsis;
|
124
|
+
white-space: nowrap;
|
116
125
|
}
|
117
126
|
|
118
127
|
.child-items {
|
@@ -127,4 +136,10 @@ import{css}from"lit";export default[css`
|
|
127
136
|
block-size: auto;
|
128
137
|
}
|
129
138
|
}
|
139
|
+
|
140
|
+
.icon-container {
|
141
|
+
display: flex;
|
142
|
+
flex: 1;
|
143
|
+
justify-content: flex-end;
|
144
|
+
}
|
130
145
|
`];
|
package/dist/tree.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
var __decorate=this&&this.__decorate||function(e,t,o,s){var r,l=arguments.length,i=l<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,o):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,o,s);else for(var n=e.length-1;n>=0;n--)(r=e[n])&&(i=(l<3?r(i):l>3?r(t,o,i):r(t,o))||i);return l>3&&i&&Object.defineProperty(t,o,i),i};import{LitElement,html}from"lit";import{createRef,ref}from"lit/directives/ref.js";import{customElement,queryAssignedElements,state}from"lit/decorators.js";import{owSlot,owSlotType}from"./library/ow.js";import GlideCoreTreeItem from"./tree.item.js";import styles from"./tree.styles.js";let GlideCoreTree=class GlideCoreTree extends LitElement{static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("focusin",this.#e),this.removeEventListener("focusout",this.#t)}firstUpdated(){owSlot(this.#o.value),owSlotType(this.#o.value,[GlideCoreTreeItem])}render(){return html`<div class="component" role="tree" tabindex="${this.privateTabIndex}" @click="${this.#s}" @keydown="${this.#r}"><slot @slotchange="${this.#l}" ${ref(this.#o)}></slot></div>`}selectItem(e){for(const t of this.slotElements)if(e===t)t.setAttribute("selected","true"),this.selectedItem=t;else{t.removeAttribute("selected");const o=t.selectItem(e);o&&(this.selectedItem=o)}this.dispatchEvent(new CustomEvent("item-selected",{bubbles:!0,detail:e}))}constructor(){super(),this.privateTabIndex=0,this.#o=createRef(),this.addEventListener("focusin",this.#e),this.addEventListener("focusout",this.#t)}#o;#
|
1
|
+
var __decorate=this&&this.__decorate||function(e,t,o,s){var r,l=arguments.length,i=l<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,o):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,o,s);else for(var n=e.length-1;n>=0;n--)(r=e[n])&&(i=(l<3?r(i):l>3?r(t,o,i):r(t,o))||i);return l>3&&i&&Object.defineProperty(t,o,i),i};import{LitElement,html}from"lit";import{createRef,ref}from"lit/directives/ref.js";import{customElement,queryAssignedElements,state}from"lit/decorators.js";import{owSlot,owSlotType}from"./library/ow.js";import GlideCoreTreeItem from"./tree.item.js";import styles from"./tree.styles.js";let GlideCoreTree=class GlideCoreTree extends LitElement{static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("focusin",this.#e),this.removeEventListener("focusout",this.#t)}firstUpdated(){owSlot(this.#o.value),owSlotType(this.#o.value,[GlideCoreTreeItem])}render(){return html`<div class="component" role="tree" tabindex="${this.privateTabIndex}" @click="${this.#s}" @keydown="${this.#r}"><slot @slotchange="${this.#l}" ${ref(this.#o)}></slot></div>`}selectItem(e){for(const t of this.slotElements)if(e===t)t.setAttribute("selected","true"),this.selectedItem=t;else{t.removeAttribute("selected");const o=t.selectItem(e);o&&(this.selectedItem=o)}this.dispatchEvent(new CustomEvent("item-selected",{bubbles:!0,detail:e}))}setContainingBlock(e){for(const t of this.#i())t.setContainingBlock(e)}constructor(){super(),this.privateTabIndex=0,this.#o=createRef(),this.addEventListener("focusin",this.#e),this.addEventListener("focusout",this.#t)}#o;#n(e){e?.focus(),this.focusedItem=e}#i(){return[...this.querySelectorAll("glide-core-tree-item")]}#d(){const e=this.#i(),t=new Set;return e.filter((e=>{const o=e.parentElement?.closest("glide-core-tree-item");return!o||o.expanded&&!t.has(o)||t.add(e),!t.has(e)}))}#s(e){const t=e.target;if(t.closest("glide-core-tree-item-icon-button")??t.closest("glide-core-tree-item-menu"))return;const o=t.closest("glide-core-tree-item");o&&(o.hasChildTreeItems?o.toggleExpand():this.selectItem(o))}#e(e){let t;e.target===this?t=this.selectedItem??this.slotElements[0]:e.target instanceof GlideCoreTreeItem&&(t=e.target,this.privateTabIndex=-1),this.#n(t)}#t(e){const t=e.relatedTarget;t&&this.contains(t)||(this.privateTabIndex=0,this.focusedItem=void 0)}#r(e){if(!["ArrowRight","ArrowLeft","ArrowDown","ArrowUp","Home","End","Enter"].includes(e.key))return;const t=this.#d(),{focusedItem:o}=this,s=t.findIndex((e=>e.matches(":focus")));if("ArrowRight"===e.key&&o?.hasChildTreeItems&&(o.expanded?this.#n(o.slotElements[0]):o.toggleExpand()),"ArrowLeft"===e.key)if(o?.expanded)o.toggleExpand();else{const e=o?.parentElement?.closest("glide-core-tree-item");this.#n(e)}"ArrowDown"===e.key&&-1!==s&&s<t.length-1&&this.#n(t[s+1]),"ArrowUp"===e.key&&s>0&&this.#n(t[s-1]),"Home"===e.key&&this.#n(t[0]),"End"===e.key&&this.#n(t.at(-1)),"Enter"===e.key&&o&&(o.hasChildTreeItems?o.toggleExpand():this.selectItem(o))}#l(){owSlot(this.#o.value),owSlotType(this.#o.value,[GlideCoreTreeItem])}};__decorate([state()],GlideCoreTree.prototype,"selectedItem",void 0),__decorate([state()],GlideCoreTree.prototype,"focusedItem",void 0),__decorate([state()],GlideCoreTree.prototype,"privateTabIndex",void 0),__decorate([queryAssignedElements()],GlideCoreTree.prototype,"slotElements",void 0),GlideCoreTree=__decorate([customElement("glide-core-tree")],GlideCoreTree);export default GlideCoreTree;
|