@crowdstrike/glide-core 0.9.5 → 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 +37 -14
- 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
@@ -0,0 +1,82 @@
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-expressions */
|
2
|
+
import './checkbox.js';
|
3
|
+
import { assert, elementUpdated, expect, fixture, html, } from '@open-wc/testing';
|
4
|
+
import GlideCoreCheckboxGroup from './checkbox-group.js';
|
5
|
+
GlideCoreCheckboxGroup.shadowRootOptions.mode = 'open';
|
6
|
+
it('checks and unchecks Checkboxes when `value` is changed programmatically', async () => {
|
7
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group">
|
8
|
+
<glide-core-checkbox label="One" value="one"></glide-core-checkbox>
|
9
|
+
<glide-core-checkbox label="Two" checked></glide-core-checkbox>
|
10
|
+
|
11
|
+
<glide-core-checkbox
|
12
|
+
label="Three"
|
13
|
+
value="three"
|
14
|
+
checked
|
15
|
+
></glide-core-checkbox>
|
16
|
+
</glide-core-checkbox-group>`);
|
17
|
+
component.value = ['one'];
|
18
|
+
const checkboxes = component.querySelectorAll('glide-core-checkbox');
|
19
|
+
expect(checkboxes[0].checked).to.be.true;
|
20
|
+
expect(checkboxes[1].checked).to.be.true;
|
21
|
+
expect(checkboxes[2].checked).to.be.false;
|
22
|
+
});
|
23
|
+
it('updates `value` when the `value` of a checked Checkbox is changed programmatically', async () => {
|
24
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group">
|
25
|
+
<glide-core-checkbox
|
26
|
+
label="One"
|
27
|
+
value="one"
|
28
|
+
checked
|
29
|
+
></glide-core-checkbox>
|
30
|
+
|
31
|
+
<glide-core-checkbox
|
32
|
+
label="Two"
|
33
|
+
value="two"
|
34
|
+
checked
|
35
|
+
></glide-core-checkbox>
|
36
|
+
</glide-core-checkbox-group>`);
|
37
|
+
const checkbox = component.querySelector('glide-core-checkbox');
|
38
|
+
assert(checkbox);
|
39
|
+
checkbox.value = 'three';
|
40
|
+
await elementUpdated(component);
|
41
|
+
expect(component.value).to.deep.equal(['three', 'two']);
|
42
|
+
expect(component.getAttribute('value')).to.equal('["three","two"]');
|
43
|
+
});
|
44
|
+
it('updates `value` when the `value` of a checked Checkbox is emptied programmatically', async () => {
|
45
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group">
|
46
|
+
<glide-core-checkbox
|
47
|
+
label="One"
|
48
|
+
value="one"
|
49
|
+
checked
|
50
|
+
></glide-core-checkbox>
|
51
|
+
|
52
|
+
<glide-core-checkbox
|
53
|
+
label="Two"
|
54
|
+
value="two"
|
55
|
+
checked
|
56
|
+
></glide-core-checkbox>
|
57
|
+
</glide-core-checkbox-group>`);
|
58
|
+
const checkbox = component.querySelector('glide-core-checkbox');
|
59
|
+
assert(checkbox);
|
60
|
+
checkbox.value = '';
|
61
|
+
await elementUpdated(component);
|
62
|
+
expect(component.value).to.deep.equal(['two']);
|
63
|
+
expect(component.getAttribute('value')).to.equal('["two"]');
|
64
|
+
});
|
65
|
+
it('enables disabled Checkboxes when `value` is set programmatically', async () => {
|
66
|
+
const component = await fixture(html `<glide-core-checkbox-group label="Checkbox Group">
|
67
|
+
<glide-core-checkbox
|
68
|
+
label="One"
|
69
|
+
value="one"
|
70
|
+
disabled
|
71
|
+
></glide-core-checkbox>
|
72
|
+
|
73
|
+
<glide-core-checkbox
|
74
|
+
label="Two"
|
75
|
+
value="two"
|
76
|
+
checked
|
77
|
+
></glide-core-checkbox>
|
78
|
+
</glide-core-checkbox-group>`);
|
79
|
+
component.value = ['one', 'two'];
|
80
|
+
const checkbox = component.querySelector('glide-core-checkbox');
|
81
|
+
expect(checkbox?.disabled).to.be.false;
|
82
|
+
});
|
package/dist/checkbox.d.ts
CHANGED
@@ -7,14 +7,13 @@ declare global {
|
|
7
7
|
}
|
8
8
|
}
|
9
9
|
/**
|
10
|
-
* @description A checkbox with a label and optional tooltip, summary, and description. Participates in forms and validation via `FormData` and various methods.
|
11
|
-
*
|
12
10
|
* @event change - `(event: Event) => void`
|
13
11
|
* @event input - `(event: Event) => void`
|
14
12
|
* @event invalid - `(event: Event) => void`
|
15
13
|
*
|
16
14
|
* @slot description - Additional information or context.
|
17
15
|
* @slot tooltip - Content for the tooltip.
|
16
|
+
* @slot private-icon
|
18
17
|
*/
|
19
18
|
export default class GlideCoreCheckbox extends LitElement {
|
20
19
|
#private;
|
@@ -29,14 +28,16 @@ export default class GlideCoreCheckbox extends LitElement {
|
|
29
28
|
get label(): string;
|
30
29
|
set label(label: string);
|
31
30
|
orientation: 'horizontal' | 'vertical';
|
32
|
-
name
|
31
|
+
name: string;
|
33
32
|
privateLabelTooltipOffset: number;
|
34
33
|
privateShowLabelTooltip: boolean;
|
34
|
+
privateSize: 'large' | 'small';
|
35
35
|
privateSplit?: 'left' | 'middle';
|
36
36
|
privateVariant?: 'minimal';
|
37
37
|
required: boolean;
|
38
38
|
summary?: string;
|
39
|
-
value: string;
|
39
|
+
get value(): string;
|
40
|
+
set value(value: string);
|
40
41
|
isReportValidityOrSubmit: boolean;
|
41
42
|
get form(): HTMLFormElement | null;
|
42
43
|
blur(): void;
|
package/dist/checkbox.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
var __decorate=this&&this.__decorate||function(e,t,i,o){var r,a=arguments.length,s=a<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,i):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,o);else for(var l=e.length-1;l>=0;l--)(r=e[l])&&(s=(a<3?r(s):a>3?r(t,i,s):r(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s};import"./label.js";import"./tooltip.js";import{LitElement,html}from"lit";import{classMap}from"lit/directives/class-map.js";import{createRef,ref}from"lit/directives/ref.js";import{customElement,property,state}from"lit/decorators.js";import{ifDefined}from"lit/directives/if-defined.js";import{when}from"lit/directives/when.js";import checkedIcon from"./icons/checked.js";import styles from"./checkbox.styles.js";const indeterminateIcon=html`<svg width="14" height="14" viewBox="0 0 14 14" fill="none" class="indeterminate-icon"><rect x="0.5" y="0.5" width="13" height="13" rx="3.5"/><path d="M3 5C3 3.89543 3.89543 3 5 3H9.79289C10.2383 3 10.4614 3.53857 10.1464 3.85355L3.85355 10.1464C3.53857 10.4614 3 10.2383 3 9.79289V5Z" fill="currentColor"/></svg>`;let GlideCoreCheckbox=class GlideCoreCheckbox extends LitElement{static{this.formAssociated=!0}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}get label(){return this.#e}set label(e){this.#e=e,setTimeout((()=>{this.#t()}))}get
|
1
|
+
var __decorate=this&&this.__decorate||function(e,t,i,o){var r,a=arguments.length,s=a<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,i):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,o);else for(var l=e.length-1;l>=0;l--)(r=e[l])&&(s=(a<3?r(s):a>3?r(t,i,s):r(t,i))||s);return a>3&&s&&Object.defineProperty(t,i,s),s};import"./label.js";import"./tooltip.js";import{LitElement,html}from"lit";import{classMap}from"lit/directives/class-map.js";import{createRef,ref}from"lit/directives/ref.js";import{customElement,property,state}from"lit/decorators.js";import{ifDefined}from"lit/directives/if-defined.js";import{when}from"lit/directives/when.js";import checkedIcon from"./icons/checked.js";import styles from"./checkbox.styles.js";const indeterminateIcon=html`<svg width="14" height="14" viewBox="0 0 14 14" fill="none" class="indeterminate-icon"><rect x="0.5" y="0.5" width="13" height="13" rx="3.5"/><path d="M3 5C3 3.89543 3.89543 3 5 3H9.79289C10.2383 3 10.4614 3.53857 10.1464 3.85355L3.85355 10.1464C3.53857 10.4614 3 10.2383 3 9.79289V5Z" fill="currentColor"/></svg>`;let GlideCoreCheckbox=class GlideCoreCheckbox extends LitElement{static{this.formAssociated=!0}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}get label(){return this.#e}set label(e){this.#e=e,setTimeout((()=>{this.#t()}))}get value(){return this.#i}set value(e){this.dispatchEvent(new CustomEvent("private-value-change",{bubbles:!0,detail:{old:this.value,new:e}})),this.#i=e}get form(){return this.#o.form}blur(){this.#r.value?.blur()}checkValidity(){this.isCheckingValidity=!0;const e=this.#o.checkValidity();return this.isCheckingValidity=!1,e}click(){this.#r.value?.click()}connectedCallback(){super.connectedCallback(),this.#a=new IntersectionObserver((()=>{this.checkVisibility()&&this.#t()})),this.#a.observe(this)}disconnectedCallback(){super.disconnectedCallback(),this.form?.removeEventListener("formdata",this.#s),this.#a?.disconnect()}get validity(){return"minimal"===this.privateVariant||(this.required&&!this.checked?this.#o.setValidity({valueMissing:!0}," ",this.#r.value):this.#o.setValidity({})),this.#o.validity}focus(e){this.#r.value?.focus(e)}formAssociatedCallback(){this.form?.addEventListener("formdata",this.#s)}formResetCallback(){this.checked=""===this.getAttribute("checked"),this.indeterminate=""===this.getAttribute("indeterminate")}render(){return html`<div class="component" data-test="component">${when("minimal"===this.privateVariant,(()=>html`<label class="${classMap({"label-and-input-and-checkbox":!0,[this.privateSize]:!0})}" part="private-label-and-input-and-checkbox"><div class="input-and-checkbox"><input aria-invalid="${this.#l}" data-test="input" type="checkbox" .checked="${this.checked}" .inert="${this.internallyInert}" ?disabled="${this.disabled}" ?required="${this.required}" @change="${this.#n}" @input="${this.#n}" @keydown="${this.#d}" ${ref(this.#r)}><div class="${classMap({checkbox:!0,disabled:this.disabled})}"><div class="checked-icon">${checkedIcon}</div>${indeterminateIcon}</div></div><div class="icon-and-label"><slot name="private-icon"></slot><glide-core-tooltip class="label-tooltip" offset="${this.privateLabelTooltipOffset}" ?disabled="${!this.isLabelOverflow}" ?open="${this.privateShowLabelTooltip}"><div aria-hidden="true" data-test="tooltip">${this.label}</div><div class="label" slot="target" ${ref(this.#h)}>${this.label}</div></glide-core-tooltip></div></label>`),(()=>html`<glide-core-private-label orientation="${this.orientation}" split="${ifDefined(this.privateSplit??void 0)}" ?disabled="${this.disabled}" ?error="${this.#l}" ?hide="${this.hideLabel}" ?required="${this.required}"><slot name="tooltip" slot="tooltip"></slot><label for="input">${this.label}</label><div class="input-and-checkbox" slot="control"><input aria-describedby="summary description" aria-invalid="${this.#l}" data-test="input" id="input" type="checkbox" .checked="${this.checked}" ?disabled="${this.disabled}" ?required="${this.required}" @blur="${this.#c}" @change="${this.#n}" @input="${this.#n}" @keydown="${this.#d}" ${ref(this.#r)}><div class="${classMap({checkbox:!0,disabled:this.disabled,error:this.#l})}"><div class="checked-icon">${checkedIcon}</div>${indeterminateIcon}</div></div><div id="summary" slot="summary">${this.summary}</div><slot id="description" name="description" slot="description"></slot></glide-core-private-label>`))}</div>`}reportValidity(){this.isReportValidityOrSubmit=!0;const e=this.#o.reportValidity();return this.requestUpdate(),e}setValidity(e,t,i){return this.#o.setValidity(e,t,i)}get willValidate(){return this.#o.willValidate}updated(){this.#r.value&&(this.#r.value.indeterminate=this.indeterminate)}constructor(){super(),this.checked=!1,this.internallyInert=!1,this.disabled=!1,this.hideLabel=!1,this.indeterminate=!1,this.orientation="horizontal",this.name="",this.privateLabelTooltipOffset=4,this.privateShowLabelTooltip=!1,this.privateSize="large",this.required=!1,this.isReportValidityOrSubmit=!1,this.isBlurring=!1,this.isCheckingValidity=!1,this.isLabelOverflow=!1,this.#r=createRef(),this.#e="",this.#h=createRef(),this.#i="",this.#s=({formData:e})=>{this.checked&&this.name&&this.value&&!this.disabled&&e.append(this.name,this.value)},this.#o=this.attachInternals(),this.addEventListener("invalid",(e=>{if(e?.preventDefault(),this.isCheckingValidity||this.isBlurring)return;this.isReportValidityOrSubmit=!0;this.form?.querySelector(":invalid")===this&&this.focus()}))}#r;#o;#a;#e;#h;#i;#s;get#l(){return"minimal"===this.privateVariant?!this.validity.valid&&this.isReportValidityOrSubmit:this.required&&!this.disabled&&!this.validity.valid&&this.isReportValidityOrSubmit}#c(){this.isBlurring=!0,this.reportValidity(),this.isBlurring=!1}#n(e){e.target instanceof HTMLInputElement&&(this.checked=e.target.checked),this.indeterminate=!1,"change"===e.type&&this.dispatchEvent(new Event(e.type,e))}#d(e){"Enter"===e.key&&this.form?.requestSubmit()}#t(){this.#h.value&&(this.isLabelOverflow=this.#h.value.scrollWidth>this.#h.value.clientWidth)}};__decorate([property({type:Boolean})],GlideCoreCheckbox.prototype,"checked",void 0),__decorate([property({attribute:"internally-inert",type:Boolean})],GlideCoreCheckbox.prototype,"internallyInert",void 0),__decorate([property({reflect:!0,type:Boolean})],GlideCoreCheckbox.prototype,"disabled",void 0),__decorate([property({attribute:"hide-label",type:Boolean})],GlideCoreCheckbox.prototype,"hideLabel",void 0),__decorate([property({type:Boolean})],GlideCoreCheckbox.prototype,"indeterminate",void 0),__decorate([property({reflect:!0})],GlideCoreCheckbox.prototype,"label",null),__decorate([property({reflect:!0})],GlideCoreCheckbox.prototype,"orientation",void 0),__decorate([property({reflect:!0})],GlideCoreCheckbox.prototype,"name",void 0),__decorate([property({attribute:"private-label-tooltip-offset",reflect:!0,type:Number})],GlideCoreCheckbox.prototype,"privateLabelTooltipOffset",void 0),__decorate([property({attribute:"private-show-label-tooltip",reflect:!0,type:Boolean})],GlideCoreCheckbox.prototype,"privateShowLabelTooltip",void 0),__decorate([property({attribute:"private-size"})],GlideCoreCheckbox.prototype,"privateSize",void 0),__decorate([property()],GlideCoreCheckbox.prototype,"privateSplit",void 0),__decorate([property({attribute:"private-variant"})],GlideCoreCheckbox.prototype,"privateVariant",void 0),__decorate([property({reflect:!0,type:Boolean})],GlideCoreCheckbox.prototype,"required",void 0),__decorate([property({reflect:!0})],GlideCoreCheckbox.prototype,"summary",void 0),__decorate([property({reflect:!0})],GlideCoreCheckbox.prototype,"value",null),__decorate([state()],GlideCoreCheckbox.prototype,"isReportValidityOrSubmit",void 0),__decorate([state()],GlideCoreCheckbox.prototype,"isBlurring",void 0),__decorate([state()],GlideCoreCheckbox.prototype,"isCheckingValidity",void 0),__decorate([state()],GlideCoreCheckbox.prototype,"isLabelOverflow",void 0),GlideCoreCheckbox=__decorate([customElement("glide-core-checkbox")],GlideCoreCheckbox);export default GlideCoreCheckbox;
|
package/dist/checkbox.styles.js
CHANGED
@@ -15,13 +15,25 @@ when browsers support them.
|
|
15
15
|
.label-and-input-and-checkbox {
|
16
16
|
align-items: center;
|
17
17
|
display: flex;
|
18
|
-
font-family: var(--glide-core-heading-xxxs-font-family);
|
19
|
-
font-size: var(--glide-core-heading-xxxs-font-size);
|
20
|
-
font-style: var(--glide-core-heading-xxxs-font-style);
|
21
|
-
font-variant: var(--glide-core-heading-xxxs-font-variant);
|
22
|
-
font-weight: var(--glide-core-body-xs-font-weight);
|
23
|
-
gap: var(--glide-core-spacing-sm);
|
24
18
|
line-height: 100%;
|
19
|
+
|
20
|
+
&.large {
|
21
|
+
column-gap: var(--glide-core-spacing-sm);
|
22
|
+
font-family: var(--glide-core-body-sm-font-family);
|
23
|
+
font-size: var(--glide-core-body-sm-font-size);
|
24
|
+
font-style: var(--glide-core-body-sm-font-style);
|
25
|
+
font-variant: var(--glide-core-body-sm-font-variant);
|
26
|
+
font-weight: var(--glide-core-body-sm-font-weight);
|
27
|
+
}
|
28
|
+
|
29
|
+
&.small {
|
30
|
+
column-gap: var(--glide-core-spacing-xs);
|
31
|
+
font-family: var(--glide-core-body-xs-font-family);
|
32
|
+
font-size: var(--glide-core-body-xs-font-size);
|
33
|
+
font-style: var(--glide-core-body-xs-font-style);
|
34
|
+
font-variant: var(--glide-core-body-xs-font-variant);
|
35
|
+
font-weight: var(--glide-core-body-xs-font-weight);
|
36
|
+
}
|
25
37
|
}
|
26
38
|
|
27
39
|
.input-and-checkbox-and-summary {
|
@@ -49,7 +61,10 @@ when browsers support them.
|
|
49
61
|
flex-shrink: 0; /* Don't shrink when the summary wraps. */
|
50
62
|
inline-size: 100%;
|
51
63
|
justify-content: center;
|
52
|
-
|
64
|
+
|
65
|
+
@media (prefers-reduced-motion: no-preference) {
|
66
|
+
transition: box-shadow 200ms ease-in-out;
|
67
|
+
}
|
53
68
|
|
54
69
|
&.error:not(.disabled) {
|
55
70
|
border-color: var(--glide-core-status-error);
|
@@ -83,7 +98,8 @@ when browsers support them.
|
|
83
98
|
}
|
84
99
|
|
85
100
|
&:disabled:not(:is(:checked, :indeterminate)) ~ .checkbox {
|
86
|
-
|
101
|
+
background-color: var(--glide-core-surface-disabled);
|
102
|
+
border-color: var(--glide-core-border-base);
|
87
103
|
}
|
88
104
|
|
89
105
|
&:is(:checked, :indeterminate):not(:disabled) ~ .checkbox {
|
@@ -110,7 +126,10 @@ when browsers support them.
|
|
110
126
|
going in the opposite direction so that it'll animate from left-to-right.
|
111
127
|
*/
|
112
128
|
stroke-dashoffset: 48;
|
113
|
-
|
129
|
+
|
130
|
+
@media (prefers-reduced-motion: no-preference) {
|
131
|
+
transition: stroke-dashoffset 300ms cubic-bezier(0.32, 0, 0.67, 0);
|
132
|
+
}
|
114
133
|
}
|
115
134
|
}
|
116
135
|
}
|
@@ -150,6 +169,13 @@ when browsers support them.
|
|
150
169
|
stroke: var(--glide-core-icon-active);
|
151
170
|
}
|
152
171
|
|
172
|
+
.icon-and-label {
|
173
|
+
align-items: center;
|
174
|
+
column-gap: var(--glide-core-spacing-xs);
|
175
|
+
display: flex;
|
176
|
+
overflow: hidden;
|
177
|
+
}
|
178
|
+
|
153
179
|
.label-tooltip {
|
154
180
|
overflow: hidden;
|
155
181
|
}
|
@@ -159,10 +185,4 @@ when browsers support them.
|
|
159
185
|
text-overflow: ellipsis;
|
160
186
|
white-space: nowrap;
|
161
187
|
}
|
162
|
-
|
163
|
-
@media (prefers-reduced-motion: reduce) {
|
164
|
-
.checked-icon .check {
|
165
|
-
transition: none !important;
|
166
|
-
}
|
167
|
-
}
|
168
188
|
`];
|
@@ -7,24 +7,15 @@ it('registers', async () => {
|
|
7
7
|
});
|
8
8
|
it('has defaults', async () => {
|
9
9
|
const component = await fixture(html `<glide-core-checkbox label="Label"></glide-core-checkbox>`);
|
10
|
-
expect(component.hasAttribute('checked')).to.be.false;
|
11
10
|
expect(component.checked).to.be.false;
|
12
|
-
expect(component.hasAttribute('disabled')).to.be.false;
|
13
11
|
expect(component.disabled).to.be.false;
|
14
|
-
expect(component.hasAttribute('hide-label')).to.be.false;
|
15
12
|
expect(component.hideLabel).to.be.false;
|
16
|
-
expect(component.hasAttribute('indeterminate')).to.be.false;
|
17
13
|
expect(component.indeterminate).to.be.false;
|
18
|
-
expect(component.
|
19
|
-
expect(component.name).to.equal(undefined);
|
20
|
-
expect(component.getAttribute('orientation')).to.equal('horizontal');
|
14
|
+
expect(component.name).to.be.empty.string;
|
21
15
|
expect(component.orientation).to.equal('horizontal');
|
22
|
-
expect(component.hasAttribute('required')).to.be.false;
|
23
16
|
expect(component.required).to.be.false;
|
24
|
-
expect(component.getAttribute('summary')).to.be.null;
|
25
17
|
expect(component.summary).to.equal(undefined);
|
26
|
-
expect(component.
|
27
|
-
expect(component.value).to.equal('');
|
18
|
+
expect(component.value).to.be.empty.string;
|
28
19
|
});
|
29
20
|
it('is accessible', async () => {
|
30
21
|
const component = await fixture(html `<glide-core-checkbox label="Label">
|
@@ -77,12 +68,12 @@ it('can have a tooltip', async () => {
|
|
77
68
|
it('can be checked', async () => {
|
78
69
|
const component = await fixture(html `<glide-core-checkbox label="Label" checked></glide-core-checkbox> `);
|
79
70
|
expect(component.hasAttribute('checked')).to.be.true;
|
80
|
-
expect(component.checked).to.
|
71
|
+
expect(component.checked).to.be.true;
|
81
72
|
});
|
82
73
|
it('can be disabled', async () => {
|
83
74
|
const component = await fixture(html `<glide-core-checkbox label="Label" disabled></glide-core-checkbox> `);
|
84
75
|
expect(component.hasAttribute('disabled')).to.be.true;
|
85
|
-
expect(component.disabled).to.
|
76
|
+
expect(component.disabled).to.be.true;
|
86
77
|
});
|
87
78
|
it('can be indeterminate', async () => {
|
88
79
|
const component = await fixture(html `<glide-core-checkbox
|
@@ -90,10 +81,10 @@ it('can be indeterminate', async () => {
|
|
90
81
|
indeterminate
|
91
82
|
></glide-core-checkbox> `);
|
92
83
|
expect(component.hasAttribute('indeterminate')).to.be.true;
|
93
|
-
expect(component.indeterminate).to.
|
84
|
+
expect(component.indeterminate).to.be.true;
|
94
85
|
});
|
95
86
|
it('can be required', async () => {
|
96
87
|
const component = await fixture(html `<glide-core-checkbox label="Label" required></glide-core-checkbox> `);
|
97
88
|
expect(component.hasAttribute('required')).to.be.true;
|
98
|
-
expect(component.required).to.
|
89
|
+
expect(component.required).to.be.true;
|
99
90
|
});
|
@@ -1,3 +1,4 @@
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-expressions */
|
1
2
|
import { expect, fixture, html } from '@open-wc/testing';
|
2
3
|
import GlideCoreCheckbox from './checkbox.js';
|
3
4
|
GlideCoreCheckbox.shadowRootOptions.mode = 'open';
|
@@ -44,6 +45,7 @@ it('blurs the input and reports validity if `blur` is called', async () => {
|
|
44
45
|
component.blur();
|
45
46
|
await component.updateComplete;
|
46
47
|
expect(component.shadowRoot?.activeElement).to.equal(null);
|
47
|
-
expect(component.validity.valid).to.
|
48
|
-
expect(component.shadowRoot?.querySelector('glide-core-private-label')?.error)
|
48
|
+
expect(component.validity.valid).to.be.false;
|
49
|
+
expect(component.shadowRoot?.querySelector('glide-core-private-label')?.error)
|
50
|
+
.to.be.true;
|
49
51
|
});
|
@@ -6,14 +6,14 @@ it('is checked after being clicked', async () => {
|
|
6
6
|
const component = await fixture(html `<glide-core-checkbox label="Label"></glide-core-checkbox>`);
|
7
7
|
component.click();
|
8
8
|
await elementUpdated(component);
|
9
|
-
expect(component.checked).to.
|
9
|
+
expect(component.checked).to.be.true;
|
10
10
|
expect(component.hasAttribute('checked')).to.be.false;
|
11
11
|
});
|
12
12
|
it('is unchecked after being clicked', async () => {
|
13
13
|
const component = await fixture(html `<glide-core-checkbox label="Label" checked></glide-core-checkbox>`);
|
14
14
|
component.click();
|
15
15
|
await elementUpdated(component);
|
16
|
-
expect(component.checked).to.
|
16
|
+
expect(component.checked).to.be.false;
|
17
17
|
expect(component.hasAttribute('checked')).to.be.true;
|
18
18
|
});
|
19
19
|
it('is checked and not indeterminate after being clicked when unchecked and indeterminate', async () => {
|
@@ -25,8 +25,8 @@ it('is checked and not indeterminate after being clicked when unchecked and inde
|
|
25
25
|
await elementUpdated(component);
|
26
26
|
const input = component.shadowRoot?.querySelector('[data-test="input"]');
|
27
27
|
expect(input?.indeterminate).to.be.false;
|
28
|
-
expect(component.checked).to.
|
29
|
-
expect(component.indeterminate).to.
|
28
|
+
expect(component.checked).to.be.true;
|
29
|
+
expect(component.indeterminate).to.be.false;
|
30
30
|
expect(component.hasAttribute('checked')).to.be.false;
|
31
31
|
expect(component.hasAttribute('indeterminate')).to.be.true;
|
32
32
|
});
|
@@ -40,8 +40,8 @@ it('is unchecked and not indeterminate after being clicked when checked and inde
|
|
40
40
|
await elementUpdated(component);
|
41
41
|
const input = component.shadowRoot?.querySelector('[data-test="input"]');
|
42
42
|
expect(input?.indeterminate).to.be.false;
|
43
|
-
expect(component.checked).to.
|
44
|
-
expect(component.indeterminate).to.
|
43
|
+
expect(component.checked).to.be.false;
|
44
|
+
expect(component.indeterminate).to.be.false;
|
45
45
|
expect(component.hasAttribute('checked')).to.be.true;
|
46
46
|
expect(component.hasAttribute('indeterminate')).to.be.true;
|
47
47
|
});
|
@@ -53,7 +53,7 @@ it('is still checked after being clicked when checked but disabled', async () =>
|
|
53
53
|
></glide-core-checkbox>`);
|
54
54
|
component.click();
|
55
55
|
await elementUpdated(component);
|
56
|
-
expect(component.checked).to.
|
56
|
+
expect(component.checked).to.be.true;
|
57
57
|
expect(component.hasAttribute('checked')).to.be.true;
|
58
58
|
});
|
59
59
|
it('is still unchecked after being clicked when unchecked and disabled', async () => {
|
@@ -61,7 +61,7 @@ it('is still unchecked after being clicked when unchecked and disabled', async (
|
|
61
61
|
component.click();
|
62
62
|
await elementUpdated(component);
|
63
63
|
expect(component.hasAttribute('checked')).to.be.false;
|
64
|
-
expect(component.checked).to.
|
64
|
+
expect(component.checked).to.be.false;
|
65
65
|
});
|
66
66
|
it('is unchecked after being clicked then forcibly unchecked via a "input" listener', async () => {
|
67
67
|
const component = await fixture(html `<glide-core-checkbox label="Label"></glide-core-checkbox>`);
|
@@ -72,7 +72,7 @@ it('is unchecked after being clicked then forcibly unchecked via a "input" liste
|
|
72
72
|
component.click();
|
73
73
|
await elementUpdated(component);
|
74
74
|
expect(component.hasAttribute('checked')).to.be.false;
|
75
|
-
expect(component.checked).to.
|
75
|
+
expect(component.checked).to.be.false;
|
76
76
|
});
|
77
77
|
it('is unchecked after being clicked then forcibly unchecked via an "change" listener', async () => {
|
78
78
|
const component = await fixture(html `<glide-core-checkbox label="Label"></glide-core-checkbox>`);
|
@@ -83,7 +83,7 @@ it('is unchecked after being clicked then forcibly unchecked via an "change" lis
|
|
83
83
|
component.click();
|
84
84
|
await elementUpdated(component);
|
85
85
|
expect(component.hasAttribute('checked')).to.be.false;
|
86
|
-
expect(component.checked).to.
|
86
|
+
expect(component.checked).to.be.false;
|
87
87
|
});
|
88
88
|
it('is still indeterminate after being clicked when unchecked and disabled', async () => {
|
89
89
|
const component = await fixture(html `<glide-core-checkbox
|
@@ -95,7 +95,7 @@ it('is still indeterminate after being clicked when unchecked and disabled', asy
|
|
95
95
|
await elementUpdated(component);
|
96
96
|
const input = component.shadowRoot?.querySelector('[data-test="input"]');
|
97
97
|
expect(input?.indeterminate).to.be.true;
|
98
|
-
expect(component.indeterminate).to.
|
98
|
+
expect(component.indeterminate).to.be.true;
|
99
99
|
expect(component.hasAttribute('indeterminate')).to.be.true;
|
100
100
|
});
|
101
101
|
it('has a tooltip when minimal and with a long label', async () => {
|
package/dist/drawer.d.ts
CHANGED
@@ -5,13 +5,10 @@ declare global {
|
|
5
5
|
}
|
6
6
|
}
|
7
7
|
/**
|
8
|
-
*
|
9
|
-
* @description A drawer for arbitrary content.
|
10
8
|
*
|
11
9
|
* @cssprop [--width] - The width the drawer.
|
12
10
|
*
|
13
11
|
* @event close
|
14
|
-
* @event open
|
15
12
|
*
|
16
13
|
* @slot - The content of the Drawer.
|
17
14
|
*/
|
@@ -23,8 +20,8 @@ export default class GlideCoreDrawer extends LitElement {
|
|
23
20
|
pinned: boolean;
|
24
21
|
close(): void;
|
25
22
|
firstUpdated(): void;
|
26
|
-
open(): void;
|
27
23
|
render(): import("lit").TemplateResult<1>;
|
28
|
-
|
24
|
+
show(): void;
|
29
25
|
private isOpen;
|
26
|
+
private state;
|
30
27
|
}
|
package/dist/drawer.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
var __decorate=this&&this.__decorate||function(e,t,s,o){var i,
|
1
|
+
var __decorate=this&&this.__decorate||function(e,t,s,o){var i,l=arguments.length,a=l<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,s):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,s,o);else for(var r=e.length-1;r>=0;r--)(i=e[r])&&(a=(l<3?i(a):l>3?i(t,s,a):i(t,s))||a);return l>3&&a&&Object.defineProperty(t,s,a),a};import{LitElement,html,nothing}from"lit";import{classMap}from"lit/directives/class-map.js";import{createRef,ref}from"lit/directives/ref.js";import{customElement,property,state}from"lit/decorators.js";import{owSlot}from"./library/ow.js";import styles from"./drawer.styles.js";let GlideCoreDrawer=class GlideCoreDrawer extends LitElement{constructor(){super(...arguments),this.label="",this.pinned=!1,this.isOpen=!1,this.state="closed",this.#e=createRef(),this.#t=createRef()}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}close(){"open"===this.state&&(this.#e?.value?.addEventListener("transitionend",(()=>{this.isOpen=!1,this.#e?.value?.classList?.remove("open"),this.#e?.value?.classList?.remove("closing"),this.state="closed",this.dispatchEvent(new Event("close",{bubbles:!0}))}),{once:!0}),this.#e?.value?.classList?.add("closing"),this.state="closing")}firstUpdated(){owSlot(this.#t.value)}render(){return html`<aside class="${classMap({component:!0,pinned:this.pinned})}" tabindex="-1" data-test-state="${this.isOpen?"open":"closed"}" @keydown="${this.#s}" ${ref(this.#e)} aria-label="${this.label||nothing}"><slot @slotchange="${this.#o}" ${ref(this.#t)}></slot></aside>`}show(){"closed"===this.state&&(this.#e?.value?.addEventListener("transitionend",(()=>{this.state="open",this.#e?.value?.focus()}),{once:!0}),this.#e?.value?.classList?.add("open"),this.state="opening",this.isOpen=!0)}#e;#t;#o(){owSlot(this.#t.value)}#s(e){"Escape"===e.key&&this.close()}};__decorate([property()],GlideCoreDrawer.prototype,"label",void 0),__decorate([property({type:Boolean})],GlideCoreDrawer.prototype,"pinned",void 0),__decorate([state()],GlideCoreDrawer.prototype,"isOpen",void 0),__decorate([state()],GlideCoreDrawer.prototype,"state",void 0),GlideCoreDrawer=__decorate([customElement("glide-core-drawer")],GlideCoreDrawer);export default GlideCoreDrawer;
|
@@ -5,18 +5,18 @@ GlideCoreDrawer.shadowRootOptions.mode = 'open';
|
|
5
5
|
// NOTE: Due to https://github.com/modernweb-dev/web/issues/2520, we sometimes need
|
6
6
|
// to manually dispatch the `transitionend` event in tests.
|
7
7
|
it('is accessible', async () => {
|
8
|
-
const
|
9
|
-
|
8
|
+
const component = await fixture(html `<glide-core-drawer>Drawer content</glide-core-drawer>`);
|
9
|
+
component.shadowRoot
|
10
10
|
?.querySelector('aside')
|
11
11
|
?.dispatchEvent(new TransitionEvent('transitionend'));
|
12
|
-
|
13
|
-
await expect(
|
12
|
+
component.show();
|
13
|
+
await expect(component).to.be.accessible();
|
14
14
|
});
|
15
15
|
it('focuses the aside upon opening', async () => {
|
16
|
-
const
|
17
|
-
|
18
|
-
|
16
|
+
const component = await fixture(html `<glide-core-drawer>Drawer content</glide-core-drawer>`);
|
17
|
+
component.show();
|
18
|
+
component.shadowRoot
|
19
19
|
?.querySelector('aside')
|
20
20
|
?.dispatchEvent(new TransitionEvent('transitionend'));
|
21
|
-
expect(
|
21
|
+
expect(component.shadowRoot?.activeElement).to.equal(component.shadowRoot?.querySelector('aside'));
|
22
22
|
});
|
@@ -8,24 +8,24 @@ it('registers', async () => {
|
|
8
8
|
expect(window.customElements.get('glide-core-drawer')).to.equal(GlideCoreDrawer);
|
9
9
|
});
|
10
10
|
it('adds an aria-label when "label" is set', async () => {
|
11
|
-
const
|
12
|
-
expect(
|
11
|
+
const component = await fixture(html `<glide-core-drawer label="label">Drawer content</glide-core-drawer>`);
|
12
|
+
expect(component.shadowRoot?.querySelector('aside')?.ariaLabel).to.equal('label');
|
13
13
|
});
|
14
14
|
it('does not add an aria-label when "label" is unset', async () => {
|
15
|
-
const
|
16
|
-
expect(
|
15
|
+
const component = await fixture(html `<glide-core-drawer>Drawer content</glide-core-drawer>`);
|
16
|
+
expect(component.shadowRoot?.querySelector('aside')).to.not.have.attribute('aria-label');
|
17
17
|
});
|
18
18
|
it('can have a default slot', async () => {
|
19
|
-
const
|
20
|
-
|
21
|
-
expect(
|
19
|
+
const component = await fixture(html `<glide-core-drawer>Drawer content</glide-core-drawer>`);
|
20
|
+
component.show();
|
21
|
+
expect(component.textContent).to.equal('Drawer content');
|
22
22
|
});
|
23
23
|
it('sets the width of the element based on the "--width" CSS variable', async () => {
|
24
24
|
const styledDiv = document.createElement('div');
|
25
25
|
styledDiv.setAttribute('style', '--width: 750px');
|
26
|
-
const
|
27
|
-
|
28
|
-
expect(
|
26
|
+
const component = await fixture(html `<glide-core-drawer>Drawer content</glide-core-drawer>`, { parentNode: styledDiv });
|
27
|
+
component.show();
|
28
|
+
expect(component.shadowRoot?.querySelector('aside')?.clientWidth).to.equal(750);
|
29
29
|
});
|
30
30
|
it('throws if it does not have a default slot', async () => {
|
31
31
|
await expectArgumentError(() => {
|
@@ -33,12 +33,12 @@ it('throws if it does not have a default slot', async () => {
|
|
33
33
|
});
|
34
34
|
});
|
35
35
|
it('adds a class when the "pinned" attribute is set', async () => {
|
36
|
-
const
|
37
|
-
|
38
|
-
expect(
|
36
|
+
const component = await fixture(html `<glide-core-drawer pinned>Drawer content</glide-core-drawer>`);
|
37
|
+
component.show();
|
38
|
+
expect(component.shadowRoot?.querySelector('aside')?.classList.contains('pinned')).to.be.true;
|
39
39
|
});
|
40
40
|
it('does not add a class when the "pinned" attribute is not set', async () => {
|
41
|
-
const
|
42
|
-
|
43
|
-
expect(
|
41
|
+
const component = await fixture(html `<glide-core-drawer>Drawer content</glide-core-drawer>`);
|
42
|
+
component.show();
|
43
|
+
expect(component.shadowRoot?.querySelector('aside')?.classList.contains('pinned')).to.be.false;
|
44
44
|
});
|
@@ -1,38 +1,40 @@
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-unused-expressions */
|
2
2
|
import './drawer.js';
|
3
3
|
import { elementUpdated, expect, fixture, html, oneEvent, } from '@open-wc/testing';
|
4
|
+
import { emulateMedia } from '@web/test-runner-commands';
|
4
5
|
import { sendKeys } from '@web/test-runner-commands';
|
5
6
|
import GlideCoreDrawer from './drawer.js';
|
6
7
|
GlideCoreDrawer.shadowRootOptions.mode = 'open';
|
7
8
|
// NOTE: Due to https://github.com/modernweb-dev/web/issues/2520, we sometimes need
|
8
9
|
// to manually dispatch the `transitionend` event in tests.
|
9
10
|
it('closes when the "Escape" key is pressed', async () => {
|
10
|
-
|
11
|
-
drawer
|
12
|
-
|
11
|
+
await emulateMedia({ reducedMotion: 'no-preference' });
|
12
|
+
const component = await fixture(html `<glide-core-drawer>Drawer content</glide-core-drawer>`);
|
13
|
+
component.show();
|
14
|
+
component.shadowRoot
|
13
15
|
?.querySelector('aside')
|
14
16
|
?.dispatchEvent(new TransitionEvent('transitionend'));
|
15
|
-
await elementUpdated(
|
17
|
+
await elementUpdated(component);
|
16
18
|
await sendKeys({ press: 'Escape' });
|
17
19
|
setTimeout(() => {
|
18
|
-
|
20
|
+
component.shadowRoot
|
19
21
|
?.querySelector('aside')
|
20
22
|
?.dispatchEvent(new TransitionEvent('transitionend'));
|
21
23
|
});
|
22
|
-
await oneEvent(
|
23
|
-
await elementUpdated(
|
24
|
-
expect(
|
25
|
-
.to.be.not.null;
|
24
|
+
await oneEvent(component, 'close');
|
25
|
+
await elementUpdated(component);
|
26
|
+
expect(component?.shadowRoot?.querySelector('aside[data-test-state="closed"]')).to.be.not.null;
|
26
27
|
});
|
27
28
|
it('does not close when a key other than "Escape" is pressed', async () => {
|
28
|
-
|
29
|
-
drawer
|
30
|
-
|
29
|
+
await emulateMedia({ reducedMotion: 'no-preference' });
|
30
|
+
const component = await fixture(html `<glide-core-drawer>Drawer content</glide-core-drawer>`);
|
31
|
+
component.show();
|
32
|
+
component.shadowRoot
|
31
33
|
?.querySelector('aside')
|
32
34
|
?.dispatchEvent(new TransitionEvent('transitionend'));
|
33
|
-
await elementUpdated(
|
34
|
-
|
35
|
+
await elementUpdated(component);
|
36
|
+
component.shadowRoot?.querySelector('aside')?.focus();
|
35
37
|
await sendKeys({ press: 'Enter' });
|
36
|
-
expect(
|
37
|
-
.be.not.null;
|
38
|
+
expect(component?.shadowRoot?.querySelector('aside[data-test-state="open"]'))
|
39
|
+
.to.be.not.null;
|
38
40
|
});
|