@redvars/peacock 3.3.0 → 3.3.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 (159) hide show
  1. package/dist/{IndividualComponent-tDnXrOLV.js → IndividualComponent-Dt5xirYG.js} +2 -2
  2. package/dist/{IndividualComponent-tDnXrOLV.js.map → IndividualComponent-Dt5xirYG.js.map} +1 -1
  3. package/dist/array-D5vjT2Xm.js +14 -0
  4. package/dist/array-D5vjT2Xm.js.map +1 -0
  5. package/dist/assets/components.css +1 -1
  6. package/dist/assets/components.css.map +1 -1
  7. package/dist/assets/styles.css +1 -1
  8. package/dist/assets/styles.css.map +1 -1
  9. package/dist/{button-BGFJfbT2.js → button-ClzS8JLq.js} +3 -4
  10. package/dist/{button-BGFJfbT2.js.map → button-ClzS8JLq.js.map} +1 -1
  11. package/dist/button-group-BMS5WvaF.js +292 -0
  12. package/dist/button-group-BMS5WvaF.js.map +1 -0
  13. package/dist/button-group.js +6 -107
  14. package/dist/button-group.js.map +1 -1
  15. package/dist/button.js +3 -4
  16. package/dist/button.js.map +1 -1
  17. package/dist/card.js +104 -0
  18. package/dist/card.js.map +1 -0
  19. package/dist/chart-bar-DbnXQgvS.js +1121 -0
  20. package/dist/chart-bar-DbnXQgvS.js.map +1 -0
  21. package/dist/chart-bar.js +259 -0
  22. package/dist/chart-bar.js.map +1 -0
  23. package/dist/chart-donut.js +4 -2
  24. package/dist/chart-donut.js.map +1 -1
  25. package/dist/chart-doughnut.js +4 -2
  26. package/dist/chart-doughnut.js.map +1 -1
  27. package/dist/chart-pie.js +4 -2
  28. package/dist/chart-pie.js.map +1 -1
  29. package/dist/chart-stacked-bar.js +401 -0
  30. package/dist/chart-stacked-bar.js.map +1 -0
  31. package/dist/{class-map-DpeNtqCn.js → class-map-59YGWLnx.js} +9 -3
  32. package/dist/class-map-59YGWLnx.js.map +1 -0
  33. package/dist/clock.js +1 -1
  34. package/dist/code-editor.js +7 -7
  35. package/dist/code-editor.js.map +1 -1
  36. package/dist/code-highlighter.js +7 -25
  37. package/dist/code-highlighter.js.map +1 -1
  38. package/dist/custom-elements-jsdocs.json +8824 -5047
  39. package/dist/custom-elements.json +7468 -4147
  40. package/dist/index.js +16 -10
  41. package/dist/index.js.map +1 -1
  42. package/dist/number-counter.js +2 -2
  43. package/dist/{observe-theme-change-BISF-Gl5.js → observe-theme-change-pALI5fmV.js} +2 -2
  44. package/dist/{observe-theme-change-BISF-Gl5.js.map → observe-theme-change-pALI5fmV.js.map} +1 -1
  45. package/dist/peacock-loader.js +42 -1016
  46. package/dist/peacock-loader.js.map +1 -1
  47. package/dist/pie-Dz0IDiPt.js +537 -0
  48. package/dist/pie-Dz0IDiPt.js.map +1 -0
  49. package/dist/{slider-Dk9CFWTG.js → snackbar-74YCdMPL.js} +6205 -3206
  50. package/dist/snackbar-74YCdMPL.js.map +1 -0
  51. package/dist/src/accordion/accordion-item.d.ts +1 -0
  52. package/dist/src/breadcrumb/breadcrumb/breadcrumb.d.ts +2 -0
  53. package/dist/src/breadcrumb/breadcrumb-item/breadcrumb-item.d.ts +1 -0
  54. package/dist/src/button/button-group/button-group.d.ts +4 -0
  55. package/dist/src/card/card.d.ts +27 -0
  56. package/dist/src/card/index.d.ts +1 -0
  57. package/dist/src/chart-bar/chart-bar.d.ts +53 -0
  58. package/dist/src/chart-bar/chart-stacked-bar.d.ts +78 -0
  59. package/dist/src/chart-bar/index.d.ts +2 -0
  60. package/dist/src/code-editor/code-editor.d.ts +4 -3
  61. package/dist/src/code-highlighter/code-highlighter.d.ts +4 -7
  62. package/dist/src/index.d.ts +9 -0
  63. package/dist/src/menu/index.d.ts +3 -0
  64. package/dist/src/menu/menu/MenuSurfaceController.d.ts +18 -0
  65. package/dist/src/menu/menu/menu.d.ts +54 -12
  66. package/dist/src/menu/menu-item/menu-item.d.ts +12 -5
  67. package/dist/src/menu/sub-menu/sub-menu.d.ts +36 -0
  68. package/dist/src/pagination/index.d.ts +1 -0
  69. package/dist/src/pagination/pagination.d.ts +38 -0
  70. package/dist/src/popover/PopoverController.d.ts +4 -1
  71. package/dist/src/snackbar/index.d.ts +1 -0
  72. package/dist/src/snackbar/snackbar.d.ts +40 -0
  73. package/dist/src/table/index.d.ts +1 -0
  74. package/dist/src/table/table.d.ts +110 -0
  75. package/dist/src/tabs/tab-group.d.ts +5 -1
  76. package/dist/src/tabs/tab-panel.d.ts +2 -0
  77. package/dist/src/tabs/tab.d.ts +3 -1
  78. package/dist/src/tabs/tabs.d.ts +2 -0
  79. package/dist/src/tooltip/tooltip.d.ts +1 -3
  80. package/dist/src/tree-view/index.d.ts +2 -0
  81. package/dist/src/tree-view/tree-node.d.ts +69 -0
  82. package/dist/src/tree-view/tree-view.d.ts +40 -0
  83. package/dist/src/tree-view/wc-tree-view.d.ts +6 -0
  84. package/dist/{style-map-CfNHEkQp.js → style-map-DcB52w-l.js} +2 -2
  85. package/dist/{style-map-CfNHEkQp.js.map → style-map-DcB52w-l.js.map} +1 -1
  86. package/dist/test/card.test.d.ts +1 -0
  87. package/dist/test/chart-bar.test.d.ts +1 -0
  88. package/dist/test/icon.test.d.ts +1 -1
  89. package/dist/test/menu.test.d.ts +1 -0
  90. package/dist/test/snackbar.test.d.ts +1 -0
  91. package/dist/test/sub-menu.test.d.ts +1 -0
  92. package/dist/test/tree-view.test.d.ts +1 -0
  93. package/dist/{transform-DRuHEvar.js → transform-DSwFSqzD.js} +13 -558
  94. package/dist/transform-DSwFSqzD.js.map +1 -0
  95. package/dist/tsconfig.tsbuildinfo +1 -1
  96. package/dist/{unsafe-html-CV6Je6HL.js → unsafe-html-C2r3PyzF.js} +2 -2
  97. package/dist/{unsafe-html-CV6Je6HL.js.map → unsafe-html-C2r3PyzF.js.map} +1 -1
  98. package/package.json +1 -1
  99. package/readme.md +40 -40
  100. package/src/accordion/accordion-item.ts +2 -1
  101. package/src/breadcrumb/breadcrumb/breadcrumb.ts +3 -0
  102. package/src/breadcrumb/breadcrumb-item/breadcrumb-item.ts +1 -0
  103. package/src/button/button-group/button-group.ts +6 -0
  104. package/src/card/card.scss +61 -0
  105. package/src/card/card.ts +38 -0
  106. package/src/card/index.ts +1 -0
  107. package/src/chart-bar/chart-bar.scss +58 -0
  108. package/src/chart-bar/chart-bar.ts +306 -0
  109. package/src/chart-bar/chart-stacked-bar.ts +402 -0
  110. package/src/chart-bar/index.ts +2 -0
  111. package/src/code-editor/code-editor.ts +4 -3
  112. package/src/code-highlighter/code-highlighter.ts +4 -22
  113. package/src/divider/divider.scss +2 -2
  114. package/src/empty-state/empty-state.scss +1 -1
  115. package/src/empty-state/empty-state.ts +1 -1
  116. package/src/index.ts +11 -2
  117. package/src/menu/index.ts +3 -0
  118. package/src/menu/menu/MenuSurfaceController.ts +61 -0
  119. package/src/menu/{menu-list/menu-list.scss → menu/menu.scss} +19 -4
  120. package/src/menu/menu/menu.ts +389 -81
  121. package/src/menu/menu-item/menu-item.ts +115 -36
  122. package/src/menu/sub-menu/sub-menu.scss +7 -0
  123. package/src/menu/sub-menu/sub-menu.ts +243 -0
  124. package/src/pagination/index.ts +1 -0
  125. package/src/pagination/pagination.scss +59 -0
  126. package/src/pagination/pagination.ts +135 -0
  127. package/src/peacock-loader.ts +39 -11
  128. package/src/popover/PopoverController.ts +13 -7
  129. package/src/snackbar/demo/index.html +29 -0
  130. package/src/snackbar/index.ts +1 -0
  131. package/src/snackbar/snackbar.scss +73 -0
  132. package/src/snackbar/snackbar.ts +151 -0
  133. package/src/table/index.ts +1 -0
  134. package/src/table/table.scss +174 -0
  135. package/src/table/table.ts +475 -0
  136. package/src/tabs/tab-group.ts +63 -28
  137. package/src/tabs/tab-panel.scss +3 -3
  138. package/src/tabs/tab-panel.ts +3 -0
  139. package/src/tabs/tab.scss +76 -2
  140. package/src/tabs/tab.ts +29 -6
  141. package/src/tabs/tabs.scss +6 -5
  142. package/src/tabs/tabs.ts +19 -5
  143. package/src/text/text.css-component.scss +6 -3
  144. package/src/tooltip/tooltip.scss +16 -13
  145. package/src/tooltip/tooltip.ts +7 -9
  146. package/src/tree-view/demo/index.html +57 -0
  147. package/src/tree-view/index.ts +2 -0
  148. package/src/tree-view/tree-node.scss +101 -0
  149. package/src/tree-view/tree-node.ts +268 -0
  150. package/src/tree-view/tree-view.scss +12 -0
  151. package/src/tree-view/tree-view.ts +182 -0
  152. package/src/tree-view/wc-tree-view.ts +9 -0
  153. package/dist/class-map-DpeNtqCn.js.map +0 -1
  154. package/dist/slider-Dk9CFWTG.js.map +0 -1
  155. package/dist/src/menu/menu-list/menu-list.d.ts +0 -22
  156. package/dist/state-8v48Exzh.js +0 -10
  157. package/dist/state-8v48Exzh.js.map +0 -1
  158. package/dist/transform-DRuHEvar.js.map +0 -1
  159. package/src/menu/menu-list/menu-list.ts +0 -48
package/src/tabs/tab.scss CHANGED
@@ -34,7 +34,7 @@
34
34
  display: flex;
35
35
  align-items: center;
36
36
  justify-content: center;
37
- gap: var(--_tab-icon-label-spacing);
37
+ gap: 0;
38
38
  width: 100%;
39
39
  height: 100%;
40
40
  z-index: 0;
@@ -47,6 +47,25 @@
47
47
  .slot-container {
48
48
  display: none;
49
49
  }
50
+
51
+ ::slotted([slot='icon']) {
52
+ flex: none;
53
+ color: var(--_label-text-color);
54
+ --icon-size: var(--tab-icon-size, var(--_tab-icon-size));
55
+ --icon-color: var(--_label-text-color);
56
+ }
57
+
58
+ ::slotted([slot='badge']) {
59
+ flex: none;
60
+ margin-inline-start: var(--_tab-badge-label-spacing, 0);
61
+ --badge-color: var(--_tab-badge-color, var(--color-error));
62
+ }
63
+ }
64
+
65
+ &.has-icon {
66
+ .tab-content {
67
+ gap: var(--_tab-icon-label-spacing);
68
+ }
50
69
  }
51
70
 
52
71
  .indicator {
@@ -112,6 +131,10 @@
112
131
  :host-context([variant='line']) .tab {
113
132
  --_tab-height: 100%;
114
133
  --_container-padding: 1rem;
134
+ --_tab-icon-size: 1.5rem;
135
+ --_tab-icon-label-spacing: 0.5rem;
136
+ --_tab-badge-label-spacing: 0.25rem;
137
+ --_tab-badge-color: var(--color-error);
115
138
 
116
139
  --_label-text-color: var(--color-on-surface);
117
140
  --_container-state-color: var(--_label-text-color);
@@ -121,7 +144,7 @@
121
144
  --_container-shape-end-end: var(--shape-corner-small);
122
145
  --_active-indicator-color: var(--color-primary);
123
146
  --_active-indicator-shape: 3px 3px 0 0;
124
- --_active-indicator-height: 2px;
147
+ --_active-indicator-height: 3px;
125
148
 
126
149
  .focus-ring {
127
150
  inset: 3px 3px 4px 3px;
@@ -146,6 +169,57 @@
146
169
  --_container-state-opacity: 0.12;
147
170
  }
148
171
 
172
+ &.disabled {
173
+ --_label-text-color: var(--color-on-surface);
174
+ --_label-text-opacity: 0.38;
175
+
176
+ .ripple {
177
+ display: none;
178
+ }
179
+ }
180
+ }
181
+
182
+ :host-context([variant='line-secondary']) .tab {
183
+ --_tab-height: 100%;
184
+ --_container-padding: 1rem;
185
+ --_tab-icon-size: 1.25rem;
186
+ --_tab-icon-label-spacing: 0.5rem;
187
+ --_tab-badge-label-spacing: 0.25rem;
188
+ --_tab-badge-color: var(--color-error);
189
+
190
+ --_label-text-color: var(--color-on-surface);
191
+ --_container-state-color: var(--_label-text-color);
192
+ --_container-shape-start-start: var(--shape-corner-small);
193
+ --_container-shape-start-end: var(--shape-corner-small);
194
+ --_container-shape-end-start: var(--shape-corner-small);
195
+ --_container-shape-end-end: var(--shape-corner-small);
196
+ --_active-indicator-color: var(--color-primary);
197
+ --_active-indicator-shape: 0;
198
+ --_active-indicator-height: 2px;
199
+
200
+ .focus-ring {
201
+ inset: 3px 3px 4px 3px;
202
+ }
203
+
204
+ &.active {
205
+
206
+ .indicator.secondary {
207
+ opacity: 1;
208
+ }
209
+
210
+ .focus-ring {
211
+ inset: 3px 3px calc(4px + var(--_active-indicator-height)) 3px;
212
+ }
213
+ }
214
+
215
+ &:hover:not(:where(.disabled)) {
216
+ --_container-state-opacity: 0.08;
217
+ }
218
+
219
+ &.pressed:not(:where(.disabled)) {
220
+ --_container-state-opacity: 0.12;
221
+ }
222
+
149
223
  &.disabled {
150
224
  --_label-text-color: var(--color-on-surface);
151
225
  --_label-text-opacity: 0.38;
package/src/tabs/tab.ts CHANGED
@@ -10,6 +10,7 @@ import styles from './tab.scss';
10
10
  * @label Tab
11
11
  * @tag wc-tab
12
12
  * @rawTag tab
13
+ * @parentRawTag tabs
13
14
  *
14
15
  * @summary A tab component for use within tabs.
15
16
  * @overview
@@ -33,8 +34,6 @@ export class Tab extends LitElement {
33
34
 
34
35
  @property({ type: String }) disabledReason = '';
35
36
 
36
- @property({ type: String }) icon?: string;
37
-
38
37
  @property({ type: String }) label?: string;
39
38
 
40
39
  @property({ type: String }) value?: string;
@@ -58,6 +57,10 @@ export class Tab extends LitElement {
58
57
 
59
58
  @state() slotHasContent = false;
60
59
 
60
+ @state() slotHasIcon = false;
61
+
62
+ @state() slotHasBadge = false;
63
+
61
64
  /**
62
65
  * States
63
66
  */
@@ -94,6 +97,22 @@ export class Tab extends LitElement {
94
97
  this.requestUpdate();
95
98
  },
96
99
  );
100
+
101
+ observerSlotChangesWithCallback(
102
+ this.renderRoot.querySelector('slot[name="icon"]'),
103
+ hasContent => {
104
+ this.slotHasIcon = hasContent;
105
+ this.requestUpdate();
106
+ },
107
+ );
108
+
109
+ observerSlotChangesWithCallback(
110
+ this.renderRoot.querySelector('slot[name="badge"]'),
111
+ hasContent => {
112
+ this.slotHasBadge = hasContent;
113
+ this.requestUpdate();
114
+ },
115
+ );
97
116
  }
98
117
 
99
118
  __dispatchClickWithThrottle: (event: MouseEvent | KeyboardEvent) => void =
@@ -158,7 +177,9 @@ export class Tab extends LitElement {
158
177
  disabled: this.disabled,
159
178
  pressed: this.isPressed,
160
179
  active: this.active,
161
- 'has-content': this.slotHasContent
180
+ 'has-content': this.slotHasContent || !!this.label,
181
+ 'has-icon': this.slotHasIcon,
182
+ 'has-badge': this.slotHasBadge,
162
183
  };
163
184
 
164
185
 
@@ -205,16 +226,18 @@ export class Tab extends LitElement {
205
226
  <wc-ripple class="ripple"></wc-ripple>
206
227
 
207
228
  <div class="tab-content">
229
+ <slot name="icon"></slot>
230
+
208
231
  <div class="slot-container">
209
- <slot></slot>
232
+ <slot>${this.label || nothing}</slot>
210
233
  </div>
211
234
 
212
- <slot name="icon"></slot>
235
+ <slot name="badge"></slot>
213
236
 
214
237
  <div class="indicator"></div>
215
238
  </div>
216
239
 
217
- <div class="indicator"></div>
240
+ <div class="secondary indicator"></div>
218
241
 
219
242
  ${this.__renderDisabledReason()}
220
243
  `;
@@ -2,17 +2,18 @@
2
2
 
3
3
  @include mixin.base-styles;
4
4
 
5
- .tabs-list {
5
+
6
+ .tabs {
6
7
  display: flex;
7
8
  position: relative;
8
9
  width: 100%;
9
10
  }
10
11
 
11
- :host-context([variant='line']) {
12
- --tabs-list-height: 3rem;
12
+ :host-context([variant='line']), :host([variant='line']) {
13
+ --tabs-height: 3rem;
13
14
 
14
- .tabs-list {
15
- height: var(--tabs-list-height);
15
+ .tabs {
16
+ height: var(--tabs-height);
16
17
  border-bottom: 1px solid var(--color-surface-variant);
17
18
  }
18
19
  }
package/src/tabs/tabs.ts CHANGED
@@ -24,6 +24,8 @@ import { Tab } from './tab.js';
24
24
  export class Tabs extends LitElement {
25
25
  static styles = [styles];
26
26
 
27
+ static Tab = Tab;
28
+
27
29
  @property({ type: Boolean }) managed = false;
28
30
 
29
31
  connectedCallback() {
@@ -42,21 +44,33 @@ export class Tabs extends LitElement {
42
44
  const detailEvent = event as CustomEvent;
43
45
  const path = detailEvent.composedPath();
44
46
  const clickedTab: Tab | undefined = path.find(
45
- node => node instanceof Element && (node as Element).tagName.toLowerCase() === 'base-tab',
47
+ node => node instanceof Element && (node as Element).tagName.toLowerCase() === 'wc-tab',
46
48
  ) as Tab | undefined;
47
49
 
48
50
  if (!clickedTab) return;
49
51
 
50
- const tabs: NodeListOf<Tab> = this.querySelectorAll('base-tab');
51
- tabs.forEach(tab => {
52
+ const tabs = Array.from(this.querySelectorAll('wc-tab')) as Tab[];
53
+ let clickedIndex = -1;
54
+ for (let index = 0; index < tabs.length; index += 1) {
55
+ const tab = tabs[index];
52
56
  tab.active = false;
53
- });
57
+ if (tab === clickedTab) clickedIndex = index;
58
+ }
54
59
  (clickedTab as Tab).active = true;
60
+
61
+ this.dispatchEvent(new CustomEvent('tab-click', {
62
+ bubbles: true,
63
+ composed: true,
64
+ detail: {
65
+ index: clickedIndex,
66
+ value: (clickedTab as Tab).value,
67
+ },
68
+ }));
55
69
  };
56
70
 
57
71
  render() {
58
72
  return html`
59
- <div class="tabs-list">
73
+ <div class="tabs">
60
74
  <slot></slot>
61
75
  </div>
62
76
  `;
@@ -49,8 +49,11 @@ $sizes: "large", "medium", 'small';
49
49
  }
50
50
 
51
51
  .text-code-block {
52
- font-family: var(--font-family-monospace);
53
- background: var(--color-primary-container);
52
+ display: inline-flex;
53
+ background-color: var(--color-surface-variant);
54
+ text-shadow: 0 1px 1px var(--color-surface-variant);
55
+ color: var(--color-on-surface);
54
56
  border-radius: var(--shape-corner-extra-small);
55
- padding-inline: var(--spacing-050);
57
+ padding: var(--spacing-050);
58
+ font-family: var(--font-family-monospace);
56
59
  }
@@ -3,20 +3,23 @@
3
3
 
4
4
  @include mixin.base-styles;
5
5
 
6
- .tooltip {
7
- pointer-events: none;
8
- transition: transform var(--duration-short2) ease-in-out, opacity var(--duration-short2) ease-in-out;
9
- transform: scale(0);
10
- position: absolute;
11
- top: 0;
12
- left: 0;
13
- opacity: 0;
14
- }
15
6
 
16
- .tooltip.open {
17
- pointer-events: auto;
18
- transform: scale(1);
19
- opacity: 1;
7
+ :host(:not([preview])) {
8
+ .tooltip {
9
+ pointer-events: none;
10
+ transition: transform var(--duration-short2) ease-in-out, opacity var(--duration-short2) ease-in-out;
11
+ transform: scale(0);
12
+ position: absolute;
13
+ top: 0;
14
+ left: 0;
15
+ opacity: 0;
16
+ }
17
+
18
+ .tooltip.open {
19
+ pointer-events: auto;
20
+ transform: scale(1);
21
+ opacity: 1;
22
+ }
20
23
  }
21
24
 
22
25
  .variant-plain .tooltip-content {
@@ -16,9 +16,7 @@ export type TooltipTrigger = 'hover' | 'focus' | 'click';
16
16
  *
17
17
  * @example
18
18
  * ```html
19
- * <wc-tooltip content="Tooltip text">
20
- * <button>Hover me</button>
21
- * </wc-tooltip>
19
+ * <wc-tooltip preview>Tooltip</wc-tooltip>
22
20
  * ```
23
21
  */
24
22
  export class Tooltip extends LitElement {
@@ -58,13 +56,13 @@ export class Tooltip extends LitElement {
58
56
 
59
57
  // Define listeners as arrow functions to maintain 'this' context
60
58
  private _onMouseEnter = () => {
61
- if (!this.hasTrigger('hover')) return;
59
+ if (this.preview || !this.hasTrigger('hover')) return;
62
60
  window.clearTimeout(this._hideTimeout); // Cancel any pending close
63
61
  this.show();
64
62
  };
65
63
 
66
64
  private _onMouseLeave = () => {
67
- if (!this.hasTrigger('hover')) return;
65
+ if (this.preview || !this.hasTrigger('hover')) return;
68
66
 
69
67
  // Small delay allows the mouse to move from target -> tooltip
70
68
  // without the tooltip vanishing instantly.
@@ -79,17 +77,17 @@ export class Tooltip extends LitElement {
79
77
  }, 100); // 100ms is usually enough for a smooth transition
80
78
  };
81
79
 
82
- private _onFocusIn = () => this.hasTrigger('focus') && this.show();
80
+ private _onFocusIn = () => this.preview && this.hasTrigger('focus') && this.show();
83
81
 
84
82
  private _onFocusOut = (e: FocusEvent) => {
85
- if (!this.hasTrigger('focus')) return;
83
+ if (this.preview || !this.hasTrigger('focus')) return;
86
84
  if (this._target && !this._target.contains(e.relatedTarget as Node)) {
87
85
  this.hide();
88
86
  }
89
87
  };
90
88
 
91
89
  private _onClick = (e: MouseEvent) => {
92
- if (!this.hasTrigger('click')) return;
90
+ if (this.preview || !this.hasTrigger('click')) return;
93
91
  e.stopPropagation();
94
92
  this.toggle();
95
93
  };
@@ -176,7 +174,7 @@ export class Tooltip extends LitElement {
176
174
  this.attachListeners();
177
175
  }
178
176
 
179
- if (changedProps.has('open') && this.open && this._target && !this.preview) {
177
+ if (changedProps.has('open') && this.open && this._target) {
180
178
  this._popover.updatePosition(this._target, this.floatingEl);
181
179
  }
182
180
  }
@@ -0,0 +1,57 @@
1
+ <!doctype html>
2
+ <html lang='en-GB'>
3
+ <head>
4
+ <meta charset='utf-8'>
5
+ <meta name='viewport' content='width=device-width, initial-scale=1.0, viewport-fit=cover' />
6
+ <link rel='stylesheet' href='/dist/assets/styles/tokens.css' />
7
+ <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+Mono:wght@100..900&family=Noto+Sans:ital,wght@0,100..900;1,100..900&display=swap" rel="stylesheet">
8
+
9
+ <style>
10
+ body {
11
+ background: #fafafa;
12
+ padding: 2rem;
13
+ font-family: 'Noto Sans', sans-serif;
14
+ }
15
+ h2 {
16
+ margin-top: 2rem;
17
+ margin-bottom: 0.5rem;
18
+ }
19
+ </style>
20
+ </head>
21
+ <body>
22
+
23
+ <h2>Basic Tree View</h2>
24
+ <wc-tree-view>
25
+ <wc-tree-node label="Documents" icon="folder" expanded>
26
+ <wc-tree-node label="Work" icon="folder" expanded>
27
+ <wc-tree-node label="Project A" icon="description"></wc-tree-node>
28
+ <wc-tree-node label="Project B" icon="description"></wc-tree-node>
29
+ </wc-tree-node>
30
+ <wc-tree-node label="Personal" icon="folder">
31
+ <wc-tree-node label="Resume.pdf" icon="picture_as_pdf"></wc-tree-node>
32
+ </wc-tree-node>
33
+ </wc-tree-node>
34
+ <wc-tree-node label="Pictures" icon="photo_library">
35
+ <wc-tree-node label="Vacation.jpg" icon="image"></wc-tree-node>
36
+ <wc-tree-node label="Family.jpg" icon="image"></wc-tree-node>
37
+ </wc-tree-node>
38
+ <wc-tree-node label="Disabled Node" icon="block" disabled></wc-tree-node>
39
+ </wc-tree-view>
40
+
41
+ <h2>Tree View without Icons</h2>
42
+ <wc-tree-view>
43
+ <wc-tree-node label="Category 1" expanded>
44
+ <wc-tree-node label="Item 1.1"></wc-tree-node>
45
+ <wc-tree-node label="Item 1.2">
46
+ <wc-tree-node label="Item 1.2.1"></wc-tree-node>
47
+ <wc-tree-node label="Item 1.2.2"></wc-tree-node>
48
+ </wc-tree-node>
49
+ </wc-tree-node>
50
+ <wc-tree-node label="Category 2">
51
+ <wc-tree-node label="Item 2.1"></wc-tree-node>
52
+ </wc-tree-node>
53
+ </wc-tree-view>
54
+
55
+ <script type='module' src='/dist/peacock-loader.js'></script>
56
+ </body>
57
+ </html>
@@ -0,0 +1,2 @@
1
+ export { TreeNode } from './tree-node.js';
2
+ export { TreeView } from './tree-view.js';
@@ -0,0 +1,101 @@
1
+ @use '../../scss/mixin';
2
+
3
+ @include mixin.base-styles;
4
+
5
+ :host {
6
+ display: block;
7
+
8
+ // M3 tree node sizing
9
+ --tree-node-height: 2.5rem;
10
+ --tree-node-icon-size: 1.25rem;
11
+ --tree-node-border-radius: var(--global-shape-corner-full, 9999px);
12
+
13
+ // M3 color tokens
14
+ --tree-node-label-color: var(--color-on-surface);
15
+ --tree-node-icon-color: var(--color-on-surface-variant);
16
+ --tree-node-selected-background: var(--color-secondary-container);
17
+ --tree-node-selected-color: var(--color-on-secondary-container);
18
+ --tree-node-hover-background: var(--color-inverse-primary);
19
+ --tree-node-focus-ring-color: var(--color-primary);
20
+ }
21
+
22
+ .tree-node {
23
+ display: block;
24
+ }
25
+
26
+ .tree-node-content {
27
+ display: flex;
28
+ align-items: center;
29
+ gap: 0.25rem;
30
+ height: var(--tree-node-height);
31
+ border-radius: var(--tree-node-border-radius);
32
+ color: var(--tree-node-label-color);
33
+ cursor: pointer;
34
+ user-select: none;
35
+ text-decoration: none;
36
+ outline: none;
37
+
38
+ @include mixin.get-typography(body-medium);
39
+
40
+ &:not(.disabled):hover {
41
+ background-color: var(--tree-node-hover-background);
42
+ }
43
+
44
+ &:focus-visible {
45
+ @include mixin.focus-ring(var(--tree-node-focus-ring-color));
46
+ }
47
+
48
+ &.selected {
49
+ background-color: var(--tree-node-selected-background);
50
+ color: var(--tree-node-selected-color);
51
+
52
+ .node-icon {
53
+ --icon-color: var(--tree-node-selected-color);
54
+ }
55
+ }
56
+
57
+ &.disabled {
58
+ cursor: not-allowed;
59
+ opacity: 0.38;
60
+ pointer-events: none;
61
+ }
62
+ }
63
+
64
+ .expand-icon {
65
+ --icon-size: var(--tree-node-icon-size);
66
+ --icon-color: var(--tree-node-icon-color);
67
+ flex-shrink: 0;
68
+ transition: transform var(--duration-short2, 200ms) var(--easing-standard, ease);
69
+
70
+ &.expanded {
71
+ transform: rotate(90deg);
72
+ }
73
+ }
74
+
75
+ .icon-space {
76
+ display: inline-block;
77
+ width: var(--tree-node-icon-size);
78
+ height: var(--tree-node-icon-size);
79
+ flex-shrink: 0;
80
+ }
81
+
82
+ .node-icon {
83
+ --icon-size: var(--tree-node-icon-size);
84
+ --icon-color: var(--tree-node-icon-color);
85
+ flex-shrink: 0;
86
+ }
87
+
88
+ .tree-node-label {
89
+ flex: 1;
90
+ overflow: hidden;
91
+ text-overflow: ellipsis;
92
+ white-space: nowrap;
93
+ }
94
+
95
+ .node-children {
96
+ display: none;
97
+
98
+ &.expanded {
99
+ display: block;
100
+ }
101
+ }