@brycks/core-front 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/data/List/List.cjs +1 -1
- package/dist/components/data/List/List.cjs.map +1 -1
- package/dist/components/data/List/List.js +92 -88
- package/dist/components/data/List/List.js.map +1 -1
- package/dist/components/data/Table/Table.cjs +1 -1
- package/dist/components/data/Table/Table.cjs.map +1 -1
- package/dist/components/data/Table/Table.js +129 -125
- package/dist/components/data/Table/Table.js.map +1 -1
- package/dist/components/data/TreeView/TreeView.cjs +2 -0
- package/dist/components/data/TreeView/TreeView.cjs.map +1 -0
- package/dist/components/data/TreeView/TreeView.js +256 -0
- package/dist/components/data/TreeView/TreeView.js.map +1 -0
- package/dist/components/data/VirtualList/VirtualList.cjs +2 -0
- package/dist/components/data/VirtualList/VirtualList.cjs.map +1 -0
- package/dist/components/data/VirtualList/VirtualList.js +186 -0
- package/dist/components/data/VirtualList/VirtualList.js.map +1 -0
- package/dist/components/data.cjs +1 -1
- package/dist/components/data.js +21 -16
- package/dist/components/data.js.map +1 -1
- package/dist/components/feedback/Modal/Modal.cjs +1 -1
- package/dist/components/feedback/Modal/Modal.cjs.map +1 -1
- package/dist/components/feedback/Modal/Modal.js +81 -77
- package/dist/components/feedback/Modal/Modal.js.map +1 -1
- package/dist/components/form/Combobox/Combobox.cjs +7 -0
- package/dist/components/form/Combobox/Combobox.cjs.map +1 -0
- package/dist/components/form/Combobox/Combobox.js +338 -0
- package/dist/components/form/Combobox/Combobox.js.map +1 -0
- package/dist/components/form/DateRangePicker/DateRangePicker.cjs +2 -0
- package/dist/components/form/DateRangePicker/DateRangePicker.cjs.map +1 -0
- package/dist/components/form/DateRangePicker/DateRangePicker.js +372 -0
- package/dist/components/form/DateRangePicker/DateRangePicker.js.map +1 -0
- package/dist/components/form/MultiSelect/MultiSelect.cjs +2 -0
- package/dist/components/form/MultiSelect/MultiSelect.cjs.map +1 -0
- package/dist/components/form/MultiSelect/MultiSelect.js +393 -0
- package/dist/components/form/MultiSelect/MultiSelect.js.map +1 -0
- package/dist/components/form/Rating/Rating.cjs +2 -0
- package/dist/components/form/Rating/Rating.cjs.map +1 -0
- package/dist/components/form/Rating/Rating.js +163 -0
- package/dist/components/form/Rating/Rating.js.map +1 -0
- package/dist/components/form/Slider/Slider.cjs +1 -1
- package/dist/components/form/Slider/Slider.cjs.map +1 -1
- package/dist/components/form/Slider/Slider.js +120 -85
- package/dist/components/form/Slider/Slider.js.map +1 -1
- package/dist/components/form/TagInput/TagInput.cjs +2 -0
- package/dist/components/form/TagInput/TagInput.cjs.map +1 -0
- package/dist/components/form/TagInput/TagInput.js +286 -0
- package/dist/components/form/TagInput/TagInput.js.map +1 -0
- package/dist/components/form/TimePicker/TimePicker.cjs +2 -0
- package/dist/components/form/TimePicker/TimePicker.cjs.map +1 -0
- package/dist/components/form/TimePicker/TimePicker.js +328 -0
- package/dist/components/form/TimePicker/TimePicker.js.map +1 -0
- package/dist/components/form.cjs +1 -1
- package/dist/components/form.js +34 -22
- package/dist/components/form.js.map +1 -1
- package/dist/components/layout/Card/Card.cjs +1 -1
- package/dist/components/layout/Card/Card.cjs.map +1 -1
- package/dist/components/layout/Card/Card.js +62 -59
- package/dist/components/layout/Card/Card.js.map +1 -1
- package/dist/components/layout/Collapse/Collapse.cjs +2 -0
- package/dist/components/layout/Collapse/Collapse.cjs.map +1 -0
- package/dist/components/layout/Collapse/Collapse.js +140 -0
- package/dist/components/layout/Collapse/Collapse.js.map +1 -0
- package/dist/components/layout.cjs +1 -1
- package/dist/components/layout.js +27 -24
- package/dist/components/layout.js.map +1 -1
- package/dist/components/navigation/Breadcrumb/Breadcrumb.cjs +1 -1
- package/dist/components/navigation/Breadcrumb/Breadcrumb.cjs.map +1 -1
- package/dist/components/navigation/Breadcrumb/Breadcrumb.js +66 -62
- package/dist/components/navigation/Breadcrumb/Breadcrumb.js.map +1 -1
- package/dist/components/navigation/ContextMenu/ContextMenu.cjs +2 -0
- package/dist/components/navigation/ContextMenu/ContextMenu.cjs.map +1 -0
- package/dist/components/navigation/ContextMenu/ContextMenu.js +227 -0
- package/dist/components/navigation/ContextMenu/ContextMenu.js.map +1 -0
- package/dist/components/navigation/Dropdown/Dropdown.cjs +2 -2
- package/dist/components/navigation/Dropdown/Dropdown.cjs.map +1 -1
- package/dist/components/navigation/Dropdown/Dropdown.js +84 -80
- package/dist/components/navigation/Dropdown/Dropdown.js.map +1 -1
- package/dist/components/navigation/Menu/Menu.cjs +1 -1
- package/dist/components/navigation/Menu/Menu.cjs.map +1 -1
- package/dist/components/navigation/Menu/Menu.js +132 -94
- package/dist/components/navigation/Menu/Menu.js.map +1 -1
- package/dist/components/navigation/Pagination/Pagination.cjs +1 -1
- package/dist/components/navigation/Pagination/Pagination.cjs.map +1 -1
- package/dist/components/navigation/Pagination/Pagination.js +111 -107
- package/dist/components/navigation/Pagination/Pagination.js.map +1 -1
- package/dist/components/navigation/Stepper/Stepper.cjs +2 -0
- package/dist/components/navigation/Stepper/Stepper.cjs.map +1 -0
- package/dist/components/navigation/Stepper/Stepper.js +187 -0
- package/dist/components/navigation/Stepper/Stepper.js.map +1 -0
- package/dist/components/navigation.cjs +1 -1
- package/dist/components/navigation.js +27 -21
- package/dist/components/navigation.js.map +1 -1
- package/dist/components/utility/Badge/Badge.cjs +1 -1
- package/dist/components/utility/Badge/Badge.cjs.map +1 -1
- package/dist/components/utility/Badge/Badge.js +38 -35
- package/dist/components/utility/Badge/Badge.js.map +1 -1
- package/dist/data.d.ts +116 -0
- package/dist/form.d.ts +316 -0
- package/dist/hooks/useInteractionState.cjs +2 -0
- package/dist/hooks/useInteractionState.cjs.map +1 -0
- package/dist/hooks/useInteractionState.js +67 -0
- package/dist/hooks/useInteractionState.js.map +1 -0
- package/dist/hooks.cjs +1 -1
- package/dist/hooks.d.ts +87 -0
- package/dist/hooks.js +16 -14
- package/dist/hooks.js.map +1 -1
- package/dist/layout.d.ts +44 -0
- package/dist/navigation.d.ts +88 -0
- package/package.json +1 -1
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { jsx as o, jsxs as V } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as q, useState as O, useMemo as F, useCallback as w } from "react";
|
|
3
|
+
import { cx as G } from "../../../utils/styles.js";
|
|
4
|
+
import { spacing as h } from "../../../design-system/tokens/spacing.js";
|
|
5
|
+
import { componentPaddingY as M, iconSizes as L } from "../../../design-system/primitives/sizing.js";
|
|
6
|
+
import { fontSizes as R } from "../../../design-system/tokens/typography.js";
|
|
7
|
+
import { durations as P, easings as B } from "../../../design-system/tokens/motion.js";
|
|
8
|
+
const J = {
|
|
9
|
+
sm: { fontSize: R.sm, iconSize: L.xs, padding: M.xs, indent: h[4] },
|
|
10
|
+
md: { fontSize: R.base, iconSize: L.sm, padding: M.sm, indent: h[5] },
|
|
11
|
+
lg: { fontSize: R.md, iconSize: L.md, padding: M.md, indent: h[6] }
|
|
12
|
+
};
|
|
13
|
+
function Q({ expanded: e }) {
|
|
14
|
+
return /* @__PURE__ */ o(
|
|
15
|
+
"svg",
|
|
16
|
+
{
|
|
17
|
+
width: "16",
|
|
18
|
+
height: "16",
|
|
19
|
+
viewBox: "0 0 16 16",
|
|
20
|
+
fill: "none",
|
|
21
|
+
"aria-hidden": "true",
|
|
22
|
+
style: {
|
|
23
|
+
transform: e ? "rotate(90deg)" : "rotate(0)",
|
|
24
|
+
transition: `transform ${P.fast}ms ${B.easeOut}`
|
|
25
|
+
},
|
|
26
|
+
children: /* @__PURE__ */ o("path", { d: "M6 4l4 4-4 4", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" })
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
function H({
|
|
31
|
+
node: e,
|
|
32
|
+
level: f,
|
|
33
|
+
config: i,
|
|
34
|
+
isSelected: m,
|
|
35
|
+
isExpanded: s,
|
|
36
|
+
showLines: x,
|
|
37
|
+
onToggle: u,
|
|
38
|
+
onSelect: y,
|
|
39
|
+
renderNode: g,
|
|
40
|
+
selectedIds: k,
|
|
41
|
+
expandedIds: S,
|
|
42
|
+
multiSelect: z
|
|
43
|
+
}) {
|
|
44
|
+
const d = e.children && e.children.length > 0, I = w(
|
|
45
|
+
(r) => {
|
|
46
|
+
e.disabled || y(e.id, r.ctrlKey || r.metaKey);
|
|
47
|
+
},
|
|
48
|
+
[e.id, e.disabled, y]
|
|
49
|
+
), D = w(
|
|
50
|
+
(r) => {
|
|
51
|
+
r.stopPropagation(), d && u(e.id);
|
|
52
|
+
},
|
|
53
|
+
[e.id, d, u]
|
|
54
|
+
), C = w(
|
|
55
|
+
(r) => {
|
|
56
|
+
if (!e.disabled)
|
|
57
|
+
switch (r.key) {
|
|
58
|
+
case "Enter":
|
|
59
|
+
case " ":
|
|
60
|
+
r.preventDefault(), y(e.id, r.ctrlKey || r.metaKey);
|
|
61
|
+
break;
|
|
62
|
+
case "ArrowRight":
|
|
63
|
+
r.preventDefault(), d && !s && u(e.id);
|
|
64
|
+
break;
|
|
65
|
+
case "ArrowLeft":
|
|
66
|
+
r.preventDefault(), d && s && u(e.id);
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
[e.id, e.disabled, d, s, u, y]
|
|
71
|
+
), K = {
|
|
72
|
+
display: "flex",
|
|
73
|
+
alignItems: "center",
|
|
74
|
+
gap: h[1.5],
|
|
75
|
+
padding: `${i.padding}px ${h[2]}px`,
|
|
76
|
+
paddingLeft: h[2] + f * i.indent,
|
|
77
|
+
fontSize: i.fontSize,
|
|
78
|
+
color: e.disabled ? "var(--brycks-foreground-disabled)" : "var(--brycks-foreground-default)",
|
|
79
|
+
backgroundColor: m ? "var(--brycks-primary-50)" : "transparent",
|
|
80
|
+
borderRadius: "var(--brycks-radius-md)",
|
|
81
|
+
cursor: e.disabled ? "not-allowed" : "pointer",
|
|
82
|
+
userSelect: "none",
|
|
83
|
+
transition: `background-color ${P.fast}ms ${B.easeOut}`,
|
|
84
|
+
position: "relative"
|
|
85
|
+
}, $ = {
|
|
86
|
+
display: "flex",
|
|
87
|
+
alignItems: "center",
|
|
88
|
+
justifyContent: "center",
|
|
89
|
+
width: i.iconSize,
|
|
90
|
+
height: i.iconSize,
|
|
91
|
+
color: "var(--brycks-foreground-muted)",
|
|
92
|
+
cursor: "pointer",
|
|
93
|
+
flexShrink: 0
|
|
94
|
+
}, j = {
|
|
95
|
+
display: "flex",
|
|
96
|
+
alignItems: "center",
|
|
97
|
+
justifyContent: "center",
|
|
98
|
+
width: i.iconSize,
|
|
99
|
+
height: i.iconSize,
|
|
100
|
+
color: m ? "var(--brycks-primary-default)" : "var(--brycks-foreground-muted)",
|
|
101
|
+
flexShrink: 0
|
|
102
|
+
}, T = x && f > 0 ? {
|
|
103
|
+
position: "absolute",
|
|
104
|
+
left: h[2] + (f - 1) * i.indent + i.iconSize / 2,
|
|
105
|
+
top: 0,
|
|
106
|
+
bottom: 0,
|
|
107
|
+
width: 1,
|
|
108
|
+
backgroundColor: "var(--brycks-border-default)"
|
|
109
|
+
} : {};
|
|
110
|
+
return /* @__PURE__ */ V("li", { role: "treeitem", "aria-selected": m, "aria-expanded": d ? s : void 0, children: [
|
|
111
|
+
/* @__PURE__ */ V(
|
|
112
|
+
"div",
|
|
113
|
+
{
|
|
114
|
+
tabIndex: e.disabled ? -1 : 0,
|
|
115
|
+
style: K,
|
|
116
|
+
onClick: I,
|
|
117
|
+
onKeyDown: C,
|
|
118
|
+
onMouseEnter: (r) => {
|
|
119
|
+
!e.disabled && !m && (r.currentTarget.style.backgroundColor = "var(--brycks-background-muted)");
|
|
120
|
+
},
|
|
121
|
+
onMouseLeave: (r) => {
|
|
122
|
+
m || (r.currentTarget.style.backgroundColor = "transparent");
|
|
123
|
+
},
|
|
124
|
+
children: [
|
|
125
|
+
x && f > 0 && /* @__PURE__ */ o("span", { style: T, "aria-hidden": "true" }),
|
|
126
|
+
/* @__PURE__ */ o("span", { style: $, onClick: D, children: d && /* @__PURE__ */ o(Q, { expanded: s }) }),
|
|
127
|
+
e.icon && /* @__PURE__ */ o("span", { style: j, children: e.icon }),
|
|
128
|
+
g ? g(e, m, s) : /* @__PURE__ */ o("span", { style: { flex: 1 }, children: e.label })
|
|
129
|
+
]
|
|
130
|
+
}
|
|
131
|
+
),
|
|
132
|
+
d && s && /* @__PURE__ */ o("ul", { role: "group", style: { listStyle: "none", margin: 0, padding: 0 }, children: e.children.map((r) => /* @__PURE__ */ o(
|
|
133
|
+
H,
|
|
134
|
+
{
|
|
135
|
+
node: r,
|
|
136
|
+
level: f + 1,
|
|
137
|
+
config: i,
|
|
138
|
+
isSelected: k.includes(r.id),
|
|
139
|
+
isExpanded: S.includes(r.id),
|
|
140
|
+
showLines: x,
|
|
141
|
+
onToggle: u,
|
|
142
|
+
onSelect: y,
|
|
143
|
+
renderNode: g,
|
|
144
|
+
selectedIds: k,
|
|
145
|
+
expandedIds: S,
|
|
146
|
+
multiSelect: z
|
|
147
|
+
},
|
|
148
|
+
r.id
|
|
149
|
+
)) })
|
|
150
|
+
] });
|
|
151
|
+
}
|
|
152
|
+
const X = q(function({
|
|
153
|
+
data: f,
|
|
154
|
+
selectedIds: i,
|
|
155
|
+
defaultSelectedIds: m = [],
|
|
156
|
+
expandedIds: s,
|
|
157
|
+
defaultExpandedIds: x = [],
|
|
158
|
+
onSelectionChange: u,
|
|
159
|
+
onExpansionChange: y,
|
|
160
|
+
onNodeClick: g,
|
|
161
|
+
multiSelect: k = !1,
|
|
162
|
+
size: S = "md",
|
|
163
|
+
showLines: z = !1,
|
|
164
|
+
renderNode: d,
|
|
165
|
+
"aria-label": I = "Tree",
|
|
166
|
+
className: D,
|
|
167
|
+
testId: C
|
|
168
|
+
}, K) {
|
|
169
|
+
const [$, j] = O(m), [T, r] = O(x), c = i !== void 0 ? i : $, b = s !== void 0 ? s : T, N = J[S], a = F(() => {
|
|
170
|
+
const t = (l, n = []) => (l.forEach((p) => {
|
|
171
|
+
n.push(p), p.children && b.includes(p.id) && t(p.children, n);
|
|
172
|
+
}), n);
|
|
173
|
+
return t(f);
|
|
174
|
+
}, [f, b]), U = w(
|
|
175
|
+
(t) => {
|
|
176
|
+
const l = b.includes(t) ? b.filter((n) => n !== t) : [...b, t];
|
|
177
|
+
s === void 0 && r(l), y?.(l);
|
|
178
|
+
},
|
|
179
|
+
[b, s, y]
|
|
180
|
+
), v = w(
|
|
181
|
+
(t, l) => {
|
|
182
|
+
const n = a.find((A) => A.id === t);
|
|
183
|
+
n && g?.(n);
|
|
184
|
+
let p;
|
|
185
|
+
k && l ? p = c.includes(t) ? c.filter((A) => A !== t) : [...c, t] : p = c.includes(t) && c.length === 1 ? [] : [t], i === void 0 && j(p), u?.(p);
|
|
186
|
+
},
|
|
187
|
+
[a, k, c, i, u, g]
|
|
188
|
+
), W = w(
|
|
189
|
+
(t) => {
|
|
190
|
+
const l = a.findIndex((n) => c.includes(n.id));
|
|
191
|
+
switch (t.key) {
|
|
192
|
+
case "ArrowDown": {
|
|
193
|
+
t.preventDefault();
|
|
194
|
+
const n = l < a.length - 1 ? l + 1 : 0;
|
|
195
|
+
v(a[n].id, !1);
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
case "ArrowUp": {
|
|
199
|
+
t.preventDefault();
|
|
200
|
+
const n = l > 0 ? l - 1 : a.length - 1;
|
|
201
|
+
v(a[n].id, !1);
|
|
202
|
+
break;
|
|
203
|
+
}
|
|
204
|
+
case "Home":
|
|
205
|
+
t.preventDefault(), a.length > 0 && v(a[0].id, !1);
|
|
206
|
+
break;
|
|
207
|
+
case "End":
|
|
208
|
+
t.preventDefault(), a.length > 0 && v(a[a.length - 1].id, !1);
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
[a, c, v]
|
|
213
|
+
), Y = {
|
|
214
|
+
listStyle: "none",
|
|
215
|
+
margin: 0,
|
|
216
|
+
padding: h[1],
|
|
217
|
+
outline: "none"
|
|
218
|
+
};
|
|
219
|
+
return /* @__PURE__ */ o(
|
|
220
|
+
"ul",
|
|
221
|
+
{
|
|
222
|
+
ref: K,
|
|
223
|
+
role: "tree",
|
|
224
|
+
"aria-label": I,
|
|
225
|
+
"aria-multiselectable": k,
|
|
226
|
+
tabIndex: 0,
|
|
227
|
+
className: G("brycks-treeview", `brycks-treeview--${S}`, D),
|
|
228
|
+
style: Y,
|
|
229
|
+
"data-testid": C,
|
|
230
|
+
onKeyDown: W,
|
|
231
|
+
children: f.map((t) => /* @__PURE__ */ o(
|
|
232
|
+
H,
|
|
233
|
+
{
|
|
234
|
+
node: t,
|
|
235
|
+
level: 0,
|
|
236
|
+
config: N,
|
|
237
|
+
isSelected: c.includes(t.id),
|
|
238
|
+
isExpanded: b.includes(t.id),
|
|
239
|
+
showLines: z,
|
|
240
|
+
onToggle: U,
|
|
241
|
+
onSelect: v,
|
|
242
|
+
renderNode: d,
|
|
243
|
+
selectedIds: c,
|
|
244
|
+
expandedIds: b,
|
|
245
|
+
multiSelect: k
|
|
246
|
+
},
|
|
247
|
+
t.id
|
|
248
|
+
))
|
|
249
|
+
}
|
|
250
|
+
);
|
|
251
|
+
});
|
|
252
|
+
X.displayName = "TreeView";
|
|
253
|
+
export {
|
|
254
|
+
X as TreeView
|
|
255
|
+
};
|
|
256
|
+
//# sourceMappingURL=TreeView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TreeView.js","sources":["../../../../src/components/data/TreeView/TreeView.tsx"],"sourcesContent":["/**\n * TreeView Component\n *\n * A hierarchical tree structure for displaying nested data.\n * Supports selection, expansion, and keyboard navigation.\n *\n * @module components/data/TreeView\n */\n\nimport {\n forwardRef,\n useState,\n useCallback,\n useMemo,\n type CSSProperties,\n type ReactNode,\n type KeyboardEvent,\n} from 'react'\nimport { cx } from '../../../utils/styles'\nimport { spacing, fontSizes, durations, easings } from '../../../design-system'\nimport { componentPaddingY, iconSizes } from '../../../design-system/primitives'\n\nexport interface TreeNode {\n /** Unique identifier */\n id: string\n /** Display label */\n label: string\n /** Optional icon */\n icon?: ReactNode\n /** Child nodes */\n children?: TreeNode[]\n /** Whether the node is disabled */\n disabled?: boolean\n /** Additional data */\n data?: unknown\n}\n\nexport type TreeViewSize = 'sm' | 'md' | 'lg'\n\nexport interface TreeViewProps {\n /** Tree data */\n data: TreeNode[]\n /** Selected node IDs (controlled) */\n selectedIds?: string[]\n /** Default selected node IDs (uncontrolled) */\n defaultSelectedIds?: string[]\n /** Expanded node IDs (controlled) */\n expandedIds?: string[]\n /** Default expanded node IDs (uncontrolled) */\n defaultExpandedIds?: string[]\n /** Callback when selection changes */\n onSelectionChange?: (selectedIds: string[]) => void\n /** Callback when expansion changes */\n onExpansionChange?: (expandedIds: string[]) => void\n /** Callback when a node is clicked */\n onNodeClick?: (node: TreeNode) => void\n /** Whether to allow multi-selection */\n multiSelect?: boolean\n /** Component size */\n size?: TreeViewSize\n /** Whether to show connecting lines */\n showLines?: boolean\n /** Custom node renderer */\n renderNode?: (node: TreeNode, isSelected: boolean, isExpanded: boolean) => ReactNode\n /** Label for accessibility */\n 'aria-label'?: string\n /** Custom class name */\n className?: string\n /** Test ID */\n testId?: string\n}\n\nconst sizeConfig: Record<TreeViewSize, { fontSize: number; iconSize: number; padding: number; indent: number }> = {\n sm: { fontSize: fontSizes.sm, iconSize: iconSizes.xs, padding: componentPaddingY.xs, indent: spacing[4] },\n md: { fontSize: fontSizes.base, iconSize: iconSizes.sm, padding: componentPaddingY.sm, indent: spacing[5] },\n lg: { fontSize: fontSizes.md, iconSize: iconSizes.md, padding: componentPaddingY.md, indent: spacing[6] },\n}\n\nfunction ChevronIcon({ expanded }: { expanded: boolean }) {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n style={{\n transform: expanded ? 'rotate(90deg)' : 'rotate(0)',\n transition: `transform ${durations.fast}ms ${easings.easeOut}`,\n }}\n >\n <path d=\"M6 4l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n\ninterface TreeNodeItemProps {\n node: TreeNode\n level: number\n config: typeof sizeConfig.md\n isSelected: boolean\n isExpanded: boolean\n showLines: boolean\n onToggle: (id: string) => void\n onSelect: (id: string, multi: boolean) => void\n renderNode?: TreeViewProps['renderNode']\n selectedIds: string[]\n expandedIds: string[]\n multiSelect: boolean\n}\n\nfunction TreeNodeItem({\n node,\n level,\n config,\n isSelected,\n isExpanded,\n showLines,\n onToggle,\n onSelect,\n renderNode,\n selectedIds,\n expandedIds,\n multiSelect,\n}: TreeNodeItemProps) {\n const hasChildren = node.children && node.children.length > 0\n\n const handleClick = useCallback(\n (e: React.MouseEvent) => {\n if (node.disabled) return\n onSelect(node.id, e.ctrlKey || e.metaKey)\n },\n [node.id, node.disabled, onSelect]\n )\n\n const handleToggle = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n if (hasChildren) {\n onToggle(node.id)\n }\n },\n [node.id, hasChildren, onToggle]\n )\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (node.disabled) return\n\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault()\n onSelect(node.id, e.ctrlKey || e.metaKey)\n break\n case 'ArrowRight':\n e.preventDefault()\n if (hasChildren && !isExpanded) {\n onToggle(node.id)\n }\n break\n case 'ArrowLeft':\n e.preventDefault()\n if (hasChildren && isExpanded) {\n onToggle(node.id)\n }\n break\n }\n },\n [node.id, node.disabled, hasChildren, isExpanded, onToggle, onSelect]\n )\n\n const itemStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: spacing[1.5],\n padding: `${config.padding}px ${spacing[2]}px`,\n paddingLeft: spacing[2] + level * config.indent,\n fontSize: config.fontSize,\n color: node.disabled ? 'var(--brycks-foreground-disabled)' : 'var(--brycks-foreground-default)',\n backgroundColor: isSelected ? 'var(--brycks-primary-50)' : 'transparent',\n borderRadius: 'var(--brycks-radius-md)',\n cursor: node.disabled ? 'not-allowed' : 'pointer',\n userSelect: 'none',\n transition: `background-color ${durations.fast}ms ${easings.easeOut}`,\n position: 'relative',\n }\n\n const toggleStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: config.iconSize,\n height: config.iconSize,\n color: 'var(--brycks-foreground-muted)',\n cursor: 'pointer',\n flexShrink: 0,\n }\n\n const iconStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: config.iconSize,\n height: config.iconSize,\n color: isSelected ? 'var(--brycks-primary-default)' : 'var(--brycks-foreground-muted)',\n flexShrink: 0,\n }\n\n const lineStyle: CSSProperties = showLines && level > 0 ? {\n position: 'absolute',\n left: spacing[2] + (level - 1) * config.indent + config.iconSize / 2,\n top: 0,\n bottom: 0,\n width: 1,\n backgroundColor: 'var(--brycks-border-default)',\n } : {}\n\n return (\n <li role=\"treeitem\" aria-selected={isSelected} aria-expanded={hasChildren ? isExpanded : undefined}>\n <div\n tabIndex={node.disabled ? -1 : 0}\n style={itemStyle}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onMouseEnter={(e) => {\n if (!node.disabled && !isSelected) {\n e.currentTarget.style.backgroundColor = 'var(--brycks-background-muted)'\n }\n }}\n onMouseLeave={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = 'transparent'\n }\n }}\n >\n {showLines && level > 0 && <span style={lineStyle} aria-hidden=\"true\" />}\n <span style={toggleStyle} onClick={handleToggle}>\n {hasChildren && <ChevronIcon expanded={isExpanded} />}\n </span>\n {node.icon && <span style={iconStyle}>{node.icon}</span>}\n {renderNode ? (\n renderNode(node, isSelected, isExpanded)\n ) : (\n <span style={{ flex: 1 }}>{node.label}</span>\n )}\n </div>\n {hasChildren && isExpanded && (\n <ul role=\"group\" style={{ listStyle: 'none', margin: 0, padding: 0 }}>\n {node.children!.map((child) => (\n <TreeNodeItem\n key={child.id}\n node={child}\n level={level + 1}\n config={config}\n isSelected={selectedIds.includes(child.id)}\n isExpanded={expandedIds.includes(child.id)}\n showLines={showLines}\n onToggle={onToggle}\n onSelect={onSelect}\n renderNode={renderNode}\n selectedIds={selectedIds}\n expandedIds={expandedIds}\n multiSelect={multiSelect}\n />\n ))}\n </ul>\n )}\n </li>\n )\n}\n\nexport const TreeView = forwardRef<HTMLUListElement, TreeViewProps>(function TreeView(\n {\n data,\n selectedIds: controlledSelectedIds,\n defaultSelectedIds = [],\n expandedIds: controlledExpandedIds,\n defaultExpandedIds = [],\n onSelectionChange,\n onExpansionChange,\n onNodeClick,\n multiSelect = false,\n size = 'md',\n showLines = false,\n renderNode,\n 'aria-label': ariaLabel = 'Tree',\n className,\n testId,\n },\n ref\n) {\n const [internalSelectedIds, setInternalSelectedIds] = useState<string[]>(defaultSelectedIds)\n const [internalExpandedIds, setInternalExpandedIds] = useState<string[]>(defaultExpandedIds)\n\n const selectedIds = controlledSelectedIds !== undefined ? controlledSelectedIds : internalSelectedIds\n const expandedIds = controlledExpandedIds !== undefined ? controlledExpandedIds : internalExpandedIds\n const config = sizeConfig[size]\n\n // Flatten all nodes for keyboard navigation\n const flatNodes = useMemo(() => {\n const flatten = (nodes: TreeNode[], result: TreeNode[] = []): TreeNode[] => {\n nodes.forEach((node) => {\n result.push(node)\n if (node.children && expandedIds.includes(node.id)) {\n flatten(node.children, result)\n }\n })\n return result\n }\n return flatten(data)\n }, [data, expandedIds])\n\n const handleToggle = useCallback(\n (id: string) => {\n const newExpandedIds = expandedIds.includes(id)\n ? expandedIds.filter((eid) => eid !== id)\n : [...expandedIds, id]\n\n if (controlledExpandedIds === undefined) {\n setInternalExpandedIds(newExpandedIds)\n }\n onExpansionChange?.(newExpandedIds)\n },\n [expandedIds, controlledExpandedIds, onExpansionChange]\n )\n\n const handleSelect = useCallback(\n (id: string, additive: boolean) => {\n const node = flatNodes.find((n) => n.id === id)\n if (node) {\n onNodeClick?.(node)\n }\n\n let newSelectedIds: string[]\n if (multiSelect && additive) {\n newSelectedIds = selectedIds.includes(id)\n ? selectedIds.filter((sid) => sid !== id)\n : [...selectedIds, id]\n } else {\n newSelectedIds = selectedIds.includes(id) && selectedIds.length === 1 ? [] : [id]\n }\n\n if (controlledSelectedIds === undefined) {\n setInternalSelectedIds(newSelectedIds)\n }\n onSelectionChange?.(newSelectedIds)\n },\n [flatNodes, multiSelect, selectedIds, controlledSelectedIds, onSelectionChange, onNodeClick]\n )\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLUListElement>) => {\n const currentIndex = flatNodes.findIndex((n) => selectedIds.includes(n.id))\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault()\n const nextIndex = currentIndex < flatNodes.length - 1 ? currentIndex + 1 : 0\n handleSelect(flatNodes[nextIndex].id, false)\n break\n }\n case 'ArrowUp': {\n e.preventDefault()\n const prevIndex = currentIndex > 0 ? currentIndex - 1 : flatNodes.length - 1\n handleSelect(flatNodes[prevIndex].id, false)\n break\n }\n case 'Home':\n e.preventDefault()\n if (flatNodes.length > 0) {\n handleSelect(flatNodes[0].id, false)\n }\n break\n case 'End':\n e.preventDefault()\n if (flatNodes.length > 0) {\n handleSelect(flatNodes[flatNodes.length - 1].id, false)\n }\n break\n }\n },\n [flatNodes, selectedIds, handleSelect]\n )\n\n const containerStyle: CSSProperties = {\n listStyle: 'none',\n margin: 0,\n padding: spacing[1],\n outline: 'none',\n }\n\n return (\n <ul\n ref={ref}\n role=\"tree\"\n aria-label={ariaLabel}\n aria-multiselectable={multiSelect}\n tabIndex={0}\n className={cx('brycks-treeview', `brycks-treeview--${size}`, className)}\n style={containerStyle}\n data-testid={testId}\n onKeyDown={handleKeyDown}\n >\n {data.map((node) => (\n <TreeNodeItem\n key={node.id}\n node={node}\n level={0}\n config={config}\n isSelected={selectedIds.includes(node.id)}\n isExpanded={expandedIds.includes(node.id)}\n showLines={showLines}\n onToggle={handleToggle}\n onSelect={handleSelect}\n renderNode={renderNode}\n selectedIds={selectedIds}\n expandedIds={expandedIds}\n multiSelect={multiSelect}\n />\n ))}\n </ul>\n )\n})\n\nTreeView.displayName = 'TreeView'\n"],"names":["sizeConfig","fontSizes","iconSizes","componentPaddingY","spacing","ChevronIcon","expanded","jsx","durations","easings","TreeNodeItem","node","level","config","isSelected","isExpanded","showLines","onToggle","onSelect","renderNode","selectedIds","expandedIds","multiSelect","hasChildren","handleClick","useCallback","e","handleToggle","handleKeyDown","itemStyle","toggleStyle","iconStyle","lineStyle","jsxs","child","TreeView","forwardRef","data","controlledSelectedIds","defaultSelectedIds","controlledExpandedIds","defaultExpandedIds","onSelectionChange","onExpansionChange","onNodeClick","size","ariaLabel","className","testId","ref","internalSelectedIds","setInternalSelectedIds","useState","internalExpandedIds","setInternalExpandedIds","flatNodes","useMemo","flatten","nodes","result","id","newExpandedIds","eid","handleSelect","additive","n","newSelectedIds","sid","currentIndex","nextIndex","prevIndex","containerStyle","cx"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const S=require("react/jsx-runtime"),r=require("react"),C=require("../../../utils/styles.cjs");function q({items:u,itemHeight:l,height:a,width:x="100%",overscan:d=3,renderItem:V,onScroll:T,onEndReached:v,endReachedThreshold:f=200,initialScrollTop:p=0,className:R,testId:j},i){const[h,M]=r.useState(p),b=r.useRef(null),w=r.useRef(!1),y=u.length*l,k=r.useMemo(()=>{const e=Math.max(0,Math.floor(h/l)-d),t=Math.ceil(a/l)+2*d,o=Math.min(u.length-1,e+t);return u.slice(e,o+1).map((c,n)=>({item:c,index:e+n}))},[u,l,a,h,d]);r.useEffect(()=>{if(!i)return;const e={scrollToIndex:(t,o="start")=>{let c;switch(o){case"center":c=t*l-a/2+l/2;break;case"end":c=(t+1)*l-a;break;default:c=t*l}c=Math.max(0,Math.min(c,y-a)),b.current?.scrollTo({top:c,behavior:"smooth"})},scrollToOffset:t=>{b.current?.scrollTo({top:t,behavior:"smooth"})},getScrollTop:()=>h};typeof i=="function"?i(e):i.current=e},[i,l,a,y,h]);const L=r.useCallback(e=>{const t=e.currentTarget.scrollTop;if(M(t),T?.(t),v){const o=y-t-a;o<=f&&!w.current?(w.current=!0,v()):o>f&&(w.current=!1)}},[y,a,f,T,v]);r.useEffect(()=>{p>0&&b.current&&(b.current.scrollTop=p)},[p]);const m={height:a,width:x,overflow:"auto",position:"relative"},s={height:y,position:"relative",width:"100%"};return S.jsx("div",{ref:b,className:C.cx("brycks-virtual-list",R),style:m,"data-testid":j,onScroll:L,role:"list",children:S.jsx("div",{style:s,children:k.map(({item:e,index:t})=>{const o={position:"absolute",top:0,left:0,width:"100%",height:l,transform:`translateY(${t*l}px)`};return V(e,t,o)})})})}const I=r.forwardRef(q);function N({items:u,estimateItemHeight:l,height:a,width:x="100%",overscan:d=3,renderItem:V,className:T,testId:v},f){const[p,R]=r.useState(0),j=r.useRef(null),[i,h]=r.useState(new Map),{positions:M,totalHeight:b}=r.useMemo(()=>{const s=[];let e=0;for(let t=0;t<u.length;t++){s.push(e);const o=i.get(t)??l(t);e+=o}return{positions:s,totalHeight:e}},[u.length,i,l]),w=r.useMemo(()=>{let s=0,e=u.length-1;for(;s<=e;){const n=Math.floor((s+e)/2),g=i.get(n)??l(n);M[n]+g<p?s=n+1:e=n-1}const t=Math.max(0,s-d);let o=t,c=0;for(let n=t;n<u.length&&c<a+p-M[t];n++)o=n,c+=i.get(n)??l(n);return o=Math.min(u.length-1,o+d),u.slice(t,o+1).map((n,g)=>({item:n,index:t+g,top:M[t+g]}))},[u,M,p,a,d,i,l]),y=r.useCallback(s=>{R(s.currentTarget.scrollTop)},[]),k=r.useCallback(s=>e=>{if(e){const t=e.getBoundingClientRect().height;h(o=>{if(o.get(s)!==t){const c=new Map(o);return c.set(s,t),c}return o})}},[]),L={height:a,width:x,overflow:"auto",position:"relative"},m={height:b,position:"relative",width:"100%"};return S.jsx("div",{ref:s=>{j.current=s,typeof f=="function"?f(s):f&&(f.current=s)},className:C.cx("brycks-variable-virtual-list",T),style:L,"data-testid":v,onScroll:y,role:"list",children:S.jsx("div",{style:m,children:w.map(({item:s,index:e,top:t})=>S.jsx("div",{style:{position:"absolute",top:0,left:0,width:"100%",transform:`translateY(${t}px)`},children:V(s,e,k(e))},e))})})}const O=r.forwardRef(N);exports.VariableHeightVirtualList=O;exports.VirtualList=I;
|
|
2
|
+
//# sourceMappingURL=VirtualList.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VirtualList.cjs","sources":["../../../../src/components/data/VirtualList/VirtualList.tsx"],"sourcesContent":["/**\n * VirtualList Component\n *\n * An efficient list component that only renders visible items.\n * Ideal for large datasets with thousands of items.\n *\n * @module components/data/VirtualList\n */\n\nimport {\n forwardRef,\n useState,\n useCallback,\n useRef,\n useEffect,\n useMemo,\n type CSSProperties,\n type ReactNode,\n type UIEvent,\n} from 'react'\nimport { cx } from '../../../utils/styles'\n\nexport interface VirtualListProps<T> {\n /** Array of items to render */\n items: T[]\n /** Height of each item in pixels */\n itemHeight: number\n /** Visible height of the container */\n height: number\n /** Optional width of the container */\n width?: number | string\n /** Number of extra items to render above/below viewport for smoother scrolling */\n overscan?: number\n /** Render function for each item */\n renderItem: (item: T, index: number, style: CSSProperties) => ReactNode\n /** Callback when scroll position changes */\n onScroll?: (scrollTop: number) => void\n /** Callback when reaching the end of the list */\n onEndReached?: () => void\n /** Threshold in pixels before end to trigger onEndReached */\n endReachedThreshold?: number\n /** Initial scroll position */\n initialScrollTop?: number\n /** Custom class name */\n className?: string\n /** Test ID */\n testId?: string\n}\n\nexport interface VirtualListHandle {\n /** Scroll to a specific index */\n scrollToIndex: (index: number, align?: 'start' | 'center' | 'end') => void\n /** Scroll to a specific offset */\n scrollToOffset: (offset: number) => void\n /** Get current scroll position */\n getScrollTop: () => number\n}\n\nfunction VirtualListInner<T>(\n {\n items,\n itemHeight,\n height,\n width = '100%',\n overscan = 3,\n renderItem,\n onScroll,\n onEndReached,\n endReachedThreshold = 200,\n initialScrollTop = 0,\n className,\n testId,\n }: VirtualListProps<T>,\n ref: React.ForwardedRef<VirtualListHandle>\n) {\n const [scrollTop, setScrollTop] = useState(initialScrollTop)\n const containerRef = useRef<HTMLDivElement>(null)\n const endReachedRef = useRef(false)\n\n const totalHeight = items.length * itemHeight\n\n // Calculate visible range\n const visibleItems = useMemo(() => {\n const start = Math.max(0, Math.floor(scrollTop / itemHeight) - overscan)\n const visibleCount = Math.ceil(height / itemHeight) + 2 * overscan\n const end = Math.min(items.length - 1, start + visibleCount)\n\n return items.slice(start, end + 1).map((item, i) => ({\n item,\n index: start + i,\n }))\n }, [items, itemHeight, height, scrollTop, overscan])\n\n // Expose imperative methods\n useEffect(() => {\n if (!ref) return\n\n const handle: VirtualListHandle = {\n scrollToIndex: (index: number, align: 'start' | 'center' | 'end' = 'start') => {\n let offset: number\n switch (align) {\n case 'center':\n offset = index * itemHeight - height / 2 + itemHeight / 2\n break\n case 'end':\n offset = (index + 1) * itemHeight - height\n break\n default:\n offset = index * itemHeight\n }\n offset = Math.max(0, Math.min(offset, totalHeight - height))\n containerRef.current?.scrollTo({ top: offset, behavior: 'smooth' })\n },\n scrollToOffset: (offset: number) => {\n containerRef.current?.scrollTo({ top: offset, behavior: 'smooth' })\n },\n getScrollTop: () => scrollTop,\n }\n\n if (typeof ref === 'function') {\n ref(handle)\n } else {\n ref.current = handle\n }\n }, [ref, itemHeight, height, totalHeight, scrollTop])\n\n // Handle scroll\n const handleScroll = useCallback(\n (e: UIEvent<HTMLDivElement>) => {\n const newScrollTop = e.currentTarget.scrollTop\n setScrollTop(newScrollTop)\n onScroll?.(newScrollTop)\n\n // Check if we've reached the end\n if (onEndReached) {\n const distanceFromEnd = totalHeight - newScrollTop - height\n if (distanceFromEnd <= endReachedThreshold && !endReachedRef.current) {\n endReachedRef.current = true\n onEndReached()\n } else if (distanceFromEnd > endReachedThreshold) {\n endReachedRef.current = false\n }\n }\n },\n [totalHeight, height, endReachedThreshold, onScroll, onEndReached]\n )\n\n // Set initial scroll position\n useEffect(() => {\n if (initialScrollTop > 0 && containerRef.current) {\n containerRef.current.scrollTop = initialScrollTop\n }\n }, [initialScrollTop])\n\n const containerStyle: CSSProperties = {\n height,\n width,\n overflow: 'auto',\n position: 'relative',\n }\n\n const innerStyle: CSSProperties = {\n height: totalHeight,\n position: 'relative',\n width: '100%',\n }\n\n return (\n <div\n ref={containerRef}\n className={cx('brycks-virtual-list', className)}\n style={containerStyle}\n data-testid={testId}\n onScroll={handleScroll}\n role=\"list\"\n >\n <div style={innerStyle}>\n {visibleItems.map(({ item, index }) => {\n const style: CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: itemHeight,\n transform: `translateY(${index * itemHeight}px)`,\n }\n return renderItem(item, index, style)\n })}\n </div>\n </div>\n )\n}\n\n// Export with proper generic typing\nexport const VirtualList = forwardRef(VirtualListInner) as <T>(\n props: VirtualListProps<T> & { ref?: React.ForwardedRef<VirtualListHandle> }\n) => React.ReactElement\n\n// Variable height virtual list\nexport interface VariableHeightVirtualListProps<T> {\n /** Array of items to render */\n items: T[]\n /** Function to estimate item height (used for initial layout) */\n estimateItemHeight: (index: number) => number\n /** Visible height of the container */\n height: number\n /** Optional width of the container */\n width?: number | string\n /** Number of extra items to render above/below viewport */\n overscan?: number\n /** Render function for each item */\n renderItem: (item: T, index: number, measureRef: (el: HTMLElement | null) => void) => ReactNode\n /** Custom class name */\n className?: string\n /** Test ID */\n testId?: string\n}\n\nfunction VariableHeightVirtualListInner<T>(\n {\n items,\n estimateItemHeight,\n height,\n width = '100%',\n overscan = 3,\n renderItem,\n className,\n testId,\n }: VariableHeightVirtualListProps<T>,\n ref: React.ForwardedRef<HTMLDivElement>\n) {\n const [scrollTop, setScrollTop] = useState(0)\n const containerRef = useRef<HTMLDivElement>(null)\n const [measuredHeights, setMeasuredHeights] = useState<Map<number, number>>(new Map())\n\n // Calculate positions and total height\n const { positions, totalHeight } = useMemo(() => {\n const pos: number[] = []\n let currentTop = 0\n\n for (let i = 0; i < items.length; i++) {\n pos.push(currentTop)\n const itemHeight = measuredHeights.get(i) ?? estimateItemHeight(i)\n currentTop += itemHeight\n }\n\n return { positions: pos, totalHeight: currentTop }\n }, [items.length, measuredHeights, estimateItemHeight])\n\n // Find visible range using binary search\n const visibleItems = useMemo(() => {\n // Binary search for start index\n let low = 0\n let high = items.length - 1\n while (low <= high) {\n const mid = Math.floor((low + high) / 2)\n const itemHeight = measuredHeights.get(mid) ?? estimateItemHeight(mid)\n if (positions[mid] + itemHeight < scrollTop) {\n low = mid + 1\n } else {\n high = mid - 1\n }\n }\n const start = Math.max(0, low - overscan)\n\n // Find end index\n let end = start\n let accumulatedHeight = 0\n for (let i = start; i < items.length && accumulatedHeight < height + scrollTop - positions[start]; i++) {\n end = i\n accumulatedHeight += measuredHeights.get(i) ?? estimateItemHeight(i)\n }\n end = Math.min(items.length - 1, end + overscan)\n\n return items.slice(start, end + 1).map((item, i) => ({\n item,\n index: start + i,\n top: positions[start + i],\n }))\n }, [items, positions, scrollTop, height, overscan, measuredHeights, estimateItemHeight])\n\n const handleScroll = useCallback((e: UIEvent<HTMLDivElement>) => {\n setScrollTop(e.currentTarget.scrollTop)\n }, [])\n\n const measureItem = useCallback((index: number) => (el: HTMLElement | null) => {\n if (el) {\n const measuredHeight = el.getBoundingClientRect().height\n setMeasuredHeights((prev) => {\n if (prev.get(index) !== measuredHeight) {\n const next = new Map(prev)\n next.set(index, measuredHeight)\n return next\n }\n return prev\n })\n }\n }, [])\n\n const containerStyle: CSSProperties = {\n height,\n width,\n overflow: 'auto',\n position: 'relative',\n }\n\n const innerStyle: CSSProperties = {\n height: totalHeight,\n position: 'relative',\n width: '100%',\n }\n\n return (\n <div\n ref={(node) => {\n (containerRef as React.MutableRefObject<HTMLDivElement | null>).current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) ref.current = node\n }}\n className={cx('brycks-variable-virtual-list', className)}\n style={containerStyle}\n data-testid={testId}\n onScroll={handleScroll}\n role=\"list\"\n >\n <div style={innerStyle}>\n {visibleItems.map(({ item, index, top }) => (\n <div\n key={index}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n transform: `translateY(${top}px)`,\n }}\n >\n {renderItem(item, index, measureItem(index))}\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nexport const VariableHeightVirtualList = forwardRef(VariableHeightVirtualListInner) as <T>(\n props: VariableHeightVirtualListProps<T> & { ref?: React.ForwardedRef<HTMLDivElement> }\n) => React.ReactElement\n"],"names":["VirtualListInner","items","itemHeight","height","width","overscan","renderItem","onScroll","onEndReached","endReachedThreshold","initialScrollTop","className","testId","ref","scrollTop","setScrollTop","useState","containerRef","useRef","endReachedRef","totalHeight","visibleItems","useMemo","start","visibleCount","end","item","i","useEffect","handle","index","align","offset","handleScroll","useCallback","newScrollTop","distanceFromEnd","containerStyle","innerStyle","jsx","cx","style","VirtualList","forwardRef","VariableHeightVirtualListInner","estimateItemHeight","measuredHeights","setMeasuredHeights","positions","pos","currentTop","low","high","mid","accumulatedHeight","e","measureItem","el","measuredHeight","prev","next","node","top","VariableHeightVirtualList"],"mappings":"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"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { jsx as M } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as j, useState as R, useRef as I, useMemo as N, useEffect as $, useCallback as Y } from "react";
|
|
3
|
+
import { cx as B } from "../../../utils/styles.js";
|
|
4
|
+
function F({
|
|
5
|
+
items: a,
|
|
6
|
+
itemHeight: n,
|
|
7
|
+
height: c,
|
|
8
|
+
width: g = "100%",
|
|
9
|
+
overscan: p = 3,
|
|
10
|
+
renderItem: m,
|
|
11
|
+
onScroll: T,
|
|
12
|
+
onEndReached: v,
|
|
13
|
+
endReachedThreshold: u = 200,
|
|
14
|
+
initialScrollTop: f = 0,
|
|
15
|
+
className: x,
|
|
16
|
+
testId: V
|
|
17
|
+
}, i) {
|
|
18
|
+
const [h, y] = R(f), d = I(null), w = I(!1), b = a.length * n, k = N(() => {
|
|
19
|
+
const o = Math.max(0, Math.floor(h / n) - p), t = Math.ceil(c / n) + 2 * p, l = Math.min(a.length - 1, o + t);
|
|
20
|
+
return a.slice(o, l + 1).map((s, e) => ({
|
|
21
|
+
item: s,
|
|
22
|
+
index: o + e
|
|
23
|
+
}));
|
|
24
|
+
}, [a, n, c, h, p]);
|
|
25
|
+
$(() => {
|
|
26
|
+
if (!i) return;
|
|
27
|
+
const o = {
|
|
28
|
+
scrollToIndex: (t, l = "start") => {
|
|
29
|
+
let s;
|
|
30
|
+
switch (l) {
|
|
31
|
+
case "center":
|
|
32
|
+
s = t * n - c / 2 + n / 2;
|
|
33
|
+
break;
|
|
34
|
+
case "end":
|
|
35
|
+
s = (t + 1) * n - c;
|
|
36
|
+
break;
|
|
37
|
+
default:
|
|
38
|
+
s = t * n;
|
|
39
|
+
}
|
|
40
|
+
s = Math.max(0, Math.min(s, b - c)), d.current?.scrollTo({ top: s, behavior: "smooth" });
|
|
41
|
+
},
|
|
42
|
+
scrollToOffset: (t) => {
|
|
43
|
+
d.current?.scrollTo({ top: t, behavior: "smooth" });
|
|
44
|
+
},
|
|
45
|
+
getScrollTop: () => h
|
|
46
|
+
};
|
|
47
|
+
typeof i == "function" ? i(o) : i.current = o;
|
|
48
|
+
}, [i, n, c, b, h]);
|
|
49
|
+
const L = Y(
|
|
50
|
+
(o) => {
|
|
51
|
+
const t = o.currentTarget.scrollTop;
|
|
52
|
+
if (y(t), T?.(t), v) {
|
|
53
|
+
const l = b - t - c;
|
|
54
|
+
l <= u && !w.current ? (w.current = !0, v()) : l > u && (w.current = !1);
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
[b, c, u, T, v]
|
|
58
|
+
);
|
|
59
|
+
$(() => {
|
|
60
|
+
f > 0 && d.current && (d.current.scrollTop = f);
|
|
61
|
+
}, [f]);
|
|
62
|
+
const C = {
|
|
63
|
+
height: c,
|
|
64
|
+
width: g,
|
|
65
|
+
overflow: "auto",
|
|
66
|
+
position: "relative"
|
|
67
|
+
}, r = {
|
|
68
|
+
height: b,
|
|
69
|
+
position: "relative",
|
|
70
|
+
width: "100%"
|
|
71
|
+
};
|
|
72
|
+
return /* @__PURE__ */ M(
|
|
73
|
+
"div",
|
|
74
|
+
{
|
|
75
|
+
ref: d,
|
|
76
|
+
className: B("brycks-virtual-list", x),
|
|
77
|
+
style: C,
|
|
78
|
+
"data-testid": V,
|
|
79
|
+
onScroll: L,
|
|
80
|
+
role: "list",
|
|
81
|
+
children: /* @__PURE__ */ M("div", { style: r, children: k.map(({ item: o, index: t }) => {
|
|
82
|
+
const l = {
|
|
83
|
+
position: "absolute",
|
|
84
|
+
top: 0,
|
|
85
|
+
left: 0,
|
|
86
|
+
width: "100%",
|
|
87
|
+
height: n,
|
|
88
|
+
transform: `translateY(${t * n}px)`
|
|
89
|
+
};
|
|
90
|
+
return m(o, t, l);
|
|
91
|
+
}) })
|
|
92
|
+
}
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
const D = j(F);
|
|
96
|
+
function O({
|
|
97
|
+
items: a,
|
|
98
|
+
estimateItemHeight: n,
|
|
99
|
+
height: c,
|
|
100
|
+
width: g = "100%",
|
|
101
|
+
overscan: p = 3,
|
|
102
|
+
renderItem: m,
|
|
103
|
+
className: T,
|
|
104
|
+
testId: v
|
|
105
|
+
}, u) {
|
|
106
|
+
const [f, x] = R(0), V = I(null), [i, h] = R(/* @__PURE__ */ new Map()), { positions: y, totalHeight: d } = N(() => {
|
|
107
|
+
const r = [];
|
|
108
|
+
let o = 0;
|
|
109
|
+
for (let t = 0; t < a.length; t++) {
|
|
110
|
+
r.push(o);
|
|
111
|
+
const l = i.get(t) ?? n(t);
|
|
112
|
+
o += l;
|
|
113
|
+
}
|
|
114
|
+
return { positions: r, totalHeight: o };
|
|
115
|
+
}, [a.length, i, n]), w = N(() => {
|
|
116
|
+
let r = 0, o = a.length - 1;
|
|
117
|
+
for (; r <= o; ) {
|
|
118
|
+
const e = Math.floor((r + o) / 2), S = i.get(e) ?? n(e);
|
|
119
|
+
y[e] + S < f ? r = e + 1 : o = e - 1;
|
|
120
|
+
}
|
|
121
|
+
const t = Math.max(0, r - p);
|
|
122
|
+
let l = t, s = 0;
|
|
123
|
+
for (let e = t; e < a.length && s < c + f - y[t]; e++)
|
|
124
|
+
l = e, s += i.get(e) ?? n(e);
|
|
125
|
+
return l = Math.min(a.length - 1, l + p), a.slice(t, l + 1).map((e, S) => ({
|
|
126
|
+
item: e,
|
|
127
|
+
index: t + S,
|
|
128
|
+
top: y[t + S]
|
|
129
|
+
}));
|
|
130
|
+
}, [a, y, f, c, p, i, n]), b = Y((r) => {
|
|
131
|
+
x(r.currentTarget.scrollTop);
|
|
132
|
+
}, []), k = Y((r) => (o) => {
|
|
133
|
+
if (o) {
|
|
134
|
+
const t = o.getBoundingClientRect().height;
|
|
135
|
+
h((l) => {
|
|
136
|
+
if (l.get(r) !== t) {
|
|
137
|
+
const s = new Map(l);
|
|
138
|
+
return s.set(r, t), s;
|
|
139
|
+
}
|
|
140
|
+
return l;
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}, []), L = {
|
|
144
|
+
height: c,
|
|
145
|
+
width: g,
|
|
146
|
+
overflow: "auto",
|
|
147
|
+
position: "relative"
|
|
148
|
+
}, C = {
|
|
149
|
+
height: d,
|
|
150
|
+
position: "relative",
|
|
151
|
+
width: "100%"
|
|
152
|
+
};
|
|
153
|
+
return /* @__PURE__ */ M(
|
|
154
|
+
"div",
|
|
155
|
+
{
|
|
156
|
+
ref: (r) => {
|
|
157
|
+
V.current = r, typeof u == "function" ? u(r) : u && (u.current = r);
|
|
158
|
+
},
|
|
159
|
+
className: B("brycks-variable-virtual-list", T),
|
|
160
|
+
style: L,
|
|
161
|
+
"data-testid": v,
|
|
162
|
+
onScroll: b,
|
|
163
|
+
role: "list",
|
|
164
|
+
children: /* @__PURE__ */ M("div", { style: C, children: w.map(({ item: r, index: o, top: t }) => /* @__PURE__ */ M(
|
|
165
|
+
"div",
|
|
166
|
+
{
|
|
167
|
+
style: {
|
|
168
|
+
position: "absolute",
|
|
169
|
+
top: 0,
|
|
170
|
+
left: 0,
|
|
171
|
+
width: "100%",
|
|
172
|
+
transform: `translateY(${t}px)`
|
|
173
|
+
},
|
|
174
|
+
children: m(r, o, k(o))
|
|
175
|
+
},
|
|
176
|
+
o
|
|
177
|
+
)) })
|
|
178
|
+
}
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
const E = j(O);
|
|
182
|
+
export {
|
|
183
|
+
E as VariableHeightVirtualList,
|
|
184
|
+
D as VirtualList
|
|
185
|
+
};
|
|
186
|
+
//# sourceMappingURL=VirtualList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VirtualList.js","sources":["../../../../src/components/data/VirtualList/VirtualList.tsx"],"sourcesContent":["/**\n * VirtualList Component\n *\n * An efficient list component that only renders visible items.\n * Ideal for large datasets with thousands of items.\n *\n * @module components/data/VirtualList\n */\n\nimport {\n forwardRef,\n useState,\n useCallback,\n useRef,\n useEffect,\n useMemo,\n type CSSProperties,\n type ReactNode,\n type UIEvent,\n} from 'react'\nimport { cx } from '../../../utils/styles'\n\nexport interface VirtualListProps<T> {\n /** Array of items to render */\n items: T[]\n /** Height of each item in pixels */\n itemHeight: number\n /** Visible height of the container */\n height: number\n /** Optional width of the container */\n width?: number | string\n /** Number of extra items to render above/below viewport for smoother scrolling */\n overscan?: number\n /** Render function for each item */\n renderItem: (item: T, index: number, style: CSSProperties) => ReactNode\n /** Callback when scroll position changes */\n onScroll?: (scrollTop: number) => void\n /** Callback when reaching the end of the list */\n onEndReached?: () => void\n /** Threshold in pixels before end to trigger onEndReached */\n endReachedThreshold?: number\n /** Initial scroll position */\n initialScrollTop?: number\n /** Custom class name */\n className?: string\n /** Test ID */\n testId?: string\n}\n\nexport interface VirtualListHandle {\n /** Scroll to a specific index */\n scrollToIndex: (index: number, align?: 'start' | 'center' | 'end') => void\n /** Scroll to a specific offset */\n scrollToOffset: (offset: number) => void\n /** Get current scroll position */\n getScrollTop: () => number\n}\n\nfunction VirtualListInner<T>(\n {\n items,\n itemHeight,\n height,\n width = '100%',\n overscan = 3,\n renderItem,\n onScroll,\n onEndReached,\n endReachedThreshold = 200,\n initialScrollTop = 0,\n className,\n testId,\n }: VirtualListProps<T>,\n ref: React.ForwardedRef<VirtualListHandle>\n) {\n const [scrollTop, setScrollTop] = useState(initialScrollTop)\n const containerRef = useRef<HTMLDivElement>(null)\n const endReachedRef = useRef(false)\n\n const totalHeight = items.length * itemHeight\n\n // Calculate visible range\n const visibleItems = useMemo(() => {\n const start = Math.max(0, Math.floor(scrollTop / itemHeight) - overscan)\n const visibleCount = Math.ceil(height / itemHeight) + 2 * overscan\n const end = Math.min(items.length - 1, start + visibleCount)\n\n return items.slice(start, end + 1).map((item, i) => ({\n item,\n index: start + i,\n }))\n }, [items, itemHeight, height, scrollTop, overscan])\n\n // Expose imperative methods\n useEffect(() => {\n if (!ref) return\n\n const handle: VirtualListHandle = {\n scrollToIndex: (index: number, align: 'start' | 'center' | 'end' = 'start') => {\n let offset: number\n switch (align) {\n case 'center':\n offset = index * itemHeight - height / 2 + itemHeight / 2\n break\n case 'end':\n offset = (index + 1) * itemHeight - height\n break\n default:\n offset = index * itemHeight\n }\n offset = Math.max(0, Math.min(offset, totalHeight - height))\n containerRef.current?.scrollTo({ top: offset, behavior: 'smooth' })\n },\n scrollToOffset: (offset: number) => {\n containerRef.current?.scrollTo({ top: offset, behavior: 'smooth' })\n },\n getScrollTop: () => scrollTop,\n }\n\n if (typeof ref === 'function') {\n ref(handle)\n } else {\n ref.current = handle\n }\n }, [ref, itemHeight, height, totalHeight, scrollTop])\n\n // Handle scroll\n const handleScroll = useCallback(\n (e: UIEvent<HTMLDivElement>) => {\n const newScrollTop = e.currentTarget.scrollTop\n setScrollTop(newScrollTop)\n onScroll?.(newScrollTop)\n\n // Check if we've reached the end\n if (onEndReached) {\n const distanceFromEnd = totalHeight - newScrollTop - height\n if (distanceFromEnd <= endReachedThreshold && !endReachedRef.current) {\n endReachedRef.current = true\n onEndReached()\n } else if (distanceFromEnd > endReachedThreshold) {\n endReachedRef.current = false\n }\n }\n },\n [totalHeight, height, endReachedThreshold, onScroll, onEndReached]\n )\n\n // Set initial scroll position\n useEffect(() => {\n if (initialScrollTop > 0 && containerRef.current) {\n containerRef.current.scrollTop = initialScrollTop\n }\n }, [initialScrollTop])\n\n const containerStyle: CSSProperties = {\n height,\n width,\n overflow: 'auto',\n position: 'relative',\n }\n\n const innerStyle: CSSProperties = {\n height: totalHeight,\n position: 'relative',\n width: '100%',\n }\n\n return (\n <div\n ref={containerRef}\n className={cx('brycks-virtual-list', className)}\n style={containerStyle}\n data-testid={testId}\n onScroll={handleScroll}\n role=\"list\"\n >\n <div style={innerStyle}>\n {visibleItems.map(({ item, index }) => {\n const style: CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: itemHeight,\n transform: `translateY(${index * itemHeight}px)`,\n }\n return renderItem(item, index, style)\n })}\n </div>\n </div>\n )\n}\n\n// Export with proper generic typing\nexport const VirtualList = forwardRef(VirtualListInner) as <T>(\n props: VirtualListProps<T> & { ref?: React.ForwardedRef<VirtualListHandle> }\n) => React.ReactElement\n\n// Variable height virtual list\nexport interface VariableHeightVirtualListProps<T> {\n /** Array of items to render */\n items: T[]\n /** Function to estimate item height (used for initial layout) */\n estimateItemHeight: (index: number) => number\n /** Visible height of the container */\n height: number\n /** Optional width of the container */\n width?: number | string\n /** Number of extra items to render above/below viewport */\n overscan?: number\n /** Render function for each item */\n renderItem: (item: T, index: number, measureRef: (el: HTMLElement | null) => void) => ReactNode\n /** Custom class name */\n className?: string\n /** Test ID */\n testId?: string\n}\n\nfunction VariableHeightVirtualListInner<T>(\n {\n items,\n estimateItemHeight,\n height,\n width = '100%',\n overscan = 3,\n renderItem,\n className,\n testId,\n }: VariableHeightVirtualListProps<T>,\n ref: React.ForwardedRef<HTMLDivElement>\n) {\n const [scrollTop, setScrollTop] = useState(0)\n const containerRef = useRef<HTMLDivElement>(null)\n const [measuredHeights, setMeasuredHeights] = useState<Map<number, number>>(new Map())\n\n // Calculate positions and total height\n const { positions, totalHeight } = useMemo(() => {\n const pos: number[] = []\n let currentTop = 0\n\n for (let i = 0; i < items.length; i++) {\n pos.push(currentTop)\n const itemHeight = measuredHeights.get(i) ?? estimateItemHeight(i)\n currentTop += itemHeight\n }\n\n return { positions: pos, totalHeight: currentTop }\n }, [items.length, measuredHeights, estimateItemHeight])\n\n // Find visible range using binary search\n const visibleItems = useMemo(() => {\n // Binary search for start index\n let low = 0\n let high = items.length - 1\n while (low <= high) {\n const mid = Math.floor((low + high) / 2)\n const itemHeight = measuredHeights.get(mid) ?? estimateItemHeight(mid)\n if (positions[mid] + itemHeight < scrollTop) {\n low = mid + 1\n } else {\n high = mid - 1\n }\n }\n const start = Math.max(0, low - overscan)\n\n // Find end index\n let end = start\n let accumulatedHeight = 0\n for (let i = start; i < items.length && accumulatedHeight < height + scrollTop - positions[start]; i++) {\n end = i\n accumulatedHeight += measuredHeights.get(i) ?? estimateItemHeight(i)\n }\n end = Math.min(items.length - 1, end + overscan)\n\n return items.slice(start, end + 1).map((item, i) => ({\n item,\n index: start + i,\n top: positions[start + i],\n }))\n }, [items, positions, scrollTop, height, overscan, measuredHeights, estimateItemHeight])\n\n const handleScroll = useCallback((e: UIEvent<HTMLDivElement>) => {\n setScrollTop(e.currentTarget.scrollTop)\n }, [])\n\n const measureItem = useCallback((index: number) => (el: HTMLElement | null) => {\n if (el) {\n const measuredHeight = el.getBoundingClientRect().height\n setMeasuredHeights((prev) => {\n if (prev.get(index) !== measuredHeight) {\n const next = new Map(prev)\n next.set(index, measuredHeight)\n return next\n }\n return prev\n })\n }\n }, [])\n\n const containerStyle: CSSProperties = {\n height,\n width,\n overflow: 'auto',\n position: 'relative',\n }\n\n const innerStyle: CSSProperties = {\n height: totalHeight,\n position: 'relative',\n width: '100%',\n }\n\n return (\n <div\n ref={(node) => {\n (containerRef as React.MutableRefObject<HTMLDivElement | null>).current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) ref.current = node\n }}\n className={cx('brycks-variable-virtual-list', className)}\n style={containerStyle}\n data-testid={testId}\n onScroll={handleScroll}\n role=\"list\"\n >\n <div style={innerStyle}>\n {visibleItems.map(({ item, index, top }) => (\n <div\n key={index}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n transform: `translateY(${top}px)`,\n }}\n >\n {renderItem(item, index, measureItem(index))}\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nexport const VariableHeightVirtualList = forwardRef(VariableHeightVirtualListInner) as <T>(\n props: VariableHeightVirtualListProps<T> & { ref?: React.ForwardedRef<HTMLDivElement> }\n) => React.ReactElement\n"],"names":["VirtualListInner","items","itemHeight","height","width","overscan","renderItem","onScroll","onEndReached","endReachedThreshold","initialScrollTop","className","testId","ref","scrollTop","setScrollTop","useState","containerRef","useRef","endReachedRef","totalHeight","visibleItems","useMemo","start","visibleCount","end","item","i","useEffect","handle","index","align","offset","handleScroll","useCallback","e","newScrollTop","distanceFromEnd","containerStyle","innerStyle","jsx","cx","style","VirtualList","forwardRef","VariableHeightVirtualListInner","estimateItemHeight","measuredHeights","setMeasuredHeights","positions","pos","currentTop","low","high","mid","accumulatedHeight","measureItem","el","measuredHeight","prev","next","node","top","VariableHeightVirtualList"],"mappings":";;;AA0DA,SAASA,EACP;AAAA,EACE,OAAAC;AAAA,EACA,YAAAC;AAAA,EACA,QAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,UAAAC,IAAW;AAAA,EACX,YAAAC;AAAA,EACA,UAAAC;AAAA,EACA,cAAAC;AAAA,EACA,qBAAAC,IAAsB;AAAA,EACtB,kBAAAC,IAAmB;AAAA,EACnB,WAAAC;AAAA,EACA,QAAAC;AACF,GACAC,GACA;AACA,QAAM,CAACC,GAAWC,CAAY,IAAIC,EAASN,CAAgB,GACrDO,IAAeC,EAAuB,IAAI,GAC1CC,IAAgBD,EAAO,EAAK,GAE5BE,IAAcnB,EAAM,SAASC,GAG7BmB,IAAeC,EAAQ,MAAM;AACjC,UAAMC,IAAQ,KAAK,IAAI,GAAG,KAAK,MAAMT,IAAYZ,CAAU,IAAIG,CAAQ,GACjEmB,IAAe,KAAK,KAAKrB,IAASD,CAAU,IAAI,IAAIG,GACpDoB,IAAM,KAAK,IAAIxB,EAAM,SAAS,GAAGsB,IAAQC,CAAY;AAE3D,WAAOvB,EAAM,MAAMsB,GAAOE,IAAM,CAAC,EAAE,IAAI,CAACC,GAAMC,OAAO;AAAA,MACnD,MAAAD;AAAA,MACA,OAAOH,IAAQI;AAAA,IAAA,EACf;AAAA,EACJ,GAAG,CAAC1B,GAAOC,GAAYC,GAAQW,GAAWT,CAAQ,CAAC;AAGnD,EAAAuB,EAAU,MAAM;AACd,QAAI,CAACf,EAAK;AAEV,UAAMgB,IAA4B;AAAA,MAChC,eAAe,CAACC,GAAeC,IAAoC,YAAY;AAC7E,YAAIC;AACJ,gBAAQD,GAAA;AAAA,UACN,KAAK;AACH,YAAAC,IAASF,IAAQ5B,IAAaC,IAAS,IAAID,IAAa;AACxD;AAAA,UACF,KAAK;AACH,YAAA8B,KAAUF,IAAQ,KAAK5B,IAAaC;AACpC;AAAA,UACF;AACE,YAAA6B,IAASF,IAAQ5B;AAAA,QAAA;AAErB,QAAA8B,IAAS,KAAK,IAAI,GAAG,KAAK,IAAIA,GAAQZ,IAAcjB,CAAM,CAAC,GAC3Dc,EAAa,SAAS,SAAS,EAAE,KAAKe,GAAQ,UAAU,UAAU;AAAA,MACpE;AAAA,MACA,gBAAgB,CAACA,MAAmB;AAClC,QAAAf,EAAa,SAAS,SAAS,EAAE,KAAKe,GAAQ,UAAU,UAAU;AAAA,MACpE;AAAA,MACA,cAAc,MAAMlB;AAAA,IAAA;AAGtB,IAAI,OAAOD,KAAQ,aACjBA,EAAIgB,CAAM,IAEVhB,EAAI,UAAUgB;AAAA,EAElB,GAAG,CAAChB,GAAKX,GAAYC,GAAQiB,GAAaN,CAAS,CAAC;AAGpD,QAAMmB,IAAeC;AAAA,IACnB,CAACC,MAA+B;AAC9B,YAAMC,IAAeD,EAAE,cAAc;AAKrC,UAJApB,EAAaqB,CAAY,GACzB7B,IAAW6B,CAAY,GAGnB5B,GAAc;AAChB,cAAM6B,IAAkBjB,IAAcgB,IAAejC;AACrD,QAAIkC,KAAmB5B,KAAuB,CAACU,EAAc,WAC3DA,EAAc,UAAU,IACxBX,EAAA,KACS6B,IAAkB5B,MAC3BU,EAAc,UAAU;AAAA,MAE5B;AAAA,IACF;AAAA,IACA,CAACC,GAAajB,GAAQM,GAAqBF,GAAUC,CAAY;AAAA,EAAA;AAInE,EAAAoB,EAAU,MAAM;AACd,IAAIlB,IAAmB,KAAKO,EAAa,YACvCA,EAAa,QAAQ,YAAYP;AAAA,EAErC,GAAG,CAACA,CAAgB,CAAC;AAErB,QAAM4B,IAAgC;AAAA,IACpC,QAAAnC;AAAA,IACA,OAAAC;AAAA,IACA,UAAU;AAAA,IACV,UAAU;AAAA,EAAA,GAGNmC,IAA4B;AAAA,IAChC,QAAQnB;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,EAAA;AAGT,SACE,gBAAAoB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKvB;AAAA,MACL,WAAWwB,EAAG,uBAAuB9B,CAAS;AAAA,MAC9C,OAAO2B;AAAA,MACP,eAAa1B;AAAA,MACb,UAAUqB;AAAA,MACV,MAAK;AAAA,MAEL,UAAA,gBAAAO,EAAC,OAAA,EAAI,OAAOD,GACT,UAAAlB,EAAa,IAAI,CAAC,EAAE,MAAAK,GAAM,OAAAI,EAAA,MAAY;AACrC,cAAMY,IAAuB;AAAA,UAC3B,UAAU;AAAA,UACV,KAAK;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,QAAQxC;AAAA,UACR,WAAW,cAAc4B,IAAQ5B,CAAU;AAAA,QAAA;AAE7C,eAAOI,EAAWoB,GAAMI,GAAOY,CAAK;AAAA,MACtC,CAAC,EAAA,CACH;AAAA,IAAA;AAAA,EAAA;AAGN;AAGO,MAAMC,IAAcC,EAAW5C,CAAgB;AAwBtD,SAAS6C,EACP;AAAA,EACE,OAAA5C;AAAA,EACA,oBAAA6C;AAAA,EACA,QAAA3C;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,UAAAC,IAAW;AAAA,EACX,YAAAC;AAAA,EACA,WAAAK;AAAA,EACA,QAAAC;AACF,GACAC,GACA;AACA,QAAM,CAACC,GAAWC,CAAY,IAAIC,EAAS,CAAC,GACtCC,IAAeC,EAAuB,IAAI,GAC1C,CAAC6B,GAAiBC,CAAkB,IAAIhC,EAA8B,oBAAI,KAAK,GAG/E,EAAE,WAAAiC,GAAW,aAAA7B,EAAA,IAAgBE,EAAQ,MAAM;AAC/C,UAAM4B,IAAgB,CAAA;AACtB,QAAIC,IAAa;AAEjB,aAASxB,IAAI,GAAGA,IAAI1B,EAAM,QAAQ0B,KAAK;AACrC,MAAAuB,EAAI,KAAKC,CAAU;AACnB,YAAMjD,IAAa6C,EAAgB,IAAIpB,CAAC,KAAKmB,EAAmBnB,CAAC;AACjE,MAAAwB,KAAcjD;AAAA,IAChB;AAEA,WAAO,EAAE,WAAWgD,GAAK,aAAaC,EAAA;AAAA,EACxC,GAAG,CAAClD,EAAM,QAAQ8C,GAAiBD,CAAkB,CAAC,GAGhDzB,IAAeC,EAAQ,MAAM;AAEjC,QAAI8B,IAAM,GACNC,IAAOpD,EAAM,SAAS;AAC1B,WAAOmD,KAAOC,KAAM;AAClB,YAAMC,IAAM,KAAK,OAAOF,IAAMC,KAAQ,CAAC,GACjCnD,IAAa6C,EAAgB,IAAIO,CAAG,KAAKR,EAAmBQ,CAAG;AACrE,MAAIL,EAAUK,CAAG,IAAIpD,IAAaY,IAChCsC,IAAME,IAAM,IAEZD,IAAOC,IAAM;AAAA,IAEjB;AACA,UAAM/B,IAAQ,KAAK,IAAI,GAAG6B,IAAM/C,CAAQ;AAGxC,QAAIoB,IAAMF,GACNgC,IAAoB;AACxB,aAAS5B,IAAIJ,GAAOI,IAAI1B,EAAM,UAAUsD,IAAoBpD,IAASW,IAAYmC,EAAU1B,CAAK,GAAGI;AACjG,MAAAF,IAAME,GACN4B,KAAqBR,EAAgB,IAAIpB,CAAC,KAAKmB,EAAmBnB,CAAC;AAErE,WAAAF,IAAM,KAAK,IAAIxB,EAAM,SAAS,GAAGwB,IAAMpB,CAAQ,GAExCJ,EAAM,MAAMsB,GAAOE,IAAM,CAAC,EAAE,IAAI,CAACC,GAAMC,OAAO;AAAA,MACnD,MAAAD;AAAA,MACA,OAAOH,IAAQI;AAAA,MACf,KAAKsB,EAAU1B,IAAQI,CAAC;AAAA,IAAA,EACxB;AAAA,EACJ,GAAG,CAAC1B,GAAOgD,GAAWnC,GAAWX,GAAQE,GAAU0C,GAAiBD,CAAkB,CAAC,GAEjFb,IAAeC,EAAY,CAACC,MAA+B;AAC/D,IAAApB,EAAaoB,EAAE,cAAc,SAAS;AAAA,EACxC,GAAG,CAAA,CAAE,GAECqB,IAActB,EAAY,CAACJ,MAAkB,CAAC2B,MAA2B;AAC7E,QAAIA,GAAI;AACN,YAAMC,IAAiBD,EAAG,sBAAA,EAAwB;AAClD,MAAAT,EAAmB,CAACW,MAAS;AAC3B,YAAIA,EAAK,IAAI7B,CAAK,MAAM4B,GAAgB;AACtC,gBAAME,IAAO,IAAI,IAAID,CAAI;AACzB,iBAAAC,EAAK,IAAI9B,GAAO4B,CAAc,GACvBE;AAAA,QACT;AACA,eAAOD;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAA,CAAE,GAECrB,IAAgC;AAAA,IACpC,QAAAnC;AAAA,IACA,OAAAC;AAAA,IACA,UAAU;AAAA,IACV,UAAU;AAAA,EAAA,GAGNmC,IAA4B;AAAA,IAChC,QAAQnB;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,EAAA;AAGT,SACE,gBAAAoB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK,CAACqB,MAAS;AACZ,QAAA5C,EAA+D,UAAU4C,GACtE,OAAOhD,KAAQ,aAAYA,EAAIgD,CAAI,IAC9BhD,QAAS,UAAUgD;AAAA,MAC9B;AAAA,MACA,WAAWpB,EAAG,gCAAgC9B,CAAS;AAAA,MACvD,OAAO2B;AAAA,MACP,eAAa1B;AAAA,MACb,UAAUqB;AAAA,MACV,MAAK;AAAA,MAEL,UAAA,gBAAAO,EAAC,OAAA,EAAI,OAAOD,GACT,UAAAlB,EAAa,IAAI,CAAC,EAAE,MAAAK,GAAM,OAAAI,GAAO,KAAAgC,EAAA,MAChC,gBAAAtB;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,OAAO;AAAA,YACL,UAAU;AAAA,YACV,KAAK;AAAA,YACL,MAAM;AAAA,YACN,OAAO;AAAA,YACP,WAAW,cAAcsB,CAAG;AAAA,UAAA;AAAA,UAG7B,UAAAxD,EAAWoB,GAAMI,GAAO0B,EAAY1B,CAAK,CAAC;AAAA,QAAA;AAAA,QATtCA;AAAA,MAAA,CAWR,EAAA,CACH;AAAA,IAAA;AAAA,EAAA;AAGN;AAEO,MAAMiC,IAA4BnB,EAAWC,CAA8B;"}
|
package/dist/components/data.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./data/Table/Table.cjs"),t=require("./data/List/List.cjs"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./data/Table/Table.cjs"),t=require("./data/List/List.cjs"),i=require("./data/InfoItem/InfoItem.cjs"),l=require("./data/TreeView/TreeView.cjs"),a=require("./data/VirtualList/VirtualList.cjs");exports.Table=e.Table;exports.TableBody=e.TableBody;exports.TableCaption=e.TableCaption;exports.TableCell=e.TableCell;exports.TableFoot=e.TableFoot;exports.TableHead=e.TableHead;exports.TableHeader=e.TableHeader;exports.TableRow=e.TableRow;exports.List=t.List;exports.ListDivider=t.ListDivider;exports.ListHeader=t.ListHeader;exports.ListItem=t.ListItem;exports.InfoItem=i.InfoItem;exports.InfoList=i.InfoList;exports.TreeView=l.TreeView;exports.VariableHeightVirtualList=a.VariableHeightVirtualList;exports.VirtualList=a.VirtualList;
|
|
2
2
|
//# sourceMappingURL=data.cjs.map
|
package/dist/components/data.js
CHANGED
|
@@ -1,20 +1,25 @@
|
|
|
1
|
-
import { Table as
|
|
2
|
-
import { List as
|
|
3
|
-
import { InfoItem as
|
|
1
|
+
import { Table as o, TableBody as r, TableCaption as a, TableCell as i, TableFoot as l, TableHead as b, TableHeader as T, TableRow as f } from "./data/Table/Table.js";
|
|
2
|
+
import { List as s, ListDivider as L, ListHeader as p, ListItem as d } from "./data/List/List.js";
|
|
3
|
+
import { InfoItem as H, InfoList as I } from "./data/InfoItem/InfoItem.js";
|
|
4
|
+
import { TreeView as n } from "./data/TreeView/TreeView.js";
|
|
5
|
+
import { VariableHeightVirtualList as w, VirtualList as C } from "./data/VirtualList/VirtualList.js";
|
|
4
6
|
export {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
7
|
+
H as InfoItem,
|
|
8
|
+
I as InfoList,
|
|
9
|
+
s as List,
|
|
10
|
+
L as ListDivider,
|
|
11
|
+
p as ListHeader,
|
|
12
|
+
d as ListItem,
|
|
13
|
+
o as Table,
|
|
14
|
+
r as TableBody,
|
|
15
|
+
a as TableCaption,
|
|
16
|
+
i as TableCell,
|
|
17
|
+
l as TableFoot,
|
|
18
|
+
b as TableHead,
|
|
17
19
|
T as TableHeader,
|
|
18
|
-
|
|
20
|
+
f as TableRow,
|
|
21
|
+
n as TreeView,
|
|
22
|
+
w as VariableHeightVirtualList,
|
|
23
|
+
C as VirtualList
|
|
19
24
|
};
|
|
20
25
|
//# sourceMappingURL=data.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"data.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
|