@crowdstrike/glide-core 0.9.6 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/README.md +17 -53
  2. package/dist/accordion.d.ts +10 -10
  3. package/dist/accordion.js +1 -1
  4. package/dist/accordion.stories.d.ts +0 -1
  5. package/dist/accordion.styles.js +36 -38
  6. package/dist/accordion.test.basics.js +13 -95
  7. package/dist/accordion.test.events.js +21 -33
  8. package/dist/accordion.test.focus.d.ts +1 -0
  9. package/dist/accordion.test.focus.js +11 -0
  10. package/dist/accordion.test.interactions.d.ts +1 -0
  11. package/dist/accordion.test.interactions.js +75 -0
  12. package/dist/button-group.button.d.ts +2 -4
  13. package/dist/button-group.button.js +1 -1
  14. package/dist/button-group.button.styles.js +6 -14
  15. package/dist/button-group.button.test.basics.js +8 -17
  16. package/dist/button-group.button.test.interactions.js +4 -4
  17. package/dist/button-group.d.ts +0 -2
  18. package/dist/button-group.test.basics.js +10 -10
  19. package/dist/button-group.test.events.js +2 -2
  20. package/dist/button-group.test.interactions.js +1 -1
  21. package/dist/button.d.ts +7 -10
  22. package/dist/button.js +1 -1
  23. package/dist/button.styles.js +4 -7
  24. package/dist/button.test.basics.js +10 -26
  25. package/dist/button.test.events.js +9 -9
  26. package/dist/checkbox-group.d.ts +3 -4
  27. package/dist/checkbox-group.js +1 -1
  28. package/dist/checkbox-group.styles.js +13 -1
  29. package/dist/checkbox-group.test.basics.js +8 -12
  30. package/dist/checkbox-group.test.focus.js +7 -7
  31. package/dist/checkbox-group.test.interactions.d.ts +1 -0
  32. package/dist/checkbox-group.test.interactions.js +82 -0
  33. package/dist/checkbox.d.ts +5 -4
  34. package/dist/checkbox.js +1 -1
  35. package/dist/checkbox.styles.js +35 -15
  36. package/dist/checkbox.test.basics.js +6 -15
  37. package/dist/checkbox.test.focus.js +4 -2
  38. package/dist/checkbox.test.interactions.js +11 -11
  39. package/dist/drawer.d.ts +2 -5
  40. package/dist/drawer.js +1 -1
  41. package/dist/drawer.test.accessibility.js +8 -8
  42. package/dist/drawer.test.basics.js +16 -16
  43. package/dist/drawer.test.closing.js +18 -16
  44. package/dist/drawer.test.events.js +13 -24
  45. package/dist/drawer.test.methods.js +22 -22
  46. package/dist/dropdown.d.ts +7 -5
  47. package/dist/dropdown.js +1 -1
  48. package/dist/dropdown.option.d.ts +1 -3
  49. package/dist/dropdown.option.js +1 -1
  50. package/dist/dropdown.option.styles.js +31 -19
  51. package/dist/dropdown.option.test.basics.js +4 -4
  52. package/dist/dropdown.styles.js +39 -3
  53. package/dist/dropdown.test.basics.js +8 -13
  54. package/dist/dropdown.test.basics.multiple.js +63 -31
  55. package/dist/dropdown.test.basics.single.js +49 -0
  56. package/dist/dropdown.test.focus.filterable.js +12 -3
  57. package/dist/dropdown.test.focus.js +18 -2
  58. package/dist/dropdown.test.interactions.filterable.js +121 -45
  59. package/dist/dropdown.test.interactions.multiple.js +71 -30
  60. package/dist/dropdown.test.interactions.single.js +26 -4
  61. package/dist/form-controls-layout.d.ts +0 -2
  62. package/dist/icon-button.d.ts +2 -4
  63. package/dist/icon-button.js +1 -1
  64. package/dist/icon-button.test.basics.js +14 -82
  65. package/dist/icon-button.test.focus.d.ts +1 -0
  66. package/dist/icon-button.test.focus.js +13 -0
  67. package/dist/input.d.ts +4 -5
  68. package/dist/input.js +1 -1
  69. package/dist/input.styles.js +4 -4
  70. package/dist/input.test.basics.js +0 -52
  71. package/dist/input.test.events.js +27 -27
  72. package/dist/input.test.focus.js +27 -26
  73. package/dist/input.test.form.js +6 -6
  74. package/dist/input.test.validity.js +130 -130
  75. package/dist/label.d.ts +1 -3
  76. package/dist/label.js +1 -1
  77. package/dist/label.styles.js +5 -6
  78. package/dist/label.test.basics.js +4 -4
  79. package/dist/library/ow.js +1 -1
  80. package/dist/menu.button.d.ts +0 -2
  81. package/dist/menu.button.test.basics.js +3 -3
  82. package/dist/menu.d.ts +1 -4
  83. package/dist/menu.js +1 -1
  84. package/dist/menu.link.d.ts +1 -2
  85. package/dist/menu.link.js +1 -1
  86. package/dist/menu.options.d.ts +0 -2
  87. package/dist/menu.test.events.js +6 -6
  88. package/dist/menu.test.focus.js +5 -18
  89. package/dist/menu.test.interactions.js +48 -24
  90. package/dist/modal.d.ts +6 -17
  91. package/dist/modal.icon-button.d.ts +0 -2
  92. package/dist/modal.icon-button.test.basics.js +3 -3
  93. package/dist/modal.js +1 -1
  94. package/dist/modal.styles.js +13 -19
  95. package/dist/modal.tertiary-icon.d.ts +0 -3
  96. package/dist/modal.tertiary-icon.test.basics.js +3 -3
  97. package/dist/modal.test.basics.js +9 -5
  98. package/dist/modal.test.close.js +2 -2
  99. package/dist/modal.test.events.js +2 -2
  100. package/dist/radio-group.d.ts +0 -3
  101. package/dist/radio-group.js +1 -1
  102. package/dist/radio-group.test.basics.js +61 -61
  103. package/dist/radio-group.test.events.js +13 -13
  104. package/dist/radio-group.test.focus.js +1 -1
  105. package/dist/radio-group.test.form.js +2 -2
  106. package/dist/radio-group.test.validity.js +12 -12
  107. package/dist/radio.d.ts +0 -3
  108. package/dist/radio.styles.js +4 -12
  109. package/dist/split-button.d.ts +8 -11
  110. package/dist/split-button.js +1 -1
  111. package/dist/split-button.primary-button.d.ts +21 -0
  112. package/dist/split-button.primary-button.js +1 -0
  113. package/dist/split-button.primary-button.styles.js +96 -0
  114. package/dist/split-button.primary-button.test.basics.d.ts +1 -0
  115. package/dist/split-button.primary-button.test.basics.js +31 -0
  116. package/dist/split-button.primary-button.test.focus.d.ts +1 -0
  117. package/dist/split-button.primary-button.test.focus.js +14 -0
  118. package/dist/split-button.primary-link.d.ts +19 -0
  119. package/dist/split-button.primary-link.js +1 -0
  120. package/dist/split-button.primary-link.test.basics.d.ts +1 -0
  121. package/dist/split-button.primary-link.test.basics.js +30 -0
  122. package/dist/split-button.primary-link.test.focus.d.ts +1 -0
  123. package/dist/split-button.primary-link.test.focus.js +15 -0
  124. package/dist/split-button.secondary-button.d.ts +25 -0
  125. package/dist/split-button.secondary-button.js +1 -0
  126. package/dist/split-button.secondary-button.styles.js +103 -0
  127. package/dist/split-button.secondary-button.test.basics.d.ts +1 -0
  128. package/dist/split-button.secondary-button.test.basics.js +58 -0
  129. package/dist/split-button.secondary-button.test.focus.d.ts +1 -0
  130. package/dist/split-button.secondary-button.test.focus.js +14 -0
  131. package/dist/split-button.secondary-button.test.interactions.d.ts +2 -0
  132. package/dist/split-button.secondary-button.test.interactions.js +30 -0
  133. package/dist/split-button.stories.d.ts +4 -3
  134. package/dist/split-button.styles.js +1 -94
  135. package/dist/split-button.test.basics.d.ts +2 -1
  136. package/dist/split-button.test.basics.js +67 -80
  137. package/dist/split-button.test.interactions.d.ts +4 -0
  138. package/dist/split-button.test.interactions.js +51 -0
  139. package/dist/styles/opacity-and-scale-animation.js +2 -6
  140. package/dist/styles/variables.css +1 -1
  141. package/dist/tab.d.ts +2 -11
  142. package/dist/tab.group.d.ts +2 -5
  143. package/dist/tab.group.styles.js +12 -15
  144. package/dist/tab.group.test.basics.js +49 -34
  145. package/dist/tab.group.test.interactions.js +17 -14
  146. package/dist/tab.panel.d.ts +0 -3
  147. package/dist/tab.test.basics.js +6 -5
  148. package/dist/tag.d.ts +6 -4
  149. package/dist/tag.js +1 -1
  150. package/dist/tag.styles.js +36 -36
  151. package/dist/tag.test.basics.js +16 -109
  152. package/dist/tag.test.events.js +12 -8
  153. package/dist/tag.test.focus.js +2 -3
  154. package/dist/tag.test.interactions.d.ts +1 -0
  155. package/dist/tag.test.interactions.js +34 -0
  156. package/dist/textarea.d.ts +2 -3
  157. package/dist/textarea.js +2 -2
  158. package/dist/textarea.test.basics.js +8 -8
  159. package/dist/textarea.test.events.js +55 -55
  160. package/dist/textarea.test.form.js +9 -9
  161. package/dist/textarea.test.validity.js +167 -135
  162. package/dist/toasts.d.ts +1 -5
  163. package/dist/toasts.test.basics.js +2 -1
  164. package/dist/toasts.toast.d.ts +1 -4
  165. package/dist/toasts.toast.js +1 -1
  166. package/dist/toasts.toast.styles.js +12 -0
  167. package/dist/toggle.d.ts +0 -2
  168. package/dist/toggle.styles.js +1 -5
  169. package/dist/toggle.test.basics.js +2 -2
  170. package/dist/toggle.test.interactions.js +7 -7
  171. package/dist/tooltip.d.ts +2 -1
  172. package/dist/tooltip.js +1 -1
  173. package/dist/tooltip.styles.js +36 -13
  174. package/dist/tooltip.test.basics.d.ts +1 -1
  175. package/dist/tooltip.test.basics.js +19 -19
  176. package/dist/tree.d.ts +0 -2
  177. package/dist/tree.item.d.ts +5 -7
  178. package/dist/tree.item.icon-button.d.ts +1 -4
  179. package/dist/tree.item.js +1 -1
  180. package/dist/tree.item.menu.d.ts +0 -2
  181. package/dist/tree.item.menu.test.basics.js +9 -9
  182. package/dist/tree.item.styles.js +4 -3
  183. package/dist/tree.item.test.basics.js +43 -31
  184. package/dist/tree.test.basics.js +29 -29
  185. package/dist/tree.test.focus.js +77 -74
  186. package/package.json +12 -14
  187. package/dist/split-container.d.ts +0 -31
  188. package/dist/split-container.js +0 -1
  189. package/dist/split-container.styles.js +0 -132
  190. package/dist/split-container.test.basics.d.ts +0 -3
  191. package/dist/split-container.test.basics.js +0 -445
  192. package/dist/split-container.test.interactions.d.ts +0 -1
  193. package/dist/split-container.test.interactions.js +0 -20
  194. package/dist/split-link.d.ts +0 -25
  195. package/dist/split-link.js +0 -1
  196. package/dist/split-link.test.basics.d.ts +0 -1
  197. package/dist/split-link.test.basics.js +0 -93
  198. package/dist/split-link.test.interactions.d.ts +0 -1
  199. package/dist/split-link.test.interactions.js +0 -20
  200. package/dist/status-indicator.d.ts +0 -30
  201. package/dist/status-indicator.js +0 -1
  202. package/dist/status-indicator.stories.d.ts +0 -5
  203. package/dist/status-indicator.styles.js +0 -58
  204. package/dist/status-indicator.test.basics.d.ts +0 -1
  205. package/dist/status-indicator.test.basics.js +0 -102
  206. /package/dist/{split-container.styles.d.ts → split-button.primary-button.styles.d.ts} +0 -0
  207. /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
+ });
@@ -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?: string;
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 form(){return this.#i.form}blur(){this.#o.value?.blur()}checkValidity(){this.isCheckingValidity=!0;const e=this.#i.checkValidity();return this.isCheckingValidity=!1,e}click(){this.#o.value?.click()}connectedCallback(){super.connectedCallback(),this.#r=new IntersectionObserver((()=>{this.checkVisibility()&&this.#t()})),this.#r.observe(this)}disconnectedCallback(){super.disconnectedCallback(),this.form?.removeEventListener("formdata",this.#a),this.#r?.disconnect()}get validity(){return"minimal"===this.privateVariant||(this.required&&!this.checked?this.#i.setValidity({valueMissing:!0}," ",this.#o.value):this.#i.setValidity({})),this.#i.validity}focus(e){this.#o.value?.focus(e)}formAssociatedCallback(){this.form?.addEventListener("formdata",this.#a)}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="label-and-input-and-checkbox" part="private-label-and-input-and-checkbox"><div class="input-and-checkbox"><input aria-invalid="${this.#s}" data-test="input" type="checkbox" .checked="${this.checked}" .inert="${this.internallyInert}" ?disabled="${this.disabled}" ?required="${this.required}" @change="${this.#l}" @input="${this.#l}" @keydown="${this.#n}" ${ref(this.#o)}><div class="${classMap({checkbox:!0,disabled:this.disabled,error:this.#s})}"><div class="checked-icon">${checkedIcon}</div>${indeterminateIcon}</div></div><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.#d)}>${this.label}</div></glide-core-tooltip></label>`),(()=>html`<glide-core-private-label orientation="${this.orientation}" split="${ifDefined(this.privateSplit??void 0)}" ?disabled="${this.disabled}" ?error="${this.#s}" ?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.#s}" data-test="input" id="input" type="checkbox" .checked="${this.checked}" ?disabled="${this.disabled}" ?required="${this.required}" @blur="${this.#h}" @change="${this.#l}" @input="${this.#l}" @keydown="${this.#n}" ${ref(this.#o)}><div class="${classMap({checkbox:!0,disabled:this.disabled,error:this.#s})}"><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.#i.reportValidity();return this.requestUpdate(),e}setValidity(e,t,i){return this.#i.setValidity(e,t,i)}get willValidate(){return this.#i.willValidate}updated(){this.#o.value&&(this.#o.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.privateLabelTooltipOffset=4,this.privateShowLabelTooltip=!1,this.required=!1,this.value="",this.isReportValidityOrSubmit=!1,this.isBlurring=!1,this.isCheckingValidity=!1,this.isLabelOverflow=!1,this.#o=createRef(),this.#e="",this.#d=createRef(),this.#a=({formData:e})=>{this.checked&&this.name&&this.value&&!this.disabled&&e.append(this.name,this.value)},this.#i=this.attachInternals(),this.addEventListener("invalid",(e=>{if(e?.preventDefault(),this.isCheckingValidity||this.isBlurring)return;this.isReportValidityOrSubmit=!0;this.form?.querySelector(":invalid")===this&&this.focus()}))}#o;#i;#r;#e;#d;#a;get#s(){return"minimal"===this.privateVariant?!this.validity.valid&&this.isReportValidityOrSubmit:this.required&&!this.disabled&&!this.validity.valid&&this.isReportValidityOrSubmit}#h(){this.isBlurring=!0,this.reportValidity(),this.isBlurring=!1}#l(e){e.target instanceof HTMLInputElement&&(this.checked=e.target.checked),this.indeterminate=!1,"change"===e.type&&this.dispatchEvent(new Event(e.type,e))}#n(e){"Enter"===e.key&&this.form?.requestSubmit()}#t(){this.#d.value&&(this.isLabelOverflow=this.#d.value.scrollWidth>this.#d.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()],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",void 0),__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;
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;
@@ -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
- transition: box-shadow 200ms ease-in-out;
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
- border-color: var(--glide-core-surface-primary-disabled);
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
- transition: stroke-dashoffset 300ms cubic-bezier(0.32, 0, 0.67, 0);
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.getAttribute('name')).to.be.null;
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.getAttribute('value')).to.equal('');
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.equal(true);
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.equal(true);
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.equal(true);
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.equal(true);
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.equal(false);
48
- expect(component.shadowRoot?.querySelector('glide-core-private-label')?.error).to.equal(true);
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.equal(true);
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.equal(false);
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.equal(true);
29
- expect(component.indeterminate).to.equal(false);
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.equal(false);
44
- expect(component.indeterminate).to.equal(false);
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.equal(true);
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.equal(false);
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.equal(false);
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.equal(false);
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.equal(true);
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
- private currentState;
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,r=arguments.length,l=r<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,s):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)l=Reflect.decorate(e,t,s,o);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(l=(r<3?i(l):r>3?i(t,s,l):i(t,s))||l);return r>3&&l&&Object.defineProperty(t,s,l),l};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.currentState="closed",this.isOpen=!1,this.#e=createRef(),this.#t=createRef()}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}close(){"open"===this.currentState&&(this.#e?.value?.addEventListener("transitionend",(()=>{this.isOpen=!1,this.#e?.value?.classList?.remove("open"),this.#e?.value?.classList?.remove("closing"),this.currentState="closed",this.dispatchEvent(new Event("close",{bubbles:!0}))}),{once:!0}),this.#e?.value?.classList?.add("closing"),this.currentState="closing")}firstUpdated(){owSlot(this.#t.value)}open(){"closed"===this.currentState&&(this.#e?.value?.addEventListener("transitionend",(()=>{this.currentState="open",this.#e?.value?.focus(),this.dispatchEvent(new Event("open",{bubbles:!0}))}),{once:!0}),this.#e?.value?.classList?.add("open"),this.currentState="opening",this.isOpen=!0)}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>`}#e;#t;#s(e){"Escape"===e.key&&this.close()}#o(){owSlot(this.#t.value)}};__decorate([property()],GlideCoreDrawer.prototype,"label",void 0),__decorate([property({type:Boolean})],GlideCoreDrawer.prototype,"pinned",void 0),__decorate([state()],GlideCoreDrawer.prototype,"currentState",void 0),__decorate([state()],GlideCoreDrawer.prototype,"isOpen",void 0),GlideCoreDrawer=__decorate([customElement("glide-core-drawer")],GlideCoreDrawer);export default GlideCoreDrawer;
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 drawer = await fixture(html `<glide-core-drawer>Drawer content</glide-core-drawer>`);
9
- drawer.shadowRoot
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
- drawer.open();
13
- await expect(drawer).to.be.accessible();
12
+ component.show();
13
+ await expect(component).to.be.accessible();
14
14
  });
15
15
  it('focuses the aside upon opening', async () => {
16
- const drawer = await fixture(html `<glide-core-drawer>Drawer content</glide-core-drawer>`);
17
- drawer.open();
18
- drawer.shadowRoot
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(drawer.shadowRoot?.activeElement).to.equal(drawer.shadowRoot?.querySelector('aside'));
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 drawer = await fixture(html `<glide-core-drawer label="label">Drawer content</glide-core-drawer>`);
12
- expect(drawer.shadowRoot?.querySelector('aside')?.ariaLabel).to.equal('label');
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 drawer = await fixture(html `<glide-core-drawer>Drawer content</glide-core-drawer>`);
16
- expect(drawer.shadowRoot?.querySelector('aside')).to.not.have.attribute('aria-label');
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 drawer = await fixture(html `<glide-core-drawer>Drawer content</glide-core-drawer>`);
20
- drawer.open();
21
- expect(drawer.textContent).to.equal('Drawer content');
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 drawer = await fixture(html `<glide-core-drawer>Drawer content</glide-core-drawer>`, { parentNode: styledDiv });
27
- drawer.open();
28
- expect(drawer.shadowRoot?.querySelector('aside')?.clientWidth).to.equal(750);
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 drawer = await fixture(html `<glide-core-drawer pinned>Drawer content</glide-core-drawer>`);
37
- drawer.open();
38
- expect(drawer.shadowRoot?.querySelector('aside')?.classList.contains('pinned')).to.be.true;
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 drawer = await fixture(html `<glide-core-drawer>Drawer content</glide-core-drawer>`);
42
- drawer.open();
43
- expect(drawer.shadowRoot?.querySelector('aside')?.classList.contains('pinned')).to.be.false;
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
- const drawer = await fixture(html `<glide-core-drawer>Drawer content</glide-core-drawer>`);
11
- drawer.open();
12
- drawer.shadowRoot
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(drawer);
17
+ await elementUpdated(component);
16
18
  await sendKeys({ press: 'Escape' });
17
19
  setTimeout(() => {
18
- drawer.shadowRoot
20
+ component.shadowRoot
19
21
  ?.querySelector('aside')
20
22
  ?.dispatchEvent(new TransitionEvent('transitionend'));
21
23
  });
22
- await oneEvent(drawer, 'close');
23
- await elementUpdated(drawer);
24
- expect(drawer?.shadowRoot?.querySelector('aside[data-test-state="closed"]'))
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
- const drawer = await fixture(html `<glide-core-drawer>Drawer content</glide-core-drawer>`);
29
- drawer.open();
30
- drawer.shadowRoot
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(drawer);
34
- drawer.shadowRoot?.querySelector('aside')?.focus();
35
+ await elementUpdated(component);
36
+ component.shadowRoot?.querySelector('aside')?.focus();
35
37
  await sendKeys({ press: 'Enter' });
36
- expect(drawer?.shadowRoot?.querySelector('aside[data-test-state="open"]')).to
37
- .be.not.null;
38
+ expect(component?.shadowRoot?.querySelector('aside[data-test-state="open"]'))
39
+ .to.be.not.null;
38
40
  });