@crowdstrike/glide-core 0.9.6 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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.events.js +9 -0
- 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 +2 -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.option.test.events.js +9 -1
- package/dist/dropdown.option.test.interactions.single.js +2 -2
- package/dist/dropdown.styles.js +39 -3
- package/dist/dropdown.test.basics.d.ts +1 -1
- package/dist/dropdown.test.basics.js +27 -14
- package/dist/dropdown.test.basics.multiple.js +65 -32
- package/dist/dropdown.test.basics.single.js +49 -0
- package/dist/dropdown.test.events.filterable.js +13 -2
- package/dist/dropdown.test.focus.filterable.js +12 -3
- package/dist/dropdown.test.focus.js +18 -2
- package/dist/dropdown.test.form.multiple.js +3 -2
- package/dist/dropdown.test.interactions.filterable.js +141 -45
- package/dist/dropdown.test.interactions.js +24 -0
- package/dist/dropdown.test.interactions.multiple.js +87 -30
- package/dist/dropdown.test.interactions.single.js +40 -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 +3 -5
- package/dist/tab.group.js +1 -1
- package/dist/tab.group.styles.js +18 -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 +5 -4
- package/dist/tag.js +1 -1
- package/dist/tag.styles.js +47 -38
- package/dist/tag.test.basics.js +18 -110
- 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 +36 -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 -13
- package/dist/tooltip.test.basics.d.ts +1 -1
- package/dist/tooltip.test.basics.js +19 -19
- package/dist/tree.d.ts +0 -2
- package/dist/tree.item.d.ts +5 -7
- package/dist/tree.item.icon-button.d.ts +1 -4
- package/dist/tree.item.js +1 -1
- package/dist/tree.item.menu.d.ts +1 -2
- package/dist/tree.item.menu.js +1 -1
- package/dist/tree.item.menu.test.basics.js +31 -10
- package/dist/tree.item.styles.js +7 -9
- package/dist/tree.item.test.basics.js +43 -31
- package/dist/tree.test.basics.js +29 -29
- package/dist/tree.test.focus.js +77 -74
- package/package.json +12 -14
- package/dist/split-container.d.ts +0 -31
- package/dist/split-container.js +0 -1
- package/dist/split-container.styles.js +0 -132
- package/dist/split-container.test.basics.d.ts +0 -3
- package/dist/split-container.test.basics.js +0 -445
- package/dist/split-container.test.interactions.d.ts +0 -1
- package/dist/split-container.test.interactions.js +0 -20
- package/dist/split-link.d.ts +0 -25
- package/dist/split-link.js +0 -1
- package/dist/split-link.test.basics.d.ts +0 -1
- package/dist/split-link.test.basics.js +0 -93
- package/dist/split-link.test.interactions.d.ts +0 -1
- package/dist/split-link.test.interactions.js +0 -20
- package/dist/status-indicator.d.ts +0 -30
- package/dist/status-indicator.js +0 -1
- package/dist/status-indicator.stories.d.ts +0 -5
- package/dist/status-indicator.styles.js +0 -58
- package/dist/status-indicator.test.basics.d.ts +0 -1
- package/dist/status-indicator.test.basics.js +0 -102
- /package/dist/{split-container.styles.d.ts → split-button.primary-button.styles.d.ts} +0 -0
- /package/dist/{status-indicator.styles.d.ts → split-button.secondary-button.styles.d.ts} +0 -0
package/dist/radio.styles.js
CHANGED
@@ -13,16 +13,6 @@ import{css}from"lit";import focusOutline from"./styles/focus-outline.js";export
|
|
13
13
|
}
|
14
14
|
}
|
15
15
|
|
16
|
-
@media (prefers-reduced-motion: reduce) {
|
17
|
-
/**
|
18
|
-
':host' is targeted here to increase specificity so that
|
19
|
-
we don't need to use '!important' to turn off the animation.
|
20
|
-
*/
|
21
|
-
:host .component .radio-circle.checked.animate::after {
|
22
|
-
animation: none;
|
23
|
-
}
|
24
|
-
}
|
25
|
-
|
26
16
|
:host {
|
27
17
|
display: flex;
|
28
18
|
outline: none;
|
@@ -74,8 +64,10 @@ import{css}from"lit";import focusOutline from"./styles/focus-outline.js";export
|
|
74
64
|
|
75
65
|
&.animate {
|
76
66
|
&.checked {
|
77
|
-
|
78
|
-
|
67
|
+
@media (prefers-reduced-motion: no-preference) {
|
68
|
+
&::after {
|
69
|
+
animation: animate-radio 250ms cubic-bezier(0.25, 0, 0.3, 1);
|
70
|
+
}
|
79
71
|
}
|
80
72
|
}
|
81
73
|
}
|
package/dist/split-button.d.ts
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
import './menu.js';
|
2
1
|
import { LitElement } from 'lit';
|
3
2
|
declare global {
|
4
3
|
interface HTMLElementTagNameMap {
|
@@ -6,22 +5,20 @@ declare global {
|
|
6
5
|
}
|
7
6
|
}
|
8
7
|
/**
|
9
|
-
* @
|
8
|
+
* @slot - One of `<glide-core-split-button-primary-button>` or `<glide-core-split-button-primary-link>`.
|
10
9
|
*
|
11
|
-
* @slot
|
12
|
-
* @slot - A label for the contents of the button.
|
10
|
+
* @slot secondary-button - One of `<glide-core-split-button-secondary-button>`.
|
13
11
|
*/
|
14
12
|
export default class GlideCoreSplitButton extends LitElement {
|
15
13
|
#private;
|
16
14
|
static shadowRootOptions: ShadowRootInit;
|
17
15
|
static styles: import("lit").CSSResult[];
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
variant: 'primary' | 'secondary';
|
23
|
-
size: 'large' | 'small';
|
16
|
+
get size(): 'large' | 'small';
|
17
|
+
set size(size: 'large' | 'small');
|
18
|
+
get variant(): 'primary' | 'secondary';
|
19
|
+
set variant(variant: 'primary' | 'secondary');
|
24
20
|
firstUpdated(): void;
|
21
|
+
private get secondaryButtonElement();
|
22
|
+
private get primaryButtonElement();
|
25
23
|
render(): import("lit").TemplateResult<1>;
|
26
|
-
private hasPrefixSlot;
|
27
24
|
}
|
package/dist/split-button.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
var __decorate=this&&this.__decorate||function(t,e,o,
|
1
|
+
var __decorate=this&&this.__decorate||function(t,e,o,n){var i,r=arguments.length,l=r<3?e:null===n?n=Object.getOwnPropertyDescriptor(e,o):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)l=Reflect.decorate(t,e,o,n);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(l=(r<3?i(l):r>3?i(e,o,l):i(e,o))||l);return r>3&&l&&Object.defineProperty(e,o,l),l};import{LitElement,html}from"lit";import{createRef,ref}from"lit/directives/ref.js";import{customElement,property}from"lit/decorators.js";import{owSlot,owSlotType}from"./library/ow.js";import GlideCoreSplitButtonPrimaryButton from"./split-button.primary-button.js";import GlideCoreSplitButtonPrimaryLink from"./split-button.primary-link.js";import GlideCoreSplitButtonSecondaryButton from"./split-button.secondary-button.js";import styles from"./split-button.styles.js";let GlideCoreSplitButton=class GlideCoreSplitButton extends LitElement{static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}get size(){return this.#t}set size(t){this.#t=t,this.primaryButtonElement&&(this.primaryButtonElement.privateSize=t),this.secondaryButtonElement&&(this.secondaryButtonElement.privateSize=t)}get variant(){return this.#e}set variant(t){this.#e=t,this.primaryButtonElement&&(this.primaryButtonElement.privateVariant=t),this.secondaryButtonElement&&(this.secondaryButtonElement.privateVariant=t)}firstUpdated(){owSlot(this.#o.value),owSlot(this.#n.value),owSlotType(this.#o.value,[GlideCoreSplitButtonPrimaryButton,GlideCoreSplitButtonPrimaryLink]),owSlotType(this.#n.value,[GlideCoreSplitButtonSecondaryButton])}get secondaryButtonElement(){const t=this.#n.value?.assignedElements().at(0);if(t instanceof GlideCoreSplitButtonSecondaryButton)return t}get primaryButtonElement(){const t=this.#o.value?.assignedElements().at(0);if(t instanceof GlideCoreSplitButtonPrimaryButton||t instanceof GlideCoreSplitButtonPrimaryLink)return t}render(){return html`<div class="component"><slot @slotchange="${this.#i}" ${ref(this.#o)}></slot><slot name="secondary-button" @slotchange="${this.#r}" ${ref(this.#n)}></slot></div>`}#o=createRef();#n=createRef();#t="large";#e="primary";#i(){owSlot(this.#o.value),owSlotType(this.#o.value,[GlideCoreSplitButtonPrimaryButton,GlideCoreSplitButtonPrimaryLink]),this.primaryButtonElement&&(this.primaryButtonElement.privateSize=this.size,this.primaryButtonElement.privateVariant=this.variant)}#r(){owSlotType(this.#n.value,[GlideCoreSplitButtonSecondaryButton]),this.secondaryButtonElement&&(this.secondaryButtonElement.privateSize=this.size,this.secondaryButtonElement.privateVariant=this.variant)}};__decorate([property({reflect:!0})],GlideCoreSplitButton.prototype,"size",null),__decorate([property({reflect:!0})],GlideCoreSplitButton.prototype,"variant",null),GlideCoreSplitButton=__decorate([customElement("glide-core-split-button")],GlideCoreSplitButton);export default GlideCoreSplitButton;
|
@@ -0,0 +1,21 @@
|
|
1
|
+
import { LitElement } from 'lit';
|
2
|
+
declare global {
|
3
|
+
interface HTMLElementTagNameMap {
|
4
|
+
'glide-core-split-button-primary-button': GlideCoreSplitButtonPrimaryButton;
|
5
|
+
}
|
6
|
+
}
|
7
|
+
/**
|
8
|
+
* @slot icon - An optional icon before the label.
|
9
|
+
*/
|
10
|
+
export default class GlideCoreSplitButtonPrimaryButton extends LitElement {
|
11
|
+
static shadowRootOptions: ShadowRootInit;
|
12
|
+
static styles: import("lit").CSSResult[];
|
13
|
+
ariaControls: string | null;
|
14
|
+
ariaExpanded: 'true' | 'false' | null;
|
15
|
+
ariaHasPopup: 'true' | 'false' | 'menu' | 'listbox' | 'tree' | 'grid' | 'dialog' | null;
|
16
|
+
disabled: boolean;
|
17
|
+
label?: string;
|
18
|
+
privateSize: 'large' | 'small';
|
19
|
+
privateVariant: 'primary' | 'secondary';
|
20
|
+
render(): import("lit").TemplateResult<1>;
|
21
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
var __decorate=this&&this.__decorate||function(t,e,o,r){var i,a=arguments.length,l=a<3?e:null===r?r=Object.getOwnPropertyDescriptor(e,o):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)l=Reflect.decorate(t,e,o,r);else for(var p=t.length-1;p>=0;p--)(i=t[p])&&(l=(a<3?i(l):a>3?i(e,o,l):i(e,o))||l);return a>3&&l&&Object.defineProperty(e,o,l),l};import{LitElement,html}from"lit";import{classMap}from"lit/directives/class-map.js";import{customElement,property,state}from"lit/decorators.js";import{ifDefined}from"lit/directives/if-defined.js";import styles from"./split-button.primary-button.styles.js";let GlideCoreSplitButtonPrimaryButton=class GlideCoreSplitButtonPrimaryButton extends LitElement{constructor(){super(...arguments),this.ariaControls=null,this.ariaExpanded=null,this.ariaHasPopup=null,this.disabled=!1,this.privateSize="large",this.privateVariant="primary"}static{this.shadowRootOptions={...LitElement.shadowRootOptions,delegatesFocus:!0,mode:"closed"}}static{this.styles=styles}render(){return html`<button aria-controls="${ifDefined(this.ariaControls??void 0)}" aria-expanded="${ifDefined(this.ariaExpanded??void 0)}" aria-haspopup="${ifDefined(this.ariaHasPopup??void 0)}" class="${classMap({component:!0,disabled:this.disabled,[this.privateVariant]:!0,[this.privateSize]:!0})}" data-test="component" type="button" ?disabled="${this.disabled}"><slot name="icon"></slot>${this.label}</button>`}};__decorate([property({attribute:"aria-controls",reflect:!0})],GlideCoreSplitButtonPrimaryButton.prototype,"ariaControls",void 0),__decorate([property({attribute:"aria-expanded",reflect:!0})],GlideCoreSplitButtonPrimaryButton.prototype,"ariaExpanded",void 0),__decorate([property({attribute:"aria-haspopup",reflect:!0})],GlideCoreSplitButtonPrimaryButton.prototype,"ariaHasPopup",void 0),__decorate([property({reflect:!0,type:Boolean})],GlideCoreSplitButtonPrimaryButton.prototype,"disabled",void 0),__decorate([property({reflect:!0})],GlideCoreSplitButtonPrimaryButton.prototype,"label",void 0),__decorate([state()],GlideCoreSplitButtonPrimaryButton.prototype,"privateSize",void 0),__decorate([state()],GlideCoreSplitButtonPrimaryButton.prototype,"privateVariant",void 0),GlideCoreSplitButtonPrimaryButton=__decorate([customElement("glide-core-split-button-primary-button")],GlideCoreSplitButtonPrimaryButton);export default GlideCoreSplitButtonPrimaryButton;
|
@@ -0,0 +1,96 @@
|
|
1
|
+
import{css}from"lit";import focusOutline from"./styles/focus-outline.js";export default[css`
|
2
|
+
${focusOutline(".component:focus-visible")}
|
3
|
+
`,css`
|
4
|
+
.component {
|
5
|
+
align-items: center;
|
6
|
+
border-radius: 0.75rem 0 0 0.75rem;
|
7
|
+
border-style: solid;
|
8
|
+
border-width: 1px 0 1px 1px;
|
9
|
+
cursor: pointer;
|
10
|
+
display: inline-flex;
|
11
|
+
font-family: var(--glide-core-heading-xxs-font-family);
|
12
|
+
font-style: var(--glide-core-heading-xxs-font-style);
|
13
|
+
font-weight: var(--glide-core-heading-xxs-font-weight);
|
14
|
+
gap: 0.625rem;
|
15
|
+
justify-content: center;
|
16
|
+
padding-block: var(--glide-core-spacing-xs);
|
17
|
+
padding-inline: var(--glide-core-spacing-md);
|
18
|
+
padding-inline-end: var(--glide-core-spacing-xs);
|
19
|
+
position: relative;
|
20
|
+
text-decoration: none;
|
21
|
+
transition-duration: 150ms;
|
22
|
+
transition-property: color, background-color, border-color, stroke;
|
23
|
+
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
24
|
+
user-select: none;
|
25
|
+
|
26
|
+
/* So the box shadow and focus outline aren't covered up by the secondary button. */
|
27
|
+
z-index: 1;
|
28
|
+
|
29
|
+
&:focus {
|
30
|
+
outline: none;
|
31
|
+
}
|
32
|
+
|
33
|
+
&:focus-visible {
|
34
|
+
/* Covers up the secondary button's border. */
|
35
|
+
box-shadow: 0 0 0 2px var(--glide-core-surface-page) !important;
|
36
|
+
}
|
37
|
+
|
38
|
+
&.primary {
|
39
|
+
background-color: var(--glide-core-surface-primary);
|
40
|
+
border-color: transparent;
|
41
|
+
color: var(--glide-core-text-selected);
|
42
|
+
}
|
43
|
+
|
44
|
+
&.secondary {
|
45
|
+
background-color: var(--glide-core-surface-page);
|
46
|
+
border-color: var(--glide-core-border-primary);
|
47
|
+
color: var(--glide-core-text-primary);
|
48
|
+
|
49
|
+
&:not(.disabled) {
|
50
|
+
/* So it has a right border when the secondary button is disabled. */
|
51
|
+
box-shadow: 1px 0 0 var(--glide-core-border-primary);
|
52
|
+
}
|
53
|
+
}
|
54
|
+
|
55
|
+
&.small {
|
56
|
+
block-size: 1.75rem;
|
57
|
+
box-sizing: border-box;
|
58
|
+
font-size: var(--glide-core-body-xs-font-size);
|
59
|
+
line-height: 1rem;
|
60
|
+
}
|
61
|
+
|
62
|
+
&.large {
|
63
|
+
block-size: 2.125rem;
|
64
|
+
box-sizing: border-box;
|
65
|
+
font-size: var(--glide-core-body-xxs-font-size);
|
66
|
+
line-height: 1.5rem;
|
67
|
+
}
|
68
|
+
|
69
|
+
/*
|
70
|
+
A "disabled" class is used instead of ":disabled" because these styles are
|
71
|
+
shared between Split Button Primary Button and Split Button Primary Link.
|
72
|
+
*/
|
73
|
+
&.disabled {
|
74
|
+
background-color: var(--glide-core-surface-disabled);
|
75
|
+
border-color: transparent;
|
76
|
+
color: var(--glide-core-text-tertiary-disabled);
|
77
|
+
cursor: not-allowed;
|
78
|
+
}
|
79
|
+
|
80
|
+
&:not(:active, .disabled):is(:focus, :hover) {
|
81
|
+
background-color: var(--glide-core-surface-hover);
|
82
|
+
border-color: transparent;
|
83
|
+
color: var(--glide-core-text-primary);
|
84
|
+
}
|
85
|
+
|
86
|
+
&:not(:active, .disabled):is(:hover) {
|
87
|
+
box-shadow: var(--glide-core-glow-sm);
|
88
|
+
z-index: 1;
|
89
|
+
}
|
90
|
+
|
91
|
+
&:not(.disabled):active {
|
92
|
+
background-color: var(--glide-core-surface-selected-hover);
|
93
|
+
color: var(--glide-core-text-selected);
|
94
|
+
}
|
95
|
+
}
|
96
|
+
`];
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,31 @@
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-expressions */
|
2
|
+
import { elementUpdated, expect, fixture, html } from '@open-wc/testing';
|
3
|
+
import GlideCoreSplitButtonPrimaryButton from './split-button.primary-button.js';
|
4
|
+
GlideCoreSplitButtonPrimaryButton.shadowRootOptions.mode = 'open';
|
5
|
+
it('registers', async () => {
|
6
|
+
expect(window.customElements.get('glide-core-split-button-primary-button')).to.equal(GlideCoreSplitButtonPrimaryButton);
|
7
|
+
});
|
8
|
+
it('is accessible', async () => {
|
9
|
+
const component = await fixture(html `
|
10
|
+
<glide-core-split-button-primary-button
|
11
|
+
label="Label"
|
12
|
+
></glide-core-split-button-primary-button>
|
13
|
+
`);
|
14
|
+
await expect(component).to.be.accessible();
|
15
|
+
component.disabled = true;
|
16
|
+
await elementUpdated(component);
|
17
|
+
await expect(component).to.be.accessible();
|
18
|
+
});
|
19
|
+
it('has defaults', async () => {
|
20
|
+
const component = await fixture(html `
|
21
|
+
<glide-core-split-button-primary-button
|
22
|
+
label="Label"
|
23
|
+
></glide-core-split-button-primary-button>
|
24
|
+
`);
|
25
|
+
expect(component.ariaControls).to.be.null;
|
26
|
+
expect(component.ariaExpanded).to.be.null;
|
27
|
+
expect(component.ariaHasPopup).to.be.null;
|
28
|
+
expect(component.disabled).to.be.false;
|
29
|
+
expect(component.privateSize).to.equal('large');
|
30
|
+
expect(component.privateVariant).to.equal('primary');
|
31
|
+
});
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,14 @@
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-expressions */
|
2
|
+
import { expect, fixture, html } from '@open-wc/testing';
|
3
|
+
import GlideCoreSplitButtonPrimaryButton from './split-button.primary-button.js';
|
4
|
+
GlideCoreSplitButtonPrimaryButton.shadowRootOptions.mode = 'open';
|
5
|
+
it('focuses itself when `focus()` is called', async () => {
|
6
|
+
const component = await fixture(html `
|
7
|
+
<glide-core-split-button-primary-button
|
8
|
+
label="Label"
|
9
|
+
></glide-core-split-button-primary-button>
|
10
|
+
`);
|
11
|
+
component.focus();
|
12
|
+
const button = component.shadowRoot?.querySelector('[data-test="component"]');
|
13
|
+
expect(component.shadowRoot?.activeElement).to.equal(button);
|
14
|
+
});
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import { LitElement } from 'lit';
|
2
|
+
declare global {
|
3
|
+
interface HTMLElementTagNameMap {
|
4
|
+
'glide-core-split-button-primary-link': GlideCoreSplitButtonPrimaryLink;
|
5
|
+
}
|
6
|
+
}
|
7
|
+
/**
|
8
|
+
* @slot icon - An optional icon before the label.
|
9
|
+
*/
|
10
|
+
export default class GlideCoreSplitButtonPrimaryLink extends LitElement {
|
11
|
+
static shadowRootOptions: ShadowRootInit;
|
12
|
+
static styles: import("lit").CSSResult[];
|
13
|
+
disabled: boolean;
|
14
|
+
label?: string;
|
15
|
+
url?: string;
|
16
|
+
privateSize: 'large' | 'small';
|
17
|
+
privateVariant: 'primary' | 'secondary';
|
18
|
+
render(): import("lit").TemplateResult<1>;
|
19
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
var __decorate=this&&this.__decorate||function(t,e,i,r){var o,a=arguments.length,l=a<3?e:null===r?r=Object.getOwnPropertyDescriptor(e,i):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)l=Reflect.decorate(t,e,i,r);else for(var s=t.length-1;s>=0;s--)(o=t[s])&&(l=(a<3?o(l):a>3?o(e,i,l):o(e,i))||l);return a>3&&l&&Object.defineProperty(e,i,l),l};import{LitElement,html}from"lit";import{classMap}from"lit/directives/class-map.js";import{customElement,property,state}from"lit/decorators.js";import{ifDefined}from"lit/directives/if-defined.js";import styles from"./split-button.primary-button.styles.js";let GlideCoreSplitButtonPrimaryLink=class GlideCoreSplitButtonPrimaryLink extends LitElement{constructor(){super(...arguments),this.disabled=!1,this.privateSize="large",this.privateVariant="primary"}static{this.shadowRootOptions={...LitElement.shadowRootOptions,delegatesFocus:!0,mode:"closed"}}static{this.styles=styles}render(){return this.disabled?html`<span aria-disabled="true" class="${classMap({component:!0,disabled:!0,[this.privateVariant]:!0,[this.privateSize]:!0})}" role="link"><slot name="icon"></slot>${this.label}</span>`:html`<a class="${classMap({component:!0,[this.privateVariant]:!0,[this.privateSize]:!0})}" data-test="component" href="${ifDefined(this.url)}"><slot name="icon"></slot>${this.label}</a>`}};__decorate([property({reflect:!0,type:Boolean})],GlideCoreSplitButtonPrimaryLink.prototype,"disabled",void 0),__decorate([property({reflect:!0})],GlideCoreSplitButtonPrimaryLink.prototype,"label",void 0),__decorate([property({reflect:!0})],GlideCoreSplitButtonPrimaryLink.prototype,"url",void 0),__decorate([state()],GlideCoreSplitButtonPrimaryLink.prototype,"privateSize",void 0),__decorate([state()],GlideCoreSplitButtonPrimaryLink.prototype,"privateVariant",void 0),GlideCoreSplitButtonPrimaryLink=__decorate([customElement("glide-core-split-button-primary-link")],GlideCoreSplitButtonPrimaryLink);export default GlideCoreSplitButtonPrimaryLink;
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,30 @@
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-expressions */
|
2
|
+
import { elementUpdated, expect, fixture, html } from '@open-wc/testing';
|
3
|
+
import GlideCoreSplitButtonPrimaryLink from './split-button.primary-link.js';
|
4
|
+
GlideCoreSplitButtonPrimaryLink.shadowRootOptions.mode = 'open';
|
5
|
+
it('registers', async () => {
|
6
|
+
expect(window.customElements.get('glide-core-split-button-primary-link')).to.equal(GlideCoreSplitButtonPrimaryLink);
|
7
|
+
});
|
8
|
+
it('is accessible', async () => {
|
9
|
+
const component = await fixture(html `
|
10
|
+
<glide-core-split-button-primary-link
|
11
|
+
label="Label"
|
12
|
+
url="/"
|
13
|
+
></glide-core-split-button-primary-link>
|
14
|
+
`);
|
15
|
+
await expect(component).to.be.accessible();
|
16
|
+
component.disabled = true;
|
17
|
+
await elementUpdated(component);
|
18
|
+
await expect(component).to.be.accessible();
|
19
|
+
});
|
20
|
+
it('has defaults', async () => {
|
21
|
+
const component = await fixture(html `
|
22
|
+
<glide-core-split-button-primary-link
|
23
|
+
label="Label"
|
24
|
+
url="/"
|
25
|
+
></glide-core-split-button-primary-link>
|
26
|
+
`);
|
27
|
+
expect(component.disabled).to.be.false;
|
28
|
+
expect(component.privateSize).to.equal('large');
|
29
|
+
expect(component.privateVariant).to.equal('primary');
|
30
|
+
});
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,15 @@
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-expressions */
|
2
|
+
import { expect, fixture, html } from '@open-wc/testing';
|
3
|
+
import GlideCoreSplitButtonPrimaryLink from './split-button.primary-link.js';
|
4
|
+
GlideCoreSplitButtonPrimaryLink.shadowRootOptions.mode = 'open';
|
5
|
+
it('focuses itself when `focus()` is called', async () => {
|
6
|
+
const component = await fixture(html `
|
7
|
+
<glide-core-split-button-primary-link
|
8
|
+
label="Label"
|
9
|
+
url="/"
|
10
|
+
></glide-core-split-button-primary-link>
|
11
|
+
`);
|
12
|
+
component.focus();
|
13
|
+
const link = component.shadowRoot?.querySelector('[data-test="component"]');
|
14
|
+
expect(component.shadowRoot?.activeElement).to.equal(link);
|
15
|
+
});
|
@@ -0,0 +1,25 @@
|
|
1
|
+
import './menu.options.js';
|
2
|
+
import { LitElement } from 'lit';
|
3
|
+
declare global {
|
4
|
+
interface HTMLElementTagNameMap {
|
5
|
+
'glide-core-split-button-secondary-button': GlideCoreSplitButtonSecondaryButton;
|
6
|
+
}
|
7
|
+
}
|
8
|
+
/**
|
9
|
+
* @slot - One or more of `<glide-core-menu-button>` or `<glide-core-menu-link>`.
|
10
|
+
*/
|
11
|
+
export default class GlideCoreSplitButtonSecondaryButton extends LitElement {
|
12
|
+
#private;
|
13
|
+
static shadowRootOptions: ShadowRootInit;
|
14
|
+
static styles: import("lit").CSSResult[];
|
15
|
+
disabled: boolean;
|
16
|
+
label?: string;
|
17
|
+
menuOpen: boolean;
|
18
|
+
menuPlacement: 'bottom-end' | 'top-end';
|
19
|
+
privateActive: boolean;
|
20
|
+
privateSize: 'large' | 'small';
|
21
|
+
privateVariant: 'primary' | 'secondary';
|
22
|
+
click(): void;
|
23
|
+
firstUpdated(): void;
|
24
|
+
render(): import("lit").TemplateResult<1>;
|
25
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
var __decorate=this&&this.__decorate||function(e,t,o,i){var n,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--)(n=e[a])&&(l=(r<3?n(l):r>3?n(t,o,l):n(t,o))||l);return r>3&&l&&Object.defineProperty(t,o,l),l};import"./menu.options.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 GlideCoreMenu from"./menu.js";import GlideCoreMenuButton from"./menu.button.js";import GlideCoreMenuLink from"./menu.link.js";import ow,{owSlot,owSlotType}from"./library/ow.js";import styles from"./split-button.secondary-button.styles.js";let GlideCoreSplitButtonSecondaryButton=class GlideCoreSplitButtonSecondaryButton extends LitElement{constructor(){super(...arguments),this.disabled=!1,this.menuOpen=!1,this.menuPlacement="bottom-end",this.privateActive=!1,this.privateSize="large",this.privateVariant="primary",this.#e=createRef(),this.#t=createRef(),this.#o=createRef()}static{this.shadowRootOptions={...LitElement.shadowRootOptions,delegatesFocus:!0,mode:"closed"}}static{this.styles=styles}click(){this.#e.value?.click()}firstUpdated(){owSlot(this.#t.value),owSlotType(this.#t.value,[GlideCoreMenuButton,GlideCoreMenuLink]);const e=new MutationObserver((()=>{this.#o.value&&(this.menuOpen=this.#o.value.open)}));ow(this.#o.value,ow.object.instanceOf(GlideCoreMenu)),e.observe(this.#o.value,{attributes:!0,attributeFilter:["open"]})}render(){return html`<glide-core-menu placement="${this.menuPlacement}" size="${this.privateSize}" ?open="${this.menuOpen}" ${ref(this.#o)}><button aria-label="${ifDefined(this.label)}" class="${classMap({component:!0,active:this.menuOpen,[this.privateVariant]:!0,[this.privateSize]:!0})}" data-test="button" slot="target" type="button" ?disabled="${this.disabled}" ${ref(this.#e)}><svg aria-hidden="true" class="${classMap({chevron:!0,disabled:this.disabled})}" width="16" height="16" viewBox="0 0 24 24" fill="none"><path d="M6 9L12 15L18 9" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></button><glide-core-menu-options><slot @slotchange="${this.#i}" ${ref(this.#t)}></slot></glide-core-menu-options></glide-core-menu>`}#e;#t;#o;#i(){owSlot(this.#t.value),owSlotType(this.#t.value,[GlideCoreMenuButton,GlideCoreMenuLink])}};__decorate([property({reflect:!0,type:Boolean})],GlideCoreSplitButtonSecondaryButton.prototype,"disabled",void 0),__decorate([property({reflect:!0})],GlideCoreSplitButtonSecondaryButton.prototype,"label",void 0),__decorate([property({attribute:"menu-open",reflect:!0,type:Boolean})],GlideCoreSplitButtonSecondaryButton.prototype,"menuOpen",void 0),__decorate([property({attribute:"menu-placement",reflect:!0})],GlideCoreSplitButtonSecondaryButton.prototype,"menuPlacement",void 0),__decorate([state()],GlideCoreSplitButtonSecondaryButton.prototype,"privateActive",void 0),__decorate([state()],GlideCoreSplitButtonSecondaryButton.prototype,"privateSize",void 0),__decorate([state()],GlideCoreSplitButtonSecondaryButton.prototype,"privateVariant",void 0),GlideCoreSplitButtonSecondaryButton=__decorate([customElement("glide-core-split-button-secondary-button")],GlideCoreSplitButtonSecondaryButton);export default GlideCoreSplitButtonSecondaryButton;
|
@@ -0,0 +1,103 @@
|
|
1
|
+
import{css}from"lit";import focusOutline from"./styles/focus-outline.js";export default[css`
|
2
|
+
${focusOutline(".component:focus-visible")}
|
3
|
+
`,css`
|
4
|
+
.component {
|
5
|
+
align-items: center;
|
6
|
+
background-color: var(--glide-core-surface-page);
|
7
|
+
border-color: var(--glide-core-border-primary);
|
8
|
+
border-radius: 0 0.75rem 0.75rem 0;
|
9
|
+
border-style: solid;
|
10
|
+
border-width: 1px;
|
11
|
+
cursor: pointer;
|
12
|
+
display: inline-flex;
|
13
|
+
font-family: var(--glide-core-heading-xxs-font-family);
|
14
|
+
font-style: var(--glide-core-heading-xxs-font-style);
|
15
|
+
font-weight: var(--glide-core-heading-xxs-font-weight);
|
16
|
+
gap: 0.625rem;
|
17
|
+
justify-content: center;
|
18
|
+
padding-block: var(--glide-core-spacing-xs);
|
19
|
+
padding-inline: var(--glide-core-spacing-xs);
|
20
|
+
position: relative;
|
21
|
+
text-decoration: none;
|
22
|
+
transition-duration: 150ms;
|
23
|
+
transition-property: color, background-color, border-color, fill, stroke;
|
24
|
+
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
25
|
+
user-select: none;
|
26
|
+
|
27
|
+
&:disabled {
|
28
|
+
background-color: var(--glide-core-surface-disabled);
|
29
|
+
border-block-color: transparent;
|
30
|
+
border-inline-end-color: transparent;
|
31
|
+
border-inline-start-color: var(--glide-core-border-base-light);
|
32
|
+
color: var(--glide-core-text-tertiary-disabled);
|
33
|
+
cursor: not-allowed;
|
34
|
+
}
|
35
|
+
|
36
|
+
&:focus {
|
37
|
+
outline: none;
|
38
|
+
}
|
39
|
+
|
40
|
+
&:focus-visible {
|
41
|
+
box-shadow: 0 0 0 1px var(--glide-core-surface-page);
|
42
|
+
|
43
|
+
/* So the box shadow isn't covered up by the primary button. */
|
44
|
+
z-index: 1;
|
45
|
+
}
|
46
|
+
|
47
|
+
&.primary {
|
48
|
+
color: var(--glide-core-text-selected);
|
49
|
+
}
|
50
|
+
|
51
|
+
&.secondary {
|
52
|
+
color: var(--glide-core-text-primary);
|
53
|
+
}
|
54
|
+
|
55
|
+
&.small {
|
56
|
+
block-size: 1.75rem;
|
57
|
+
box-sizing: border-box;
|
58
|
+
font-size: var(--glide-core-body-xs-font-size);
|
59
|
+
line-height: 1rem;
|
60
|
+
min-inline-size: fit-content;
|
61
|
+
}
|
62
|
+
|
63
|
+
&.large {
|
64
|
+
block-size: 2.125rem;
|
65
|
+
box-sizing: border-box;
|
66
|
+
font-size: var(--glide-core-body-xxs-font-size);
|
67
|
+
line-height: 1.5rem;
|
68
|
+
}
|
69
|
+
|
70
|
+
&:not(:disabled):is(:active, .active) {
|
71
|
+
background-color: var(--glide-core-surface-selected-hover);
|
72
|
+
border-color: transparent;
|
73
|
+
color: var(--glide-core-text-selected);
|
74
|
+
|
75
|
+
.chevron {
|
76
|
+
color: var(--glide-core-icon-selected);
|
77
|
+
}
|
78
|
+
}
|
79
|
+
|
80
|
+
&:not(:active, .active, :disabled):is(:focus, :hover) {
|
81
|
+
background-color: var(--glide-core-surface-hover);
|
82
|
+
border-color: transparent;
|
83
|
+
color: var(--glide-core-text-primary);
|
84
|
+
}
|
85
|
+
|
86
|
+
&:not(:active, .active, :disabled):is(:hover) {
|
87
|
+
box-shadow: var(--glide-core-glow-sm);
|
88
|
+
|
89
|
+
/* So the box shadow isn't covered up by the primary button. */
|
90
|
+
z-index: 1;
|
91
|
+
}
|
92
|
+
}
|
93
|
+
|
94
|
+
.chevron {
|
95
|
+
&.disabled {
|
96
|
+
color: var(--glide-core-icon-tertiary-disabled);
|
97
|
+
}
|
98
|
+
|
99
|
+
&:not(.disabled) {
|
100
|
+
color: var(--glide-core-icon-primary);
|
101
|
+
}
|
102
|
+
}
|
103
|
+
`];
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,58 @@
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-expressions */
|
2
|
+
import { elementUpdated, expect, fixture, html, waitUntil, } from '@open-wc/testing';
|
3
|
+
import GlideCoreMenuButton from './menu.button.js';
|
4
|
+
import GlideCoreSplitButtonSecondaryButton from './split-button.secondary-button.js';
|
5
|
+
import expectArgumentError from './library/expect-argument-error.js';
|
6
|
+
import sinon from 'sinon';
|
7
|
+
GlideCoreSplitButtonSecondaryButton.shadowRootOptions.mode = 'open';
|
8
|
+
GlideCoreMenuButton.shadowRootOptions.mode = 'open';
|
9
|
+
it('registers', async () => {
|
10
|
+
expect(window.customElements.get('glide-core-split-button-secondary-button')).to.equal(GlideCoreSplitButtonSecondaryButton);
|
11
|
+
});
|
12
|
+
it('is accessible', async () => {
|
13
|
+
const component = await fixture(html `
|
14
|
+
<glide-core-split-button-secondary-button label="Label">
|
15
|
+
<glide-core-menu-button label="Label"></glide-core-menu-button>
|
16
|
+
</glide-core-split-button-secondary-button>
|
17
|
+
`);
|
18
|
+
await expect(component).to.be.accessible();
|
19
|
+
component.disabled = true;
|
20
|
+
await elementUpdated(component);
|
21
|
+
await expect(component).to.be.accessible();
|
22
|
+
});
|
23
|
+
it('has defaults', async () => {
|
24
|
+
const component = await fixture(html `
|
25
|
+
<glide-core-split-button-secondary-button label="Label">
|
26
|
+
<glide-core-menu-button label="Label"></glide-core-menu-button>
|
27
|
+
</glide-core-split-button-secondary-button>
|
28
|
+
`);
|
29
|
+
expect(component.disabled).to.be.false;
|
30
|
+
expect(component.menuOpen).to.be.false;
|
31
|
+
expect(component.menuPlacement).to.be.equal('bottom-end');
|
32
|
+
expect(component.privateSize).to.be.equal('large');
|
33
|
+
expect(component.privateVariant).to.be.equal('primary');
|
34
|
+
});
|
35
|
+
it('throws when its default slot is empty', async () => {
|
36
|
+
await expectArgumentError(() => fixture(html `
|
37
|
+
<glide-core-split-button-secondary-button
|
38
|
+
label="Label"
|
39
|
+
></glide-core-split-button-secondary-button>
|
40
|
+
`));
|
41
|
+
});
|
42
|
+
it('throws when its default slot is the incorrect type', async () => {
|
43
|
+
await expectArgumentError(() => fixture(html `
|
44
|
+
<glide-core-split-button-secondary-button label="Label">
|
45
|
+
<div></div>
|
46
|
+
</glide-core-split-button-secondary-button>
|
47
|
+
`));
|
48
|
+
// Menu is rendered asynchronously outside of this component's lifecycle
|
49
|
+
// and asserts against its default slot. That assertion, which is expected
|
50
|
+
// to fail in this case, results in an unhandled rejection that gets logged.
|
51
|
+
// `console.error` is stubbed so the logs aren't muddied.
|
52
|
+
const stub = sinon.stub(console, 'error');
|
53
|
+
// Menu asserts against its default slot once on `firstUpdated` and again
|
54
|
+
// on "slotchange". So we wait until the stub is called twice before restoring
|
55
|
+
// it.
|
56
|
+
await waitUntil(() => stub.calledTwice);
|
57
|
+
stub.restore();
|
58
|
+
});
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,14 @@
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-expressions */
|
2
|
+
import { expect, fixture, html } from '@open-wc/testing';
|
3
|
+
import GlideCoreSplitButtonSecondaryButton from './split-button.secondary-button.js';
|
4
|
+
GlideCoreSplitButtonSecondaryButton.shadowRootOptions.mode = 'open';
|
5
|
+
it('focuses itself when `focus()` is called', async () => {
|
6
|
+
const component = await fixture(html `
|
7
|
+
<glide-core-split-button-secondary-button label="Label">
|
8
|
+
<glide-core-menu-button label="Label"></glide-core-menu-button>
|
9
|
+
</glide-core-split-button-secondary-button>
|
10
|
+
`);
|
11
|
+
component.focus();
|
12
|
+
const button = component.shadowRoot?.querySelector('[data-test="button"]');
|
13
|
+
expect(component.shadowRoot?.activeElement).to.equal(button);
|
14
|
+
});
|
@@ -0,0 +1,30 @@
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-expressions */
|
2
|
+
import './menu.button.js';
|
3
|
+
import './menu.options.js';
|
4
|
+
import { aTimeout, expect, fixture, html } from '@open-wc/testing';
|
5
|
+
import GlideCoreSplitButtonSecondaryButton from './split-button.secondary-button.js';
|
6
|
+
GlideCoreSplitButtonSecondaryButton.shadowRootOptions.mode = 'open';
|
7
|
+
it('sets `menuOpen` when its menu is opened', async () => {
|
8
|
+
const component = await fixture(html `
|
9
|
+
<glide-core-split-button-secondary-button label="Label">
|
10
|
+
<glide-core-menu-button label="Label"></glide-core-menu-button>
|
11
|
+
</glide-core-split-button-secondary-button>
|
12
|
+
`);
|
13
|
+
component.click();
|
14
|
+
// Wait for the Mutation Observer to pick up the attribute change.
|
15
|
+
await aTimeout(0);
|
16
|
+
expect(component.menuOpen).to.be.true;
|
17
|
+
});
|
18
|
+
it('sets `menuOpen` when its menu is closed', async () => {
|
19
|
+
const component = await fixture(html `
|
20
|
+
<glide-core-split-button-secondary-button label="Label" menu-open>
|
21
|
+
<glide-core-menu-button label="Label"></glide-core-menu-button>
|
22
|
+
</glide-core-split-button-secondary-button>
|
23
|
+
`);
|
24
|
+
// Wait for Menu to open.
|
25
|
+
await aTimeout(0);
|
26
|
+
document.body.click();
|
27
|
+
// Wait for the Mutation Observer to pick up the attribute change.
|
28
|
+
await aTimeout(0);
|
29
|
+
expect(component.menuOpen).to.be.false;
|
30
|
+
});
|
@@ -2,11 +2,12 @@ import './icons/storybook.js';
|
|
2
2
|
import './menu.button.js';
|
3
3
|
import './menu.link.js';
|
4
4
|
import './split-button.js';
|
5
|
-
import './split-
|
6
|
-
import './split-link.js';
|
5
|
+
import './split-button.primary-button.js';
|
6
|
+
import './split-button.primary-link.js';
|
7
|
+
import './split-button.secondary-button.js';
|
7
8
|
import type { Meta, StoryObj } from '@storybook/web-components';
|
8
9
|
declare const meta: Meta;
|
9
10
|
export default meta;
|
10
11
|
export declare const SplitButton: StoryObj;
|
11
12
|
export declare const WithIcon: StoryObj;
|
12
|
-
export declare const
|
13
|
+
export declare const WithPrimaryLink: StoryObj;
|