@redvars/peacock 3.4.0 → 3.5.1

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 (258) hide show
  1. package/dist/BaseButton-DuASuVth.js +219 -0
  2. package/dist/BaseButton-DuASuVth.js.map +1 -0
  3. package/dist/BaseHyperlinkMixin-BNuwbiEf.js +65 -0
  4. package/dist/BaseHyperlinkMixin-BNuwbiEf.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/banner.js +187 -0
  10. package/dist/banner.js.map +1 -0
  11. package/dist/bottom-sheet.js +2 -2
  12. package/dist/{button-COYCtuA8.js → button-DouvOfEU.js} +92 -283
  13. package/dist/button-DouvOfEU.js.map +1 -0
  14. package/dist/{button-group-DsXquZQn.js → button-group-CEdMwvJJ.js} +72 -48
  15. package/dist/button-group-CEdMwvJJ.js.map +1 -0
  16. package/dist/button-group.js +8 -5
  17. package/dist/button-group.js.map +1 -1
  18. package/dist/button.js +7 -4
  19. package/dist/button.js.map +1 -1
  20. package/dist/card.js +29 -74
  21. package/dist/card.js.map +1 -1
  22. package/dist/chart-bar.js +2 -2
  23. package/dist/chart-bar.js.map +1 -1
  24. package/dist/chart-doughnut.js +2 -2
  25. package/dist/chart-doughnut.js.map +1 -1
  26. package/dist/chart-pie.js +2 -2
  27. package/dist/chart-pie.js.map +1 -1
  28. package/dist/chart-stacked-bar.js +2 -2
  29. package/dist/chart-stacked-bar.js.map +1 -1
  30. package/dist/{class-map-3TAnCMAX.js → class-map-YU7g0o3B.js} +2 -2
  31. package/dist/{class-map-3TAnCMAX.js.map → class-map-YU7g0o3B.js.map} +1 -1
  32. package/dist/clock.js.map +1 -1
  33. package/dist/code-editor.js +4 -4
  34. package/dist/code-editor.js.map +1 -1
  35. package/dist/code-highlighter.js +5 -4
  36. package/dist/code-highlighter.js.map +1 -1
  37. package/dist/custom-elements-jsdocs.json +6627 -3477
  38. package/dist/custom-elements.json +10954 -7810
  39. package/dist/directive-ZPhl09Yt.js +9 -0
  40. package/dist/directive-ZPhl09Yt.js.map +1 -0
  41. package/dist/dispatch-event-utils-CuEqjlPT.js +127 -0
  42. package/dist/dispatch-event-utils-CuEqjlPT.js.map +1 -0
  43. package/dist/fab.js +423 -0
  44. package/dist/fab.js.map +1 -0
  45. package/dist/index.js +17 -9
  46. package/dist/index.js.map +1 -1
  47. package/dist/{observe-theme-change-DKAIv5BB.js → is-dark-mode-DicqGkCJ.js} +6 -2
  48. package/dist/is-dark-mode-DicqGkCJ.js.map +1 -0
  49. package/dist/{select-C3XAzenC.js → navigation-rail-Lxetd5-Z.js} +2426 -898
  50. package/dist/navigation-rail-Lxetd5-Z.js.map +1 -0
  51. package/dist/notification.js +418 -0
  52. package/dist/notification.js.map +1 -0
  53. package/dist/number-counter.js +2 -2
  54. package/dist/number-counter.js.map +1 -1
  55. package/dist/observe-slot-change-BGJfgg2E.js +31 -0
  56. package/dist/observe-slot-change-BGJfgg2E.js.map +1 -0
  57. package/dist/peacock-loader.js +48 -13
  58. package/dist/peacock-loader.js.map +1 -1
  59. package/dist/search.js +456 -0
  60. package/dist/search.js.map +1 -0
  61. package/dist/side-sheet.js +2 -2
  62. package/dist/src/__mixins/BaseButtonMixin.d.ts +20 -0
  63. package/dist/src/__mixins/BaseHyperlinkMixin.d.ts +18 -0
  64. package/dist/src/__mixins/MixinConstructor.d.ts +1 -0
  65. package/dist/src/__utils/cache-fetch.d.ts +1 -0
  66. package/dist/src/__utils/is-dark-mode.d.ts +1 -0
  67. package/dist/src/__utils/is-in-viewport.d.ts +1 -0
  68. package/dist/src/__utils/observe-slot-change.d.ts +1 -0
  69. package/dist/src/__utils/sanitize-svg.d.ts +1 -0
  70. package/dist/src/__utils/throttle.d.ts +4 -0
  71. package/dist/src/accordion/accordion-item.d.ts +33 -9
  72. package/dist/src/accordion/accordion.d.ts +21 -5
  73. package/dist/src/banner/banner.d.ts +43 -0
  74. package/dist/src/banner/index.d.ts +1 -0
  75. package/dist/src/button/BaseButton.d.ts +7 -57
  76. package/dist/src/button/button/button.d.ts +32 -3
  77. package/dist/src/button/button-group/button-group.d.ts +4 -4
  78. package/dist/src/button/icon-button/icon-button.d.ts +33 -8
  79. package/dist/src/card/card.d.ts +4 -15
  80. package/dist/src/empty-state/empty-state.d.ts +1 -1
  81. package/dist/src/fab/fab.d.ts +80 -0
  82. package/dist/src/fab/index.d.ts +1 -0
  83. package/dist/src/focus-ring/focus-ring.d.ts +11 -5
  84. package/dist/src/index.d.ts +8 -1
  85. package/dist/src/link/link.d.ts +3 -10
  86. package/dist/src/menu/menu/menu.d.ts +3 -2
  87. package/dist/src/menu/sub-menu/sub-menu.d.ts +1 -0
  88. package/dist/src/navigation-rail/index.d.ts +2 -0
  89. package/dist/src/navigation-rail/navigation-rail-item.d.ts +55 -0
  90. package/dist/src/navigation-rail/navigation-rail.d.ts +71 -0
  91. package/dist/src/notification/index.d.ts +1 -0
  92. package/dist/src/notification/notification.d.ts +69 -0
  93. package/dist/src/pagination/pagination.d.ts +8 -1
  94. package/dist/src/search/index.d.ts +1 -0
  95. package/dist/src/search/search.d.ts +76 -0
  96. package/dist/src/select/select.d.ts +3 -5
  97. package/dist/src/sidebar-menu/index.d.ts +3 -0
  98. package/dist/src/sidebar-menu/sidebar-menu-item.d.ts +58 -0
  99. package/dist/src/sidebar-menu/sidebar-menu.d.ts +38 -0
  100. package/dist/src/sidebar-menu/sidebar-sub-menu.d.ts +35 -0
  101. package/dist/src/slider/slider.d.ts +4 -0
  102. package/dist/src/snackbar/snackbar.d.ts +14 -1
  103. package/dist/src/toolbar/index.d.ts +1 -0
  104. package/dist/src/toolbar/toolbar.d.ts +86 -0
  105. package/dist/src/tooltip/tooltip.d.ts +3 -0
  106. package/dist/src/url-field/index.d.ts +1 -0
  107. package/dist/src/url-field/url-field.d.ts +48 -0
  108. package/dist/{style-map-CRFEoCEg.js → style-map-DVmWOuYy.js} +2 -2
  109. package/dist/{style-map-CRFEoCEg.js.map → style-map-DVmWOuYy.js.map} +1 -1
  110. package/dist/test/banner.test.d.ts +1 -0
  111. package/dist/test/search.test.d.ts +1 -0
  112. package/dist/test/sidebar-menu.test.d.ts +1 -0
  113. package/dist/test/toolbar.test.d.ts +1 -0
  114. package/dist/toolbar.js +306 -0
  115. package/dist/toolbar.js.map +1 -0
  116. package/dist/tsconfig.tsbuildinfo +1 -1
  117. package/dist/{unsafe-html-D3GHRaGQ.js → unsafe-html-BsGUjx94.js} +2 -2
  118. package/dist/{unsafe-html-D3GHRaGQ.js.map → unsafe-html-BsGUjx94.js.map} +1 -1
  119. package/package.json +1 -1
  120. package/readme.md +73 -65
  121. package/scss/mixin.scss +16 -0
  122. package/scss/styles.scss +4 -0
  123. package/src/__mixins/BaseButtonMixin.ts +83 -0
  124. package/src/__mixins/BaseHyperlinkMixin.ts +68 -0
  125. package/src/__mixins/MixinConstructor.ts +1 -0
  126. package/src/__mixins/README.md +19 -0
  127. package/src/__utils/cache-fetch.ts +65 -0
  128. package/src/__utils/is-dark-mode.ts +3 -0
  129. package/src/__utils/is-in-viewport.ts +6 -0
  130. package/src/__utils/observe-slot-change.ts +38 -0
  131. package/src/__utils/sanitize-svg.ts +27 -0
  132. package/src/__utils/throttle.ts +27 -0
  133. package/src/accordion/accordion-item.scss +136 -65
  134. package/src/accordion/accordion-item.ts +117 -44
  135. package/src/accordion/accordion.scss +24 -5
  136. package/src/accordion/accordion.ts +29 -23
  137. package/src/accordion/demo/index.html +74 -35
  138. package/src/banner/banner.scss +83 -0
  139. package/src/banner/banner.ts +101 -0
  140. package/src/banner/index.ts +1 -0
  141. package/src/button/BaseButton.ts +13 -115
  142. package/src/button/button/button-colors.scss +14 -14
  143. package/src/button/button/button-sizes.scss +4 -2
  144. package/src/button/button/button.ts +80 -26
  145. package/src/button/button-group/button-group.ts +5 -5
  146. package/src/button/icon-button/icon-button.ts +79 -44
  147. package/src/card/card.ts +50 -100
  148. package/src/chart-bar/chart-bar.ts +10 -15
  149. package/src/chart-bar/chart-stacked-bar.ts +15 -19
  150. package/src/chart-doughnut/chart-doughnut.ts +24 -28
  151. package/src/chart-pie/chart-pie.ts +20 -24
  152. package/src/checkbox/checkbox.scss +17 -34
  153. package/src/checkbox/checkbox.ts +4 -2
  154. package/src/clock/clock.ts +1 -1
  155. package/src/code-editor/code-editor.ts +4 -4
  156. package/src/code-highlighter/code-highlighter.scss +1 -0
  157. package/src/code-highlighter/code-highlighter.ts +3 -3
  158. package/src/date-picker/date-picker.ts +6 -3
  159. package/src/divider/divider.ts +3 -1
  160. package/src/elevation/elevation.scss +5 -5
  161. package/src/empty-state/empty-state.scss +7 -9
  162. package/src/empty-state/empty-state.ts +1 -1
  163. package/src/fab/fab-colors.scss +49 -0
  164. package/src/fab/fab-sizes.scss +47 -0
  165. package/src/fab/fab.scss +137 -0
  166. package/src/fab/fab.ts +214 -0
  167. package/src/fab/index.ts +1 -0
  168. package/src/field/field.ts +3 -1
  169. package/src/focus-ring/focus-ring.ts +47 -40
  170. package/src/icon/datasource.ts +1 -1
  171. package/src/icon/icon.ts +3 -1
  172. package/src/image/image.ts +3 -2
  173. package/src/index.ts +8 -1
  174. package/src/input/input.ts +8 -3
  175. package/src/link/link.ts +2 -15
  176. package/src/menu/menu/menu.scss +7 -0
  177. package/src/menu/menu/menu.ts +7 -4
  178. package/src/menu/menu-item/menu-item.ts +3 -1
  179. package/src/menu/sub-menu/sub-menu.ts +1 -0
  180. package/src/navigation-rail/index.ts +2 -0
  181. package/src/navigation-rail/navigation-rail-item.scss +216 -0
  182. package/src/navigation-rail/navigation-rail-item.ts +223 -0
  183. package/src/navigation-rail/navigation-rail.scss +72 -0
  184. package/src/navigation-rail/navigation-rail.ts +149 -0
  185. package/src/notification/index.ts +1 -0
  186. package/src/notification/notification.scss +201 -0
  187. package/src/notification/notification.ts +207 -0
  188. package/src/number-counter/number-counter.ts +3 -1
  189. package/src/number-field/number-field.ts +10 -6
  190. package/src/pagination/pagination.scss +33 -24
  191. package/src/pagination/pagination.ts +115 -60
  192. package/src/peacock-loader.ts +42 -5
  193. package/src/radio/radio.ts +3 -1
  194. package/src/search/index.ts +1 -0
  195. package/src/search/search-colors.scss +14 -0
  196. package/src/search/search.scss +204 -0
  197. package/src/search/search.ts +244 -0
  198. package/src/select/option.ts +1 -1
  199. package/src/select/select.scss +5 -0
  200. package/src/select/select.ts +71 -37
  201. package/src/sidebar-menu/demo/index.html +68 -0
  202. package/src/sidebar-menu/index.ts +3 -0
  203. package/src/sidebar-menu/sidebar-menu-item.scss +102 -0
  204. package/src/sidebar-menu/sidebar-menu-item.ts +151 -0
  205. package/src/{tree-view/tree-view.scss → sidebar-menu/sidebar-menu.scss} +1 -1
  206. package/src/sidebar-menu/sidebar-menu.ts +182 -0
  207. package/src/sidebar-menu/sidebar-sub-menu.scss +130 -0
  208. package/src/sidebar-menu/sidebar-sub-menu.ts +160 -0
  209. package/src/skeleton/skeleton.scss +18 -24
  210. package/src/slider/slider.scss +19 -0
  211. package/src/slider/slider.ts +30 -19
  212. package/src/snackbar/snackbar.scss +62 -31
  213. package/src/snackbar/snackbar.ts +91 -11
  214. package/src/switch/switch.ts +3 -1
  215. package/src/table/table.ts +3 -1
  216. package/src/tabs/tab.ts +10 -6
  217. package/src/text/text.css-component.scss +7 -1
  218. package/src/textarea/textarea.ts +4 -2
  219. package/src/time-picker/time-picker.ts +5 -3
  220. package/src/toolbar/index.ts +1 -0
  221. package/src/toolbar/toolbar-colors.scss +16 -0
  222. package/src/toolbar/toolbar.scss +165 -0
  223. package/src/toolbar/toolbar.ts +137 -0
  224. package/src/tooltip/tooltip.ts +24 -0
  225. package/src/url-field/index.ts +1 -0
  226. package/src/url-field/url-field.scss +50 -0
  227. package/src/url-field/url-field.ts +239 -0
  228. package/dist/button-COYCtuA8.js.map +0 -1
  229. package/dist/button-group-DsXquZQn.js.map +0 -1
  230. package/dist/directive-Cuw6h7YA.js +0 -9
  231. package/dist/directive-Cuw6h7YA.js.map +0 -1
  232. package/dist/dispatch-event-utils-B4odODQf.js +0 -277
  233. package/dist/dispatch-event-utils-B4odODQf.js.map +0 -1
  234. package/dist/observe-theme-change-DKAIv5BB.js.map +0 -1
  235. package/dist/select-C3XAzenC.js.map +0 -1
  236. package/dist/src/styleMixins.css.d.ts +0 -9
  237. package/dist/src/tree-view/index.d.ts +0 -2
  238. package/dist/src/tree-view/tree-node.d.ts +0 -69
  239. package/dist/src/tree-view/tree-view.d.ts +0 -40
  240. package/dist/src/tree-view/wc-tree-view.d.ts +0 -6
  241. package/dist/src/utils.d.ts +0 -9
  242. package/dist/test/tree-view.test.d.ts +0 -1
  243. package/src/styleMixins.css.ts +0 -55
  244. package/src/tree-view/demo/index.html +0 -57
  245. package/src/tree-view/index.ts +0 -2
  246. package/src/tree-view/tree-node.scss +0 -101
  247. package/src/tree-view/tree-node.ts +0 -268
  248. package/src/tree-view/tree-view.ts +0 -182
  249. package/src/tree-view/wc-tree-view.ts +0 -9
  250. package/src/utils.ts +0 -193
  251. /package/dist/src/{spread.d.ts → __directive/spread.d.ts} +0 -0
  252. /package/dist/src/{utils → __utils}/copy-to-clipboard.d.ts +0 -0
  253. /package/dist/src/{utils → __utils}/dispatch-event-utils.d.ts +0 -0
  254. /package/dist/src/{utils → __utils}/observe-theme-change.d.ts +0 -0
  255. /package/src/{spread.ts → __directive/spread.ts} +0 -0
  256. /package/src/{utils → __utils}/copy-to-clipboard.ts +0 -0
  257. /package/src/{utils → __utils}/dispatch-event-utils.ts +0 -0
  258. /package/src/{utils → __utils}/observe-theme-change.ts +0 -0
@@ -1,9 +0,0 @@
1
- import { CSSResult } from 'lit';
2
- export declare const focusRing: (color?: string) => CSSResult;
3
- export declare const getTypography: (name: string) => CSSResult;
4
- export declare const getTypographyNotImportant: (name: string) => CSSResult;
5
- export declare const forPhoneOnly: (content: CSSResult) => CSSResult;
6
- export declare const forTabletPortraitUp: (content: CSSResult) => CSSResult;
7
- export declare const forTabletLandscapeUp: (content: CSSResult) => CSSResult;
8
- export declare const forDesktopUp: (content: CSSResult) => CSSResult;
9
- export declare const forBigDesktopUp: (content: CSSResult) => CSSResult;
@@ -1,2 +0,0 @@
1
- export { TreeNode } from './tree-node.js';
2
- export { TreeView } from './tree-view.js';
@@ -1,69 +0,0 @@
1
- import { LitElement } from 'lit';
2
- /**
3
- * @label Tree Node
4
- * @tag wc-tree-node
5
- * @rawTag tree-node
6
- * @parentRawTag tree-view
7
- * @summary A tree node represents a single item in a hierarchical tree structure. It supports nesting, icons, links, and keyboard navigation.
8
- *
9
- * @example
10
- * ```html
11
- * <wc-tree-view>
12
- * <wc-tree-node label="Parent">
13
- * <wc-tree-node label="Child"></wc-tree-node>
14
- * </wc-tree-node>
15
- * </wc-tree-view>
16
- * ```
17
- * @tags navigation
18
- */
19
- export declare class TreeNode extends LitElement {
20
- static styles: import("lit").CSSResultGroup[];
21
- /**
22
- * The value used to identify this node when selected.
23
- */
24
- value: string;
25
- /**
26
- * The display label for this node.
27
- */
28
- label: string;
29
- /**
30
- * Optional icon name to display before the label.
31
- */
32
- icon: string;
33
- /**
34
- * Optional hyperlink to navigate to on click.
35
- */
36
- href: string;
37
- /**
38
- * Sets or retrieves the window or frame at which to target content.
39
- */
40
- target: string;
41
- /**
42
- * If true, the user cannot interact with the node.
43
- */
44
- disabled: boolean;
45
- /**
46
- * Whether the node is currently selected.
47
- */
48
- selected: boolean;
49
- /**
50
- * Whether child nodes are visible.
51
- */
52
- expanded: boolean;
53
- /**
54
- * The nesting depth level (set automatically by the parent tree-view).
55
- */
56
- level: number;
57
- private readonly _nativeElement;
58
- focus(): void;
59
- blur(): void;
60
- private _getChildNodes;
61
- connectedCallback(): void;
62
- private _syncHostAria;
63
- private _updateChildLevels;
64
- private _handleClick;
65
- private _handleKeyDown;
66
- updated(changedProps: Map<string, unknown>): void;
67
- private _renderContent;
68
- render(): import("lit-html").TemplateResult<1>;
69
- }
@@ -1,40 +0,0 @@
1
- import { LitElement } from 'lit';
2
- import { TreeNode } from './tree-node.js';
3
- /**
4
- * @label Tree View
5
- * @tag wc-tree-view
6
- * @rawTag tree-view
7
- * @summary A tree view is a hierarchical structure that provides nested levels of navigation. It supports keyboard navigation, single/multi select, and expandable nodes.
8
- *
9
- * @example
10
- * ```html
11
- * <wc-tree-view>
12
- * <wc-tree-node label="Parent" expanded>
13
- * <wc-tree-node label="Child 1"></wc-tree-node>
14
- * <wc-tree-node label="Child 2"></wc-tree-node>
15
- * </wc-tree-node>
16
- * </wc-tree-view>
17
- * ```
18
- * @tags navigation
19
- */
20
- export declare class TreeView extends LitElement {
21
- static styles: import("lit").CSSResultGroup[];
22
- /**
23
- * The value of the currently selected node.
24
- */
25
- selectedNode: string;
26
- connectedCallback(): void;
27
- updated(changedProps: Map<string, unknown>): void;
28
- disconnectedCallback(): void;
29
- private _getTopLevelNodes;
30
- private _getAllVisibleNodes;
31
- private _onNodeClick;
32
- private _updateSelectedState;
33
- private _clearSelectedState;
34
- private _syncSelectedStateFromProperty;
35
- private _onSlotChange;
36
- private _collectAllNodes;
37
- private _onKeyDown;
38
- render(): import("lit-html").TemplateResult<1>;
39
- static Node: typeof TreeNode;
40
- }
@@ -1,6 +0,0 @@
1
- import { TreeView } from './tree-view.js';
2
- import { TreeNode } from './tree-node.js';
3
- export declare class WcTreeNode extends TreeNode {
4
- }
5
- export declare class WcTreeView extends TreeView {
6
- }
@@ -1,9 +0,0 @@
1
- export declare function createCacheFetch(name: string): Promise<(url: string) => Promise<string>>;
2
- export declare function sanitizeSvg(rawSvg: string): string;
3
- export declare function observerSlotChangesWithCallback(slot: HTMLSlotElement | null, callback: (hasContent: boolean) => void): void;
4
- export declare function throttle(func: Function, delay: number, options?: {
5
- leading: boolean;
6
- trailing: boolean;
7
- }): (...args: any[]) => void;
8
- export declare function isInViewport(element: HTMLElement): boolean;
9
- export declare function isDarkMode(): boolean;
@@ -1 +0,0 @@
1
- import '../src/tree-view/wc-tree-view.js';
@@ -1,55 +0,0 @@
1
- import { css, unsafeCSS, CSSResult } from 'lit';
2
-
3
- export const focusRing = (
4
- color = 'var(--border-interactive)',
5
- ): CSSResult => css`
6
- outline: 2px solid ${unsafeCSS(color)};
7
- `;
8
-
9
- export const getTypography = (name: string): CSSResult => css`
10
- font-family: var(--typography-${unsafeCSS(name)}-font-family) !important;
11
- font-size: var(--typography-${unsafeCSS(name)}-font-size) !important;
12
- font-weight: var(--typography-${unsafeCSS(name)}-font-weight) !important;
13
- line-height: var(--typography-${unsafeCSS(name)}-line-height) !important;
14
- letter-spacing: var(
15
- --typography-${unsafeCSS(name)}-letter-spacing
16
- ) !important;
17
- `;
18
-
19
- export const getTypographyNotImportant = (name: string): CSSResult => css`
20
- font-family: var(--typography-${unsafeCSS(name)}-font-family);
21
- font-size: var(--typography-${unsafeCSS(name)}-font-size);
22
- font-weight: var(--typography-${unsafeCSS(name)}-font-weight);
23
- line-height: var(--typography-${unsafeCSS(name)}-line-height);
24
- letter-spacing: var(--typography-${unsafeCSS(name)}-letter-spacing);
25
- `;
26
-
27
- export const forPhoneOnly = (content: CSSResult): CSSResult => css`
28
- @media (max-width: 671px) {
29
- ${content}
30
- }
31
- `;
32
-
33
- export const forTabletPortraitUp = (content: CSSResult): CSSResult => css`
34
- @media (min-width: 672px) {
35
- ${content}
36
- }
37
- `;
38
-
39
- export const forTabletLandscapeUp = (content: CSSResult): CSSResult => css`
40
- @media (min-width: 1056px) {
41
- ${content}
42
- }
43
- `;
44
-
45
- export const forDesktopUp = (content: CSSResult): CSSResult => css`
46
- @media (min-width: 1312px) {
47
- ${content}
48
- }
49
- `;
50
-
51
- export const forBigDesktopUp = (content: CSSResult): CSSResult => css`
52
- @media (min-width: 1584px) {
53
- ${content}
54
- }
55
- `;
@@ -1,57 +0,0 @@
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>
@@ -1,2 +0,0 @@
1
- export { TreeNode } from './tree-node.js';
2
- export { TreeView } from './tree-view.js';
@@ -1,101 +0,0 @@
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
- }
@@ -1,268 +0,0 @@
1
- import { html, LitElement } from 'lit';
2
- import { property, query } from 'lit/decorators.js';
3
- import { classMap } from 'lit/directives/class-map.js';
4
- import { styleMap } from 'lit/directives/style-map.js';
5
- import styles from './tree-node.scss';
6
-
7
- /**
8
- * @label Tree Node
9
- * @tag wc-tree-node
10
- * @rawTag tree-node
11
- * @parentRawTag tree-view
12
- * @summary A tree node represents a single item in a hierarchical tree structure. It supports nesting, icons, links, and keyboard navigation.
13
- *
14
- * @example
15
- * ```html
16
- * <wc-tree-view>
17
- * <wc-tree-node label="Parent">
18
- * <wc-tree-node label="Child"></wc-tree-node>
19
- * </wc-tree-node>
20
- * </wc-tree-view>
21
- * ```
22
- * @tags navigation
23
- */
24
- export class TreeNode extends LitElement {
25
- static styles = [styles];
26
-
27
- /**
28
- * The value used to identify this node when selected.
29
- */
30
- @property({ type: String, reflect: true })
31
- value: string = '';
32
-
33
- /**
34
- * The display label for this node.
35
- */
36
- @property({ type: String, reflect: true })
37
- label: string = '';
38
-
39
- /**
40
- * Optional icon name to display before the label.
41
- */
42
- @property({ type: String, reflect: true })
43
- icon: string = '';
44
-
45
- /**
46
- * Optional hyperlink to navigate to on click.
47
- */
48
- @property({ type: String, reflect: true })
49
- href: string = '';
50
-
51
- /**
52
- * Sets or retrieves the window or frame at which to target content.
53
- */
54
- @property({ type: String, reflect: true })
55
- target: string = '_self';
56
-
57
- /**
58
- * If true, the user cannot interact with the node.
59
- */
60
- @property({ type: Boolean, reflect: true })
61
- disabled: boolean = false;
62
-
63
- /**
64
- * Whether the node is currently selected.
65
- */
66
- @property({ type: Boolean, reflect: true })
67
- selected: boolean = false;
68
-
69
- /**
70
- * Whether child nodes are visible.
71
- */
72
- @property({ type: Boolean, reflect: true })
73
- expanded: boolean = false;
74
-
75
- /**
76
- * The nesting depth level (set automatically by the parent tree-view).
77
- */
78
- @property({ type: Number, reflect: true })
79
- level: number = 0;
80
-
81
- @query('.tree-node-content')
82
- private readonly _nativeElement!: HTMLElement | null;
83
-
84
- override focus() {
85
- this._nativeElement?.focus();
86
- }
87
-
88
- override blur() {
89
- this._nativeElement?.blur();
90
- }
91
-
92
- private _getChildNodes(): TreeNode[] {
93
- return Array.from(this.children).filter(
94
- el => el.tagName.toLowerCase() === 'wc-tree-node',
95
- ) as TreeNode[];
96
- }
97
-
98
- connectedCallback() {
99
- super.connectedCallback();
100
- this._updateChildLevels();
101
- this.setAttribute('role', 'treeitem');
102
- this._syncHostAria();
103
- }
104
-
105
- private _syncHostAria() {
106
- const hasChildren = this._getChildNodes().length > 0;
107
- if (hasChildren) {
108
- this.setAttribute('aria-expanded', String(this.expanded));
109
- } else {
110
- this.removeAttribute('aria-expanded');
111
- }
112
- this.setAttribute('aria-selected', String(this.selected));
113
- this.setAttribute('aria-disabled', String(this.disabled));
114
- this.setAttribute('aria-level', String(this.level + 1));
115
- }
116
-
117
- private _updateChildLevels() {
118
- const children = this._getChildNodes();
119
- children.forEach(child => {
120
- // eslint-disable-next-line no-param-reassign
121
- child.level = this.level + 1;
122
- });
123
- }
124
-
125
- private _handleClick(event: Event) {
126
- if (this.disabled) {
127
- event.preventDefault();
128
- event.stopPropagation();
129
- return;
130
- }
131
-
132
- const hasChildren = this._getChildNodes().length > 0;
133
- if (hasChildren) {
134
- this.expanded = !this.expanded;
135
- }
136
-
137
- this.dispatchEvent(
138
- new CustomEvent('tree-node:click', {
139
- bubbles: true,
140
- composed: true,
141
- detail: {
142
- value: this.value || this.label,
143
- label: this.label,
144
- expanded: this.expanded,
145
- },
146
- }),
147
- );
148
- }
149
-
150
- private _handleKeyDown(event: KeyboardEvent) {
151
- if (this.disabled) return;
152
-
153
- const hasChildren = this._getChildNodes().length > 0;
154
-
155
- switch (event.key) {
156
- case ' ':
157
- case 'Enter':
158
- event.preventDefault();
159
- if (hasChildren) {
160
- this.expanded = !this.expanded;
161
- }
162
- this.dispatchEvent(
163
- new CustomEvent('tree-node:click', {
164
- bubbles: true,
165
- composed: true,
166
- detail: {
167
- value: this.value || this.label,
168
- label: this.label,
169
- expanded: this.expanded,
170
- },
171
- }),
172
- );
173
- if (this.href) {
174
- window.open(this.href, this.target);
175
- }
176
- break;
177
- case 'ArrowLeft':
178
- event.preventDefault();
179
- if (this.expanded && hasChildren) {
180
- this.expanded = false;
181
- }
182
- break;
183
- case 'ArrowRight':
184
- event.preventDefault();
185
- if (hasChildren) {
186
- if (!this.expanded) {
187
- this.expanded = true;
188
- } else {
189
- const firstChild = this._getChildNodes()[0];
190
- firstChild?.focus();
191
- }
192
- }
193
- break;
194
- default:
195
- break;
196
- }
197
- }
198
-
199
- updated(changedProps: Map<string, unknown>) {
200
- super.updated(changedProps);
201
- if (changedProps.has('level')) {
202
- this._updateChildLevels();
203
- }
204
- this._syncHostAria();
205
- }
206
-
207
- private _renderContent(hasChildren: boolean) {
208
- // 0.125rem offset aligns text visually with the expand/icon space
209
- const indentStyle = styleMap({
210
- paddingInlineStart: `calc(${this.level + 1}rem - 0.125rem)`,
211
- });
212
-
213
- const contentClasses = classMap({
214
- 'tree-node-content': true,
215
- selected: this.selected,
216
- disabled: this.disabled,
217
- });
218
-
219
- const innerContent = html`
220
- ${hasChildren
221
- ? html`<wc-icon
222
- class=${classMap({ 'expand-icon': true, expanded: this.expanded })}
223
- name="arrow_right"
224
- ></wc-icon>`
225
- : html`<span class="icon-space"></span>`}
226
- ${this.icon
227
- ? html`<wc-icon class="node-icon" name=${this.icon}></wc-icon>`
228
- : ''}
229
- <span class="tree-node-label">${this.label}<slot name="label"></slot></span>
230
- `;
231
-
232
- if (this.href) {
233
- return html`<a
234
- class=${contentClasses}
235
- style=${indentStyle}
236
- href=${this.href}
237
- target=${this.target}
238
- tabindex=${this.disabled ? '-1' : '0'}
239
- @click=${this._handleClick}
240
- @keydown=${this._handleKeyDown}
241
- >${innerContent}</a>`;
242
- }
243
-
244
- return html`<div
245
- class=${contentClasses}
246
- style=${indentStyle}
247
- tabindex=${this.disabled ? '-1' : '0'}
248
- @click=${this._handleClick}
249
- @keydown=${this._handleKeyDown}
250
- >${innerContent}</div>`;
251
- }
252
-
253
- render() {
254
- const hasChildren = this._getChildNodes().length > 0;
255
-
256
- const nodeSlotClasses = classMap({
257
- 'node-children': true,
258
- expanded: this.expanded,
259
- });
260
-
261
- return html`<div class="tree-node">
262
- ${this._renderContent(hasChildren)}
263
- <div class=${nodeSlotClasses}>
264
- <slot></slot>
265
- </div>
266
- </div>`;
267
- }
268
- }