@crowdstrike/glide-core 0.5.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 (272) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +41 -0
  3. package/dist/accordion.d.ts +23 -0
  4. package/dist/accordion.js +1 -0
  5. package/dist/accordion.stories.d.ts +9 -0
  6. package/dist/accordion.styles.d.ts +2 -0
  7. package/dist/accordion.styles.js +98 -0
  8. package/dist/accordion.test.basics.d.ts +1 -0
  9. package/dist/accordion.test.events.d.ts +1 -0
  10. package/dist/button-group.button.d.ts +33 -0
  11. package/dist/button-group.button.js +1 -0
  12. package/dist/button-group.button.styles.d.ts +2 -0
  13. package/dist/button-group.button.styles.js +99 -0
  14. package/dist/button-group.button.test.basics.d.ts +1 -0
  15. package/dist/button-group.button.test.events.d.ts +1 -0
  16. package/dist/button-group.d.ts +26 -0
  17. package/dist/button-group.js +1 -0
  18. package/dist/button-group.stories.d.ts +16 -0
  19. package/dist/button-group.styles.d.ts +2 -0
  20. package/dist/button-group.styles.js +18 -0
  21. package/dist/button-group.test.basics.d.ts +1 -0
  22. package/dist/button-group.test.events.d.ts +1 -0
  23. package/dist/button.d.ts +29 -0
  24. package/dist/button.js +1 -0
  25. package/dist/button.stories.d.ts +17 -0
  26. package/dist/button.styles.d.ts +2 -0
  27. package/dist/button.styles.js +133 -0
  28. package/dist/button.test.basics.d.ts +1 -0
  29. package/dist/button.test.events.d.ts +1 -0
  30. package/dist/button.test.form.d.ts +1 -0
  31. package/dist/checkbox-group.d.ts +43 -0
  32. package/dist/checkbox-group.js +1 -0
  33. package/dist/checkbox-group.stories.d.ts +7 -0
  34. package/dist/checkbox-group.styles.d.ts +2 -0
  35. package/dist/checkbox-group.styles.js +20 -0
  36. package/dist/checkbox-group.test.basics.d.ts +1 -0
  37. package/dist/checkbox-group.test.events.d.ts +1 -0
  38. package/dist/checkbox-group.test.focus.d.ts +1 -0
  39. package/dist/checkbox-group.test.form.d.ts +1 -0
  40. package/dist/checkbox-group.test.validity.d.ts +1 -0
  41. package/dist/checkbox.d.ts +50 -0
  42. package/dist/checkbox.js +1 -0
  43. package/dist/checkbox.stories.d.ts +9 -0
  44. package/dist/checkbox.styles.d.ts +2 -0
  45. package/dist/checkbox.styles.js +116 -0
  46. package/dist/checkbox.test.basics.d.ts +1 -0
  47. package/dist/checkbox.test.events.d.ts +1 -0
  48. package/dist/checkbox.test.focus.d.ts +1 -0
  49. package/dist/checkbox.test.form.d.ts +1 -0
  50. package/dist/checkbox.test.states.d.ts +1 -0
  51. package/dist/checkbox.test.validity.d.ts +1 -0
  52. package/dist/drawer.d.ts +30 -0
  53. package/dist/drawer.js +15 -0
  54. package/dist/drawer.stories.d.ts +7 -0
  55. package/dist/drawer.styles.d.ts +2 -0
  56. package/dist/drawer.styles.js +34 -0
  57. package/dist/drawer.test.accessibility.d.ts +1 -0
  58. package/dist/drawer.test.basics.d.ts +1 -0
  59. package/dist/drawer.test.closing.d.ts +1 -0
  60. package/dist/drawer.test.events.d.ts +1 -0
  61. package/dist/drawer.test.methods.d.ts +1 -0
  62. package/dist/dropdown.d.ts +66 -0
  63. package/dist/dropdown.js +1 -0
  64. package/dist/dropdown.option.d.ts +33 -0
  65. package/dist/dropdown.option.js +1 -0
  66. package/dist/dropdown.option.styles.d.ts +2 -0
  67. package/dist/dropdown.option.styles.js +64 -0
  68. package/dist/dropdown.option.test.basics.d.ts +1 -0
  69. package/dist/dropdown.option.test.basics.multiple.d.ts +1 -0
  70. package/dist/dropdown.option.test.basics.single.d.ts +1 -0
  71. package/dist/dropdown.option.test.events.d.ts +1 -0
  72. package/dist/dropdown.option.test.focus.multiple.d.ts +1 -0
  73. package/dist/dropdown.option.test.focus.single.d.ts +1 -0
  74. package/dist/dropdown.option.test.interactions.multiple.d.ts +1 -0
  75. package/dist/dropdown.option.test.interactions.single.d.ts +1 -0
  76. package/dist/dropdown.stories.d.ts +15 -0
  77. package/dist/dropdown.styles.d.ts +2 -0
  78. package/dist/dropdown.styles.js +162 -0
  79. package/dist/dropdown.test.basics.d.ts +1 -0
  80. package/dist/dropdown.test.basics.filterable.d.ts +1 -0
  81. package/dist/dropdown.test.basics.multiple.d.ts +1 -0
  82. package/dist/dropdown.test.basics.single.d.ts +1 -0
  83. package/dist/dropdown.test.events.d.ts +1 -0
  84. package/dist/dropdown.test.focus.filterable.d.ts +1 -0
  85. package/dist/dropdown.test.focus.multiple.d.ts +1 -0
  86. package/dist/dropdown.test.focus.single.d.ts +1 -0
  87. package/dist/dropdown.test.form.d.ts +1 -0
  88. package/dist/dropdown.test.form.multiple.d.ts +1 -0
  89. package/dist/dropdown.test.form.single.d.ts +1 -0
  90. package/dist/dropdown.test.interactions.d.ts +1 -0
  91. package/dist/dropdown.test.interactions.filterable.d.ts +1 -0
  92. package/dist/dropdown.test.interactions.multiple.d.ts +1 -0
  93. package/dist/dropdown.test.interactions.single.d.ts +1 -0
  94. package/dist/dropdown.test.validity.d.ts +1 -0
  95. package/dist/icon-button.d.ts +22 -0
  96. package/dist/icon-button.js +1 -0
  97. package/dist/icon-button.stories.d.ts +8 -0
  98. package/dist/icon-button.styles.d.ts +2 -0
  99. package/dist/icon-button.styles.js +112 -0
  100. package/dist/icon-button.test.basics.d.ts +1 -0
  101. package/dist/icons/checked.d.ts +2 -0
  102. package/dist/icons/checked.js +1 -0
  103. package/dist/icons/magnifying-glass.d.ts +2 -0
  104. package/dist/icons/magnifying-glass.js +1 -0
  105. package/dist/input.d.ts +67 -0
  106. package/dist/input.js +1 -0
  107. package/dist/input.stories.d.ts +19 -0
  108. package/dist/input.styles.d.ts +2 -0
  109. package/dist/input.styles.js +109 -0
  110. package/dist/input.test.basics.d.ts +1 -0
  111. package/dist/input.test.events.d.ts +1 -0
  112. package/dist/input.test.focus.d.ts +1 -0
  113. package/dist/input.test.form.d.ts +1 -0
  114. package/dist/input.test.validity.d.ts +1 -0
  115. package/dist/label.d.ts +33 -0
  116. package/dist/label.js +1 -0
  117. package/dist/label.styles.d.ts +2 -0
  118. package/dist/label.styles.js +154 -0
  119. package/dist/label.test.basics.d.ts +1 -0
  120. package/dist/library/expect-argument-error.d.ts +1 -0
  121. package/dist/library/expect-argument-error.js +1 -0
  122. package/dist/library/ow.d.ts +16 -0
  123. package/dist/library/ow.js +1 -0
  124. package/dist/library/ow.test.d.ts +4 -0
  125. package/dist/menu.button.d.ts +21 -0
  126. package/dist/menu.button.js +1 -0
  127. package/dist/menu.button.styles.d.ts +2 -0
  128. package/dist/menu.button.styles.js +20 -0
  129. package/dist/menu.button.test.basics.d.ts +1 -0
  130. package/dist/menu.d.ts +27 -0
  131. package/dist/menu.js +1 -0
  132. package/dist/menu.link.d.ts +22 -0
  133. package/dist/menu.link.js +1 -0
  134. package/dist/menu.link.styles.d.ts +2 -0
  135. package/dist/menu.link.styles.js +22 -0
  136. package/dist/menu.link.test.basics.d.ts +1 -0
  137. package/dist/menu.stories.d.ts +9 -0
  138. package/dist/menu.styles.d.ts +2 -0
  139. package/dist/menu.styles.js +61 -0
  140. package/dist/menu.test.basics.d.ts +1 -0
  141. package/dist/menu.test.focus.d.ts +2 -0
  142. package/dist/menu.test.interactions.d.ts +2 -0
  143. package/dist/modal.d.ts +51 -0
  144. package/dist/modal.icon-button.d.ts +26 -0
  145. package/dist/modal.icon-button.js +1 -0
  146. package/dist/modal.icon-button.styles.d.ts +2 -0
  147. package/dist/modal.icon-button.styles.js +8 -0
  148. package/dist/modal.icon-button.test.basics.d.ts +1 -0
  149. package/dist/modal.js +15 -0
  150. package/dist/modal.stories.d.ts +14 -0
  151. package/dist/modal.styles.d.ts +2 -0
  152. package/dist/modal.styles.js +169 -0
  153. package/dist/modal.tertiary-icon.d.ts +21 -0
  154. package/dist/modal.tertiary-icon.js +1 -0
  155. package/dist/modal.tertiary-icon.test.basics.d.ts +1 -0
  156. package/dist/modal.test.accessibility.d.ts +1 -0
  157. package/dist/modal.test.basics.d.ts +3 -0
  158. package/dist/modal.test.close.d.ts +1 -0
  159. package/dist/modal.test.events.d.ts +1 -0
  160. package/dist/modal.test.lock-scroll.d.ts +1 -0
  161. package/dist/modal.test.methods.d.ts +1 -0
  162. package/dist/modal.test.scrollbars.d.ts +1 -0
  163. package/dist/radio-group.d.ts +48 -0
  164. package/dist/radio-group.js +1 -0
  165. package/dist/radio-group.stories.d.ts +8 -0
  166. package/dist/radio-group.styles.d.ts +2 -0
  167. package/dist/radio-group.styles.js +40 -0
  168. package/dist/radio-group.test.basics.d.ts +2 -0
  169. package/dist/radio-group.test.events.d.ts +2 -0
  170. package/dist/radio-group.test.focus.d.ts +2 -0
  171. package/dist/radio-group.test.form.d.ts +1 -0
  172. package/dist/radio-group.test.validity.d.ts +1 -0
  173. package/dist/radio.d.ts +23 -0
  174. package/dist/radio.js +1 -0
  175. package/dist/radio.styles.d.ts +2 -0
  176. package/dist/radio.styles.js +92 -0
  177. package/dist/status-indicator.d.ts +30 -0
  178. package/dist/status-indicator.js +1 -0
  179. package/dist/status-indicator.stories.d.ts +17 -0
  180. package/dist/status-indicator.styles.d.ts +2 -0
  181. package/dist/status-indicator.styles.js +58 -0
  182. package/dist/status-indicator.test.basics.d.ts +1 -0
  183. package/dist/styles/focus-outline.d.ts +2 -0
  184. package/dist/styles/focus-outline.js +4 -0
  185. package/dist/styles/fonts.css +1 -0
  186. package/dist/styles/variables.css +1 -0
  187. package/dist/styles/visually-hidden.d.ts +2 -0
  188. package/dist/styles/visually-hidden.js +11 -0
  189. package/dist/tab.d.ts +32 -0
  190. package/dist/tab.group.d.ts +35 -0
  191. package/dist/tab.group.js +1 -0
  192. package/dist/tab.group.styles.d.ts +2 -0
  193. package/dist/tab.group.styles.js +27 -0
  194. package/dist/tab.group.test.basics.d.ts +3 -0
  195. package/dist/tab.js +1 -0
  196. package/dist/tab.panel.d.ts +26 -0
  197. package/dist/tab.panel.js +1 -0
  198. package/dist/tab.panel.styles.d.ts +2 -0
  199. package/dist/tab.panel.styles.js +9 -0
  200. package/dist/tab.styles.d.ts +2 -0
  201. package/dist/tab.styles.js +83 -0
  202. package/dist/tab.test.basics.d.ts +1 -0
  203. package/dist/tabs.stories.d.ts +9 -0
  204. package/dist/tag.d.ts +25 -0
  205. package/dist/tag.js +1 -0
  206. package/dist/tag.stories.d.ts +9 -0
  207. package/dist/tag.styles.d.ts +2 -0
  208. package/dist/tag.styles.js +133 -0
  209. package/dist/tag.test.basics.d.ts +1 -0
  210. package/dist/tag.test.events.d.ts +1 -0
  211. package/dist/tag.test.focus.d.ts +1 -0
  212. package/dist/textarea.d.ts +49 -0
  213. package/dist/textarea.js +2 -0
  214. package/dist/textarea.stories.d.ts +13 -0
  215. package/dist/textarea.styles.d.ts +2 -0
  216. package/dist/textarea.styles.js +69 -0
  217. package/dist/textarea.test.basics.d.ts +1 -0
  218. package/dist/textarea.test.events.d.ts +1 -0
  219. package/dist/textarea.test.form.d.ts +1 -0
  220. package/dist/textarea.test.validity.d.ts +1 -0
  221. package/dist/toasts.d.ts +29 -0
  222. package/dist/toasts.js +1 -0
  223. package/dist/toasts.stories.d.ts +7 -0
  224. package/dist/toasts.styles.d.ts +2 -0
  225. package/dist/toasts.styles.js +15 -0
  226. package/dist/toasts.test.basics.d.ts +1 -0
  227. package/dist/toasts.toast.d.ts +28 -0
  228. package/dist/toasts.toast.js +1 -0
  229. package/dist/toasts.toast.styles.d.ts +2 -0
  230. package/dist/toasts.toast.styles.js +60 -0
  231. package/dist/toasts.toast.test.basics.d.ts +1 -0
  232. package/dist/toggle.d.ts +31 -0
  233. package/dist/toggle.js +1 -0
  234. package/dist/toggle.stories.d.ts +7 -0
  235. package/dist/toggle.styles.d.ts +2 -0
  236. package/dist/toggle.styles.js +81 -0
  237. package/dist/toggle.test.basics.d.ts +1 -0
  238. package/dist/toggle.test.events.d.ts +1 -0
  239. package/dist/toggle.test.focus.d.ts +1 -0
  240. package/dist/toggle.test.states.d.ts +1 -0
  241. package/dist/tooltip.d.ts +21 -0
  242. package/dist/tooltip.js +1 -0
  243. package/dist/tooltip.stories.d.ts +7 -0
  244. package/dist/tooltip.styles.d.ts +2 -0
  245. package/dist/tooltip.styles.js +66 -0
  246. package/dist/tooltip.test.basics.d.ts +1 -0
  247. package/dist/tooltip.test.interactions.d.ts +1 -0
  248. package/dist/tree.d.ts +26 -0
  249. package/dist/tree.item.d.ts +43 -0
  250. package/dist/tree.item.icon-button.d.ts +20 -0
  251. package/dist/tree.item.icon-button.js +1 -0
  252. package/dist/tree.item.icon-button.styles.d.ts +2 -0
  253. package/dist/tree.item.icon-button.styles.js +9 -0
  254. package/dist/tree.item.icon-button.test.basics.d.ts +1 -0
  255. package/dist/tree.item.js +1 -0
  256. package/dist/tree.item.menu.d.ts +21 -0
  257. package/dist/tree.item.menu.js +1 -0
  258. package/dist/tree.item.menu.styles.d.ts +2 -0
  259. package/dist/tree.item.menu.styles.js +17 -0
  260. package/dist/tree.item.menu.test.basics.d.ts +1 -0
  261. package/dist/tree.item.styles.d.ts +2 -0
  262. package/dist/tree.item.styles.js +130 -0
  263. package/dist/tree.item.test.basics.d.ts +1 -0
  264. package/dist/tree.js +1 -0
  265. package/dist/tree.stories.d.ts +17 -0
  266. package/dist/tree.styles.d.ts +2 -0
  267. package/dist/tree.styles.js +7 -0
  268. package/dist/tree.test.aria.d.ts +1 -0
  269. package/dist/tree.test.basics.d.ts +3 -0
  270. package/dist/tree.test.events.d.ts +2 -0
  271. package/dist/tree.test.focus.d.ts +1 -0
  272. package/package.json +129 -0
package/dist/toggle.js ADDED
@@ -0,0 +1 @@
1
+ "use strict";var y=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var a=(i,e,t,l)=>{for(var o=l>1?void 0:l?E(e,t):e,p=i.length-1,m;p>=0;p--)(m=i[p])&&(o=(l?m(e,t,o):m(o))||o);return l&&o&&y(e,t,o),o};var u=(i,e,t)=>{if(!e.has(i))throw TypeError("Cannot "+t)};var c=(i,e,t)=>(u(i,e,"read from private field"),t?t.call(i):e.get(i)),h=(i,e,t)=>{if(e.has(i))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(i):e.set(i,t)};var f=(i,e,t)=>(u(i,e,"access private method"),t);var n,d,v;import"./label.js";import{LitElement as b,html as $}from"lit";import{createRef as k,ref as L}from"lit/directives/ref.js";import{customElement as R,property as r}from"lit/decorators.js";import w from"./toggle.styles.js";let s=class extends b{constructor(){super(...arguments);h(this,d);this.checked=!1;this.disabled=!1;this.hideLabel=!1;this.orientation="horizontal";h(this,n,k())}click(){c(this,n).value?.click()}focus(t){c(this,n).value?.focus(t)}render(){return $`<div data-test="component"><glide-core-label orientation="${this.orientation}" ?disabled="${this.disabled}" ?hide="${this.hideLabel}"><slot name="tooltip" slot="tooltip"></slot><label for="input">${this.label}</label><div class="toggle-and-input" slot="control"><input aria-describedby="summary description" data-test="input" id="input" type="checkbox" ?checked="${this.checked}" ?disabled="${this.disabled}" @change="${f(this,d,v)}" ${L(c(this,n))}></div><div slot="summary" id="summary">${this.summary}</div><slot class="description" id="description" name="description" slot="description"></slot></glide-core-label></div>`}};n=new WeakMap,d=new WeakSet,v=function(t){t.target instanceof HTMLInputElement&&(this.checked=t.target.checked),this.dispatchEvent(new Event(t.type,t))},s.shadowRootOptions={...b.shadowRootOptions,mode:"closed"},s.styles=w,a([r({type:Boolean})],s.prototype,"checked",2),a([r({reflect:!0,type:Boolean})],s.prototype,"disabled",2),a([r({attribute:"hide-label",type:Boolean})],s.prototype,"hideLabel",2),a([r({reflect:!0})],s.prototype,"label",2),a([r({reflect:!0})],s.prototype,"orientation",2),a([r({reflect:!0})],s.prototype,"name",2),a([r({reflect:!0})],s.prototype,"summary",2),s=a([R("glide-core-toggle")],s);export{s as default};
@@ -0,0 +1,7 @@
1
+ import type { Meta, StoryObj } from '@storybook/web-components';
2
+ declare const meta: Meta;
3
+ export default meta;
4
+ export declare const Horizontal: StoryObj;
5
+ export declare const HorizontalWithTooltip: StoryObj;
6
+ export declare const Vertical: StoryObj;
7
+ export declare const VerticalWithToolip: StoryObj;
@@ -0,0 +1,2 @@
1
+ declare const _default: import("lit").CSSResult[];
2
+ export default _default;
@@ -0,0 +1,81 @@
1
+ "use strict";import{css as e}from"lit";import s from"./styles/focus-outline.js";export default[e`
2
+ /*
3
+ Most states are handled on the host. But ":checked" is handled on the input
4
+ because browsers don't support that class on the host. And using attribute
5
+ selectors won't work because those attributes, same as native, don't change
6
+ when their properties do.
7
+
8
+ TODO
9
+ Use the ":checked" pseudo class on the host and throughout when browsers support it.
10
+ */
11
+
12
+ .toggle-and-input-and-summary {
13
+ align-items: center;
14
+ display: flex;
15
+ gap: var(--glide-core-spacing-sm);
16
+ }
17
+
18
+ .toggle-and-input {
19
+ --inline-size: 1.5rem;
20
+
21
+ align-items: center;
22
+ background-color: var(--glide-core-surface-selected-disabled);
23
+ block-size: 0.875rem;
24
+ border: 1px solid transparent;
25
+ border-radius: var(--glide-core-spacing-sm);
26
+ display: flex;
27
+ flex-shrink: 0; /* Don't shrink when the summary wraps. */
28
+ inline-size: var(--inline-size);
29
+ justify-content: center;
30
+ position: relative;
31
+
32
+ &:has(input:focus-visible) {
33
+ ${s};
34
+ outline-offset: 4px;
35
+ }
36
+
37
+ &:has(input:checked:not(:disabled)) {
38
+ background-color: var(--glide-core-surface-primary);
39
+ border-color: transparent;
40
+
41
+ &::before {
42
+ transform: translateX(0);
43
+ }
44
+ }
45
+
46
+ &:has(input:disabled) {
47
+ background-color: var(--glide-core-surface-disabled);
48
+
49
+ &::before {
50
+ box-shadow: none;
51
+ }
52
+ }
53
+
54
+ &::before {
55
+ background: var(--glide-core-surface-page);
56
+ block-size: 0.875rem;
57
+ border-radius: 50%;
58
+ box-shadow:
59
+ 0 3px 1px 0 rgb(0 0 0 / 6%),
60
+ 0 3px 8px 0 rgb(0 0 0 / 15%);
61
+ content: '';
62
+ display: block;
63
+ inline-size: 0.875rem;
64
+ inset-inline-end: 0;
65
+ position: absolute;
66
+ transform: translateX(calc(var(--inline-size) * -1 + 100%));
67
+ transition: 150ms transform;
68
+ }
69
+ }
70
+
71
+ input {
72
+ block-size: 100%;
73
+ cursor: inherit;
74
+ inline-size: 100%;
75
+ inset-block-start: 0;
76
+ inset-inline-start: 0;
77
+ margin: 0;
78
+ opacity: 0;
79
+ position: absolute;
80
+ }
81
+ `];
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,21 @@
1
+ import { LitElement } from 'lit';
2
+ declare global {
3
+ interface HTMLElementTagNameMap {
4
+ 'glide-core-tooltip': GlideCoreTooltip;
5
+ }
6
+ }
7
+ /**
8
+ * @slot - The contents of the tooltip.
9
+ * @slot target - The element to which the tooltip should attach.
10
+ */
11
+ export default class GlideCoreTooltip extends LitElement {
12
+ #private;
13
+ static shadowRootOptions: ShadowRootInit;
14
+ static styles: import("lit").CSSResult[];
15
+ placement?: 'bottom' | 'left' | 'right' | 'top';
16
+ firstUpdated(): void;
17
+ private get isVisible();
18
+ private set isVisible(value);
19
+ render(): import("lit").TemplateResult<1>;
20
+ private effectivePlacement?;
21
+ }
@@ -0,0 +1 @@
1
+ "use strict";var Z=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var v=(i,s,t,l)=>{for(var n=l>1?void 0:l?_(s,t):s,f=i.length-1,u;f>=0;f--)(u=i[f])&&(n=(l?u(s,t,n):u(n))||n);return l&&n&&Z(s,t,n),n};var P=(i,s,t)=>{if(!s.has(i))throw TypeError("Cannot "+t)};var e=(i,s,t)=>(P(i,s,"read from private field"),t?t.call(i):s.get(i)),o=(i,s,t)=>{if(s.has(i))throw TypeError("Cannot add the same private member more than once");s instanceof WeakSet?s.add(i):s.set(i,t)},S=(i,s,t,l)=>(P(i,s,"write to private field"),l?l.call(i,t):s.set(i,t),t);var a=(i,s,t)=>(P(i,s,"access private method"),t);var b,y,w,c,$,m,p,h,x,N,M,X,V,Y,T,q,L,z,U,A,H,B,F,J,O,Q,E,k;import{LitElement as I,html as C}from"lit";import{arrow as G,autoUpdate as tt,computePosition as et,flip as st,offset as it,shift as ot}from"@floating-ui/dom";import{classMap as lt}from"lit/directives/class-map.js";import{createRef as d,ref as g}from"lit/directives/ref.js";import{customElement as at,property as rt,state as K}from"lit/decorators.js";import{owSlot as R}from"./library/ow.js";import nt from"./tooltip.styles.js";let r=class extends I{constructor(){super(...arguments);o(this,x);o(this,M);o(this,V);o(this,T);o(this,L);o(this,U);o(this,H);o(this,F);o(this,O);o(this,E);o(this,b,d());o(this,y,void 0);o(this,w,void 0);o(this,c,d());o(this,$,!1);o(this,m,d());o(this,p,d());o(this,h,d())}firstUpdated(){R(e(this,c).value),R(e(this,p).value),a(this,E,k).call(this)}get isVisible(){return e(this,$)}set isVisible(t){var l;S(this,$,t),this.isVisible?a(this,E,k).call(this):(l=e(this,y))==null||l.call(this)}render(){return C`<div class="component" @mouseover="${a(this,H,B)}" @mouseout="${a(this,U,A)}"><div aria-labelledby="tooltip" class="target" slot="target" @focusin="${a(this,V,Y)}" @focusout="${a(this,T,q)}" @keydown="${a(this,L,z)}" ${g(e(this,m))}><slot @slotchange="${a(this,F,J)}" ${g(e(this,p))} name="target"></slot></div><div class="${lt({tooltip:!0,visible:this.isVisible})}" id="tooltip" role="tooltip" ${g(e(this,h))}><span aria-label="Tooltip: "></span><slot @slotchange="${a(this,M,X)}" ${g(e(this,c))}></slot><div class="arrow" ${g(e(this,b))}></div></div></div>`}};b=new WeakMap,y=new WeakMap,w=new WeakMap,c=new WeakMap,$=new WeakMap,m=new WeakMap,p=new WeakMap,h=new WeakMap,x=new WeakSet,N=function(){clearTimeout(e(this,w))},M=new WeakSet,X=function(){R(e(this,c).value)},V=new WeakSet,Y=function(){this.isVisible=!0},T=new WeakSet,q=function(){this.isVisible=!1},L=new WeakSet,z=function(t){t.key==="Escape"&&(this.isVisible=!1)},U=new WeakSet,A=function(){a(this,O,Q).call(this)},H=new WeakSet,B=function(){a(this,x,N).call(this),this.isVisible=!0},F=new WeakSet,J=function(){R(e(this,p).value)},O=new WeakSet,Q=function(){S(this,w,setTimeout(()=>{this.isVisible=!1},200))},E=new WeakSet,k=function(){e(this,m).value&&e(this,h).value&&S(this,y,tt(e(this,m).value,e(this,h).value,()=>{(async()=>{if(e(this,m).value&&e(this,h).value){const t=e(this,b).value,{placement:l,x:n,y:f,middlewareData:u}=await et(e(this,m).value,e(this,h).value,{placement:this.placement,strategy:"fixed",middleware:[it(10),st({fallbackStrategy:"initialPlacement"}),ot(),G({element:t})]});Object.assign(e(this,h).value.style,{left:`${n}px`,top:`${f}px`});const D=u.arrow?.x??null,j=u.arrow?.y??null,W={top:"bottom",right:"left",bottom:"top",left:"right"}[l.split("-")[0]];Object.assign(t.style,{left:D===null?"":`${D}px`,top:j===null?"":`${j}px`,right:"",bottom:"",[W]:"-3px"}),this.effectivePlacement=l}})()}))},r.shadowRootOptions={...I.shadowRootOptions,delegatesFocus:!0,mode:"closed"},r.styles=nt,v([rt()],r.prototype,"placement",2),v([K()],r.prototype,"isVisible",1),v([K()],r.prototype,"effectivePlacement",2),r=v([at("glide-core-tooltip")],r);export{r as default};
@@ -0,0 +1,7 @@
1
+ import './button.js';
2
+ import './icons/storybook.js';
3
+ import './tooltip.js';
4
+ import type { Meta, StoryObj } from '@storybook/web-components';
5
+ declare const meta: Meta;
6
+ export default meta;
7
+ export declare const Tooltip: StoryObj;
@@ -0,0 +1,2 @@
1
+ declare const _default: import("lit").CSSResult[];
2
+ export default _default;
@@ -0,0 +1,66 @@
1
+ "use strict";import{css as e}from"lit";import i from"./styles/focus-outline.js";export default[e`
2
+ .component {
3
+ /* https://github.com/CrowdStrike/glide-core/pull/119#issuecomment-2113314591 */
4
+ display: flex;
5
+ position: relative;
6
+ }
7
+
8
+ .target {
9
+ background-color: transparent;
10
+ border-width: 0;
11
+
12
+ /* Additional whitespace from line height and the tooltip won't be vertically centered. */
13
+ display: flex;
14
+ padding: 0;
15
+ position: relative;
16
+
17
+ &:focus {
18
+ outline: none;
19
+ }
20
+
21
+ &:focus-visible {
22
+ ${i};
23
+ }
24
+
25
+ ::slotted svg {
26
+ display: block;
27
+ }
28
+ }
29
+
30
+ .tooltip {
31
+ background-color: var(--glide-core-surface-base-dark);
32
+ border-radius: var(--glide-core-spacing-xs);
33
+ color: var(--glide-core-text-selected);
34
+ display: none;
35
+ font-family: var(--glide-core-body-md-font-family);
36
+ font-style: var(--glide-core-body-md-font-style);
37
+ font-weight: var(--glide-core-body-md-font-weight);
38
+ inline-size: max-content;
39
+ inset-block-start: 50%;
40
+ inset-block-start: 0;
41
+ inset-inline-start: 0;
42
+ padding: var(--glide-core-spacing-xs) var(--glide-core-spacing-sm);
43
+ position: fixed;
44
+ z-index: 1;
45
+
46
+ ::slotted(kbd) {
47
+ color: var(--glide-core-text-header-2);
48
+ display: inline-block;
49
+ font-family: inherit;
50
+ margin-inline-start: var(--glide-core-spacing-sm);
51
+ white-space: nowrap;
52
+ }
53
+
54
+ &.visible {
55
+ display: unset;
56
+ }
57
+ }
58
+
59
+ .arrow {
60
+ background: var(--glide-core-surface-base-dark);
61
+ block-size: 0.375rem;
62
+ inline-size: 0.375rem;
63
+ position: absolute;
64
+ transform: rotate(45deg);
65
+ }
66
+ `];
@@ -0,0 +1 @@
1
+ import './tooltip.js';
@@ -0,0 +1 @@
1
+ import './tooltip.js';
package/dist/tree.d.ts ADDED
@@ -0,0 +1,26 @@
1
+ import { LitElement } from 'lit';
2
+ import GlideCoreTreeItem from './tree.item.js';
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ 'glide-core-tree': GlideCoreTree;
6
+ }
7
+ }
8
+ /**
9
+ * @description A tree element, containing a hierarchy of tree items
10
+ *
11
+ * @slot - One or more of <glide-core-tree-item>
12
+ */
13
+ export default class GlideCoreTree extends LitElement {
14
+ #private;
15
+ static shadowRootOptions: ShadowRootInit;
16
+ static styles: import("lit").CSSResult[];
17
+ selectedItem?: GlideCoreTreeItem;
18
+ focusedItem?: GlideCoreTreeItem | null;
19
+ privateTabIndex: number;
20
+ slotElements: GlideCoreTreeItem[];
21
+ disconnectedCallback(): void;
22
+ firstUpdated(): void;
23
+ render(): import("lit").TemplateResult<1>;
24
+ selectItem(item: GlideCoreTreeItem): void;
25
+ constructor();
26
+ }
@@ -0,0 +1,43 @@
1
+ import './tree.item.menu.js';
2
+ import { LitElement } from 'lit';
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ 'glide-core-tree-item': GlideCoreTreeItem;
6
+ }
7
+ }
8
+ /**
9
+ * @description A single node of a Tree.
10
+ *
11
+ * @slot - One or more of <glide-core-tree-item>, if this tree item contains nested tree items.
12
+ * @slot prefix - An optional icon to display before the label.
13
+ * @slot suffix - An optional icon to add after the label.
14
+ * @slot menu - Place a <glide-core-menu> here, which will be visible on hover or focus
15
+ */
16
+ export default class GlideCoreTreeItem extends LitElement {
17
+ #private;
18
+ static shadowRootOptions: ShadowRootInit;
19
+ static styles: import("lit").CSSResult[];
20
+ expanded: boolean;
21
+ label: string;
22
+ level: number;
23
+ selected: boolean;
24
+ menuSlotAssignedElements: HTMLElement[];
25
+ prefixSlotAssignedElements: HTMLElement[];
26
+ slotElements: GlideCoreTreeItem[];
27
+ suffixSlotAssignedElements: HTMLElement[];
28
+ firstUpdated(): void;
29
+ focus(): void;
30
+ get hasChildTreeItems(): boolean;
31
+ render(): import("lit").TemplateResult<1>;
32
+ /**
33
+ * Traverses down the tree, selecting the passed-in item,
34
+ * and deselecting all other items.
35
+ * Returns the selected item
36
+ */
37
+ selectItem(item: GlideCoreTreeItem): GlideCoreTreeItem | undefined;
38
+ toggleExpand(): void;
39
+ private childTreeItems;
40
+ private hasMenuSlot;
41
+ private hasPrefixSlot;
42
+ private hasSuffixSlot;
43
+ }
@@ -0,0 +1,20 @@
1
+ import './icon-button.js';
2
+ import { LitElement } from 'lit';
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ 'glide-core-tree-item-icon-button': GlideCoreTreeItemIconButton;
6
+ }
7
+ }
8
+ /**
9
+ * @description An icon button that can be used inside of a tree item.
10
+ * Provides correct color styling based on tree item state
11
+ *
12
+ * @slot - Reserved for the icon to display inside of the button.
13
+ */
14
+ export default class GlideCoreTreeItemIconButton extends LitElement {
15
+ #private;
16
+ static shadowRootOptions: ShadowRootInit;
17
+ static styles: import("lit").CSSResult[];
18
+ firstUpdated(): void;
19
+ render(): import("lit").TemplateResult<1>;
20
+ }
@@ -0,0 +1 @@
1
+ "use strict";var b=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var f=(e,t,o,a)=>{for(var i=a>1?void 0:a?E(t,o):t,n=e.length-1,d;n>=0;n--)(d=e[n])&&(i=(a?d(t,o,i):d(i))||i);return a&&i&&b(t,o,i),i};var p=(e,t,o)=>{if(!t.has(e))throw TypeError("Cannot "+o)};var s=(e,t,o)=>(p(e,t,"read from private field"),o?o.call(e):t.get(e)),c=(e,t,o)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,o)};var h=(e,t,o)=>(p(e,t,"access private method"),o);var l,m,v;import"./icon-button.js";import{LitElement as g,html as R}from"lit";import{createRef as S,ref as w}from"lit/directives/ref.js";import{customElement as y}from"lit/decorators.js";import{owSlot as u}from"./library/ow.js";import L from"./tree.item.icon-button.styles.js";let r=class extends g{constructor(){super(...arguments);c(this,m);c(this,l,S())}firstUpdated(){u(s(this,l).value)}render(){return R`<glide-core-icon-button class="component" variant="tertiary"><slot @slotchange="${h(this,m,v)}" ${w(s(this,l))}></slot></glide-core-icon-button>`}};l=new WeakMap,m=new WeakSet,v=function(){u(s(this,l).value)},r.shadowRootOptions={...g.shadowRootOptions,mode:"closed"},r.styles=L,r=f([y("glide-core-tree-item-icon-button")],r);export{r as default};
@@ -0,0 +1,2 @@
1
+ declare const _default: import("lit").CSSResult[];
2
+ export default _default;
@@ -0,0 +1,9 @@
1
+ "use strict";import{css as o}from"lit";export default[o`
2
+ .component {
3
+ display: flex;
4
+
5
+ --icon-color: var(--icon-button-color);
6
+ --hovered-icon-color: var(--hovered-icon-button-color);
7
+ --size: 1rem;
8
+ }
9
+ `];
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ "use strict";var N=Object.defineProperty;var O=Object.getOwnPropertyDescriptor;var l=(i,s,t,o)=>{for(var n=o>1?void 0:o?O(s,t):s,r=i.length-1,b;r>=0;r--)(b=i[r])&&(n=(o?b(s,t,n):b(n))||n);return o&&n&&N(s,t,n),n};var A=(i,s,t)=>{if(!s.has(i))throw TypeError("Cannot "+t)};var d=(i,s,t)=>(A(i,s,"read from private field"),t?t.call(i):s.get(i)),a=(i,s,t)=>{if(s.has(i))throw TypeError("Cannot add the same private member more than once");s instanceof WeakSet?s.add(i):s.set(i,t)};var h=(i,s,t)=>(A(i,s,"access private method"),t);var f,p,H,x,I,g,R,v,k,S,B,E,P,$,T;import"./tree.item.menu.js";import{LitElement as w,html as y}from"lit";import{classMap as M}from"lit/directives/class-map.js";import{createRef as j,ref as q}from"lit/directives/ref.js";import{customElement as D,property as c,queryAssignedElements as m,state as u}from"lit/decorators.js";import{ifDefined as L}from"lit/directives/if-defined.js";import{when as F}from"lit/directives/when.js";import U from"./tree.item.styles.js";let e=class extends w{constructor(){super(...arguments);a(this,p);a(this,x);a(this,g);a(this,v);a(this,S);a(this,E);a(this,$);this.expanded=!1;this.label="";this.level=1;this.selected=!1;this.childTreeItems=[];this.hasMenuSlot=!1;this.hasPrefixSlot=!1;this.hasSuffixSlot=!1;a(this,f,j())}firstUpdated(){h(this,$,T).call(this)}focus(){d(this,f).value?.focus()}get hasChildTreeItems(){return this.childTreeItems.length>0}render(){return y`<div class="${M({component:!0,expanded:this.expanded,selected:this.selected})}" role="treeitem" aria-label="${this.label}" aria-selected="${L(d(this,x,I))}" aria-expanded="${L(d(this,p,H))}"><div class="${M({"label-container":!0})}" tabindex="-1" ${q(d(this,f))}><div style="width:${d(this,g,R)};"></div><div class="expand-icon-container">${F(this.hasChildTreeItems,()=>y`<div><svg aria-hidden="true" class="${M({"expand-icon":!0,"expand-icon-expanded":this.expanded})}" width="16" height="16" viewBox="0 0 24 24" fill="none"><path d="M9 18L15 12L9 6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></div>`)}</div><slot name="prefix" @slotchange="${h(this,S,B)}"></slot><div class="label">${this.label}</div><slot name="menu" @slotchange="${h(this,v,k)}"></slot><slot name="suffix" @slotchange="${h(this,E,P)}"></slot></div><div class="child-items" role="group"><slot></slot></div></div>`}selectItem(t){let o;for(const n of this.slotElements)if(t===n)n.setAttribute("selected","true"),o=n;else{n.removeAttribute("selected");const r=n.selectItem(t);r&&(o=r)}return o}toggleExpand(){this.expanded=!this.expanded}};f=new WeakMap,p=new WeakSet,H=function(){if(this.hasChildTreeItems)return this.expanded?"true":"false"},x=new WeakSet,I=function(){if(!this.hasChildTreeItems)return this.selected?"true":"false"},g=new WeakSet,R=function(){return`${(this.level-1)*20}px`},v=new WeakSet,k=function(){this.hasMenuSlot=this.menuSlotAssignedElements.length>0},S=new WeakSet,B=function(){this.hasPrefixSlot=this.prefixSlotAssignedElements.length>0},E=new WeakSet,P=function(){this.hasSuffixSlot=this.suffixSlotAssignedElements.length>0},$=new WeakSet,T=function(){const t=[];for(const o of this.slotElements)o.level=this.level+1,t.push(o);this.childTreeItems=t},e.shadowRootOptions={...w.shadowRootOptions,delegatesFocus:!0,mode:"closed"},e.styles=U,l([c({type:Boolean})],e.prototype,"expanded",2),l([c({reflect:!0})],e.prototype,"label",2),l([c({type:Number})],e.prototype,"level",2),l([c({type:Boolean})],e.prototype,"selected",2),l([m({slot:"menu"})],e.prototype,"menuSlotAssignedElements",2),l([m({slot:"prefix"})],e.prototype,"prefixSlotAssignedElements",2),l([m()],e.prototype,"slotElements",2),l([m({slot:"suffix"})],e.prototype,"suffixSlotAssignedElements",2),l([u()],e.prototype,"childTreeItems",2),l([u()],e.prototype,"hasMenuSlot",2),l([u()],e.prototype,"hasPrefixSlot",2),l([u()],e.prototype,"hasSuffixSlot",2),e=l([D("glide-core-tree-item")],e);export{e as default};
@@ -0,0 +1,21 @@
1
+ import './icon-button.js';
2
+ import './menu.js';
3
+ import { LitElement } from 'lit';
4
+ declare global {
5
+ interface HTMLElementTagNameMap {
6
+ 'glide-core-tree-item-menu': GlideCoreTreeItemMenu;
7
+ }
8
+ }
9
+ /**
10
+ * @description A menu built into a tree item. Uses <glide-core-menu>
11
+ *
12
+ * @slot - One or more of <glide-core-menu-link> or <glide-core-menu-button>.
13
+ * @slot target - A focusable element against which Menu will be positioned. Opens and closes Menu when interacted with.
14
+ */
15
+ export default class GlideCoreTreeItemMenu extends LitElement {
16
+ #private;
17
+ static shadowRootOptions: ShadowRootInit;
18
+ static styles: import("lit").CSSResult[];
19
+ firstUpdated(): void;
20
+ render(): import("lit").TemplateResult<1>;
21
+ }
@@ -0,0 +1 @@
1
+ "use strict";var E=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var h=(o,t,e,a)=>{for(var i=a>1?void 0:a?R(t,e):t,m=o.length-1,d;m>=0;m--)(d=o[m])&&(i=(a?d(t,e,i):d(i))||i);return a&&i&&E(t,e,i),i};var p=(o,t,e)=>{if(!t.has(o))throw TypeError("Cannot "+e)};var s=(o,t,e)=>(p(o,t,"read from private field"),e?e.call(o):t.get(o)),c=(o,t,e)=>{if(t.has(o))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(o):t.set(o,e)};var f=(o,t,e)=>(p(o,t,"access private method"),e);var r,n,S;import"./icon-button.js";import"./menu.js";import{LitElement as u,html as y}from"lit";import{createRef as L,ref as M}from"lit/directives/ref.js";import{customElement as b}from"lit/decorators.js";import{owSlot as g,owSlotType as v}from"./library/ow.js";import C from"./menu.button.js";import w from"./menu.link.js";import k from"./tree.item.menu.styles.js";let l=class extends u{constructor(){super(...arguments);c(this,n);c(this,r,L())}firstUpdated(){g(s(this,r).value),v(s(this,r).value,[C,w])}render(){return y`<glide-core-menu class="component"><slot @slotchange="${f(this,n,S)}" ${M(s(this,r))}></slot><glide-core-icon-button slot="target" variant="tertiary"><svg width="4" height="14" viewBox="0 0 4 18" fill="none" stroke="currentColor" stroke-width="2"><path d="M2 15C2.55228 15 3 15.4477 3 16C3 16.5523 2.55228 17 2 17C1.44772 17 1 16.5523 1 16C1 15.4477 1.44772 15 2 15Z"/><path d="M2 8C2.55228 8 3 8.44772 3 9C3 9.55228 2.55228 10 2 10C1.44772 10 1 9.55228 1 9C1 8.44772 1.44772 8 2 8Z"/><path d="M2 1C2.55228 1 3 1.44772 3 2C3 2.55228 2.55228 3 2 3C1.44772 3 1 2.55228 1 2C1 1.44772 1.44772 1 2 1Z"/></svg></glide-core-icon-button></glide-core-menu>`}};r=new WeakMap,n=new WeakSet,S=function(){g(s(this,r).value),v(s(this,r).value,[C,w])},l.shadowRootOptions={...u.shadowRootOptions,mode:"closed"},l.styles=k,l=h([b("glide-core-tree-item-menu")],l);export{l as default};
@@ -0,0 +1,2 @@
1
+ declare const _default: import("lit").CSSResult[];
2
+ export default _default;
@@ -0,0 +1,17 @@
1
+ "use strict";import{css as o}from"lit";export default[o`
2
+ :host {
3
+ display: contents;
4
+ }
5
+
6
+ .component {
7
+ display: flex;
8
+ }
9
+
10
+ glide-core-icon-button {
11
+ display: flex;
12
+
13
+ --icon-color: var(--icon-button-color);
14
+ --hovered-icon-color: var(--hovered-icon-button-color);
15
+ --size: 1rem;
16
+ }
17
+ `];
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ declare const _default: import("lit").CSSResult[];
2
+ export default _default;
@@ -0,0 +1,130 @@
1
+ "use strict";import{css as e}from"lit";export default[e`
2
+ :host {
3
+ cursor: pointer;
4
+ display: flex;
5
+ flex-direction: column;
6
+ }
7
+
8
+ .component {
9
+ display: contents;
10
+ font-family: var(--glide-core-body-sm-font-family);
11
+ font-style: var(--glide-core-body-sm-font-style);
12
+ font-weight: var(--glide-core-body-sm-font-weight);
13
+ grid-template-columns: repeat(auto-fill, 2.5rem);
14
+
15
+ --color: var(--glide-core-text-body-1);
16
+
17
+ &.selected {
18
+ --color: var(--glide-core-text-selected);
19
+ }
20
+ }
21
+
22
+ .expand-icon-container {
23
+ min-inline-size: 1.5625rem;
24
+ }
25
+
26
+ .expand-icon {
27
+ align-items: center;
28
+ cursor: pointer;
29
+ display: flex;
30
+ justify-content: center;
31
+ rotate: 0deg;
32
+ transition: 250ms rotate ease;
33
+
34
+ &.expand-icon-expanded {
35
+ rotate: 90deg;
36
+ }
37
+ }
38
+
39
+ .label-and-children {
40
+ display: flex;
41
+ flex-direction: column;
42
+ }
43
+
44
+ .label-container {
45
+ align-items: center;
46
+ border-radius: 0.625rem;
47
+ color: var(--color);
48
+ display: flex;
49
+ font-size: var(--glide-core-body-sm-font-size);
50
+ padding-block: var(--glide-core-spacing-xxs);
51
+ padding-inline: var(--glide-core-spacing-xs);
52
+
53
+ &:hover {
54
+ background-color: var(--glide-core-surface-hover);
55
+ }
56
+
57
+ &.selected {
58
+ background-color: var(--glide-core-surface-selected);
59
+
60
+ &:hover {
61
+ background-color: var(--glide-core-color-dark-blue);
62
+ }
63
+ }
64
+
65
+ &:focus-visible {
66
+ outline: var(--glide-core-border-primary);
67
+ outline-offset: -1px;
68
+ outline-style: auto;
69
+ outline-width: 2px;
70
+ }
71
+
72
+ .component.selected & {
73
+ background-color: var(--glide-core-surface-selected);
74
+
75
+ &:hover {
76
+ background-color: var(--glide-core-color-dark-blue);
77
+ }
78
+ }
79
+ }
80
+
81
+ ::slotted([slot='prefix']) {
82
+ margin-inline-end: var(--glide-core-spacing-xs);
83
+ }
84
+
85
+ ::slotted([slot='menu']) {
86
+ visibility: hidden;
87
+ }
88
+
89
+ ::slotted([slot='prefix']),
90
+ ::slotted([slot='menu']),
91
+ ::slotted([slot='suffix']) {
92
+ --icon-button-color: var(--color);
93
+ }
94
+
95
+ .component.selected ::slotted([slot='prefix']),
96
+ .component.selected ::slotted([slot='menu']),
97
+ .component.selected ::slotted([slot='suffix']) {
98
+ --hovered-icon-button-color: var(--glide-core-icon-hover);
99
+ }
100
+
101
+ ::slotted([slot='suffix']) {
102
+ padding-inline: var(--glide-core-spacing-xxs);
103
+ }
104
+
105
+ .label-container:hover,
106
+ .label-container:focus,
107
+ .label-container:focus-within,
108
+ .label-container:focus-visible {
109
+ ::slotted([slot='menu']) {
110
+ visibility: visible;
111
+ }
112
+ }
113
+
114
+ .label {
115
+ flex-grow: 1;
116
+ }
117
+
118
+ .child-items {
119
+ block-size: 0;
120
+ display: flex;
121
+ flex-direction: column;
122
+ overflow: hidden;
123
+ }
124
+
125
+ .expanded {
126
+ .child-items {
127
+ block-size: auto;
128
+ }
129
+ }
130
+ `];
@@ -0,0 +1 @@
1
+ export {};
package/dist/tree.js ADDED
@@ -0,0 +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};
@@ -0,0 +1,17 @@
1
+ import './icon-button.js';
2
+ import './icons/storybook.js';
3
+ import './tree.item.icon-button.js';
4
+ import './tree.item.js';
5
+ import './tree.js';
6
+ import type { Meta, StoryObj } from '@storybook/web-components';
7
+ declare const meta: Meta;
8
+ export default meta;
9
+ export declare const Tree: StoryObj;
10
+ export declare const TreeItemDefault: StoryObj;
11
+ export declare const TreeItemSelected: StoryObj;
12
+ export declare const TreeItemWithChildItemsCollapsed: StoryObj;
13
+ export declare const TreeItemWithChildItemsExpanded: StoryObj;
14
+ export declare const TreeItemWithPrefixIcon: StoryObj;
15
+ export declare const TreeItemWithSuffixIconButton: StoryObj;
16
+ export declare const TreeItemWithMenu: StoryObj;
17
+ export declare const TreeItemWithPrefixSuffixAndMenu: StoryObj;
@@ -0,0 +1,2 @@
1
+ declare const _default: import("lit").CSSResult[];
2
+ export default _default;
@@ -0,0 +1,7 @@
1
+ "use strict";import{css as o}from"lit";export default[o`
2
+ .component {
3
+ font-family: var(--glide-core-body-sm-font-family);
4
+ font-style: var(--glide-core-body-sm-font-style);
5
+ font-weight: var(--glide-core-body-sm-font-weight);
6
+ }
7
+ `];
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ import './tree.item.icon-button.js';
2
+ import './tree.item.js';
3
+ import './tree.js';
@@ -0,0 +1,2 @@
1
+ import './tree.item.menu.js';
2
+ import './tree.js';
@@ -0,0 +1 @@
1
+ import './tree.js';