@pibit.ai/cure-design-system 0.6.21 → 0.6.23
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.
- package/dist/patterns/filters/checklist-select.d.ts.map +1 -1
- package/dist/patterns/filters/checklist-select.js +32 -26
- package/dist/patterns/filters/filter-list-section.d.ts.map +1 -1
- package/dist/patterns/filters/filter-list-section.js +55 -48
- package/dist/patterns/filters/status-filter-dropdown.d.ts.map +1 -1
- package/dist/patterns/filters/status-filter-dropdown.js +66 -79
- package/dist/patterns/tree-view/indented-tree.d.ts +23 -0
- package/dist/patterns/tree-view/indented-tree.d.ts.map +1 -0
- package/dist/patterns/tree-view/indented-tree.js +232 -0
- package/dist/patterns/tree-view/tree-view.d.ts +40 -7
- package/dist/patterns/tree-view/tree-view.d.ts.map +1 -1
- package/dist/patterns/tree-view/tree-view.js +142 -107
- package/dist/styles/components.css +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { jsx as n, jsxs as b } from "react/jsx-runtime";
|
|
2
|
+
import { useRef as I, useMemo as $ } from "react";
|
|
3
|
+
import { ChevronRight as P } from "@untitledui/icons";
|
|
4
|
+
import { motion as A } from "../../node_modules/framer-motion/dist/es/render/components/motion/proxy.js";
|
|
5
|
+
import { AnimatePresence as D } from "../../node_modules/framer-motion/dist/es/components/AnimatePresence/index.js";
|
|
6
|
+
const _ = ({
|
|
7
|
+
tree: s,
|
|
8
|
+
onToggle: p,
|
|
9
|
+
CustomNode: x,
|
|
10
|
+
onNodeClick: c,
|
|
11
|
+
selectedNodeId: v,
|
|
12
|
+
keyboardNavigation: e,
|
|
13
|
+
canSelectNode: d,
|
|
14
|
+
"aria-label": m
|
|
15
|
+
}) => {
|
|
16
|
+
const f = I(null), l = $(() => {
|
|
17
|
+
const t = [];
|
|
18
|
+
function i(a, r = "", h) {
|
|
19
|
+
a.forEach((u, g) => {
|
|
20
|
+
const O = r ? `${r}-${g}` : String(g);
|
|
21
|
+
t.push({ node: u, path: O, parentId: h }), u.isOpen && i(u.children, O, u.id);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
return i(s), t;
|
|
25
|
+
}, [s]);
|
|
26
|
+
function o(t) {
|
|
27
|
+
var a;
|
|
28
|
+
const i = (a = f.current) == null ? void 0 : a.querySelector(
|
|
29
|
+
`[data-tree-node-id="${CSS.escape(t)}"]`
|
|
30
|
+
);
|
|
31
|
+
i == null || i.focus({ preventScroll: !0 }), i == null || i.scrollIntoView({ block: "nearest", behavior: "instant" });
|
|
32
|
+
}
|
|
33
|
+
function w(t) {
|
|
34
|
+
if (!e || t.nativeEvent.isComposing) return;
|
|
35
|
+
const i = t.target.closest(
|
|
36
|
+
"[data-tree-node-id]"
|
|
37
|
+
), a = l.findIndex(
|
|
38
|
+
({ node: g }) => g.id === (i == null ? void 0 : i.dataset.treeNodeId)
|
|
39
|
+
);
|
|
40
|
+
if (a < 0) return;
|
|
41
|
+
const { node: r, path: h, parentId: u } = l[a];
|
|
42
|
+
if ([
|
|
43
|
+
"ArrowDown",
|
|
44
|
+
"ArrowUp",
|
|
45
|
+
"ArrowRight",
|
|
46
|
+
"ArrowLeft",
|
|
47
|
+
"Home",
|
|
48
|
+
"End",
|
|
49
|
+
"Enter",
|
|
50
|
+
" "
|
|
51
|
+
].includes(t.key) && !((t.key === "Enter" || t.key === " ") && t.target.closest("button")))
|
|
52
|
+
switch (t.preventDefault(), t.stopPropagation(), t.key) {
|
|
53
|
+
case "ArrowDown":
|
|
54
|
+
o(l[(a + 1) % l.length].node.id);
|
|
55
|
+
break;
|
|
56
|
+
case "ArrowUp":
|
|
57
|
+
o(
|
|
58
|
+
l[(a - 1 + l.length) % l.length].node.id
|
|
59
|
+
);
|
|
60
|
+
break;
|
|
61
|
+
case "Home":
|
|
62
|
+
o(l[0].node.id);
|
|
63
|
+
break;
|
|
64
|
+
case "End":
|
|
65
|
+
o(l[l.length - 1].node.id);
|
|
66
|
+
break;
|
|
67
|
+
case "ArrowRight":
|
|
68
|
+
r.children.length && !r.isOpen ? p(h) : r.children.length && o(r.children[0].id);
|
|
69
|
+
break;
|
|
70
|
+
case "ArrowLeft":
|
|
71
|
+
r.children.length && r.isOpen ? p(h) : u && o(u);
|
|
72
|
+
break;
|
|
73
|
+
default:
|
|
74
|
+
(!d || d(r)) && (c == null || c(r));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return /* @__PURE__ */ n(
|
|
78
|
+
"div",
|
|
79
|
+
{
|
|
80
|
+
ref: f,
|
|
81
|
+
role: e ? "tree" : void 0,
|
|
82
|
+
"aria-label": e ? m : void 0,
|
|
83
|
+
onKeyDown: w,
|
|
84
|
+
children: /* @__PURE__ */ n("div", { className: "flex flex-col gap-2", children: s.map((t, i) => /* @__PURE__ */ n(
|
|
85
|
+
E,
|
|
86
|
+
{
|
|
87
|
+
node: t,
|
|
88
|
+
path: String(i),
|
|
89
|
+
onToggle: p,
|
|
90
|
+
onNodeClick: c,
|
|
91
|
+
CustomNode: x,
|
|
92
|
+
keyboardNavigation: e,
|
|
93
|
+
selectedNodeId: v,
|
|
94
|
+
canSelectNode: d,
|
|
95
|
+
level: 1,
|
|
96
|
+
position: i + 1,
|
|
97
|
+
siblingCount: s.length
|
|
98
|
+
},
|
|
99
|
+
t.id || i
|
|
100
|
+
)) })
|
|
101
|
+
}
|
|
102
|
+
);
|
|
103
|
+
}, E = ({
|
|
104
|
+
node: s,
|
|
105
|
+
path: p,
|
|
106
|
+
onToggle: x,
|
|
107
|
+
onNodeClick: c,
|
|
108
|
+
CustomNode: v,
|
|
109
|
+
keyboardNavigation: e,
|
|
110
|
+
selectedNodeId: d,
|
|
111
|
+
canSelectNode: m,
|
|
112
|
+
level: f,
|
|
113
|
+
position: l,
|
|
114
|
+
siblingCount: o
|
|
115
|
+
}) => {
|
|
116
|
+
const w = s.children.length > 0, t = d != null && s.id === d, i = (r) => {
|
|
117
|
+
r.stopPropagation(), x(p);
|
|
118
|
+
}, a = (r) => {
|
|
119
|
+
r.stopPropagation(), c == null || c(s);
|
|
120
|
+
};
|
|
121
|
+
return /* @__PURE__ */ b("div", { className: "relative", children: [
|
|
122
|
+
/* @__PURE__ */ b(
|
|
123
|
+
"div",
|
|
124
|
+
{
|
|
125
|
+
className: `flex items-center gap-2 py-0.5 ${e ? "rounded-md outline-none hover:bg-primary_hover focus:bg-primary_hover" : ""}`,
|
|
126
|
+
"data-tree-node-id": s.id,
|
|
127
|
+
role: e ? "treeitem" : void 0,
|
|
128
|
+
tabIndex: e ? f === 1 && l === 1 ? 0 : -1 : void 0,
|
|
129
|
+
"aria-label": e ? s.label : void 0,
|
|
130
|
+
"aria-level": e ? f : void 0,
|
|
131
|
+
"aria-posinset": e ? l : void 0,
|
|
132
|
+
"aria-setsize": e ? o : void 0,
|
|
133
|
+
"aria-expanded": e && w ? !!s.isOpen : void 0,
|
|
134
|
+
"aria-selected": e && (!m || m(s)) ? t : void 0,
|
|
135
|
+
children: [
|
|
136
|
+
/* @__PURE__ */ n(
|
|
137
|
+
"div",
|
|
138
|
+
{
|
|
139
|
+
className: "w-4 h-4 flex-shrink-0",
|
|
140
|
+
onClick: (r) => r.stopPropagation(),
|
|
141
|
+
children: w && /* @__PURE__ */ n(
|
|
142
|
+
"button",
|
|
143
|
+
{
|
|
144
|
+
type: "button",
|
|
145
|
+
tabIndex: e ? -1 : void 0,
|
|
146
|
+
onClick: i,
|
|
147
|
+
className: "cursor-pointer hover:bg-secondary_subtle rounded p-0.5 transition-colors flex items-center justify-center",
|
|
148
|
+
"aria-label": s.isOpen ? "Collapse" : "Expand",
|
|
149
|
+
children: /* @__PURE__ */ n(
|
|
150
|
+
A.div,
|
|
151
|
+
{
|
|
152
|
+
initial: !1,
|
|
153
|
+
animate: { rotate: s.isOpen ? 90 : 0 },
|
|
154
|
+
transition: { duration: 0.2, ease: "easeOut" },
|
|
155
|
+
children: /* @__PURE__ */ n(P, { className: "w-4 h-4 text-[var(--color-gray-400)]" })
|
|
156
|
+
}
|
|
157
|
+
)
|
|
158
|
+
}
|
|
159
|
+
)
|
|
160
|
+
}
|
|
161
|
+
),
|
|
162
|
+
/* @__PURE__ */ n(
|
|
163
|
+
"div",
|
|
164
|
+
{
|
|
165
|
+
onClick: a,
|
|
166
|
+
className: "flex-1 min-w-0 cursor-pointer",
|
|
167
|
+
children: /* @__PURE__ */ n(v, { node: s, isSelected: t })
|
|
168
|
+
}
|
|
169
|
+
)
|
|
170
|
+
]
|
|
171
|
+
}
|
|
172
|
+
),
|
|
173
|
+
/* @__PURE__ */ n(D, { initial: !1, children: w && s.isOpen && /* @__PURE__ */ n(
|
|
174
|
+
A.div,
|
|
175
|
+
{
|
|
176
|
+
initial: e ? !1 : { opacity: 0, height: 0 },
|
|
177
|
+
animate: {
|
|
178
|
+
opacity: 1,
|
|
179
|
+
height: "auto",
|
|
180
|
+
transition: {
|
|
181
|
+
height: {
|
|
182
|
+
duration: e ? 0 : 0.1,
|
|
183
|
+
ease: "easeOut"
|
|
184
|
+
},
|
|
185
|
+
opacity: {
|
|
186
|
+
duration: e ? 0 : 0.1,
|
|
187
|
+
ease: "easeOut"
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
exit: {
|
|
192
|
+
opacity: 0,
|
|
193
|
+
height: 0,
|
|
194
|
+
transition: {
|
|
195
|
+
height: {
|
|
196
|
+
duration: e ? 0 : 0.3,
|
|
197
|
+
ease: "easeIn"
|
|
198
|
+
},
|
|
199
|
+
opacity: {
|
|
200
|
+
duration: e ? 0 : 0.2,
|
|
201
|
+
ease: "easeIn"
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
},
|
|
205
|
+
style: { overflow: "clip" },
|
|
206
|
+
children: /* @__PURE__ */ b("div", { className: "ml-6 relative", children: [
|
|
207
|
+
/* @__PURE__ */ n("div", { className: "absolute left-[-17px] top-[-6px] bottom-0 w-px bg-[var(--color-gray-200)]" }),
|
|
208
|
+
/* @__PURE__ */ n("div", { className: "flex flex-col gap-2", children: s.children.map((r, h) => /* @__PURE__ */ n(
|
|
209
|
+
E,
|
|
210
|
+
{
|
|
211
|
+
node: r,
|
|
212
|
+
path: `${p}-${h}`,
|
|
213
|
+
onToggle: x,
|
|
214
|
+
onNodeClick: c,
|
|
215
|
+
CustomNode: v,
|
|
216
|
+
keyboardNavigation: e,
|
|
217
|
+
selectedNodeId: d,
|
|
218
|
+
canSelectNode: m,
|
|
219
|
+
level: f + 1,
|
|
220
|
+
position: h + 1,
|
|
221
|
+
siblingCount: s.children.length
|
|
222
|
+
},
|
|
223
|
+
r.id || `${p}-${h}`
|
|
224
|
+
)) })
|
|
225
|
+
] })
|
|
226
|
+
}
|
|
227
|
+
) })
|
|
228
|
+
] });
|
|
229
|
+
};
|
|
230
|
+
export {
|
|
231
|
+
_ as IndentedTree
|
|
232
|
+
};
|
|
@@ -7,17 +7,14 @@ export interface TreeViewNode {
|
|
|
7
7
|
isOpen?: boolean;
|
|
8
8
|
[key: string]: any;
|
|
9
9
|
}
|
|
10
|
-
|
|
11
|
-
/** Raw data array. The component converts it internally using `config`. */
|
|
12
|
-
data: Record<string, any>[];
|
|
13
|
-
/** Config that tells the component how to read your raw data. */
|
|
14
|
-
config: TreeViewBuildConfig;
|
|
10
|
+
interface TreeViewBaseProps {
|
|
15
11
|
/** Component to render the content area of each row (icon, label, etc.) */
|
|
16
12
|
CustomNode: React.FC<{
|
|
17
13
|
node: TreeViewNode;
|
|
18
14
|
isSelected: boolean;
|
|
19
15
|
}>;
|
|
20
|
-
/** Called when a parent row (with children) is clicked
|
|
16
|
+
/** Called when a parent row (with children) is clicked, or a leaf that `isLeafClickable` allows.
|
|
17
|
+
* In the `indented` variant it fires for any row's content. */
|
|
21
18
|
onNodeClick?: (node: TreeViewNode) => void;
|
|
22
19
|
/** ID of the currently selected node */
|
|
23
20
|
selectedNodeId?: string | null;
|
|
@@ -32,7 +29,39 @@ export interface TreeViewProps {
|
|
|
32
29
|
/** When true, every node starts expanded. Per-node `isOpen` on the
|
|
33
30
|
* source data, if present, still wins. Default false. */
|
|
34
31
|
defaultExpanded?: boolean;
|
|
32
|
+
/** Built node ids (paths such as `"doc.field"`) that start expanded; every other node starts
|
|
33
|
+
* collapsed. Wins over `defaultExpanded`; per-node `isOpen` on the source data still wins. */
|
|
34
|
+
defaultExpandedIds?: Iterable<string>;
|
|
35
|
+
/** Rebuild the tree when `data`, `config`, `nodes` or `defaultExpandedIds` change, which
|
|
36
|
+
* resets expansion to those inputs. Off by default: the tree is built once on mount.
|
|
37
|
+
* Pass stable (memoised) inputs when this is on. */
|
|
38
|
+
syncWithData?: boolean;
|
|
39
|
+
/** `nested` (default): 28px rows with a guide line per ancestor; a parent row click toggles it.
|
|
40
|
+
* `indented`: spaced rows, 24px indent and animated chevrons; the chevron toggles and a row's
|
|
41
|
+
* content selects. Search (`showSearch`) is only available in `nested`. */
|
|
42
|
+
variant?: "nested" | "indented";
|
|
43
|
+
/** `nested` variant: leaf rows for which this returns true are clickable and fire `onNodeClick`. */
|
|
44
|
+
isLeafClickable?: (node: TreeViewNode) => boolean;
|
|
45
|
+
/** `indented` variant: arrow/Home/End navigation, Enter/Space to select, and tree/treeitem roles. */
|
|
46
|
+
keyboardNavigation?: boolean;
|
|
47
|
+
/** `indented` variant: rows for which this returns false are not selected by Enter/Space and get
|
|
48
|
+
* no `aria-selected`. Mouse clicks still reach `onNodeClick`, so check it there as well. */
|
|
49
|
+
canSelectNode?: (node: TreeViewNode) => boolean;
|
|
50
|
+
/** Accessible name of the tree; used with `keyboardNavigation`. */
|
|
51
|
+
"aria-label"?: string;
|
|
35
52
|
}
|
|
53
|
+
export type TreeViewProps = TreeViewBaseProps & ({
|
|
54
|
+
/** Raw data array. The component converts it internally using `config`. */
|
|
55
|
+
data: Record<string, any>[];
|
|
56
|
+
/** Config that tells the component how to read your raw data. */
|
|
57
|
+
config: TreeViewBuildConfig;
|
|
58
|
+
nodes?: never;
|
|
59
|
+
} | {
|
|
60
|
+
/** Already-built nodes, used as they are (ids, `isOpen` and extra keys kept). */
|
|
61
|
+
nodes: TreeViewNode[];
|
|
62
|
+
data?: never;
|
|
63
|
+
config?: never;
|
|
64
|
+
});
|
|
36
65
|
/**
|
|
37
66
|
* Config for building TreeViewNode[] from arbitrary data.
|
|
38
67
|
* Tells the build function which keys to use for label, children, and where to store the original node data.
|
|
@@ -53,6 +82,9 @@ export interface TreeViewBuildConfig {
|
|
|
53
82
|
/** When true, every built node starts with `isOpen: true`. Per-node
|
|
54
83
|
* `isOpen` on source data overrides this (source data always wins). */
|
|
55
84
|
defaultExpanded?: boolean;
|
|
85
|
+
/** Built node ids that start expanded; every other node starts collapsed. Wins over
|
|
86
|
+
* `defaultExpanded`; per-node `isOpen` on source data still wins. */
|
|
87
|
+
expandedIds?: ReadonlySet<string>;
|
|
56
88
|
}
|
|
57
89
|
/**
|
|
58
90
|
* Converts any array of items into TreeViewNode[] using the given config.
|
|
@@ -61,7 +93,8 @@ export interface TreeViewBuildConfig {
|
|
|
61
93
|
*/
|
|
62
94
|
export declare function buildTreeViewNodes<T extends Record<string, any>>(data: T[], config: TreeViewBuildConfig, parentPath?: string): TreeViewNode[];
|
|
63
95
|
export declare const TreeView: {
|
|
64
|
-
({ data, config, CustomNode, onNodeClick, selectedNodeId, showSearch, searchPlaceholder, searchClassName, searchInputClassName, defaultExpanded, }: TreeViewProps): import("react/jsx-runtime").JSX.Element;
|
|
96
|
+
({ data, config, nodes, CustomNode, onNodeClick, selectedNodeId, showSearch, searchPlaceholder, searchClassName, searchInputClassName, defaultExpanded, defaultExpandedIds, syncWithData, variant, isLeafClickable, keyboardNavigation, canSelectNode, "aria-label": ariaLabel, }: TreeViewProps): import("react/jsx-runtime").JSX.Element;
|
|
65
97
|
displayName: string;
|
|
66
98
|
};
|
|
99
|
+
export {};
|
|
67
100
|
//# sourceMappingURL=tree-view.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-view.d.ts","sourceRoot":"","sources":["../../../src/patterns/tree-view/tree-view.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tree-view.d.ts","sourceRoot":"","sources":["../../../src/patterns/tree-view/tree-view.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,168 +1,203 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { useState as
|
|
3
|
-
import { SearchSm as
|
|
4
|
-
import { cn as
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import { jsx as s, jsxs as N, Fragment as D } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo as P, useState as V, useRef as Q, useEffect as U } from "react";
|
|
3
|
+
import { SearchSm as z, ChevronDown as B, ChevronRight as F } from "@untitledui/icons";
|
|
4
|
+
import { cn as H } from "../../utils/cn.js";
|
|
5
|
+
import { IndentedTree as X } from "./indented-tree.js";
|
|
6
|
+
import { Input as Z } from "../../primitives/input/input.js";
|
|
7
|
+
const T = 10;
|
|
8
|
+
function K(e, t) {
|
|
9
|
+
const r = (i, [n, ...a]) => i.map((l, c) => c !== n ? l : a.length ? { ...l, children: r(l.children, a) } : { ...l, isOpen: !l.isOpen });
|
|
10
|
+
return r(e, t.split("-").map(Number));
|
|
11
|
+
}
|
|
12
|
+
function E(e, t, r = "") {
|
|
8
13
|
const {
|
|
9
|
-
labelKey:
|
|
14
|
+
labelKey: i,
|
|
10
15
|
childrenKey: n,
|
|
11
|
-
dataKey:
|
|
12
|
-
typeKey:
|
|
13
|
-
idKey:
|
|
14
|
-
maxDepth:
|
|
15
|
-
defaultExpanded:
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
dataKey: a = "metadata",
|
|
17
|
+
typeKey: l = "type",
|
|
18
|
+
idKey: c,
|
|
19
|
+
maxDepth: o,
|
|
20
|
+
defaultExpanded: u,
|
|
21
|
+
expandedIds: f
|
|
22
|
+
} = t, y = r ? r.split(".").length : 0;
|
|
23
|
+
return o != null && y >= o ? [] : (Array.isArray(e) ? e : Object.values(e)).map((h, S) => {
|
|
24
|
+
const b = c != null ? h[c] : void 0, A = String(b ?? S), x = r ? `${r}.${A}` : A, d = h[n], g = Array.isArray(d) ? d : d != null ? Object.values(d) : [];
|
|
19
25
|
return {
|
|
20
|
-
id:
|
|
21
|
-
label:
|
|
22
|
-
type:
|
|
23
|
-
isOpen:
|
|
24
|
-
children:
|
|
25
|
-
[
|
|
26
|
+
id: x,
|
|
27
|
+
label: h[i] ?? "Untitled",
|
|
28
|
+
type: h[l] ?? "Untitled",
|
|
29
|
+
isOpen: h.isOpen ?? (f ? f.has(x) : u) ?? !1,
|
|
30
|
+
children: g.length > 0 ? E(g, t, x) : [],
|
|
31
|
+
[a]: h
|
|
26
32
|
};
|
|
27
33
|
});
|
|
28
34
|
}
|
|
29
|
-
function
|
|
30
|
-
const
|
|
31
|
-
return
|
|
35
|
+
function I(e, t) {
|
|
36
|
+
const r = e.label ?? "", i = Array.isArray(e.children) ? e.children : [];
|
|
37
|
+
return r.toLowerCase().includes(t.toLowerCase()) ? !0 : i.some((n) => I(n, t));
|
|
32
38
|
}
|
|
33
|
-
const
|
|
39
|
+
const G = () => /* @__PURE__ */ s("div", { className: "flex h-[28px] items-center px-[13px] shrink-0", children: /* @__PURE__ */ s("div", { className: "relative h-full w-0 shrink-0", children: /* @__PURE__ */ s(
|
|
34
40
|
"div",
|
|
35
41
|
{
|
|
36
42
|
className: "absolute inset-y-0 bg-(--color-border-secondary)",
|
|
37
43
|
style: { left: "-0.5px", width: 1 }
|
|
38
44
|
}
|
|
39
|
-
) }) }),
|
|
45
|
+
) }) }), J = ({
|
|
40
46
|
data: e,
|
|
41
|
-
config:
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
config: t,
|
|
48
|
+
nodes: r,
|
|
49
|
+
CustomNode: i,
|
|
50
|
+
onNodeClick: n,
|
|
51
|
+
selectedNodeId: a,
|
|
52
|
+
showSearch: l = !1,
|
|
53
|
+
searchPlaceholder: c = "Search...",
|
|
54
|
+
searchClassName: o,
|
|
55
|
+
searchInputClassName: u,
|
|
56
|
+
defaultExpanded: f,
|
|
57
|
+
defaultExpandedIds: y,
|
|
58
|
+
syncWithData: p = !1,
|
|
59
|
+
variant: h = "nested",
|
|
60
|
+
isLeafClickable: S,
|
|
61
|
+
keyboardNavigation: b = !1,
|
|
62
|
+
canSelectNode: A,
|
|
63
|
+
"aria-label": x
|
|
50
64
|
}) => {
|
|
51
|
-
const
|
|
52
|
-
() =>
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
65
|
+
const d = P(
|
|
66
|
+
() => y == null ? void 0 : new Set(y),
|
|
67
|
+
[y]
|
|
68
|
+
), g = () => r ?? E(e, {
|
|
69
|
+
...t,
|
|
70
|
+
defaultExpanded: f ?? t.defaultExpanded,
|
|
71
|
+
expandedIds: d ?? t.expandedIds
|
|
72
|
+
}), [$, m] = V(g), [w, _] = V(""), j = Q(!1);
|
|
73
|
+
U(() => {
|
|
74
|
+
p && (j.current && m(g()), j.current = !0);
|
|
75
|
+
}, [p, e, t, r, d, f]);
|
|
76
|
+
function L(v, O) {
|
|
77
|
+
m((M) => K(M, O));
|
|
62
78
|
}
|
|
63
|
-
return
|
|
64
|
-
|
|
65
|
-
|
|
79
|
+
return h === "indented" ? /* @__PURE__ */ s(
|
|
80
|
+
X,
|
|
81
|
+
{
|
|
82
|
+
tree: $,
|
|
83
|
+
onToggle: (v) => m((O) => K(O, v)),
|
|
84
|
+
CustomNode: i,
|
|
85
|
+
onNodeClick: n,
|
|
86
|
+
selectedNodeId: a,
|
|
87
|
+
keyboardNavigation: b,
|
|
88
|
+
canSelectNode: A,
|
|
89
|
+
"aria-label": x
|
|
90
|
+
}
|
|
91
|
+
) : /* @__PURE__ */ N("div", { className: "min-w-max", children: [
|
|
92
|
+
l && /* @__PURE__ */ s("div", { className: H("mb-2", o), children: /* @__PURE__ */ s(
|
|
93
|
+
Z,
|
|
66
94
|
{
|
|
67
95
|
type: "search",
|
|
68
|
-
placeholder:
|
|
69
|
-
value:
|
|
70
|
-
onChange: (
|
|
96
|
+
placeholder: c,
|
|
97
|
+
value: w,
|
|
98
|
+
onChange: (v) => _(v),
|
|
71
99
|
size: "sm",
|
|
72
|
-
className:
|
|
73
|
-
icon:
|
|
100
|
+
className: u,
|
|
101
|
+
icon: z
|
|
74
102
|
}
|
|
75
103
|
) }),
|
|
76
|
-
/* @__PURE__ */
|
|
77
|
-
|
|
104
|
+
/* @__PURE__ */ s("div", { className: "flex flex-col", children: $.map((v, O) => /* @__PURE__ */ s(
|
|
105
|
+
R,
|
|
78
106
|
{
|
|
79
|
-
node:
|
|
80
|
-
parentId: String(
|
|
107
|
+
node: v,
|
|
108
|
+
parentId: String(O),
|
|
81
109
|
depth: 0,
|
|
82
|
-
handleToggle:
|
|
83
|
-
onNodeClick:
|
|
84
|
-
selectedNodeId:
|
|
85
|
-
CustomNode:
|
|
86
|
-
query:
|
|
110
|
+
handleToggle: L,
|
|
111
|
+
onNodeClick: n,
|
|
112
|
+
selectedNodeId: a,
|
|
113
|
+
CustomNode: i,
|
|
114
|
+
query: w,
|
|
115
|
+
isLeafClickable: S
|
|
87
116
|
},
|
|
88
|
-
|
|
117
|
+
v.id || O
|
|
89
118
|
)) })
|
|
90
119
|
] });
|
|
91
120
|
};
|
|
92
|
-
|
|
93
|
-
const
|
|
121
|
+
J.displayName = "TreeView";
|
|
122
|
+
const R = ({
|
|
94
123
|
node: e,
|
|
95
|
-
parentId:
|
|
96
|
-
depth:
|
|
97
|
-
handleToggle:
|
|
124
|
+
parentId: t,
|
|
125
|
+
depth: r = 0,
|
|
126
|
+
handleToggle: i,
|
|
98
127
|
onNodeClick: n,
|
|
99
|
-
selectedNodeId:
|
|
100
|
-
CustomNode:
|
|
101
|
-
query:
|
|
128
|
+
selectedNodeId: a,
|
|
129
|
+
CustomNode: l,
|
|
130
|
+
query: c,
|
|
131
|
+
isLeafClickable: o
|
|
102
132
|
}) => {
|
|
103
|
-
const
|
|
104
|
-
if (
|
|
133
|
+
const u = c.length > 0, f = Array.isArray(e.children) ? e.children : [], y = e.label ?? "";
|
|
134
|
+
if (u && !I(e, c))
|
|
105
135
|
return null;
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
136
|
+
const p = f.length > 0, h = a != null && e.id === a, S = p && (u || (e.isOpen ?? !1)), b = !p && !!(o != null && o(e)), A = (m) => {
|
|
137
|
+
if (m.stopPropagation(), b) {
|
|
138
|
+
n == null || n(e);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
p && (u || i(e, t), n == null || n(e));
|
|
142
|
+
}, x = r === 0 ? "pl-[6px]" : "", d = r === 0 ? "pl-[2px]" : "pl-[8px]", g = u && y.toLowerCase().includes(c.toLowerCase()), $ = u ? !0 : e.isOpen;
|
|
143
|
+
return /* @__PURE__ */ N("div", { className: "relative", children: [
|
|
144
|
+
/* @__PURE__ */ N(
|
|
111
145
|
"div",
|
|
112
146
|
{
|
|
113
|
-
className: `flex h-[28px] w-full items-center pr-[8px] rounded-sm ${
|
|
114
|
-
onClick:
|
|
147
|
+
className: `flex h-[28px] w-full items-center pr-[8px] rounded-sm ${x} ${g ? "bg-(--color-bg-secondary)" : ""} ${p ? "cursor-pointer hover:bg-(--color-bg-secondary)" : ""} ${b ? "cursor-pointer" : ""}`,
|
|
148
|
+
onClick: A,
|
|
115
149
|
children: [
|
|
116
|
-
|
|
117
|
-
|
|
150
|
+
r > 0 && Array.from({ length: r }).map((m, w) => /* @__PURE__ */ s(G, {}, w)),
|
|
151
|
+
p ? /* @__PURE__ */ s(
|
|
118
152
|
"div",
|
|
119
153
|
{
|
|
120
|
-
className: `flex flex-col h-full items-center shrink-0 ${d} ${
|
|
121
|
-
children:
|
|
122
|
-
/* @__PURE__ */
|
|
123
|
-
|
|
154
|
+
className: `flex flex-col h-full items-center shrink-0 ${d} ${$ ? "justify-end" : "justify-center"}`,
|
|
155
|
+
children: $ ? /* @__PURE__ */ N(D, { children: [
|
|
156
|
+
/* @__PURE__ */ s(
|
|
157
|
+
B,
|
|
124
158
|
{
|
|
125
159
|
className: "shrink-0 text-(--color-gray-400)",
|
|
126
|
-
style: { width:
|
|
160
|
+
style: { width: T, height: T }
|
|
127
161
|
}
|
|
128
162
|
),
|
|
129
|
-
/* @__PURE__ */
|
|
163
|
+
/* @__PURE__ */ s("div", { className: "relative h-[8px] w-0 shrink-0", children: /* @__PURE__ */ s(
|
|
130
164
|
"div",
|
|
131
165
|
{
|
|
132
166
|
className: "absolute inset-y-0 bg-(--color-border-secondary)",
|
|
133
167
|
style: { left: "-0.5px", width: 1 }
|
|
134
168
|
}
|
|
135
169
|
) })
|
|
136
|
-
] }) : /* @__PURE__ */
|
|
137
|
-
|
|
170
|
+
] }) : /* @__PURE__ */ s(
|
|
171
|
+
F,
|
|
138
172
|
{
|
|
139
173
|
className: "shrink-0 text-(--color-gray-400)",
|
|
140
|
-
style: { width:
|
|
174
|
+
style: { width: T, height: T }
|
|
141
175
|
}
|
|
142
176
|
)
|
|
143
177
|
}
|
|
144
|
-
) :
|
|
145
|
-
/* @__PURE__ */
|
|
178
|
+
) : r > 0 ? /* @__PURE__ */ s("div", { className: "h-full w-[6px] shrink-0" }) : null,
|
|
179
|
+
/* @__PURE__ */ s("div", { className: "flex flex-1 h-full items-center min-w-0 pl-[2px]", children: /* @__PURE__ */ s(l, { node: e, isSelected: h }) })
|
|
146
180
|
]
|
|
147
181
|
}
|
|
148
182
|
),
|
|
149
|
-
|
|
150
|
-
|
|
183
|
+
S && /* @__PURE__ */ s("div", { className: "relative", children: f.map((m, w) => /* @__PURE__ */ s(
|
|
184
|
+
R,
|
|
151
185
|
{
|
|
152
|
-
node:
|
|
153
|
-
parentId: `${
|
|
154
|
-
depth:
|
|
155
|
-
handleToggle:
|
|
186
|
+
node: m,
|
|
187
|
+
parentId: `${t}-${w}`,
|
|
188
|
+
depth: r + 1,
|
|
189
|
+
handleToggle: i,
|
|
156
190
|
onNodeClick: n,
|
|
157
|
-
selectedNodeId:
|
|
158
|
-
CustomNode:
|
|
159
|
-
query:
|
|
191
|
+
selectedNodeId: a,
|
|
192
|
+
CustomNode: l,
|
|
193
|
+
query: c,
|
|
194
|
+
isLeafClickable: o
|
|
160
195
|
},
|
|
161
|
-
|
|
196
|
+
m.id || `${t}-${w}`
|
|
162
197
|
)) })
|
|
163
198
|
] });
|
|
164
199
|
};
|
|
165
200
|
export {
|
|
166
|
-
|
|
167
|
-
|
|
201
|
+
J as TreeView,
|
|
202
|
+
E as buildTreeViewNodes
|
|
168
203
|
};
|