@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.
@@ -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
- export interface TreeViewProps {
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":"AAKA,MAAM,WAAW,YAAY;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC1B,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;IAC5B,iEAAiE;IACjE,MAAM,EAAE,mBAAmB,CAAC;IAC5B,2EAA2E;IAC3E,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC;QAAE,IAAI,EAAE,YAAY,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAClE,0DAA0D;IAC1D,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IAC3C,wCAAwC;IACxC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,uCAAuC;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4CAA4C;IAC5C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wEAAwE;IACxE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iDAAiD;IACjD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;8DAC0D;IAC1D,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAChC,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,2FAA2F;IAC3F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;4EACwE;IACxE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AAID;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5D,IAAI,EAAE,CAAC,EAAE,EACT,MAAM,EAAE,mBAAmB,EAC3B,UAAU,GAAE,MAAW,GACxB,YAAY,EAAE,CAwChB;AAqBD,eAAO,MAAM,QAAQ;wJAWlB,aAAa;;CAuDf,CAAC"}
1
+ {"version":3,"file":"tree-view.d.ts","sourceRoot":"","sources":["../../../src/patterns/tree-view/tree-view.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,UAAU,iBAAiB;IACvB,2EAA2E;IAC3E,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC;QAAE,IAAI,EAAE,YAAY,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAClE;oEACgE;IAChE,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IAC3C,wCAAwC;IACxC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,uCAAuC;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4CAA4C;IAC5C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wEAAwE;IACxE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iDAAiD;IACjD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;8DAC0D;IAC1D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;mGAC+F;IAC/F,kBAAkB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtC;;yDAEqD;IACrD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;gFAE4E;IAC5E,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IAChC,oGAAoG;IACpG,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC;IAClD,qGAAqG;IACrG,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;iGAC6F;IAC7F,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC;IAChD,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,aAAa,GAAG,iBAAiB,GACzC,CACM;IACI,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;IAC5B,iEAAiE;IACjE,MAAM,EAAE,mBAAmB,CAAC;IAC5B,KAAK,CAAC,EAAE,KAAK,CAAC;CACjB,GACD;IACI,iFAAiF;IACjF,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,MAAM,CAAC,EAAE,KAAK,CAAC;CAClB,CACN,CAAC;AAEN;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAChC,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,2FAA2F;IAC3F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;4EACwE;IACxE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;0EACsE;IACtE,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACrC;AAoBD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5D,IAAI,EAAE,CAAC,EAAE,EACT,MAAM,EAAE,mBAAmB,EAC3B,UAAU,GAAE,MAAW,GACxB,YAAY,EAAE,CA4ChB;AAqBD,eAAO,MAAM,QAAQ;uRAmBlB,aAAa;;CA4Ef,CAAC"}
@@ -1,168 +1,203 @@
1
- import { jsxs as A, jsx as r, Fragment as E } from "react/jsx-runtime";
2
- import { useState as $ } from "react";
3
- import { SearchSm as T, ChevronDown as K, ChevronRight as V } from "@untitledui/icons";
4
- import { cn as k } from "../../utils/cn.js";
5
- import { Input as _ } from "../../primitives/input/input.js";
6
- const N = 10;
7
- function C(e, l, s = "") {
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: m,
14
+ labelKey: i,
10
15
  childrenKey: n,
11
- dataKey: f = "metadata",
12
- typeKey: x = "type",
13
- idKey: h,
14
- maxDepth: i,
15
- defaultExpanded: g
16
- } = l, v = s ? s.split(".").length : 0;
17
- return i != null && v >= i ? [] : (Array.isArray(e) ? e : Object.values(e)).map((t, w) => {
18
- const b = h != null ? t[h] : void 0, a = String(b ?? w), d = s ? `${s}.${a}` : a, c = t[n], o = Array.isArray(c) ? c : c != null ? Object.values(c) : [];
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: d,
21
- label: t[m] ?? "Untitled",
22
- type: t[x] ?? "Untitled",
23
- isOpen: t.isOpen ?? g ?? !1,
24
- children: o.length > 0 ? C(o, l, d) : [],
25
- [f]: t
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 O(e, l) {
30
- const s = e.label ?? "", m = Array.isArray(e.children) ? e.children : [];
31
- return s.toLowerCase().includes(l.toLowerCase()) ? !0 : m.some((n) => O(n, l));
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 D = () => /* @__PURE__ */ r("div", { className: "flex h-[28px] items-center px-[13px] shrink-0", children: /* @__PURE__ */ r("div", { className: "relative h-full w-0 shrink-0", children: /* @__PURE__ */ r(
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
- ) }) }), I = ({
45
+ ) }) }), J = ({
40
46
  data: e,
41
- config: l,
42
- CustomNode: s,
43
- onNodeClick: m,
44
- selectedNodeId: n,
45
- showSearch: f = !1,
46
- searchPlaceholder: x = "Search...",
47
- searchClassName: h,
48
- searchInputClassName: i,
49
- defaultExpanded: g
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 [v, y] = $(
52
- () => C(e, {
53
- ...l,
54
- defaultExpanded: g ?? l.defaultExpanded
55
- })
56
- ), [t, w] = $("");
57
- function b(a, d) {
58
- const c = structuredClone(v), o = d.split("-"), p = Number(o[0]);
59
- o.shift();
60
- let u = c[p];
61
- o.length > 0 && (u = o.reduce((L, j) => L.children[Number(j)], c[p])), u.isOpen = !u.isOpen, y(c);
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 /* @__PURE__ */ A("div", { className: "min-w-max", children: [
64
- f && /* @__PURE__ */ r("div", { className: k("mb-2", h), children: /* @__PURE__ */ r(
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: x,
69
- value: t,
70
- onChange: (a) => w(a),
96
+ placeholder: c,
97
+ value: w,
98
+ onChange: (v) => _(v),
71
99
  size: "sm",
72
- className: i,
73
- icon: T
100
+ className: u,
101
+ icon: z
74
102
  }
75
103
  ) }),
76
- /* @__PURE__ */ r("div", { className: "flex flex-col", children: v.map((a, d) => /* @__PURE__ */ r(
77
- S,
104
+ /* @__PURE__ */ s("div", { className: "flex flex-col", children: $.map((v, O) => /* @__PURE__ */ s(
105
+ R,
78
106
  {
79
- node: a,
80
- parentId: String(d),
107
+ node: v,
108
+ parentId: String(O),
81
109
  depth: 0,
82
- handleToggle: b,
83
- onNodeClick: m,
84
- selectedNodeId: n,
85
- CustomNode: s,
86
- query: t
110
+ handleToggle: L,
111
+ onNodeClick: n,
112
+ selectedNodeId: a,
113
+ CustomNode: i,
114
+ query: w,
115
+ isLeafClickable: S
87
116
  },
88
- a.id || d
117
+ v.id || O
89
118
  )) })
90
119
  ] });
91
120
  };
92
- I.displayName = "TreeView";
93
- const S = ({
121
+ J.displayName = "TreeView";
122
+ const R = ({
94
123
  node: e,
95
- parentId: l,
96
- depth: s = 0,
97
- handleToggle: m,
124
+ parentId: t,
125
+ depth: r = 0,
126
+ handleToggle: i,
98
127
  onNodeClick: n,
99
- selectedNodeId: f,
100
- CustomNode: x,
101
- query: h
128
+ selectedNodeId: a,
129
+ CustomNode: l,
130
+ query: c,
131
+ isLeafClickable: o
102
132
  }) => {
103
- const i = h.length > 0, g = Array.isArray(e.children) ? e.children : [], v = e.label ?? "";
104
- if (i && !O(e, h))
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 y = g.length > 0, t = f != null && e.id === f, w = y && (i || (e.isOpen ?? !1)), b = (p) => {
107
- p.stopPropagation(), y && (i || m(e, l), n == null || n(e));
108
- }, a = s === 0 ? "pl-[6px]" : "", d = s === 0 ? "pl-[2px]" : "pl-[8px]", c = i && v.toLowerCase().includes(h.toLowerCase()), o = i ? !0 : e.isOpen;
109
- return /* @__PURE__ */ A("div", { className: "relative", children: [
110
- /* @__PURE__ */ A(
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 ${a} ${c ? "bg-(--color-bg-secondary)" : ""} ${y ? "cursor-pointer hover:bg-(--color-bg-secondary)" : ""}`,
114
- onClick: b,
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
- s > 0 && Array.from({ length: s }).map((p, u) => /* @__PURE__ */ r(D, {}, u)),
117
- y ? /* @__PURE__ */ r(
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} ${o ? "justify-end" : "justify-center"}`,
121
- children: o ? /* @__PURE__ */ A(E, { children: [
122
- /* @__PURE__ */ r(
123
- K,
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: N, height: N }
160
+ style: { width: T, height: T }
127
161
  }
128
162
  ),
129
- /* @__PURE__ */ r("div", { className: "relative h-[8px] w-0 shrink-0", children: /* @__PURE__ */ r(
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__ */ r(
137
- V,
170
+ ] }) : /* @__PURE__ */ s(
171
+ F,
138
172
  {
139
173
  className: "shrink-0 text-(--color-gray-400)",
140
- style: { width: N, height: N }
174
+ style: { width: T, height: T }
141
175
  }
142
176
  )
143
177
  }
144
- ) : s > 0 ? /* @__PURE__ */ r("div", { className: "h-full w-[6px] shrink-0" }) : null,
145
- /* @__PURE__ */ r("div", { className: "flex flex-1 h-full items-center min-w-0 pl-[2px]", children: /* @__PURE__ */ r(x, { node: e, isSelected: t }) })
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
- w && /* @__PURE__ */ r("div", { className: "relative", children: g.map((p, u) => /* @__PURE__ */ r(
150
- S,
183
+ S && /* @__PURE__ */ s("div", { className: "relative", children: f.map((m, w) => /* @__PURE__ */ s(
184
+ R,
151
185
  {
152
- node: p,
153
- parentId: `${l}-${u}`,
154
- depth: s + 1,
155
- handleToggle: m,
186
+ node: m,
187
+ parentId: `${t}-${w}`,
188
+ depth: r + 1,
189
+ handleToggle: i,
156
190
  onNodeClick: n,
157
- selectedNodeId: f,
158
- CustomNode: x,
159
- query: h
191
+ selectedNodeId: a,
192
+ CustomNode: l,
193
+ query: c,
194
+ isLeafClickable: o
160
195
  },
161
- p.id || `${l}-${u}`
196
+ m.id || `${t}-${w}`
162
197
  )) })
163
198
  ] });
164
199
  };
165
200
  export {
166
- I as TreeView,
167
- C as buildTreeViewNodes
201
+ J as TreeView,
202
+ E as buildTreeViewNodes
168
203
  };