@neovici/cosmoz-treenode-navigator 8.5.0 → 9.0.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 (53) hide show
  1. package/NOTICE +6 -0
  2. package/README.md +143 -48
  3. package/dist/cosmoz-treenode-button-view.js +12 -1
  4. package/dist/cosmoz-treenode-button-view.js.map +1 -1
  5. package/dist/cosmoz-treenode-button-view.styles.d.ts.map +1 -1
  6. package/dist/cosmoz-treenode-button-view.styles.js +34 -15
  7. package/dist/cosmoz-treenode-button-view.styles.js.map +1 -1
  8. package/dist/cosmoz-treenode-navigator.d.ts +1 -1
  9. package/dist/cosmoz-treenode-navigator.d.ts.map +1 -1
  10. package/dist/cosmoz-treenode-navigator.js +128 -267
  11. package/dist/cosmoz-treenode-navigator.js.map +1 -1
  12. package/dist/cosmoz-treenode-navigator.styles.d.ts.map +1 -1
  13. package/dist/cosmoz-treenode-navigator.styles.js +59 -76
  14. package/dist/cosmoz-treenode-navigator.styles.js.map +1 -1
  15. package/dist/hooks/useNodes.d.ts.map +1 -1
  16. package/dist/hooks/useNodes.js +2 -1
  17. package/dist/hooks/useNodes.js.map +1 -1
  18. package/dist/hooks/useSourceTree.d.ts +33 -0
  19. package/dist/hooks/useSourceTree.d.ts.map +1 -0
  20. package/dist/hooks/useSourceTree.js +102 -0
  21. package/dist/hooks/useSourceTree.js.map +1 -0
  22. package/dist/tree-view/flatten.d.ts +29 -0
  23. package/dist/tree-view/flatten.d.ts.map +1 -0
  24. package/dist/tree-view/flatten.js +88 -0
  25. package/dist/tree-view/flatten.js.map +1 -0
  26. package/dist/tree-view/render.d.ts +22 -0
  27. package/dist/tree-view/render.d.ts.map +1 -0
  28. package/dist/tree-view/render.js +85 -0
  29. package/dist/tree-view/render.js.map +1 -0
  30. package/dist/tree-view/styles.d.ts +3 -0
  31. package/dist/tree-view/styles.d.ts.map +1 -0
  32. package/dist/tree-view/styles.js +134 -0
  33. package/dist/tree-view/styles.js.map +1 -0
  34. package/dist/tree-view/tree-view.d.ts +25 -0
  35. package/dist/tree-view/tree-view.d.ts.map +1 -0
  36. package/dist/tree-view/tree-view.js +27 -0
  37. package/dist/tree-view/tree-view.js.map +1 -0
  38. package/dist/tree-view/types.d.ts +59 -0
  39. package/dist/tree-view/types.d.ts.map +1 -0
  40. package/dist/tree-view/types.js +2 -0
  41. package/dist/tree-view/types.js.map +1 -0
  42. package/dist/tree-view/use-tree-view.d.ts +18 -0
  43. package/dist/tree-view/use-tree-view.d.ts.map +1 -0
  44. package/dist/tree-view/use-tree-view.js +175 -0
  45. package/dist/tree-view/use-tree-view.js.map +1 -0
  46. package/dist/util/source-tree.d.ts +26 -0
  47. package/dist/util/source-tree.d.ts.map +1 -0
  48. package/dist/util/source-tree.js +91 -0
  49. package/dist/util/source-tree.js.map +1 -0
  50. package/dist/util/source.d.ts.map +1 -1
  51. package/dist/util/source.js +4 -1
  52. package/dist/util/source.js.map +1 -1
  53. package/package.json +9 -8
@@ -1,109 +1,92 @@
1
1
  import { css } from '@pionjs/pion';
2
2
  export default css `
3
- .header {
4
- margin: 0 16px;
5
- color: var(--cz-text-color, inherit);
6
- }
7
-
8
- .header a {
9
- text-decoration: none;
10
- color: inherit;
11
- }
12
-
13
- .icon {
14
- display: inline-block;
15
- position: relative;
16
- padding: 8px;
17
- outline: none;
18
- user-select: none;
19
- cursor: pointer;
20
- z-index: 0;
21
- line-height: 1;
22
- width: 40px;
23
- height: 40px;
24
- box-sizing: border-box;
25
- color: var(--cosmoz-treenode-navigator-icon-color, currentColor);
3
+ :host {
4
+ display: flex;
5
+ flex-direction: column;
6
+ gap: calc(var(--cz-spacing) * 3);
7
+ min-width: 0;
26
8
  }
27
9
 
28
- .icon svg {
29
- fill: currentColor;
10
+ .header {
11
+ display: flex;
12
+ flex-direction: column;
13
+ gap: calc(var(--cz-spacing) * 2);
14
+ margin: 0 calc(var(--cz-spacing) * 5);
30
15
  }
31
16
 
32
17
  .path {
33
18
  display: flex;
34
- align-items: center;
35
19
  flex-wrap: wrap;
36
- margin: 0;
20
+ align-items: center;
21
+ gap: 2px;
22
+ min-height: var(--cz-text-sm-line-height);
23
+ font-size: var(--cz-text-sm);
24
+ line-height: var(--cz-text-sm-line-height);
25
+ color: var(--cz-color-text-tertiary);
37
26
  }
38
27
 
39
28
  .slash {
40
- margin: 0 2px;
29
+ color: var(--cz-color-text-quaternary);
41
30
  }
42
31
 
43
- .pointer {
32
+ .crumb {
33
+ all: unset;
44
34
  cursor: pointer;
35
+ padding: 0 4px;
36
+ border-radius: var(--cz-radius-xs);
37
+ font-weight: var(--cz-font-weight-medium);
45
38
  }
46
39
 
47
- .items {
48
- height: var(--cosmoz-treenode-navigator-list-height, 50vh);
49
- width: 100%;
50
- overflow-y: auto;
40
+ .crumb:hover {
41
+ color: var(--cz-color-text-secondary-hover);
42
+ background: var(--cz-color-bg-primary-hover);
51
43
  }
52
44
 
53
- .section {
54
- background-color: var(--cz-bg-color, var(--cz-color-bg-secondary));
55
- padding: 5px;
45
+ .crumb:focus-visible {
46
+ box-shadow: var(--cz-focus-ring);
56
47
  }
57
48
 
58
- .item {
59
- width: 100%;
49
+ .crumb[aria-current] {
50
+ color: var(--cz-color-text-primary);
51
+ font-weight: var(--cz-font-weight-semibold);
60
52
  }
61
53
 
62
- .node {
63
- align-items: center;
64
- display: flex;
65
- font-size: 16px;
66
- font-weight: 400;
67
- color: var(--cz-text-color, inherit);
68
- height: 40px;
69
- line-height: 24px;
70
- padding: 6px 12px 6px 16px;
71
- cursor: pointer;
72
- }
73
-
74
- .name {
75
- flex: auto;
54
+ .items {
55
+ height: var(--cosmoz-treenode-navigator-list-height, min(44dvh, 24rem));
56
+ margin: 0 8px;
76
57
  }
77
58
 
78
- .node.selected {
79
- background-color: var(
80
- --cosmoz-listbox-active-color,
81
- var(--cz-color-bg-tertiary)
82
- );
83
- transition: background-color 0.2s ease-out;
59
+ .status {
60
+ margin: 0 calc(var(--cz-spacing) * 5);
61
+ min-height: var(--cz-text-sm-line-height);
62
+ padding-block: 0 calc(var(--cz-spacing) * 3);
63
+ color: var(--cz-color-text-tertiary);
64
+ font-size: var(--cz-text-sm);
65
+ display: flex;
66
+ align-items: center;
67
+ gap: calc(var(--cz-spacing) * 2);
84
68
  }
85
-
86
- .node.selected .icon svg {
87
- fill: var(
88
- --cosmoz-treenode-navigator-select-node-icon-color,
89
- var(--cz-color-fg-secondary)
90
- );
91
- transition: color 0.8s ease-out;
69
+ .status:empty {
70
+ display: none;
92
71
  }
93
-
94
- .path > .pointer:hover,
95
- .path > .pointer:has(~ .pointer:hover) {
72
+ .retry {
73
+ border: 0;
74
+ padding: 0;
75
+ background: none;
76
+ font: inherit;
77
+ color: var(--cz-color-text-brand-primary);
78
+ cursor: pointer;
96
79
  text-decoration: underline;
97
80
  }
98
-
99
- .global-search {
100
- margin-block: calc(var(--cz-spacing) * 4);
81
+ .retry:focus-visible {
82
+ outline: none;
83
+ box-shadow: var(--cz-focus-ring);
101
84
  }
102
-
103
- .status {
104
- padding: 6px 16px;
105
- color: var(--cosmoz-treenode-navigator-status-color, #757575);
106
- font-size: 13px;
85
+ @media (max-width: 480px) {
86
+ .header,
87
+ .status {
88
+ margin-inline: calc(var(--cz-spacing) * 4);
89
+ }
107
90
  }
108
91
  `;
109
92
  //# sourceMappingURL=cosmoz-treenode-navigator.styles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cosmoz-treenode-navigator.styles.js","sourceRoot":"","sources":["../src/cosmoz-treenode-navigator.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEnC,eAAe,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0GjB,CAAC"}
1
+ {"version":3,"file":"cosmoz-treenode-navigator.styles.js","sourceRoot":"","sources":["../src/cosmoz-treenode-navigator.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEnC,eAAe,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyFjB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useNodes.d.ts","sourceRoot":"","sources":["../../src/hooks/useNodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAGjD;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ,GACpB,MAAM,MAAM,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EACpC,MAAM,OAAO,EAAE;;;;CA+Bf,CAAC"}
1
+ {"version":3,"file":"useNodes.d.ts","sourceRoot":"","sources":["../../src/hooks/useNodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAGjD;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ,GACpB,MAAM,MAAM,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EACpC,MAAM,OAAO,EAAE;;;;CAgCf,CAAC"}
@@ -13,7 +13,8 @@ export const useNodes = (load, deps) => {
13
13
  const [error, setError] = useState();
14
14
  const request = useRef(0);
15
15
  useEffect(() => {
16
- const id = ++request.current;
16
+ const id = (request.current ?? 0) + 1;
17
+ request.current = id;
17
18
  setLoading(true);
18
19
  setError(undefined);
19
20
  Promise.resolve()
@@ -1 +1 @@
1
- {"version":3,"file":"useNodes.js","sourceRoot":"","sources":["../../src/hooks/useNodes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE3D;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACvB,IAAoC,EACpC,IAAe,EACd,EAAE;IACH,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAW,CAAC;IAC9C,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAE1B,SAAS,CAAC,GAAG,EAAE;QACd,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC;QAE7B,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,QAAQ,CAAC,SAAS,CAAC,CAAC;QAEpB,OAAO,CAAC,OAAO,EAAE;aACf,IAAI,CAAC,IAAI,CAAC;aACV,IAAI,CACJ,CAAC,MAAM,EAAE,EAAE;YACV,IAAI,EAAE,KAAK,OAAO,CAAC,OAAO;gBAAE,OAAO;YACnC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;YACvB,UAAU,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC,EACD,CAAC,MAAM,EAAE,EAAE;YACV,IAAI,EAAE,KAAK,OAAO,CAAC,OAAO;gBAAE,OAAO;YACnC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACb,QAAQ,CAAC,MAAM,CAAC,CAAC;YACjB,UAAU,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC,CACD,CAAC;IACJ,CAAC,EAAE,IAAI,CAAC,CAAC;IAET,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAClC,CAAC,CAAC"}
1
+ {"version":3,"file":"useNodes.js","sourceRoot":"","sources":["../../src/hooks/useNodes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE3D;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACvB,IAAoC,EACpC,IAAe,EACd,EAAE;IACH,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAW,CAAC;IAC9C,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAE1B,SAAS,CAAC,GAAG,EAAE;QACd,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,CAAC,OAAO,GAAG,EAAE,CAAC;QAErB,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,QAAQ,CAAC,SAAS,CAAC,CAAC;QAEpB,OAAO,CAAC,OAAO,EAAE;aACf,IAAI,CAAC,IAAI,CAAC;aACV,IAAI,CACJ,CAAC,MAAM,EAAE,EAAE;YACV,IAAI,EAAE,KAAK,OAAO,CAAC,OAAO;gBAAE,OAAO;YACnC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;YACvB,UAAU,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC,EACD,CAAC,MAAM,EAAE,EAAE;YACV,IAAI,EAAE,KAAK,OAAO,CAAC,OAAO;gBAAE,OAAO;YACnC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACb,QAAQ,CAAC,MAAM,CAAC,CAAC;YACjB,UAAU,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC,CACD,CAAC;IACJ,CAAC,EAAE,IAAI,CAAC,CAAC;IAET,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAClC,CAAC,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { Node } from '@neovici/cosmoz-tree';
2
+ import type { NodeSource } from '../util/source';
3
+ export declare const useSourceTree: (source: NodeSource, path: string, opened?: boolean) => {
4
+ model: {
5
+ subscribe: (listener: () => void) => () => void;
6
+ roots: () => Node[];
7
+ getChildren: (node: Node) => Node[];
8
+ hasChildren: (node: Node) => boolean;
9
+ pending: Map<string, Promise<void>>;
10
+ errors: Set<string>;
11
+ loadPath: (path: string) => Promise<Node[]>;
12
+ loadLevel: (path: string) => Promise<void>;
13
+ };
14
+ expanded: readonly string[];
15
+ setExpanded: import("@pionjs/pion").StateUpdater<readonly string[]>;
16
+ highlighted: string;
17
+ setHighlighted: import("@pionjs/pion").StateUpdater<string>;
18
+ error: boolean;
19
+ loading: boolean;
20
+ retry: () => void;
21
+ };
22
+ export declare const useSearchTree: (source: NodeSource, query: string) => {
23
+ found: {
24
+ matches: number;
25
+ roots: Node[];
26
+ getChildren: (node: Node) => Node[];
27
+ expanded: string[];
28
+ } | undefined;
29
+ loading: boolean;
30
+ error: boolean;
31
+ retry: () => void;
32
+ };
33
+ //# sourceMappingURL=useSourceTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSourceTree.d.ts","sourceRoot":"","sources":["../../src/hooks/useSourceTree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGjD,eAAO,MAAM,aAAa,GACzB,QAAQ,UAAU,EAClB,MAAM,MAAM,EACZ,SAAS,OAAO;;;;;;;;;;;;;;;;;;CAiEhB,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,QAAQ,UAAU,EAAE,OAAO,MAAM;;;;;;;;;;CAsC9D,CAAC"}
@@ -0,0 +1,102 @@
1
+ import { useEffect, useMemo, useState } from '@pionjs/pion';
2
+ import { searchTree, sourceTree } from '../util/source-tree';
3
+ export const useSourceTree = (source, path, opened) => {
4
+ const [, refresh] = useState(0);
5
+ const model = useMemo(() => sourceTree(source), [source, opened]);
6
+ const [expanded, setExpanded] = useState([]);
7
+ const [highlighted, setHighlighted] = useState('');
8
+ const [error, setError] = useState(false);
9
+ const [loading, setLoading] = useState(false);
10
+ const [attempt, setAttempt] = useState(0);
11
+ useEffect(() => model.subscribe(() => refresh((value) => value + 1)), [model]);
12
+ useEffect(() => {
13
+ setHighlighted('');
14
+ setExpanded([]);
15
+ if (opened === false)
16
+ return;
17
+ const controller = new AbortController();
18
+ setLoading(true);
19
+ setError(false);
20
+ const initial = path ? model.loadPath(path) : Promise.resolve([]);
21
+ initial
22
+ .then(async (parts) => {
23
+ if (controller.signal.aborted)
24
+ return;
25
+ const current = parts[parts.length - 1];
26
+ setExpanded(parts.map((node) => node.pathLocator));
27
+ setHighlighted(current?.pathLocator === path ? path : '');
28
+ if (current) {
29
+ await Promise.all(parts
30
+ .filter((node) => source.hasChildren(node) !== false)
31
+ .map((node) => model.loadLevel(node.pathLocator)));
32
+ }
33
+ else {
34
+ await model.loadLevel('');
35
+ if (controller.signal.aborted)
36
+ return;
37
+ const roots = model.roots();
38
+ setExpanded(roots.map((node) => node.pathLocator));
39
+ await Promise.all(roots
40
+ .filter((node) => source.hasChildren(node) !== false)
41
+ .map((node) => model.loadLevel(node.pathLocator)));
42
+ }
43
+ }, () => {
44
+ if (!controller.signal.aborted)
45
+ setError(true);
46
+ })
47
+ .finally(() => {
48
+ if (!controller.signal.aborted)
49
+ setLoading(false);
50
+ });
51
+ return () => controller.abort();
52
+ }, [model, path, attempt]);
53
+ return {
54
+ model,
55
+ expanded,
56
+ setExpanded,
57
+ highlighted,
58
+ setHighlighted,
59
+ error,
60
+ loading,
61
+ retry: () => setAttempt((value) => value + 1),
62
+ };
63
+ };
64
+ export const useSearchTree = (source, query) => {
65
+ const [found, setFound] = useState();
66
+ const [loading, setLoading] = useState(false);
67
+ const [error, setError] = useState(false);
68
+ const [attempt, setAttempt] = useState(0);
69
+ useEffect(() => {
70
+ const controller = new AbortController();
71
+ setError(false);
72
+ if (!query) {
73
+ setFound(undefined);
74
+ setLoading(false);
75
+ return;
76
+ }
77
+ setLoading(true);
78
+ setFound(undefined);
79
+ searchTree(source, query)
80
+ .then((result) => {
81
+ if (!controller.signal.aborted)
82
+ setFound(result);
83
+ }, () => {
84
+ if (!controller.signal.aborted) {
85
+ setFound(undefined);
86
+ setError(true);
87
+ }
88
+ })
89
+ .finally(() => {
90
+ if (!controller.signal.aborted)
91
+ setLoading(false);
92
+ });
93
+ return () => controller.abort();
94
+ }, [source, query, attempt]);
95
+ return {
96
+ found,
97
+ loading,
98
+ error,
99
+ retry: () => setAttempt((value) => value + 1),
100
+ };
101
+ };
102
+ //# sourceMappingURL=useSourceTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSourceTree.js","sourceRoot":"","sources":["../../src/hooks/useSourceTree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { Row, TreeViewAccessors } from './types';
2
+ export declare const defaultGetId: (node: unknown) => string;
3
+ export declare const defaultGetLabel: (node: unknown) => string;
4
+ export declare const defaultGetChildren: (node: unknown) => readonly unknown[] | undefined;
5
+ /**
6
+ * The rows a reader sees: roots, and the children of every expanded node,
7
+ * depth first. Only expanded branches are walked, so a node with a huge
8
+ * number of children costs nothing until it is opened.
9
+ */
10
+ export declare const flatten: <T>(items: readonly T[] | null | undefined, expanded: ReadonlySet<string>, { getId, getChildren, hasChildren: canExpand, }?: TreeViewAccessors<T>) => Row<T>[];
11
+ export type KeyAction = {
12
+ type: 'focus';
13
+ index: number;
14
+ } | {
15
+ type: 'expand';
16
+ id: string;
17
+ } | {
18
+ type: 'collapse';
19
+ id: string;
20
+ };
21
+ /**
22
+ * What a navigation key does on the row at `index`, following the WAI-ARIA
23
+ * tree pattern. Returns nothing when the key has no effect there, so the
24
+ * caller can leave the event alone (and native scrolling working).
25
+ */
26
+ export declare const keyAction: <T>(rows: readonly Row<T>[], index: number, key: string) => KeyAction | undefined;
27
+ /** `expanded` with `id` added or removed. */
28
+ export declare const toggleId: (expanded: readonly string[], id: string, open?: boolean) => string[];
29
+ //# sourceMappingURL=flatten.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flatten.d.ts","sourceRoot":"","sources":["../../src/tree-view/flatten.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAItD,eAAO,MAAM,YAAY,GAAI,MAAM,OAAO,WAA8B,CAAC;AAEzE,eAAO,MAAM,eAAe,GAAI,MAAM,OAAO,WACa,CAAC;AAE3D,eAAO,MAAM,kBAAkB,GAAI,MAAM,OAAO,KACpB,SAAS,OAAO,EAAE,GAAG,SAAS,CAAC;AAE3D;;;;GAIG;AACH,eAAO,MAAM,OAAO,GAAI,CAAC,EACxB,OAAO,SAAS,CAAC,EAAE,GAAG,IAAI,GAAG,SAAS,EACtC,UAAU,WAAW,CAAC,MAAM,CAAC,EAC7B,kDAMG,iBAAiB,CAAC,CAAC,CAAM,KAC1B,GAAG,CAAC,CAAC,CAAC,EA4BR,CAAC;AAEF,MAAM,MAAM,SAAS,GAClB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpC;;;;GAIG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,EAC1B,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,EACvB,OAAO,MAAM,EACb,KAAK,MAAM,KACT,SAAS,GAAG,SAmCd,CAAC;AAEF,6CAA6C;AAC7C,eAAO,MAAM,QAAQ,GACpB,UAAU,SAAS,MAAM,EAAE,EAC3B,IAAI,MAAM,EACV,cAA6B,KAC3B,MAAM,EAIR,CAAC"}
@@ -0,0 +1,88 @@
1
+ export const defaultGetId = (node) => String(node.id);
2
+ export const defaultGetLabel = (node) => String(node.label ?? node.name ?? '');
3
+ export const defaultGetChildren = (node) => node.children;
4
+ /**
5
+ * The rows a reader sees: roots, and the children of every expanded node,
6
+ * depth first. Only expanded branches are walked, so a node with a huge
7
+ * number of children costs nothing until it is opened.
8
+ */
9
+ export const flatten = (items, expanded, { getId = defaultGetId, getChildren = defaultGetChildren, hasChildren: canExpand, } = {}) => {
10
+ const rows = [];
11
+ const visit = (nodes, level, parentId) => {
12
+ const setsize = nodes.length;
13
+ nodes.forEach((node, i) => {
14
+ const id = getId(node);
15
+ const children = getChildren(node);
16
+ const hasChildren = canExpand?.(node) ?? (children?.length ?? 0) > 0;
17
+ const isExpanded = hasChildren && expanded.has(id);
18
+ rows.push({
19
+ node,
20
+ id,
21
+ level,
22
+ posinset: i + 1,
23
+ setsize,
24
+ parentId,
25
+ hasChildren,
26
+ expanded: isExpanded,
27
+ });
28
+ if (isExpanded) {
29
+ visit(children ?? [], level + 1, id);
30
+ }
31
+ });
32
+ };
33
+ if (items?.length) {
34
+ visit(items, 1);
35
+ }
36
+ return rows;
37
+ };
38
+ /**
39
+ * What a navigation key does on the row at `index`, following the WAI-ARIA
40
+ * tree pattern. Returns nothing when the key has no effect there, so the
41
+ * caller can leave the event alone (and native scrolling working).
42
+ */
43
+ export const keyAction = (rows, index, key) => {
44
+ const row = rows[index];
45
+ if (!row) {
46
+ return rows.length > 0 ? { type: 'focus', index: 0 } : undefined;
47
+ }
48
+ switch (key) {
49
+ case 'ArrowDown':
50
+ return index < rows.length - 1
51
+ ? { type: 'focus', index: index + 1 }
52
+ : undefined;
53
+ case 'ArrowUp':
54
+ return index > 0 ? { type: 'focus', index: index - 1 } : undefined;
55
+ case 'Home':
56
+ return index > 0 ? { type: 'focus', index: 0 } : undefined;
57
+ case 'End':
58
+ return index < rows.length - 1
59
+ ? { type: 'focus', index: rows.length - 1 }
60
+ : undefined;
61
+ case 'ArrowRight':
62
+ if (!row.hasChildren)
63
+ return undefined;
64
+ if (!row.expanded)
65
+ return { type: 'expand', id: row.id };
66
+ return rows[index + 1]?.parentId === row.id
67
+ ? { type: 'focus', index: index + 1 }
68
+ : undefined;
69
+ case 'ArrowLeft': {
70
+ if (row.expanded)
71
+ return { type: 'collapse', id: row.id };
72
+ if (row.parentId == null)
73
+ return undefined;
74
+ const parent = rows.findIndex((r, i) => i < index && r.id === row.parentId);
75
+ return parent >= 0 ? { type: 'focus', index: parent } : undefined;
76
+ }
77
+ default:
78
+ return undefined;
79
+ }
80
+ };
81
+ /** `expanded` with `id` added or removed. */
82
+ export const toggleId = (expanded, id, open = !expanded.includes(id)) => {
83
+ const has = expanded.includes(id);
84
+ if (open === has)
85
+ return [...expanded];
86
+ return open ? [...expanded, id] : expanded.filter((e) => e !== id);
87
+ };
88
+ //# sourceMappingURL=flatten.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flatten.js","sourceRoot":"","sources":["../../src/tree-view/flatten.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { RangeChangedEvent } from '@lit-labs/virtualizer/events.js';
2
+ import { type VirtualizerHostElement } from '@lit-labs/virtualizer/virtualize.js';
3
+ import type { Props, Row } from './types';
4
+ interface State<T> {
5
+ rows: Row<T>[];
6
+ selected?: string;
7
+ tabStopId?: string;
8
+ scrollerRef: {
9
+ current: VirtualizerHostElement | undefined;
10
+ };
11
+ toggle: (id: string) => void;
12
+ select: (row: Row<T>) => void;
13
+ activate: (row: Row<T>) => void;
14
+ onKeyDown: (e: KeyboardEvent) => void;
15
+ treeTabIndex: number;
16
+ focusActiveItem: () => void;
17
+ onRowFocus: (row: Row<T>) => void;
18
+ onRangeChanged: (event: RangeChangedEvent) => void;
19
+ }
20
+ export declare const render: <T>({ label, renderIcon, getLabel }: Props<T>, { rows, selected, tabStopId, scrollerRef, toggle, select, activate, onKeyDown, treeTabIndex, focusActiveItem, onRowFocus, onRangeChanged, }: State<T>) => import("lit-html").TemplateResult<1>;
21
+ export {};
22
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/tree-view/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAEN,KAAK,sBAAsB,EAC3B,MAAM,qCAAqC,CAAC;AAM7C,OAAO,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAE1C,UAAU,KAAK,CAAC,CAAC;IAChB,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE;QAAE,OAAO,EAAE,sBAAsB,GAAG,SAAS,CAAA;KAAE,CAAC;IAC7D,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAC9B,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAChC,SAAS,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,UAAU,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAClC,cAAc,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACnD;AAID,eAAO,MAAM,MAAM,GAAI,CAAC,EACvB,iCAAmD,KAAK,CAAC,CAAC,CAAC,EAC3D,6IAaG,KAAK,CAAC,CAAC,CAAC,yCA+EX,CAAC"}
@@ -0,0 +1,85 @@
1
+ import { virtualize, } from '@lit-labs/virtualizer/virtualize.js';
2
+ import { chevronRightIcon } from '@neovici/cosmoz-icons/untitled';
3
+ import { html, nothing } from 'lit-html';
4
+ import { ifDefined } from 'lit-html/directives/if-defined.js';
5
+ import { ref } from 'lit-html/directives/ref.js';
6
+ import { defaultGetLabel } from './flatten';
7
+ const stop = (e) => e.stopPropagation();
8
+ export const render = ({ label, renderIcon, getLabel = defaultGetLabel }, { rows, selected, tabStopId, scrollerRef, toggle, select, activate, onKeyDown, treeTabIndex, focusActiveItem, onRowFocus, onRangeChanged, }) => {
9
+ const renderRow = (row) => {
10
+ // While the rows shrink, the virtualizer can render once from its
11
+ // previous range and hand us indexes past the end.
12
+ if (!row)
13
+ return html ``;
14
+ const isSelected = row.id === selected;
15
+ return html `<div
16
+ role="treeitem"
17
+ class="row"
18
+ part="row"
19
+ data-id=${row.id}
20
+ aria-level=${row.level}
21
+ aria-posinset=${row.posinset}
22
+ aria-setsize=${row.setsize}
23
+ aria-expanded=${row.hasChildren ? String(row.expanded) : nothing}
24
+ aria-selected=${String(isSelected)}
25
+ tabindex=${row.id === tabStopId ? 0 : -1}
26
+ @focus=${() => onRowFocus(row)}
27
+ @click=${() => select(row)}
28
+ @dblclick=${() => activate(row)}
29
+ >
30
+ ${Array.from({ length: row.level - 1 }, () => html `<span class="guide" part="guide"></span>`)}
31
+ <span class="content" part="content">
32
+ <span
33
+ class="toggle"
34
+ part="toggle"
35
+ aria-hidden="true"
36
+ @click=${row.hasChildren
37
+ ? (e) => {
38
+ stop(e);
39
+ toggle(row.id);
40
+ }
41
+ : nothing}
42
+ @dblclick=${stop}
43
+ >${row.hasChildren
44
+ ? chevronRightIcon({ width: '16', height: '16' })
45
+ : nothing}</span
46
+ >${renderIcon
47
+ ? html `<span class="icon" part="icon"
48
+ >${renderIcon(row.node, {
49
+ expanded: row.expanded,
50
+ selected: isSelected,
51
+ hasChildren: row.hasChildren,
52
+ level: row.level,
53
+ })}</span
54
+ >`
55
+ : nothing}<span class="label" part="label"
56
+ >${getLabel(row.node)}</span
57
+ >
58
+ </span>
59
+ </div>`;
60
+ };
61
+ return html `<div
62
+ role="tree"
63
+ class="tree"
64
+ part="tree"
65
+ aria-label=${ifDefined(label)}
66
+ tabindex=${treeTabIndex}
67
+ @rangeChanged=${onRangeChanged}
68
+ @focus=${(event) => {
69
+ if (event.target === event.currentTarget)
70
+ focusActiveItem();
71
+ }}
72
+ @keydown=${onKeyDown}
73
+ ${ref((el) => {
74
+ scrollerRef.current = el;
75
+ })}
76
+ >
77
+ ${virtualize({
78
+ items: rows,
79
+ renderItem: renderRow,
80
+ keyFunction: (row, index) => row?.id ?? index,
81
+ scroller: true,
82
+ })}
83
+ </div>`;
84
+ };
85
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/tree-view/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const _default: string;
2
+ export default _default;
3
+ //# sourceMappingURL=styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/tree-view/styles.ts"],"names":[],"mappings":";AAKA,wBAgIE"}