@crowdstrike/glide-core 0.5.1 → 0.5.2

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 (208) hide show
  1. package/dist/accordion.js +1 -1
  2. package/dist/accordion.styles.js +4 -4
  3. package/dist/accordion.test.basics.js +109 -0
  4. package/dist/accordion.test.events.js +39 -0
  5. package/dist/button-group.button.js +1 -1
  6. package/dist/button-group.button.styles.js +4 -4
  7. package/dist/button-group.button.test.basics.js +169 -0
  8. package/dist/button-group.button.test.events.js +73 -0
  9. package/dist/button-group.js +1 -1
  10. package/dist/button-group.styles.js +3 -3
  11. package/dist/button-group.test.basics.js +268 -0
  12. package/dist/button-group.test.events.js +291 -0
  13. package/dist/button.js +1 -1
  14. package/dist/button.styles.js +4 -4
  15. package/dist/button.test.basics.js +196 -0
  16. package/dist/button.test.events.js +25 -0
  17. package/dist/button.test.form.js +49 -0
  18. package/dist/checkbox-group.js +1 -1
  19. package/dist/checkbox-group.styles.js +2 -2
  20. package/dist/checkbox-group.test.basics.js +119 -0
  21. package/dist/checkbox-group.test.events.js +110 -0
  22. package/dist/checkbox-group.test.focus.js +45 -0
  23. package/dist/checkbox-group.test.form.js +130 -0
  24. package/dist/checkbox-group.test.validity.js +75 -0
  25. package/dist/checkbox.js +1 -1
  26. package/dist/checkbox.styles.js +3 -3
  27. package/dist/checkbox.test.basics.js +89 -0
  28. package/dist/checkbox.test.events.js +87 -0
  29. package/dist/checkbox.test.focus.js +38 -0
  30. package/dist/checkbox.test.form.js +115 -0
  31. package/dist/checkbox.test.states.js +62 -0
  32. package/dist/checkbox.test.validity.js +51 -0
  33. package/dist/drawer.d.ts +2 -2
  34. package/dist/drawer.js +1 -15
  35. package/dist/drawer.styles.js +18 -4
  36. package/dist/drawer.test.accessibility.js +22 -0
  37. package/dist/drawer.test.basics.js +43 -0
  38. package/dist/drawer.test.closing.js +37 -0
  39. package/dist/drawer.test.events.js +52 -0
  40. package/dist/drawer.test.methods.js +34 -0
  41. package/dist/dropdown.d.ts +4 -2
  42. package/dist/dropdown.js +1 -1
  43. package/dist/dropdown.option.d.ts +0 -2
  44. package/dist/dropdown.option.js +1 -1
  45. package/dist/dropdown.option.styles.js +2 -2
  46. package/dist/dropdown.option.test.basics.js +59 -0
  47. package/dist/dropdown.option.test.basics.multiple.js +26 -0
  48. package/dist/dropdown.option.test.basics.single.js +20 -0
  49. package/dist/dropdown.option.test.events.js +27 -0
  50. package/dist/dropdown.option.test.focus.js +11 -0
  51. package/dist/dropdown.option.test.interactions.multiple.js +87 -0
  52. package/dist/dropdown.option.test.interactions.single.js +22 -0
  53. package/dist/dropdown.styles.js +25 -6
  54. package/dist/dropdown.test.basics.filterable.js +84 -0
  55. package/dist/dropdown.test.basics.js +233 -0
  56. package/dist/dropdown.test.basics.multiple.js +270 -0
  57. package/dist/dropdown.test.basics.single.js +79 -0
  58. package/dist/dropdown.test.events.js +268 -0
  59. package/dist/dropdown.test.events.multiple.js +130 -0
  60. package/dist/dropdown.test.focus.d.ts +1 -0
  61. package/dist/dropdown.test.focus.filterable.js +154 -0
  62. package/dist/dropdown.test.focus.js +18 -0
  63. package/dist/dropdown.test.focus.multiple.js +181 -0
  64. package/dist/dropdown.test.focus.single.js +53 -0
  65. package/dist/dropdown.test.form.js +140 -0
  66. package/dist/dropdown.test.form.multiple.js +149 -0
  67. package/dist/dropdown.test.form.single.js +128 -0
  68. package/dist/dropdown.test.interactions.filterable.js +385 -0
  69. package/dist/dropdown.test.interactions.js +446 -0
  70. package/dist/dropdown.test.interactions.multiple.js +908 -0
  71. package/dist/dropdown.test.interactions.single.js +466 -0
  72. package/dist/dropdown.test.validity.js +46 -0
  73. package/dist/icon-button.js +1 -1
  74. package/dist/icon-button.styles.js +3 -3
  75. package/dist/icon-button.test.basics.js +103 -0
  76. package/dist/icons/checked.js +1 -1
  77. package/dist/icons/magnifying-glass.js +1 -1
  78. package/dist/input.js +1 -1
  79. package/dist/input.styles.js +3 -3
  80. package/dist/input.test.basics.js +169 -0
  81. package/dist/input.test.events.js +97 -0
  82. package/dist/input.test.focus.js +54 -0
  83. package/dist/input.test.form.js +56 -0
  84. package/dist/input.test.validity.js +50 -0
  85. package/dist/label.js +1 -1
  86. package/dist/label.styles.js +3 -3
  87. package/dist/label.test.basics.js +129 -0
  88. package/dist/library/expect-argument-error.js +1 -1
  89. package/dist/library/ow.js +1 -1
  90. package/dist/library/ow.test.js +55 -0
  91. package/dist/menu.button.d.ts +1 -2
  92. package/dist/menu.button.js +1 -1
  93. package/dist/menu.button.styles.js +3 -3
  94. package/dist/menu.button.test.basics.js +42 -0
  95. package/dist/menu.d.ts +4 -0
  96. package/dist/menu.js +1 -1
  97. package/dist/menu.link.d.ts +1 -2
  98. package/dist/menu.link.js +1 -1
  99. package/dist/menu.link.styles.js +3 -3
  100. package/dist/menu.link.test.basics.js +46 -0
  101. package/dist/menu.styles.js +6 -6
  102. package/dist/menu.test.basics.js +161 -0
  103. package/dist/menu.test.focus.d.ts +0 -1
  104. package/dist/menu.test.focus.js +66 -0
  105. package/dist/menu.test.interactions.d.ts +0 -1
  106. package/dist/menu.test.interactions.js +522 -0
  107. package/dist/modal.icon-button.js +1 -1
  108. package/dist/modal.icon-button.styles.js +2 -2
  109. package/dist/modal.icon-button.test.basics.js +45 -0
  110. package/dist/modal.js +1 -15
  111. package/dist/modal.styles.js +4 -4
  112. package/dist/modal.tertiary-icon.js +1 -1
  113. package/dist/modal.tertiary-icon.test.basics.js +59 -0
  114. package/dist/modal.test.accessibility.js +48 -0
  115. package/dist/modal.test.basics.js +203 -0
  116. package/dist/modal.test.close.js +38 -0
  117. package/dist/modal.test.events.js +110 -0
  118. package/dist/modal.test.lock-scroll.js +76 -0
  119. package/dist/modal.test.methods.js +23 -0
  120. package/dist/modal.test.scrollbars.js +19 -0
  121. package/dist/radio-group.js +1 -1
  122. package/dist/radio-group.styles.js +2 -2
  123. package/dist/radio-group.test.basics.js +323 -0
  124. package/dist/radio-group.test.events.js +277 -0
  125. package/dist/radio-group.test.focus.js +75 -0
  126. package/dist/radio-group.test.form.js +104 -0
  127. package/dist/radio-group.test.validity.js +228 -0
  128. package/dist/radio.js +1 -1
  129. package/dist/radio.styles.js +4 -4
  130. package/dist/split-button.d.ts +24 -0
  131. package/dist/split-button.js +1 -0
  132. package/dist/split-button.stories.d.ts +17 -0
  133. package/dist/split-button.styles.d.ts +2 -0
  134. package/dist/split-button.styles.js +103 -0
  135. package/dist/split-button.test.basics.d.ts +1 -0
  136. package/dist/split-button.test.basics.js +84 -0
  137. package/dist/split-container.d.ts +30 -0
  138. package/dist/split-container.js +1 -0
  139. package/dist/split-container.styles.d.ts +2 -0
  140. package/dist/split-container.styles.js +132 -0
  141. package/dist/split-container.test.basics.d.ts +3 -0
  142. package/dist/split-container.test.basics.js +445 -0
  143. package/dist/split-container.test.interactions.d.ts +1 -0
  144. package/dist/split-container.test.interactions.js +20 -0
  145. package/dist/split-link.d.ts +25 -0
  146. package/dist/split-link.js +1 -0
  147. package/dist/split-link.test.basics.d.ts +1 -0
  148. package/dist/split-link.test.basics.js +92 -0
  149. package/dist/split-link.test.interactions.d.ts +1 -0
  150. package/dist/split-link.test.interactions.js +19 -0
  151. package/dist/status-indicator.js +1 -1
  152. package/dist/status-indicator.styles.js +2 -2
  153. package/dist/status-indicator.test.basics.js +102 -0
  154. package/dist/styles/focus-outline.js +1 -4
  155. package/dist/styles/visually-hidden.js +1 -11
  156. package/dist/tab.group.js +1 -1
  157. package/dist/tab.group.styles.js +2 -2
  158. package/dist/tab.group.test.basics.js +185 -0
  159. package/dist/tab.js +1 -1
  160. package/dist/tab.panel.js +1 -1
  161. package/dist/tab.panel.styles.js +3 -3
  162. package/dist/tab.styles.js +2 -2
  163. package/dist/tab.test.basics.js +71 -0
  164. package/dist/tag.js +1 -1
  165. package/dist/tag.styles.js +3 -3
  166. package/dist/tag.test.basics.js +118 -0
  167. package/dist/tag.test.events.js +16 -0
  168. package/dist/tag.test.focus.js +11 -0
  169. package/dist/textarea.js +2 -2
  170. package/dist/textarea.styles.js +3 -3
  171. package/dist/textarea.test.basics.js +140 -0
  172. package/dist/textarea.test.events.js +204 -0
  173. package/dist/textarea.test.form.js +70 -0
  174. package/dist/textarea.test.validity.js +83 -0
  175. package/dist/toasts.js +1 -1
  176. package/dist/toasts.styles.js +2 -2
  177. package/dist/toasts.test.basics.js +94 -0
  178. package/dist/toasts.toast.js +1 -1
  179. package/dist/toasts.toast.styles.js +5 -2
  180. package/dist/toasts.toast.test.basics.js +139 -0
  181. package/dist/toggle.js +1 -1
  182. package/dist/toggle.styles.js +3 -3
  183. package/dist/toggle.test.basics.js +64 -0
  184. package/dist/toggle.test.events.js +29 -0
  185. package/dist/toggle.test.focus.js +9 -0
  186. package/dist/toggle.test.states.js +35 -0
  187. package/dist/tooltip.js +1 -1
  188. package/dist/tooltip.styles.js +3 -3
  189. package/dist/tooltip.test.basics.js +64 -0
  190. package/dist/tooltip.test.interactions.js +78 -0
  191. package/dist/tree.item.icon-button.js +1 -1
  192. package/dist/tree.item.icon-button.styles.js +2 -2
  193. package/dist/tree.item.icon-button.test.basics.js +13 -0
  194. package/dist/tree.item.js +1 -1
  195. package/dist/tree.item.menu.js +1 -1
  196. package/dist/tree.item.menu.styles.js +2 -2
  197. package/dist/tree.item.menu.test.basics.js +34 -0
  198. package/dist/tree.item.styles.js +2 -2
  199. package/dist/tree.item.test.basics.js +102 -0
  200. package/dist/tree.js +1 -1
  201. package/dist/tree.styles.js +2 -2
  202. package/dist/tree.test.aria.js +86 -0
  203. package/dist/tree.test.basics.js +123 -0
  204. package/dist/tree.test.events.js +19 -0
  205. package/dist/tree.test.focus.js +261 -0
  206. package/package.json +18 -16
  207. /package/dist/{dropdown.option.test.focus.multiple.d.ts → dropdown.option.test.focus.d.ts} +0 -0
  208. /package/dist/{dropdown.option.test.focus.single.d.ts → dropdown.test.events.multiple.d.ts} +0 -0
package/dist/tree.js CHANGED
@@ -1 +1 @@
1
- "use strict";var O=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var f=(r,o,e,t)=>{for(var s=t>1?void 0:t?D(o,e):o,l=r.length-1,h;l>=0;l--)(h=r[l])&&(s=(t?h(o,e,s):h(s))||s);return t&&s&&O(o,e,s),s};var A=(r,o,e)=>{if(!o.has(r))throw TypeError("Cannot "+e)};var u=(r,o,e)=>(A(r,o,"read from private field"),e?e.call(r):o.get(r)),d=(r,o,e)=>{if(o.has(r))throw TypeError("Cannot add the same private member more than once");o instanceof WeakSet?o.add(r):o.set(r,e)};var i=(r,o,e)=>(A(r,o,"access private method"),e);var m,c,a,g,F,E,R,v,H,I,y,p,k,w,M,T,$;import{LitElement as L,html as U}from"lit";import{createRef as q,ref as K}from"lit/directives/ref.js";import{customElement as N,queryAssignedElements as j,state as b}from"lit/decorators.js";import{owSlot as S,owSlotType as C}from"./library/ow.js";import x from"./tree.item.js";import z from"./tree.styles.js";let n=class extends L{constructor(){super();d(this,c);d(this,g);d(this,E);d(this,v);d(this,I);d(this,p);d(this,w);d(this,T);this.privateTabIndex=0;d(this,m,q());this.addEventListener("focusin",i(this,I,y)),this.addEventListener("focusout",i(this,p,k))}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("focusin",i(this,I,y)),this.removeEventListener("focusout",i(this,p,k))}firstUpdated(){S(u(this,m).value),C(u(this,m).value,[x])}render(){return U`<div class="component" role="tree" tabindex="${this.privateTabIndex}" @click="${i(this,v,H)}" @keydown="${i(this,w,M)}"><slot @slotchange="${i(this,T,$)}" ${K(u(this,m))}></slot></div>`}selectItem(e){for(const t of this.slotElements)if(e===t)t.setAttribute("selected","true"),this.selectedItem=t;else{t.removeAttribute("selected");const s=t.selectItem(e);s&&(this.selectedItem=s)}this.dispatchEvent(new CustomEvent("item-selected",{bubbles:!0,detail:e}))}};m=new WeakMap,c=new WeakSet,a=function(e){e?.focus(),this.focusedItem=e},g=new WeakSet,F=function(){return[...this.querySelectorAll("glide-core-tree-item")]},E=new WeakSet,R=function(){const e=i(this,g,F).call(this),t=new Set;return e.filter(s=>{const l=s.parentElement?.closest("glide-core-tree-item");return l&&(!l.expanded||t.has(l))&&t.add(s),!t.has(s)})},v=new WeakSet,H=function(e){const t=e.target;if(t.closest("glide-core-tree-item-icon-button")??t.closest("glide-core-tree-item-menu"))return;const s=t.closest("glide-core-tree-item");s&&(s.hasChildTreeItems?s.toggleExpand():this.selectItem(s))},I=new WeakSet,y=function(e){let t;e.target===this?t=this.selectedItem??this.slotElements[0]:e.target instanceof x&&(t=e.target,this.privateTabIndex=-1),i(this,c,a).call(this,t)},p=new WeakSet,k=function(e){const t=e.relatedTarget;(!t||!this.contains(t))&&(this.privateTabIndex=0,this.focusedItem=void 0)},w=new WeakSet,M=function(e){if(!["ArrowRight","ArrowLeft","ArrowDown","ArrowUp","Home","End","Enter"].includes(e.key))return;const t=i(this,E,R).call(this),{focusedItem:s}=this,l=t.findIndex(h=>h.matches(":focus"));if(e.key==="ArrowRight"&&s?.hasChildTreeItems&&(s.expanded?i(this,c,a).call(this,s.slotElements[0]):s.toggleExpand()),e.key==="ArrowLeft")if(s?.expanded)s.toggleExpand();else{const h=s?.parentElement?.closest("glide-core-tree-item");i(this,c,a).call(this,h)}e.key==="ArrowDown"&&l!==-1&&l<t.length-1&&i(this,c,a).call(this,t[l+1]),e.key==="ArrowUp"&&l>0&&i(this,c,a).call(this,t[l-1]),e.key==="Home"&&i(this,c,a).call(this,t[0]),e.key==="End"&&i(this,c,a).call(this,t.at(-1)),e.key==="Enter"&&s&&(s.hasChildTreeItems?s.toggleExpand():this.selectItem(s))},T=new WeakSet,$=function(){S(u(this,m).value),C(u(this,m).value,[x])},n.shadowRootOptions={...L.shadowRootOptions,mode:"closed"},n.styles=z,f([b()],n.prototype,"selectedItem",2),f([b()],n.prototype,"focusedItem",2),f([b()],n.prototype,"privateTabIndex",2),f([j()],n.prototype,"slotElements",2),n=f([N("glide-core-tree")],n);export{n as default};
1
+ var __decorate=this&&this.__decorate||function(e,t,o,s){var r,l=arguments.length,i=l<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,o):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,o,s);else for(var n=e.length-1;n>=0;n--)(r=e[n])&&(i=(l<3?r(i):l>3?r(t,o,i):r(t,o))||i);return l>3&&i&&Object.defineProperty(t,o,i),i};import{LitElement,html}from"lit";import{createRef,ref}from"lit/directives/ref.js";import{customElement,queryAssignedElements,state}from"lit/decorators.js";import{owSlot,owSlotType}from"./library/ow.js";import GlideCoreTreeItem from"./tree.item.js";import styles from"./tree.styles.js";let GlideCoreTree=class GlideCoreTree extends LitElement{static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("focusin",this.#e),this.removeEventListener("focusout",this.#t)}firstUpdated(){owSlot(this.#o.value),owSlotType(this.#o.value,[GlideCoreTreeItem])}render(){return html`<div class="component" role="tree" tabindex="${this.privateTabIndex}" @click="${this.#s}" @keydown="${this.#r}"><slot @slotchange="${this.#l}" ${ref(this.#o)}></slot></div>`}selectItem(e){for(const t of this.slotElements)if(e===t)t.setAttribute("selected","true"),this.selectedItem=t;else{t.removeAttribute("selected");const o=t.selectItem(e);o&&(this.selectedItem=o)}this.dispatchEvent(new CustomEvent("item-selected",{bubbles:!0,detail:e}))}constructor(){super(),this.privateTabIndex=0,this.#o=createRef(),this.addEventListener("focusin",this.#e),this.addEventListener("focusout",this.#t)}#o;#i(e){e?.focus(),this.focusedItem=e}#n(){return[...this.querySelectorAll("glide-core-tree-item")]}#d(){const e=this.#n(),t=new Set;return e.filter((e=>{const o=e.parentElement?.closest("glide-core-tree-item");return!o||o.expanded&&!t.has(o)||t.add(e),!t.has(e)}))}#s(e){const t=e.target;if(t.closest("glide-core-tree-item-icon-button")??t.closest("glide-core-tree-item-menu"))return;const o=t.closest("glide-core-tree-item");o&&(o.hasChildTreeItems?o.toggleExpand():this.selectItem(o))}#e(e){let t;e.target===this?t=this.selectedItem??this.slotElements[0]:e.target instanceof GlideCoreTreeItem&&(t=e.target,this.privateTabIndex=-1),this.#i(t)}#t(e){const t=e.relatedTarget;t&&this.contains(t)||(this.privateTabIndex=0,this.focusedItem=void 0)}#r(e){if(!["ArrowRight","ArrowLeft","ArrowDown","ArrowUp","Home","End","Enter"].includes(e.key))return;const t=this.#d(),{focusedItem:o}=this,s=t.findIndex((e=>e.matches(":focus")));if("ArrowRight"===e.key&&o?.hasChildTreeItems&&(o.expanded?this.#i(o.slotElements[0]):o.toggleExpand()),"ArrowLeft"===e.key)if(o?.expanded)o.toggleExpand();else{const e=o?.parentElement?.closest("glide-core-tree-item");this.#i(e)}"ArrowDown"===e.key&&-1!==s&&s<t.length-1&&this.#i(t[s+1]),"ArrowUp"===e.key&&s>0&&this.#i(t[s-1]),"Home"===e.key&&this.#i(t[0]),"End"===e.key&&this.#i(t.at(-1)),"Enter"===e.key&&o&&(o.hasChildTreeItems?o.toggleExpand():this.selectItem(o))}#l(){owSlot(this.#o.value),owSlotType(this.#o.value,[GlideCoreTreeItem])}};__decorate([state()],GlideCoreTree.prototype,"selectedItem",void 0),__decorate([state()],GlideCoreTree.prototype,"focusedItem",void 0),__decorate([state()],GlideCoreTree.prototype,"privateTabIndex",void 0),__decorate([queryAssignedElements()],GlideCoreTree.prototype,"slotElements",void 0),GlideCoreTree=__decorate([customElement("glide-core-tree")],GlideCoreTree);export default GlideCoreTree;
@@ -1,7 +1,7 @@
1
- "use strict";import{css as o}from"lit";export default[o`
1
+ import{css}from"lit";export default[css`
2
2
  .component {
3
3
  font-family: var(--glide-core-body-sm-font-family);
4
4
  font-style: var(--glide-core-body-sm-font-style);
5
5
  font-weight: var(--glide-core-body-sm-font-weight);
6
6
  }
7
- `];
7
+ `];
@@ -0,0 +1,86 @@
1
+ import { expect, fixture, html } from '@open-wc/testing';
2
+ import GlideCoreTree from './tree.js';
3
+ import GlideCoreTreeItem from './tree.item.js';
4
+ GlideCoreTree.shadowRootOptions.mode = 'open';
5
+ GlideCoreTreeItem.shadowRootOptions.mode = 'open';
6
+ it('is accessible', async () => {
7
+ const component = await fixture(html `
8
+ <glide-core-tree>
9
+ <glide-core-tree-item label="Child Item 1"></glide-core-tree-item>
10
+ <glide-core-tree-item label="Child Item 2">
11
+ <glide-core-tree-item label="Grandchild Item 1"></glide-core-tree-item>
12
+ </glide-core-tree-item>
13
+ </glide-core-tree>
14
+ `);
15
+ await expect(component).to.be.accessible();
16
+ });
17
+ it('sets roles tree and treeitem', async () => {
18
+ const component = await fixture(html `
19
+ <glide-core-tree>
20
+ <glide-core-tree-item label="Child Item 1"></glide-core-tree-item>
21
+ <glide-core-tree-item label="Child Item 2">
22
+ <glide-core-tree-item label="Grandchild Item 1"></glide-core-tree-item>
23
+ </glide-core-tree-item>
24
+ </glide-core-tree>
25
+ `);
26
+ const childItems = component.slotElements;
27
+ expect(component.shadowRoot?.firstElementChild?.getAttribute('role')).to.equal('tree');
28
+ expect(childItems[0].shadowRoot?.querySelector('.component')?.getAttribute('role')).to.equal('treeitem');
29
+ expect(childItems[1].shadowRoot?.querySelector('.component')?.getAttribute('role')).to.equal('treeitem');
30
+ expect(childItems[1].slotElements[0].shadowRoot
31
+ ?.querySelector('.component')
32
+ ?.getAttribute('role')).to.equal('treeitem');
33
+ });
34
+ it('sets aria-expanded correctly', async () => {
35
+ const component = await fixture(html `
36
+ <glide-core-tree>
37
+ <glide-core-tree-item label="Child Item 1"></glide-core-tree-item>
38
+ <glide-core-tree-item label="Child Item 2">
39
+ <glide-core-tree-item label="Grandchild Item 1"></glide-core-tree-item>
40
+ </glide-core-tree-item>
41
+ <glide-core-tree-item label="Expanded child item" expanded>
42
+ <glide-core-tree-item label="Grandchild Item 2"></glide-core-tree-item>
43
+ </glide-core-tree-item>
44
+ </glide-core-tree>
45
+ `);
46
+ const childItems = component.slotElements;
47
+ expect(childItems[0].getAttribute('aria-expanded')).to.equal(null, 'does not set at all if there are no child items');
48
+ expect(childItems[1].shadowRoot
49
+ ?.querySelector('.component')
50
+ ?.getAttribute('aria-expanded')).to.equal('false', 'sets to string "false" if not expanded');
51
+ childItems[1].toggleExpand();
52
+ await childItems[1].updateComplete;
53
+ expect(childItems[1].shadowRoot
54
+ ?.querySelector('.component')
55
+ ?.getAttribute('aria-expanded')).to.equal('true', 'sets to string "true" after being expanded');
56
+ expect(childItems[2].shadowRoot
57
+ ?.querySelector('.component')
58
+ ?.getAttribute('aria-expanded')).to.equal('true', 'sets to string "true" if starts as expanded');
59
+ });
60
+ it('sets aria-selected correctly', async () => {
61
+ const component = await fixture(html `
62
+ <glide-core-tree>
63
+ <glide-core-tree-item label="Child Item 1">
64
+ <glide-core-tree-item label="Grandchild Item 1"></glide-core-tree-item>
65
+ </glide-core-tree-item>
66
+ <glide-core-tree-item label="Child Item 2"></glide-core-tree-item>
67
+ <glide-core-tree-item
68
+ label="Child Item 3"
69
+ selected
70
+ ></glide-core-tree-item>
71
+ </glide-core-tree>
72
+ `);
73
+ const childItems = component.slotElements;
74
+ expect(childItems[0].getAttribute('aria-selected')).to.equal(null, 'does not set at all if there are child items');
75
+ expect(childItems[1].shadowRoot
76
+ ?.querySelector('.component')
77
+ ?.getAttribute('aria-selected')).to.equal('false', 'sets to string "false" if not selected');
78
+ expect(childItems[2].shadowRoot
79
+ ?.querySelector('.component')
80
+ ?.getAttribute('aria-selected')).to.equal('true', 'sets to string "true" if starts as selected');
81
+ component.selectItem(childItems[1]);
82
+ await childItems[1].updateComplete;
83
+ expect(childItems[1].shadowRoot
84
+ ?.querySelector('.component')
85
+ ?.getAttribute('aria-selected')).to.equal('true', 'sets to string "true" after being selected');
86
+ });
@@ -0,0 +1,123 @@
1
+ import './tree.item.icon-button.js';
2
+ import './tree.item.js';
3
+ import './tree.js';
4
+ import { ArgumentError } from 'ow';
5
+ import { assert, expect, fixture, html } from '@open-wc/testing';
6
+ import GlideCoreTree from './tree.js';
7
+ import expectArgumentError from './library/expect-argument-error.js';
8
+ import sinon from 'sinon';
9
+ GlideCoreTree.shadowRootOptions.mode = 'open';
10
+ it('registers', async () => {
11
+ expect(window.customElements.get('glide-core-tree')).to.equal(GlideCoreTree);
12
+ });
13
+ it('renders and sets default attributes', async () => {
14
+ const tree = await fixture(html `
15
+ <glide-core-tree>
16
+ <glide-core-tree-item label="Child Item"></glide-core-tree-item>
17
+ </glide-core-tree>
18
+ `);
19
+ expect(tree.selectedItem).to.equal(undefined);
20
+ });
21
+ it('can select child and grandchild items', async () => {
22
+ const tree = await fixture(html `
23
+ <glide-core-tree>
24
+ <glide-core-tree-item label="Child Item 1"></glide-core-tree-item>
25
+ <glide-core-tree-item label="Child Item 2">
26
+ <glide-core-tree-item label="Grandchild Item 1"></glide-core-tree-item>
27
+ </glide-core-tree-item>
28
+ </glide-core-tree>
29
+ `);
30
+ const childItems = tree.slotElements;
31
+ const grandchildItems = childItems?.[1].slotElements;
32
+ tree.selectItem(childItems[0]);
33
+ expect(childItems[0].selected).to.equal(true);
34
+ expect(tree.selectedItem).to.equal(childItems[0]);
35
+ expect(childItems[1].selected).to.equal(false);
36
+ expect(grandchildItems[0].selected).to.equal(false);
37
+ tree.selectItem(grandchildItems[0]);
38
+ expect(childItems[0].selected).to.equal(false);
39
+ expect(childItems[1].selected).to.equal(false);
40
+ expect(grandchildItems[0].selected).to.equal(true);
41
+ expect(tree.selectedItem).to.equal(grandchildItems[0]);
42
+ });
43
+ it('can click child and grandchild items to expand or select them', async () => {
44
+ const tree = await fixture(html `
45
+ <glide-core-tree>
46
+ <glide-core-tree-item label="Child Item 1"></glide-core-tree-item>
47
+ <glide-core-tree-item label="Child Item 2">
48
+ <glide-core-tree-item label="Grandchild Item 1"></glide-core-tree-item>
49
+ </glide-core-tree-item>
50
+ </glide-core-tree>
51
+ `);
52
+ const childItems = tree.slotElements;
53
+ const grandchildItems = childItems?.[1].slotElements;
54
+ // Clicking an item that doesn't have children selects it
55
+ childItems[0].click();
56
+ expect(childItems[0].selected).to.equal(true);
57
+ expect(childItems[1].selected).to.equal(false);
58
+ expect(grandchildItems[0].selected).to.equal(false);
59
+ expect(childItems[1].expanded).to.equal(false);
60
+ // Clicking an item that has children expands it
61
+ childItems[1].click();
62
+ expect(childItems[1].expanded).to.equal(true);
63
+ // Can click and select a grandchild item
64
+ grandchildItems[0].click();
65
+ expect(grandchildItems[0].selected).to.equal(true);
66
+ });
67
+ it('does not select an item if a tree-item-icon-button is clicked', async () => {
68
+ const tree = await fixture(html `
69
+ <glide-core-tree>
70
+ <glide-core-tree-item label="Child Item 1">
71
+ <glide-core-tree-item-icon-button slot="suffix" data-test-icon-button>
72
+ <svg viewBox="0 0 24 24">
73
+ <path d="M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z" />
74
+ </svg>
75
+ </glide-core-tree-item-icon-button>
76
+ </glide-core-tree-item>
77
+ </glide-core-tree>
78
+ `);
79
+ const childItems = tree.slotElements;
80
+ const iconButton = childItems[0].querySelector('[data-test-icon-button]');
81
+ assert(iconButton);
82
+ iconButton.click();
83
+ await iconButton.updateComplete;
84
+ expect(childItems[0].selected).to.equal(false);
85
+ });
86
+ it('does not select an item if its menu slot is clicked', async () => {
87
+ const tree = await fixture(html `
88
+ <glide-core-tree>
89
+ <glide-core-tree-item label="Child Item 1">
90
+ <glide-core-tree-item-menu slot="menu" data-test-menu>
91
+ <glide-core-menu-link label="Edit" url="/edit"></glide-core-menu-link>
92
+ </glide-core-tree-item-menu>
93
+ </glide-core-tree-item>
94
+ </glide-core-tree>
95
+ `);
96
+ const childItems = tree.slotElements;
97
+ const menu = childItems[0].querySelector('[data-test-menu]');
98
+ assert(menu);
99
+ menu.click();
100
+ await menu.updateComplete;
101
+ expect(childItems[0].selected).to.equal(false);
102
+ });
103
+ it('throws if it does not have a default slot', async () => {
104
+ const spy = sinon.spy();
105
+ try {
106
+ await fixture(html `<glide-core-tree></glide-core-tree>`);
107
+ }
108
+ catch (error) {
109
+ if (error instanceof ArgumentError) {
110
+ spy();
111
+ }
112
+ }
113
+ expect(spy.called).to.be.true;
114
+ });
115
+ it('throws if the default slot is the incorrect type', async () => {
116
+ await expectArgumentError(() => {
117
+ return fixture(html `
118
+ <glide-core-tree>
119
+ <button>Button</button>
120
+ </glide-core-tree>
121
+ `);
122
+ });
123
+ });
@@ -0,0 +1,19 @@
1
+ import './tree.item.menu.js';
2
+ import './tree.js';
3
+ import { expect, fixture, html, oneEvent } from '@open-wc/testing';
4
+ import GlideCoreTree from './tree.js';
5
+ import GlideCoreTreeItem from './tree.item.js';
6
+ it('dispatches an "item-selected" event when an item is clicked', async () => {
7
+ const component = await fixture(html `
8
+ <glide-core-tree>
9
+ <glide-core-tree-item label="Child Item"></glide-core-tree-item>
10
+ </glide-core-tree>
11
+ `);
12
+ setTimeout(() => {
13
+ component.querySelector('glide-core-tree-item')?.click();
14
+ });
15
+ const event = await oneEvent(component, 'item-selected');
16
+ expect(event instanceof CustomEvent).to.be.true;
17
+ expect(event.bubbles).to.be.true;
18
+ expect(event.detail instanceof GlideCoreTreeItem).to.be.true;
19
+ });
@@ -0,0 +1,261 @@
1
+ import './tree.js';
2
+ import { assert, expect, fixture, html } from '@open-wc/testing';
3
+ import { sendKeys } from '@web/test-runner-commands';
4
+ import GlideCoreTree from './tree.js';
5
+ import GlideCoreTreeItem from './tree.item.js';
6
+ import GlideCoreTreeItemIconButton from './tree.item.icon-button.js';
7
+ import GlideCoreTreeItemMenu from './tree.item.menu.js';
8
+ GlideCoreTree.shadowRootOptions.mode = 'open';
9
+ it('focuses the first tree item when tree is focused, if there are no selected items', async () => {
10
+ const tree = await fixture(html `
11
+ <glide-core-tree>
12
+ <glide-core-tree-item label="Child Item 1">
13
+ <glide-core-tree-item label="Grandchild Item 1"></glide-core-tree-item>
14
+ </glide-core-tree-item>
15
+ <glide-core-tree-item label="Child Item 2"></glide-core-tree-item>
16
+ </glide-core-tree>
17
+ `);
18
+ tree.dispatchEvent(new Event('focusin'));
19
+ const childItems = tree.slotElements;
20
+ assert(document.activeElement instanceof GlideCoreTreeItem);
21
+ expect(document.activeElement?.label).to.equal(childItems[0].label);
22
+ });
23
+ it('focuses the selected tree item on `focus()`, if there is one', async () => {
24
+ const tree = await fixture(html `
25
+ <glide-core-tree>
26
+ <glide-core-tree-item label="Child Item 1"></glide-core-tree-item>
27
+ <glide-core-tree-item label="Child Item 2"></glide-core-tree-item>
28
+ </glide-core-tree>
29
+ `);
30
+ const childItems = tree.slotElements;
31
+ tree.selectItem(childItems[1]);
32
+ tree.dispatchEvent(new Event('focusin'));
33
+ await tree.updateComplete;
34
+ assert(document.activeElement instanceof GlideCoreTreeItem);
35
+ expect(document.activeElement?.label).to.equal(childItems[1].label);
36
+ });
37
+ it('expands a tree item if right arrow is pressed', async () => {
38
+ const tree = await fixture(html `
39
+ <glide-core-tree>
40
+ <glide-core-tree-item label="Child Item 1">
41
+ <glide-core-tree-item label="Grandchild Item 1"></glide-core-tree-item>
42
+ </glide-core-tree-item>
43
+ <glide-core-tree-item label="Child Item 2"></glide-core-tree-item>
44
+ </glide-core-tree>
45
+ `);
46
+ const childItems = tree.slotElements;
47
+ tree.dispatchEvent(new Event('focusin'));
48
+ await sendKeys({ press: 'ArrowRight' });
49
+ expect(childItems[0].expanded).to.equal(true);
50
+ assert(document.activeElement instanceof GlideCoreTreeItem);
51
+ expect(document.activeElement?.label).to.equal(childItems[0].label, 'focus does not move');
52
+ });
53
+ it(`focuses on an expanded tree item's child if right arrow is pressed`, async () => {
54
+ const tree = await fixture(html `
55
+ <glide-core-tree>
56
+ <glide-core-tree-item label="Child Item 1" expanded>
57
+ <glide-core-tree-item label="Grandchild Item 1"></glide-core-tree-item>
58
+ </glide-core-tree-item>
59
+ <glide-core-tree-item label="Child Item 2"></glide-core-tree-item>
60
+ </glide-core-tree>
61
+ `);
62
+ const childItems = tree.slotElements;
63
+ tree.dispatchEvent(new Event('focusin'));
64
+ await sendKeys({ press: 'ArrowRight' });
65
+ assert(document.activeElement instanceof GlideCoreTreeItem);
66
+ expect(document.activeElement?.label).to.equal(childItems[0].slotElements[0].label);
67
+ });
68
+ it('collapses an expanded tree item if left arrow is pressed', async () => {
69
+ const tree = await fixture(html `
70
+ <glide-core-tree>
71
+ <glide-core-tree-item label="Child Item 1" expanded>
72
+ <glide-core-tree-item label="Grandchild Item 1"></glide-core-tree-item>
73
+ </glide-core-tree-item>
74
+ <glide-core-tree-item label="Child Item 2"></glide-core-tree-item>
75
+ </glide-core-tree>
76
+ `);
77
+ const childItems = tree.slotElements;
78
+ tree.dispatchEvent(new Event('focusin'));
79
+ await sendKeys({ press: 'ArrowLeft' });
80
+ expect(childItems[0].expanded).to.equal(false);
81
+ assert(document.activeElement instanceof GlideCoreTreeItem);
82
+ expect(document.activeElement?.label).to.equal(childItems[0].label, 'focus does not move');
83
+ });
84
+ it(`focuses on a collapsed tree item's parent if left arrow is pressed`, async () => {
85
+ const tree = await fixture(html `
86
+ <glide-core-tree>
87
+ <glide-core-tree-item label="Child Item 1">
88
+ <glide-core-tree-item label="Grandchild Item 1"></glide-core-tree-item>
89
+ </glide-core-tree-item>
90
+ <glide-core-tree-item label="Child Item 2"></glide-core-tree-item>
91
+ </glide-core-tree>
92
+ `);
93
+ const childItems = tree.slotElements;
94
+ const grandchildItems = childItems[0].slotElements;
95
+ grandchildItems[0].focus();
96
+ await sendKeys({ press: 'ArrowLeft' });
97
+ assert(document.activeElement instanceof GlideCoreTreeItem);
98
+ expect(document.activeElement?.label).to.equal(childItems[0].label);
99
+ });
100
+ it('moves down the non-expanded tree items with down arrow', async () => {
101
+ const tree = await fixture(html `
102
+ <glide-core-tree>
103
+ <glide-core-tree-item label="Child Item 1" expanded>
104
+ <glide-core-tree-item label="Grandchild Item 1"></glide-core-tree-item>
105
+ </glide-core-tree-item>
106
+ <glide-core-tree-item label="Child Item 2">
107
+ <glide-core-tree-item label="Grandchild Item 2"></glide-core-tree-item>
108
+ </glide-core-tree-item>
109
+ <glide-core-tree-item label="Child Item 3"></glide-core-tree-item>
110
+ </glide-core-tree>
111
+ `);
112
+ const childItems = tree.slotElements;
113
+ tree.dispatchEvent(new Event('focusin'));
114
+ await sendKeys({ press: 'ArrowDown' });
115
+ assert(document.activeElement instanceof GlideCoreTreeItem);
116
+ expect(document.activeElement?.label).to.equal(childItems[0].slotElements[0].label, 'moves to child item if expanded');
117
+ await sendKeys({ press: 'ArrowDown' });
118
+ expect(document.activeElement?.label).to.equal(childItems[1].label, 'moves from last child for next parent');
119
+ await sendKeys({ press: 'ArrowDown' });
120
+ expect(document.activeElement?.label).to.equal(childItems[2].label, 'Does not navigate to collapsed tree items');
121
+ await sendKeys({ press: 'ArrowDown' });
122
+ expect(document.activeElement?.label).to.equal(childItems[2].label, 'Does not move if at the last item');
123
+ });
124
+ it('moves up the non-expanded tree items with up arrow', async () => {
125
+ const tree = await fixture(html `
126
+ <glide-core-tree>
127
+ <glide-core-tree-item label="Child Item 1">
128
+ <glide-core-tree-item label="Grandchild Item 1"></glide-core-tree-item>
129
+ </glide-core-tree-item>
130
+ <glide-core-tree-item label="Child Item 2" expanded>
131
+ <glide-core-tree-item label="Grandchild Item 2"></glide-core-tree-item>
132
+ </glide-core-tree-item>
133
+ </glide-core-tree>
134
+ `);
135
+ const childItems = tree.slotElements;
136
+ // Start at the last item
137
+ childItems[1].slotElements[0].focus();
138
+ await sendKeys({ press: 'ArrowUp' });
139
+ assert(document.activeElement instanceof GlideCoreTreeItem);
140
+ expect(document.activeElement?.label).to.equal(childItems[1].label);
141
+ await sendKeys({ press: 'ArrowUp' });
142
+ expect(document.activeElement?.label).to.equal(childItems[0].label, 'Does not navigate to collapsed tree items');
143
+ await sendKeys({ press: 'ArrowUp' });
144
+ expect(document.activeElement?.label).to.equal(childItems[0].label, 'Does not move if at the first item');
145
+ });
146
+ it('moves to the first item when Home is pressed', async () => {
147
+ const tree = await fixture(html `
148
+ <glide-core-tree>
149
+ <glide-core-tree-item label="Child Item 1">
150
+ <glide-core-tree-item label="Grandchild Item 1"></glide-core-tree-item>
151
+ </glide-core-tree-item>
152
+ <glide-core-tree-item label="Child Item 2" expanded>
153
+ <glide-core-tree-item label="Grandchild Item 2"></glide-core-tree-item>
154
+ </glide-core-tree-item>
155
+ </glide-core-tree>
156
+ `);
157
+ const childItems = tree.slotElements;
158
+ // Start at the last item
159
+ childItems[1].slotElements[0].focus();
160
+ await sendKeys({ press: 'Home' });
161
+ assert(document.activeElement instanceof GlideCoreTreeItem);
162
+ expect(document.activeElement?.label).to.equal(childItems[0].label);
163
+ });
164
+ it('moves to the last item when End is pressed', async () => {
165
+ const tree = await fixture(html `
166
+ <glide-core-tree>
167
+ <glide-core-tree-item label="Child Item 1">
168
+ <glide-core-tree-item label="Grandchild Item 1"></glide-core-tree-item>
169
+ </glide-core-tree-item>
170
+ <glide-core-tree-item label="Child Item 2" expanded>
171
+ <glide-core-tree-item label="Grandchild Item 2"></glide-core-tree-item>
172
+ </glide-core-tree-item>
173
+ </glide-core-tree>
174
+ `);
175
+ const childItems = tree.slotElements;
176
+ // Start at the first item
177
+ childItems[0].focus();
178
+ await sendKeys({ press: 'End' });
179
+ assert(document.activeElement instanceof GlideCoreTreeItem);
180
+ expect(document.activeElement?.label).to.equal(childItems[1].slotElements[0].label);
181
+ });
182
+ it('selects or expands/collapses node when Enter is pressed', async () => {
183
+ const tree = await fixture(html `
184
+ <glide-core-tree>
185
+ <glide-core-tree-item label="Child Item 1"></glide-core-tree-item>
186
+ <glide-core-tree-item label="Child Item 2">
187
+ <glide-core-tree-item label="Grandchild Item 1"></glide-core-tree-item>
188
+ </glide-core-tree-item>
189
+ </glide-core-tree>
190
+ `);
191
+ const childItems = tree.slotElements;
192
+ const grandchildItems = childItems?.[1].slotElements;
193
+ // For an item that doesn't have children, selects it
194
+ childItems[0].focus();
195
+ await sendKeys({ press: 'Enter' });
196
+ expect(childItems[0].selected).to.equal(true);
197
+ expect(childItems[1].selected).to.equal(false);
198
+ expect(grandchildItems[0].selected).to.equal(false);
199
+ expect(childItems[1].expanded).to.equal(false);
200
+ // For an item that has children, expands it
201
+ childItems[1].focus();
202
+ await sendKeys({ press: 'Enter' });
203
+ expect(childItems[1].expanded).to.equal(true);
204
+ // Can select a grandchild item
205
+ grandchildItems[0].focus();
206
+ await sendKeys({ press: 'Enter' });
207
+ expect(grandchildItems[0].selected).to.equal(true);
208
+ });
209
+ it('does nothing if some other key is pressed', async () => {
210
+ const tree = await fixture(html `
211
+ <glide-core-tree>
212
+ <glide-core-tree-item label="Child Item 1">
213
+ <glide-core-tree-item label="Grandchild Item 1"></glide-core-tree-item>
214
+ </glide-core-tree-item>
215
+ <glide-core-tree-item label="Child Item 2" expanded>
216
+ <glide-core-tree-item label="Grandchild Item 2"></glide-core-tree-item>
217
+ </glide-core-tree-item>
218
+ </glide-core-tree>
219
+ `);
220
+ const childItems = tree.slotElements;
221
+ // Start at the first item
222
+ childItems[0].focus();
223
+ await sendKeys({ press: 'a' });
224
+ assert(document.activeElement instanceof GlideCoreTreeItem);
225
+ expect(document.activeElement?.label).to.equal(childItems[0].label);
226
+ });
227
+ it('can use the keyboard to navigate to a tree item icon button', async () => {
228
+ const tree = await fixture(html `
229
+ <glide-core-tree>
230
+ <glide-core-tree-item label="Child Item 1">
231
+ <glide-core-tree-item-icon-button slot="suffix">
232
+ <svg viewBox="0 0 24 24">
233
+ <path d="M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z" />
234
+ </svg>
235
+ </glide-core-tree-item-icon-button>
236
+ </glide-core-tree-item>
237
+ </glide-core-tree>
238
+ `);
239
+ tree.dispatchEvent(new Event('focusin'));
240
+ const childItems = tree.slotElements;
241
+ childItems[0].focus();
242
+ await sendKeys({ press: 'Tab' });
243
+ assert(document.activeElement instanceof GlideCoreTreeItemIconButton);
244
+ });
245
+ it('can use the keyboard to navigate to a tree item menu', async () => {
246
+ const tree = await fixture(html `
247
+ <glide-core-tree>
248
+ <glide-core-tree-item label="Child Item 1">
249
+ <glide-core-tree-item-menu slot="menu">
250
+ <glide-core-menu-link label="Edit" url="/edit">
251
+ </glide-core-menu-link>
252
+ </glide-core-tree-item-menu>
253
+ </glide-core-tree-item>
254
+ </glide-core-tree>
255
+ `);
256
+ tree.dispatchEvent(new Event('focusin'));
257
+ const childItems = tree.slotElements;
258
+ childItems[0].focus();
259
+ await sendKeys({ press: 'Tab' });
260
+ assert(document.activeElement instanceof GlideCoreTreeItemMenu);
261
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crowdstrike/glide-core",
3
- "version": "0.5.1",
3
+ "version": "0.5.2",
4
4
  "description": "CrowdStrike's Glide Design System components package for providing web components",
5
5
  "author": "CrowdStrike UX Team",
6
6
  "license": "Apache-2.0",
@@ -45,15 +45,15 @@
45
45
  "@eslint/js": "^8.56.0",
46
46
  "@open-wc/testing": "^3.2.2",
47
47
  "@rollup/plugin-commonjs": "^25.0.7",
48
- "@storybook/addon-essentials": "^8.0.9",
49
- "@storybook/addon-links": "^8.0.9",
50
- "@storybook/blocks": "^8.0.9",
51
- "@storybook/core-events": "^8.0.9",
52
- "@storybook/manager-api": "^8.1.1",
53
- "@storybook/preview-api": "^8.0.9",
54
- "@storybook/theming": "^8.1.1",
55
- "@storybook/web-components": "^8.0.9",
56
- "@storybook/web-components-vite": "^8.0.9",
48
+ "@storybook/addon-essentials": "^8.1.11",
49
+ "@storybook/addon-links": "^8.1.11",
50
+ "@storybook/blocks": "^8.1.11",
51
+ "@storybook/core-events": "^8.1.11",
52
+ "@storybook/manager-api": "^8.1.11",
53
+ "@storybook/preview-api": "^8.1.11",
54
+ "@storybook/theming": "^8.1.11",
55
+ "@storybook/web-components": "^8.1.11",
56
+ "@storybook/web-components-vite": "^8.1.11",
57
57
  "@stylistic/eslint-plugin": "^1.7.0",
58
58
  "@types/mocha": "^10.0.6",
59
59
  "@types/sinon": "^17.0.3",
@@ -83,14 +83,16 @@
83
83
  "postcss": "^8.4.38",
84
84
  "postcss-lit": "^1.1.1",
85
85
  "prettier": "3.1.0",
86
+ "rimraf": "^5.0.7",
86
87
  "sinon": "^17.0.1",
87
- "storybook": "^8.0.9",
88
+ "storybook": "^8.1.11",
88
89
  "stylelint": "^16.3.1",
89
90
  "stylelint-config-standard": "^36.0.0",
90
91
  "stylelint-order": "^6.0.4",
91
92
  "stylelint-prettier": "^5.0.0",
92
93
  "stylelint-use-logical": "^2.1.2",
93
94
  "stylelint-use-nesting": "^5.1.1",
95
+ "terser": "^5.31.1",
94
96
  "ts-lit-plugin": "^2.0.2",
95
97
  "typescript": "^5.3.3",
96
98
  "typescript-eslint": "^7.8.0",
@@ -102,12 +104,11 @@
102
104
  "scripts": {
103
105
  "start": "per-env",
104
106
  "start:development": "storybook dev --config-dir .storybook --disable-telemetry --port 6006",
105
- "start:production": "npm-run-all --parallel start:production:components start:production:storybook start:production:stylesheets --aggregate-output --print-label",
106
- "start:production:components": "node ./esbuild.ts.js && tsc --emitDeclarationOnly --declaration --outDir ./dist",
107
- "start:production:components:comment": "https://github.com/evanw/esbuild/issues/95#issuecomment-626069971",
107
+ "start:production": "rimraf ./dist && npm-run-all --parallel start:production:components start:production:storybook start:production:stylesheets --aggregate-output --print-label",
108
+ "start:production:components": "tsc --outDir ./dist && node ./terser.js",
108
109
  "start:production:figma": "pnpm dt export-variables && pnpm dt build-tokens && pnpm dt build-styles",
109
110
  "start:production:storybook": "storybook build --config-dir .storybook --disable-telemetry --output-dir ./dist/storybook",
110
- "start:production:stylesheets": "node ./esbuild.css.js",
111
+ "start:production:stylesheets": "node ./esbuild.js",
111
112
  "format": "per-env",
112
113
  "format:development": "prettier . --write && stylelint '**/*.styles.ts' --custom-syntax postcss-lit --fix",
113
114
  "format:production": "prettier . --check && stylelint '**/*.styles.ts' --custom-syntax postcss-lit --no-color",
@@ -124,6 +125,7 @@
124
125
  "test:development:serve": "npx http-server dist/coverage/lcov-report --silent",
125
126
  "test:development:web-test-runner": "web-test-runner --watch",
126
127
  "test:production": "npm-run-all --parallel test:production:* start:production:stylesheets --aggregate-output --print-label",
127
- "test:production:web-test-runner": "web-test-runner"
128
+ "test:production:web-test-runner": "web-test-runner",
129
+ "postinstall": "pnpm dlx playwright install --with-deps"
128
130
  }
129
131
  }