@aster-ui/prefixed 0.12.50 → 0.12.52
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/Anchor.js +53 -53
- package/dist/components/Anchor.js.map +1 -1
- package/dist/components/Form.d.ts +8 -2
- package/dist/components/Form.js +159 -156
- package/dist/components/Form.js.map +1 -1
- package/dist/components/Layout.js +66 -66
- package/dist/components/Layout.js.map +1 -1
- package/dist/components/Splitter.js +93 -95
- package/dist/components/Splitter.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,126 +1,126 @@
|
|
|
1
|
-
import { jsx as h, jsxs as
|
|
2
|
-
import
|
|
3
|
-
const
|
|
1
|
+
import { jsx as h, jsxs as K, Fragment as ie } from "react/jsx-runtime";
|
|
2
|
+
import T, { useRef as L, useState as J, useCallback as y, useEffect as Q } from "react";
|
|
3
|
+
const pe = ({ children: M }) => /* @__PURE__ */ h(ie, { children: M }), ue = ({
|
|
4
4
|
children: M,
|
|
5
|
-
direction:
|
|
6
|
-
sizes:
|
|
7
|
-
defaultSizes:
|
|
8
|
-
onSizesChange:
|
|
5
|
+
direction: z = "horizontal",
|
|
6
|
+
sizes: P,
|
|
7
|
+
defaultSizes: $,
|
|
8
|
+
onSizesChange: F,
|
|
9
9
|
gutterSize: R = 8,
|
|
10
10
|
minSize: E = 50,
|
|
11
|
-
className:
|
|
11
|
+
className: Z = ""
|
|
12
12
|
}) => {
|
|
13
|
-
const D = L(null),
|
|
14
|
-
(e) =>
|
|
15
|
-
), m = u.length, [
|
|
13
|
+
const D = L(null), I = L([]), x = L(null), u = T.Children.toArray(M).filter(
|
|
14
|
+
(e) => T.isValidElement(e)
|
|
15
|
+
), m = u.length, [f, W] = J(
|
|
16
16
|
() => u.map((e) => e.props.defaultCollapsed ?? e.props.collapsed ?? !1)
|
|
17
|
-
),
|
|
17
|
+
), X = L([]), j = y(() => {
|
|
18
18
|
const e = u.map((s) => s.props.defaultSize), o = e.some((s) => s !== void 0);
|
|
19
|
-
if (
|
|
20
|
-
return
|
|
19
|
+
if ($ && $.length === m)
|
|
20
|
+
return $;
|
|
21
21
|
if (o) {
|
|
22
22
|
const s = e.reduce((l, n) => l + (n ?? 0), 0), r = e.filter((l) => l === void 0).length, a = Math.max(0, 100 - s), t = r > 0 ? a / r : 0;
|
|
23
23
|
return e.map((l) => l ?? t);
|
|
24
24
|
}
|
|
25
25
|
const i = 100 / m;
|
|
26
26
|
return Array(m).fill(i);
|
|
27
|
-
}, [
|
|
27
|
+
}, [$, m, u]), [k, Y] = J(j), ee = y(() => {
|
|
28
28
|
const e = u.map((t) => t.props.size);
|
|
29
29
|
if (!e.some((t) => t !== void 0)) return null;
|
|
30
30
|
const i = e.reduce((t, l) => t + (l ?? 0), 0), s = e.filter((t) => t === void 0).length, r = Math.max(0, 100 - i), a = s > 0 ? r / s : 0;
|
|
31
|
-
return e.map((t, l) => t ??
|
|
32
|
-
}, [u,
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}, [m,
|
|
31
|
+
return e.map((t, l) => t ?? k[l] ?? a);
|
|
32
|
+
}, [u, k]), d = P || ee() || k;
|
|
33
|
+
Q(() => {
|
|
34
|
+
!P && k.length !== m && Y(j());
|
|
35
|
+
}, [m, P, k.length, j]), Q(() => {
|
|
36
36
|
const e = u.map(
|
|
37
|
-
(i, s) => i.props.collapsed ??
|
|
37
|
+
(i, s) => i.props.collapsed ?? f[s] ?? !1
|
|
38
38
|
);
|
|
39
|
-
e.some((i, s) => i !==
|
|
39
|
+
e.some((i, s) => i !== f[s]) && W(e);
|
|
40
40
|
}, [u.map((e) => e.props.collapsed).join(",")]);
|
|
41
|
-
const
|
|
41
|
+
const b = y(
|
|
42
42
|
(e) => {
|
|
43
|
-
|
|
43
|
+
P || Y(e), F?.(e);
|
|
44
44
|
},
|
|
45
|
-
[
|
|
46
|
-
),
|
|
45
|
+
[P, F]
|
|
46
|
+
), _ = y(
|
|
47
47
|
(e) => {
|
|
48
48
|
const o = u[e];
|
|
49
49
|
if (!o?.props.collapsible) return;
|
|
50
|
-
const s = !
|
|
51
|
-
if (r[e] = s,
|
|
52
|
-
|
|
53
|
-
const a = 0, t =
|
|
50
|
+
const s = !f[e], r = [...f];
|
|
51
|
+
if (r[e] = s, W(r), o.props.onCollapse?.(s), s) {
|
|
52
|
+
X.current = [...d];
|
|
53
|
+
const a = 0, t = d[e] - a, l = d.map((n, c) => ({ size: n, index: c })).filter((n, c) => c !== e && !r[c]);
|
|
54
54
|
if (l.length > 0) {
|
|
55
|
-
const n = t / l.length, c =
|
|
56
|
-
|
|
55
|
+
const n = t / l.length, c = d.map((p, w) => w === e ? a : r[w] ? p : p + n);
|
|
56
|
+
b(c);
|
|
57
57
|
}
|
|
58
58
|
} else {
|
|
59
|
-
const a =
|
|
59
|
+
const a = X.current[e] || 100 / m, l = d.map((n, c) => ({ size: n, index: c })).filter((n, c) => c !== e && !r[c]).reduce((n, c) => n + c.size, 0);
|
|
60
60
|
if (l > 0) {
|
|
61
|
-
const n =
|
|
61
|
+
const n = d.map((c, p) => {
|
|
62
62
|
if (p === e) return a;
|
|
63
63
|
if (!r[p]) {
|
|
64
|
-
const
|
|
65
|
-
return c - a *
|
|
64
|
+
const w = c / l;
|
|
65
|
+
return c - a * w;
|
|
66
66
|
}
|
|
67
67
|
return c;
|
|
68
68
|
});
|
|
69
|
-
|
|
69
|
+
b(n);
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
72
|
},
|
|
73
|
-
[u,
|
|
74
|
-
),
|
|
73
|
+
[u, f, d, m, b]
|
|
74
|
+
), te = y(
|
|
75
75
|
(e, o) => {
|
|
76
76
|
const i = u[e]?.props || {}, s = u[e + 1]?.props || {};
|
|
77
|
-
if (i.resizable === !1 || s.resizable === !1 ||
|
|
77
|
+
if (i.resizable === !1 || s.resizable === !1 || f[e] || f[e + 1])
|
|
78
78
|
return;
|
|
79
79
|
o.preventDefault();
|
|
80
|
-
const r =
|
|
80
|
+
const r = z === "horizontal" ? o.clientX : o.clientY;
|
|
81
81
|
x.current = {
|
|
82
82
|
index: e,
|
|
83
83
|
startPos: r,
|
|
84
|
-
startSizes: [...
|
|
84
|
+
startSizes: [...d]
|
|
85
85
|
};
|
|
86
86
|
const a = (l) => {
|
|
87
87
|
if (!x.current || !D.current) return;
|
|
88
|
-
const { index: n, startPos: c, startSizes: p } = x.current,
|
|
89
|
-
let v = p[n] +
|
|
90
|
-
v < A && (v = A,
|
|
91
|
-
const
|
|
92
|
-
if (
|
|
93
|
-
const
|
|
94
|
-
v >
|
|
88
|
+
const { index: n, startPos: c, startSizes: p } = x.current, w = D.current.getBoundingClientRect(), se = z === "horizontal" ? w.width : w.height, re = z === "horizontal" ? l.clientX : l.clientY, le = (m - 1) * R, N = se - le, q = (re - c) / N * 100, G = u[n]?.props || {}, H = u[n + 1]?.props || {}, ae = G.minSize ?? E, ce = H.minSize ?? E, A = ae / N * 100, B = ce / N * 100;
|
|
89
|
+
let v = p[n] + q, C = p[n + 1] - q;
|
|
90
|
+
v < A && (v = A, C = p[n] + p[n + 1] - A), C < B && (C = B, v = p[n] + p[n + 1] - B);
|
|
91
|
+
const O = G.maxSize, V = H.maxSize;
|
|
92
|
+
if (O) {
|
|
93
|
+
const S = O / N * 100;
|
|
94
|
+
v > S && (v = S, C = p[n] + p[n + 1] - S);
|
|
95
95
|
}
|
|
96
|
-
if (
|
|
97
|
-
const
|
|
98
|
-
|
|
96
|
+
if (V) {
|
|
97
|
+
const S = V / N * 100;
|
|
98
|
+
C > S && (C = S, v = p[n] + p[n + 1] - S);
|
|
99
99
|
}
|
|
100
|
-
const
|
|
101
|
-
|
|
100
|
+
const U = [...p];
|
|
101
|
+
U[n] = v, U[n + 1] = C, b(U);
|
|
102
102
|
}, t = () => {
|
|
103
103
|
x.current = null, document.removeEventListener("mousemove", a), document.removeEventListener("mouseup", t), document.body.style.cursor = "", document.body.style.userSelect = "";
|
|
104
104
|
};
|
|
105
|
-
document.addEventListener("mousemove", a), document.addEventListener("mouseup", t), document.body.style.cursor =
|
|
105
|
+
document.addEventListener("mousemove", a), document.addEventListener("mouseup", t), document.body.style.cursor = z === "horizontal" ? "col-resize" : "row-resize", document.body.style.userSelect = "none";
|
|
106
106
|
},
|
|
107
|
-
[
|
|
108
|
-
),
|
|
107
|
+
[z, d, m, R, u, E, b, f]
|
|
108
|
+
), oe = y(
|
|
109
109
|
(e, o) => {
|
|
110
|
-
if (
|
|
110
|
+
if (f[e] || f[e + 1])
|
|
111
111
|
return;
|
|
112
112
|
const i = o.shiftKey ? 10 : 1;
|
|
113
113
|
let s = 0;
|
|
114
|
-
if (
|
|
114
|
+
if (z === "horizontal" ? o.key === "ArrowLeft" ? s = -i : o.key === "ArrowRight" && (s = i) : o.key === "ArrowUp" ? s = -i : o.key === "ArrowDown" && (s = i), s !== 0) {
|
|
115
115
|
o.preventDefault();
|
|
116
|
-
const r = [...
|
|
116
|
+
const r = [...d], a = 5;
|
|
117
117
|
let t = r[e] + s, l = r[e + 1] - s;
|
|
118
|
-
t >= a && l >= a && (r[e] = t, r[e + 1] = l,
|
|
118
|
+
t >= a && l >= a && (r[e] = t, r[e + 1] = l, b(r));
|
|
119
119
|
}
|
|
120
120
|
},
|
|
121
|
-
[
|
|
122
|
-
),
|
|
123
|
-
const o = u[e], i = u[e + 1], s = o?.props.collapsible, r = i?.props.collapsible, a =
|
|
121
|
+
[z, d, b, f]
|
|
122
|
+
), g = z === "horizontal", ne = (e) => {
|
|
123
|
+
const o = u[e], i = u[e + 1], s = o?.props.collapsible, r = i?.props.collapsible, a = f[e], t = f[e + 1];
|
|
124
124
|
return {
|
|
125
125
|
showStart: s && !t,
|
|
126
126
|
showEnd: r && !a,
|
|
@@ -132,19 +132,19 @@ const ze = "d-bg-base-300", ge = "d-bg-primary", B = "d-text-base-content", we =
|
|
|
132
132
|
"div",
|
|
133
133
|
{
|
|
134
134
|
ref: D,
|
|
135
|
-
className: `flex ${
|
|
135
|
+
className: `flex ${g ? "flex-row" : "flex-col"} h-full w-full ${Z}`,
|
|
136
136
|
children: u.map((e, o) => {
|
|
137
|
-
const i = e.props, s = o === u.length - 1, r =
|
|
138
|
-
return /* @__PURE__ */
|
|
137
|
+
const i = e.props, s = o === u.length - 1, r = f[o], a = i.resizable !== !1 && !r;
|
|
138
|
+
return /* @__PURE__ */ K(T.Fragment, { children: [
|
|
139
139
|
/* @__PURE__ */ h(
|
|
140
140
|
"div",
|
|
141
141
|
{
|
|
142
142
|
ref: (t) => {
|
|
143
|
-
|
|
143
|
+
I.current[o] = t;
|
|
144
144
|
},
|
|
145
145
|
className: `overflow-auto ${i.className || ""}`,
|
|
146
146
|
style: {
|
|
147
|
-
[
|
|
147
|
+
[g ? "width" : "height"]: r ? "0px" : `calc(${d[o]}% - ${(m - 1) * R / m}px)`,
|
|
148
148
|
flexShrink: 0,
|
|
149
149
|
overflow: r ? "hidden" : "auto"
|
|
150
150
|
},
|
|
@@ -156,40 +156,40 @@ const ze = "d-bg-base-300", ge = "d-bg-primary", B = "d-text-base-content", we =
|
|
|
156
156
|
"div",
|
|
157
157
|
{
|
|
158
158
|
role: "separator",
|
|
159
|
-
"aria-orientation":
|
|
160
|
-
"aria-valuenow": Math.round(
|
|
159
|
+
"aria-orientation": g ? "vertical" : "horizontal",
|
|
160
|
+
"aria-valuenow": Math.round(d[o]),
|
|
161
161
|
tabIndex: a ? 0 : -1,
|
|
162
162
|
className: `
|
|
163
|
-
flex-shrink-0
|
|
164
|
-
${a ?
|
|
165
|
-
${a ?
|
|
163
|
+
flex-shrink-0 bg-base-300 transition-colors duration-150 relative group
|
|
164
|
+
${a ? "hover:bg-primary/30 active:bg-primary/50" : ""}
|
|
165
|
+
${a ? g ? "cursor-col-resize" : "cursor-row-resize" : "cursor-default"}
|
|
166
166
|
`,
|
|
167
167
|
style: {
|
|
168
|
-
[
|
|
168
|
+
[g ? "width" : "height"]: `${R}px`
|
|
169
169
|
},
|
|
170
|
-
onMouseDown: (t) =>
|
|
171
|
-
onKeyDown: (t) =>
|
|
170
|
+
onMouseDown: (t) => te(o, t),
|
|
171
|
+
onKeyDown: (t) => oe(o, t),
|
|
172
172
|
children: (() => {
|
|
173
|
-
const { showStart: t, showEnd: l, panel1Collapsed: n, panel2Collapsed: c } =
|
|
174
|
-
return !t && !l ? /* @__PURE__ */
|
|
173
|
+
const { showStart: t, showEnd: l, panel1Collapsed: n, panel2Collapsed: c } = ne(o);
|
|
174
|
+
return !t && !l ? /* @__PURE__ */ K(
|
|
175
175
|
"div",
|
|
176
176
|
{
|
|
177
177
|
className: `
|
|
178
178
|
absolute inset-0 flex items-center justify-center
|
|
179
|
-
${
|
|
179
|
+
${g ? "flex-col gap-0.5" : "flex-row gap-0.5"}
|
|
180
180
|
`,
|
|
181
181
|
children: [
|
|
182
|
-
/* @__PURE__ */ h("div", { className:
|
|
183
|
-
/* @__PURE__ */ h("div", { className:
|
|
184
|
-
/* @__PURE__ */ h("div", { className:
|
|
182
|
+
/* @__PURE__ */ h("div", { className: "w-1 h-1 rounded-full bg-base-content/30 group-hover:bg-primary/60" }),
|
|
183
|
+
/* @__PURE__ */ h("div", { className: "w-1 h-1 rounded-full bg-base-content/30 group-hover:bg-primary/60" }),
|
|
184
|
+
/* @__PURE__ */ h("div", { className: "w-1 h-1 rounded-full bg-base-content/30 group-hover:bg-primary/60" })
|
|
185
185
|
]
|
|
186
186
|
}
|
|
187
|
-
) : /* @__PURE__ */
|
|
187
|
+
) : /* @__PURE__ */ K(
|
|
188
188
|
"div",
|
|
189
189
|
{
|
|
190
190
|
className: `
|
|
191
191
|
absolute inset-0 flex items-center justify-center
|
|
192
|
-
${
|
|
192
|
+
${g ? "flex-col" : "flex-row"}
|
|
193
193
|
`,
|
|
194
194
|
children: [
|
|
195
195
|
t && /* @__PURE__ */ h(
|
|
@@ -197,17 +197,17 @@ const ze = "d-bg-base-300", ge = "d-bg-primary", B = "d-text-base-content", we =
|
|
|
197
197
|
{
|
|
198
198
|
type: "button",
|
|
199
199
|
onClick: (p) => {
|
|
200
|
-
p.stopPropagation(),
|
|
200
|
+
p.stopPropagation(), _(o);
|
|
201
201
|
},
|
|
202
202
|
className: `
|
|
203
|
-
p-0.5
|
|
203
|
+
p-0.5 rounded hover:bg-base-content/20 transition-colors
|
|
204
204
|
|
|
205
205
|
`,
|
|
206
206
|
"aria-label": n ? "Expand panel" : "Collapse panel",
|
|
207
207
|
children: /* @__PURE__ */ h(
|
|
208
208
|
"svg",
|
|
209
209
|
{
|
|
210
|
-
className: `w-3 h-3
|
|
210
|
+
className: `w-3 h-3 text-base-content/50 hover:text-base-content transition-transform ${n ? g ? "rotate-180" : "-rotate-90" : g ? "rotate-0" : "rotate-90"}`,
|
|
211
211
|
fill: "none",
|
|
212
212
|
viewBox: "0 0 24 24",
|
|
213
213
|
stroke: "currentColor",
|
|
@@ -221,16 +221,14 @@ const ze = "d-bg-base-300", ge = "d-bg-primary", B = "d-text-base-content", we =
|
|
|
221
221
|
{
|
|
222
222
|
type: "button",
|
|
223
223
|
onClick: (p) => {
|
|
224
|
-
p.stopPropagation(),
|
|
224
|
+
p.stopPropagation(), _(o + 1);
|
|
225
225
|
},
|
|
226
|
-
className:
|
|
227
|
-
p-0.5 ${ne} ${oe}/20 transition-colors
|
|
228
|
-
`,
|
|
226
|
+
className: "p-0.5 rounded hover:bg-base-content/20 transition-colors",
|
|
229
227
|
"aria-label": c ? "Expand panel" : "Collapse panel",
|
|
230
228
|
children: /* @__PURE__ */ h(
|
|
231
229
|
"svg",
|
|
232
230
|
{
|
|
233
|
-
className: `w-3 h-3
|
|
231
|
+
className: `w-3 h-3 text-base-content/50 hover:text-base-content transition-transform ${c ? g ? "rotate-0" : "rotate-90" : g ? "rotate-180" : "-rotate-90"}`,
|
|
234
232
|
fill: "none",
|
|
235
233
|
viewBox: "0 0 24 24",
|
|
236
234
|
stroke: "currentColor",
|
|
@@ -250,8 +248,8 @@ const ze = "d-bg-base-300", ge = "d-bg-primary", B = "d-text-base-content", we =
|
|
|
250
248
|
}
|
|
251
249
|
);
|
|
252
250
|
};
|
|
253
|
-
|
|
251
|
+
ue.Panel = pe;
|
|
254
252
|
export {
|
|
255
|
-
|
|
253
|
+
ue as Splitter
|
|
256
254
|
};
|
|
257
255
|
//# sourceMappingURL=Splitter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Splitter.js","sources":["../../src/components/Splitter.tsx"],"sourcesContent":["import React, { useState, useRef, useCallback, useEffect } from 'react'\n\n// DaisyUI classes\nconst dBgBase300 = 'd-bg-base-300'\nconst dBgPrimary = 'd-bg-primary'\nconst dTextBaseContent = 'd-text-base-content'\nconst dHoverBgPrimary = 'd-hover:bg-primary'\nconst dHoverTextBaseContent = 'd-hover:text-base-content'\nconst dGroupHoverBgPrimary = 'd-group-hover:bg-primary'\nconst dHoverBgBaseContent = 'd-hover:bg-base-content'\nconst dRounded = 'd-rounded'\nconst dRoundedFull = 'd-rounded-full'\n\nexport interface SplitterPanelProps {\n children: React.ReactNode\n defaultSize?: number\n size?: number\n minSize?: number\n maxSize?: number\n collapsible?: boolean\n collapsed?: boolean\n defaultCollapsed?: boolean\n onCollapse?: (collapsed: boolean) => void\n resizable?: boolean\n className?: string\n}\n\nexport interface SplitterProps {\n children: React.ReactNode\n direction?: 'horizontal' | 'vertical'\n sizes?: number[]\n defaultSizes?: number[]\n onSizesChange?: (sizes: number[]) => void\n gutterSize?: number\n minSize?: number\n className?: string\n}\n\nconst Panel: React.FC<SplitterPanelProps> = ({ children }) => {\n return <>{children}</>\n}\n\nexport const Splitter: React.FC<SplitterProps> & { Panel: typeof Panel } = ({\n children,\n direction = 'horizontal',\n sizes,\n defaultSizes,\n onSizesChange,\n gutterSize = 8,\n minSize = 50,\n className = '',\n}) => {\n const containerRef = useRef<HTMLDivElement>(null)\n const panelsRef = useRef<(HTMLDivElement | null)[]>([])\n const draggingRef = useRef<{ index: number; startPos: number; startSizes: number[] } | null>(null)\n\n // Extract panel props from children\n const panels = React.Children.toArray(children).filter(\n (child): child is React.ReactElement<SplitterPanelProps> =>\n React.isValidElement(child)\n )\n\n const panelCount = panels.length\n\n // Track collapsed state for each panel\n const [collapsedStates, setCollapsedStates] = useState<boolean[]>(() =>\n panels.map((panel) => panel.props.defaultCollapsed ?? panel.props.collapsed ?? false)\n )\n\n // Store sizes before collapse for restoration\n const sizesBeforeCollapseRef = useRef<number[]>([])\n\n // Initialize sizes from panel props or defaults\n const getInitialSizes = useCallback(() => {\n // First check if any panels have defaultSize\n const panelDefaultSizes = panels.map((panel) => panel.props.defaultSize)\n const hasAnyPanelSize = panelDefaultSizes.some((s) => s !== undefined)\n\n if (defaultSizes && defaultSizes.length === panelCount) {\n return defaultSizes\n }\n\n if (hasAnyPanelSize) {\n // Calculate sizes from panel props\n const definedTotal = panelDefaultSizes.reduce<number>((sum, s) => sum + (s ?? 0), 0)\n const undefinedCount = panelDefaultSizes.filter((s) => s === undefined).length\n const remainingSize = Math.max(0, 100 - definedTotal)\n const sizePerUndefined = undefinedCount > 0 ? remainingSize / undefinedCount : 0\n\n return panelDefaultSizes.map((s) => s ?? sizePerUndefined)\n }\n\n // Equal distribution\n const equalSize = 100 / panelCount\n return Array(panelCount).fill(equalSize)\n }, [defaultSizes, panelCount, panels])\n\n const [internalSizes, setInternalSizes] = useState<number[]>(getInitialSizes)\n\n // Handle controlled sizes from panel props\n const getControlledSizes = useCallback(() => {\n const panelSizes = panels.map((panel) => panel.props.size)\n const hasControlledPanel = panelSizes.some((s) => s !== undefined)\n\n if (!hasControlledPanel) return null\n\n // Mix controlled and uncontrolled\n const definedTotal = panelSizes.reduce<number>((sum, s) => sum + (s ?? 0), 0)\n const undefinedCount = panelSizes.filter((s) => s === undefined).length\n const remainingSize = Math.max(0, 100 - definedTotal)\n const sizePerUndefined = undefinedCount > 0 ? remainingSize / undefinedCount : 0\n\n return panelSizes.map((s, i) => s ?? internalSizes[i] ?? sizePerUndefined)\n }, [panels, internalSizes])\n\n const currentSizes = sizes || getControlledSizes() || internalSizes\n\n // Update internal sizes when panel count changes\n useEffect(() => {\n if (!sizes && internalSizes.length !== panelCount) {\n setInternalSizes(getInitialSizes())\n }\n }, [panelCount, sizes, internalSizes.length, getInitialSizes])\n\n // Sync controlled collapsed states from props\n useEffect(() => {\n const newCollapsedStates = panels.map((panel, i) =>\n panel.props.collapsed ?? collapsedStates[i] ?? false\n )\n const hasChange = newCollapsedStates.some((s, i) => s !== collapsedStates[i])\n if (hasChange) {\n setCollapsedStates(newCollapsedStates)\n }\n }, [panels.map(p => p.props.collapsed).join(',')])\n\n const updateSizes = useCallback(\n (newSizes: number[]) => {\n if (!sizes) {\n setInternalSizes(newSizes)\n }\n onSizesChange?.(newSizes)\n },\n [sizes, onSizesChange]\n )\n\n const toggleCollapse = useCallback(\n (panelIndex: number) => {\n const panel = panels[panelIndex]\n if (!panel?.props.collapsible) return\n\n const isCurrentlyCollapsed = collapsedStates[panelIndex]\n const newCollapsed = !isCurrentlyCollapsed\n\n // Update collapsed state\n const newCollapsedStates = [...collapsedStates]\n newCollapsedStates[panelIndex] = newCollapsed\n setCollapsedStates(newCollapsedStates)\n\n // Call panel's onCollapse callback\n panel.props.onCollapse?.(newCollapsed)\n\n // Adjust sizes\n if (newCollapsed) {\n // Store current sizes before collapse\n sizesBeforeCollapseRef.current = [...currentSizes]\n\n // Collapse: set to minimum (we'll use 0 for collapsed)\n const collapsedSize = 0\n const sizeToRedistribute = currentSizes[panelIndex] - collapsedSize\n\n // Find panels that can receive the size\n const otherPanels = currentSizes\n .map((s, i) => ({ size: s, index: i }))\n .filter((_, i) => i !== panelIndex && !newCollapsedStates[i])\n\n if (otherPanels.length > 0) {\n const sizePerPanel = sizeToRedistribute / otherPanels.length\n const newSizes = currentSizes.map((s, i) => {\n if (i === panelIndex) return collapsedSize\n if (!newCollapsedStates[i]) return s + sizePerPanel\n return s\n })\n updateSizes(newSizes)\n }\n } else {\n // Expand: restore previous size\n const previousSize = sizesBeforeCollapseRef.current[panelIndex] || (100 / panelCount)\n\n // Take size from other panels proportionally\n const otherPanels = currentSizes\n .map((s, i) => ({ size: s, index: i }))\n .filter((_, i) => i !== panelIndex && !newCollapsedStates[i])\n\n const totalOtherSize = otherPanels.reduce((sum, p) => sum + p.size, 0)\n\n if (totalOtherSize > 0) {\n const newSizes = currentSizes.map((s, i) => {\n if (i === panelIndex) return previousSize\n if (!newCollapsedStates[i]) {\n const proportion = s / totalOtherSize\n return s - previousSize * proportion\n }\n return s\n })\n updateSizes(newSizes)\n }\n }\n },\n [panels, collapsedStates, currentSizes, panelCount, updateSizes]\n )\n\n const handleMouseDown = useCallback(\n (index: number, e: React.MouseEvent) => {\n // Check if either panel is non-resizable\n const panel1Props = panels[index]?.props || {}\n const panel2Props = panels[index + 1]?.props || {}\n\n if (panel1Props.resizable === false || panel2Props.resizable === false) {\n return // Don't allow dragging\n }\n\n // Don't allow dragging if either panel is collapsed\n if (collapsedStates[index] || collapsedStates[index + 1]) {\n return\n }\n\n e.preventDefault()\n const startPos = direction === 'horizontal' ? e.clientX : e.clientY\n draggingRef.current = {\n index,\n startPos,\n startSizes: [...currentSizes],\n }\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n if (!draggingRef.current || !containerRef.current) return\n\n const { index: dragIndex, startPos: dragStartPos, startSizes } = draggingRef.current\n const containerRect = containerRef.current.getBoundingClientRect()\n const containerSize = direction === 'horizontal' ? containerRect.width : containerRect.height\n const currentPos = direction === 'horizontal' ? moveEvent.clientX : moveEvent.clientY\n\n // Calculate delta as percentage\n const gutterCount = panelCount - 1\n const totalGutterSize = gutterCount * gutterSize\n const availableSize = containerSize - totalGutterSize\n const deltaPixels = currentPos - dragStartPos\n const deltaPercent = (deltaPixels / availableSize) * 100\n\n // Get min sizes for panels\n const panel1Props = panels[dragIndex]?.props || {}\n const panel2Props = panels[dragIndex + 1]?.props || {}\n const minSize1 = panel1Props.minSize ?? minSize\n const minSize2 = panel2Props.minSize ?? minSize\n const minPercent1 = (minSize1 / availableSize) * 100\n const minPercent2 = (minSize2 / availableSize) * 100\n\n // Calculate new sizes\n let newSize1 = startSizes[dragIndex] + deltaPercent\n let newSize2 = startSizes[dragIndex + 1] - deltaPercent\n\n // Apply min constraints\n if (newSize1 < minPercent1) {\n newSize1 = minPercent1\n newSize2 = startSizes[dragIndex] + startSizes[dragIndex + 1] - minPercent1\n }\n if (newSize2 < minPercent2) {\n newSize2 = minPercent2\n newSize1 = startSizes[dragIndex] + startSizes[dragIndex + 1] - minPercent2\n }\n\n // Apply max constraints\n const maxSize1 = panel1Props.maxSize\n const maxSize2 = panel2Props.maxSize\n if (maxSize1) {\n const maxPercent1 = (maxSize1 / availableSize) * 100\n if (newSize1 > maxPercent1) {\n newSize1 = maxPercent1\n newSize2 = startSizes[dragIndex] + startSizes[dragIndex + 1] - maxPercent1\n }\n }\n if (maxSize2) {\n const maxPercent2 = (maxSize2 / availableSize) * 100\n if (newSize2 > maxPercent2) {\n newSize2 = maxPercent2\n newSize1 = startSizes[dragIndex] + startSizes[dragIndex + 1] - maxPercent2\n }\n }\n\n const newSizes = [...startSizes]\n newSizes[dragIndex] = newSize1\n newSizes[dragIndex + 1] = newSize2\n updateSizes(newSizes)\n }\n\n const handleMouseUp = () => {\n draggingRef.current = null\n document.removeEventListener('mousemove', handleMouseMove)\n document.removeEventListener('mouseup', handleMouseUp)\n document.body.style.cursor = ''\n document.body.style.userSelect = ''\n }\n\n document.addEventListener('mousemove', handleMouseMove)\n document.addEventListener('mouseup', handleMouseUp)\n document.body.style.cursor = direction === 'horizontal' ? 'col-resize' : 'row-resize'\n document.body.style.userSelect = 'none'\n },\n [direction, currentSizes, panelCount, gutterSize, panels, minSize, updateSizes, collapsedStates]\n )\n\n const handleKeyDown = useCallback(\n (index: number, e: React.KeyboardEvent) => {\n // Don't allow keyboard resize if either panel is collapsed\n if (collapsedStates[index] || collapsedStates[index + 1]) {\n return\n }\n\n const step = e.shiftKey ? 10 : 1\n let delta = 0\n\n if (direction === 'horizontal') {\n if (e.key === 'ArrowLeft') delta = -step\n else if (e.key === 'ArrowRight') delta = step\n } else {\n if (e.key === 'ArrowUp') delta = -step\n else if (e.key === 'ArrowDown') delta = step\n }\n\n if (delta !== 0) {\n e.preventDefault()\n const newSizes = [...currentSizes]\n const minPercent = 5 // Minimum 5% when using keyboard\n\n let newSize1 = newSizes[index] + delta\n let newSize2 = newSizes[index + 1] - delta\n\n if (newSize1 >= minPercent && newSize2 >= minPercent) {\n newSizes[index] = newSize1\n newSizes[index + 1] = newSize2\n updateSizes(newSizes)\n }\n }\n },\n [direction, currentSizes, updateSizes, collapsedStates]\n )\n\n const isHorizontal = direction === 'horizontal'\n\n // Determine if gutter should show collapse buttons\n const getCollapseConfig = (index: number) => {\n const panel1 = panels[index]\n const panel2 = panels[index + 1]\n const panel1Collapsible = panel1?.props.collapsible\n const panel2Collapsible = panel2?.props.collapsible\n const panel1Collapsed = collapsedStates[index]\n const panel2Collapsed = collapsedStates[index + 1]\n\n return {\n showStart: panel1Collapsible && !panel2Collapsed,\n showEnd: panel2Collapsible && !panel1Collapsed,\n panel1Collapsed,\n panel2Collapsed,\n }\n }\n\n return (\n <div\n ref={containerRef}\n className={`flex ${isHorizontal ? 'flex-row' : 'flex-col'} h-full w-full ${className}`}\n >\n {panels.map((panel, index) => {\n const panelProps = panel.props\n const isLast = index === panels.length - 1\n const isCollapsed = collapsedStates[index]\n const canResize = panelProps.resizable !== false && !isCollapsed\n\n return (\n <React.Fragment key={index}>\n <div\n ref={(el) => {\n panelsRef.current[index] = el\n }}\n className={`overflow-auto ${panelProps.className || ''}`}\n style={{\n [isHorizontal ? 'width' : 'height']: isCollapsed\n ? '0px'\n : `calc(${currentSizes[index]}% - ${((panelCount - 1) * gutterSize) / panelCount}px)`,\n flexShrink: 0,\n overflow: isCollapsed ? 'hidden' : 'auto',\n }}\n data-collapsed={isCollapsed}\n >\n {panelProps.children}\n </div>\n {!isLast && (\n <div\n role=\"separator\"\n aria-orientation={isHorizontal ? 'vertical' : 'horizontal'}\n aria-valuenow={Math.round(currentSizes[index])}\n tabIndex={canResize ? 0 : -1}\n className={`\n flex-shrink-0 ${dBgBase300} transition-colors duration-150 relative group\n ${canResize ? `${dHoverBgPrimary}/30 active:${dBgPrimary}/50` : ''}\n ${canResize ? (isHorizontal ? 'cursor-col-resize' : 'cursor-row-resize') : 'cursor-default'}\n `}\n style={{\n [isHorizontal ? 'width' : 'height']: `${gutterSize}px`,\n }}\n onMouseDown={(e) => handleMouseDown(index, e)}\n onKeyDown={(e) => handleKeyDown(index, e)}\n >\n {/* Collapse buttons */}\n {(() => {\n const { showStart, showEnd, panel1Collapsed, panel2Collapsed } = getCollapseConfig(index)\n\n if (!showStart && !showEnd) {\n // Just show grip indicator\n return (\n <div\n className={`\n absolute inset-0 flex items-center justify-center\n ${isHorizontal ? 'flex-col gap-0.5' : 'flex-row gap-0.5'}\n `}\n >\n <div className={`w-1 h-1 ${dRoundedFull} ${dTextBaseContent}/30 ${dGroupHoverBgPrimary}/60`} />\n <div className={`w-1 h-1 ${dRoundedFull} ${dTextBaseContent}/30 ${dGroupHoverBgPrimary}/60`} />\n <div className={`w-1 h-1 ${dRoundedFull} ${dTextBaseContent}/30 ${dGroupHoverBgPrimary}/60`} />\n </div>\n )\n }\n\n return (\n <div\n className={`\n absolute inset-0 flex items-center justify-center\n ${isHorizontal ? 'flex-col' : 'flex-row'}\n `}\n >\n {showStart && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n toggleCollapse(index)\n }}\n className={`\n p-0.5 ${dRounded} ${dHoverBgBaseContent}/20 transition-colors\n ${isHorizontal ? '' : ''}\n `}\n aria-label={panel1Collapsed ? 'Expand panel' : 'Collapse panel'}\n >\n <svg\n className={`w-3 h-3 ${dTextBaseContent}/50 ${dHoverTextBaseContent} transition-transform ${\n panel1Collapsed\n ? isHorizontal ? 'rotate-180' : '-rotate-90'\n : isHorizontal ? 'rotate-0' : 'rotate-90'\n }`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n )}\n {showEnd && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n toggleCollapse(index + 1)\n }}\n className={`\n p-0.5 ${dRounded} ${dHoverBgBaseContent}/20 transition-colors\n `}\n aria-label={panel2Collapsed ? 'Expand panel' : 'Collapse panel'}\n >\n <svg\n className={`w-3 h-3 ${dTextBaseContent}/50 ${dHoverTextBaseContent} transition-transform ${\n panel2Collapsed\n ? isHorizontal ? 'rotate-0' : 'rotate-90'\n : isHorizontal ? 'rotate-180' : '-rotate-90'\n }`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n )}\n </div>\n )\n })()}\n </div>\n )}\n </React.Fragment>\n )\n })}\n </div>\n )\n}\n\nSplitter.Panel = Panel\n"],"names":["dBgBase300","dBgPrimary","dTextBaseContent","dHoverBgPrimary","dHoverTextBaseContent","dGroupHoverBgPrimary","dHoverBgBaseContent","dRounded","dRoundedFull","Panel","children","Splitter","direction","sizes","defaultSizes","onSizesChange","gutterSize","minSize","className","containerRef","useRef","panelsRef","draggingRef","panels","React","child","panelCount","collapsedStates","setCollapsedStates","useState","panel","sizesBeforeCollapseRef","getInitialSizes","useCallback","panelDefaultSizes","hasAnyPanelSize","definedTotal","sum","s","undefinedCount","remainingSize","sizePerUndefined","equalSize","internalSizes","setInternalSizes","getControlledSizes","panelSizes","i","currentSizes","useEffect","newCollapsedStates","p","updateSizes","newSizes","toggleCollapse","panelIndex","newCollapsed","collapsedSize","sizeToRedistribute","otherPanels","_","sizePerPanel","previousSize","totalOtherSize","proportion","handleMouseDown","index","e","panel1Props","panel2Props","startPos","handleMouseMove","moveEvent","dragIndex","dragStartPos","startSizes","containerRect","containerSize","currentPos","totalGutterSize","availableSize","deltaPercent","minSize1","minSize2","minPercent1","minPercent2","newSize1","newSize2","maxSize1","maxSize2","maxPercent1","maxPercent2","handleMouseUp","handleKeyDown","step","delta","minPercent","isHorizontal","getCollapseConfig","panel1","panel2","panel1Collapsible","panel2Collapsible","panel1Collapsed","panel2Collapsed","jsx","panelProps","isLast","isCollapsed","canResize","jsxs","el","showStart","showEnd"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Splitter.js","sources":["../../src/components/Splitter.tsx"],"sourcesContent":["import React, { useState, useRef, useCallback, useEffect } from 'react'\n\nexport interface SplitterPanelProps {\n children: React.ReactNode\n defaultSize?: number\n size?: number\n minSize?: number\n maxSize?: number\n collapsible?: boolean\n collapsed?: boolean\n defaultCollapsed?: boolean\n onCollapse?: (collapsed: boolean) => void\n resizable?: boolean\n className?: string\n}\n\nexport interface SplitterProps {\n children: React.ReactNode\n direction?: 'horizontal' | 'vertical'\n sizes?: number[]\n defaultSizes?: number[]\n onSizesChange?: (sizes: number[]) => void\n gutterSize?: number\n minSize?: number\n className?: string\n}\n\nconst Panel: React.FC<SplitterPanelProps> = ({ children }) => {\n return <>{children}</>\n}\n\nexport const Splitter: React.FC<SplitterProps> & { Panel: typeof Panel } = ({\n children,\n direction = 'horizontal',\n sizes,\n defaultSizes,\n onSizesChange,\n gutterSize = 8,\n minSize = 50,\n className = '',\n}) => {\n const containerRef = useRef<HTMLDivElement>(null)\n const panelsRef = useRef<(HTMLDivElement | null)[]>([])\n const draggingRef = useRef<{ index: number; startPos: number; startSizes: number[] } | null>(null)\n\n // Extract panel props from children\n const panels = React.Children.toArray(children).filter(\n (child): child is React.ReactElement<SplitterPanelProps> =>\n React.isValidElement(child)\n )\n\n const panelCount = panels.length\n\n // Track collapsed state for each panel\n const [collapsedStates, setCollapsedStates] = useState<boolean[]>(() =>\n panels.map((panel) => panel.props.defaultCollapsed ?? panel.props.collapsed ?? false)\n )\n\n // Store sizes before collapse for restoration\n const sizesBeforeCollapseRef = useRef<number[]>([])\n\n // Initialize sizes from panel props or defaults\n const getInitialSizes = useCallback(() => {\n // First check if any panels have defaultSize\n const panelDefaultSizes = panels.map((panel) => panel.props.defaultSize)\n const hasAnyPanelSize = panelDefaultSizes.some((s) => s !== undefined)\n\n if (defaultSizes && defaultSizes.length === panelCount) {\n return defaultSizes\n }\n\n if (hasAnyPanelSize) {\n // Calculate sizes from panel props\n const definedTotal = panelDefaultSizes.reduce<number>((sum, s) => sum + (s ?? 0), 0)\n const undefinedCount = panelDefaultSizes.filter((s) => s === undefined).length\n const remainingSize = Math.max(0, 100 - definedTotal)\n const sizePerUndefined = undefinedCount > 0 ? remainingSize / undefinedCount : 0\n\n return panelDefaultSizes.map((s) => s ?? sizePerUndefined)\n }\n\n // Equal distribution\n const equalSize = 100 / panelCount\n return Array(panelCount).fill(equalSize)\n }, [defaultSizes, panelCount, panels])\n\n const [internalSizes, setInternalSizes] = useState<number[]>(getInitialSizes)\n\n // Handle controlled sizes from panel props\n const getControlledSizes = useCallback(() => {\n const panelSizes = panels.map((panel) => panel.props.size)\n const hasControlledPanel = panelSizes.some((s) => s !== undefined)\n\n if (!hasControlledPanel) return null\n\n // Mix controlled and uncontrolled\n const definedTotal = panelSizes.reduce<number>((sum, s) => sum + (s ?? 0), 0)\n const undefinedCount = panelSizes.filter((s) => s === undefined).length\n const remainingSize = Math.max(0, 100 - definedTotal)\n const sizePerUndefined = undefinedCount > 0 ? remainingSize / undefinedCount : 0\n\n return panelSizes.map((s, i) => s ?? internalSizes[i] ?? sizePerUndefined)\n }, [panels, internalSizes])\n\n const currentSizes = sizes || getControlledSizes() || internalSizes\n\n // Update internal sizes when panel count changes\n useEffect(() => {\n if (!sizes && internalSizes.length !== panelCount) {\n setInternalSizes(getInitialSizes())\n }\n }, [panelCount, sizes, internalSizes.length, getInitialSizes])\n\n // Sync controlled collapsed states from props\n useEffect(() => {\n const newCollapsedStates = panels.map((panel, i) =>\n panel.props.collapsed ?? collapsedStates[i] ?? false\n )\n const hasChange = newCollapsedStates.some((s, i) => s !== collapsedStates[i])\n if (hasChange) {\n setCollapsedStates(newCollapsedStates)\n }\n }, [panels.map(p => p.props.collapsed).join(',')])\n\n const updateSizes = useCallback(\n (newSizes: number[]) => {\n if (!sizes) {\n setInternalSizes(newSizes)\n }\n onSizesChange?.(newSizes)\n },\n [sizes, onSizesChange]\n )\n\n const toggleCollapse = useCallback(\n (panelIndex: number) => {\n const panel = panels[panelIndex]\n if (!panel?.props.collapsible) return\n\n const isCurrentlyCollapsed = collapsedStates[panelIndex]\n const newCollapsed = !isCurrentlyCollapsed\n\n // Update collapsed state\n const newCollapsedStates = [...collapsedStates]\n newCollapsedStates[panelIndex] = newCollapsed\n setCollapsedStates(newCollapsedStates)\n\n // Call panel's onCollapse callback\n panel.props.onCollapse?.(newCollapsed)\n\n // Adjust sizes\n if (newCollapsed) {\n // Store current sizes before collapse\n sizesBeforeCollapseRef.current = [...currentSizes]\n\n // Collapse: set to minimum (we'll use 0 for collapsed)\n const collapsedSize = 0\n const sizeToRedistribute = currentSizes[panelIndex] - collapsedSize\n\n // Find panels that can receive the size\n const otherPanels = currentSizes\n .map((s, i) => ({ size: s, index: i }))\n .filter((_, i) => i !== panelIndex && !newCollapsedStates[i])\n\n if (otherPanels.length > 0) {\n const sizePerPanel = sizeToRedistribute / otherPanels.length\n const newSizes = currentSizes.map((s, i) => {\n if (i === panelIndex) return collapsedSize\n if (!newCollapsedStates[i]) return s + sizePerPanel\n return s\n })\n updateSizes(newSizes)\n }\n } else {\n // Expand: restore previous size\n const previousSize = sizesBeforeCollapseRef.current[panelIndex] || (100 / panelCount)\n\n // Take size from other panels proportionally\n const otherPanels = currentSizes\n .map((s, i) => ({ size: s, index: i }))\n .filter((_, i) => i !== panelIndex && !newCollapsedStates[i])\n\n const totalOtherSize = otherPanels.reduce((sum, p) => sum + p.size, 0)\n\n if (totalOtherSize > 0) {\n const newSizes = currentSizes.map((s, i) => {\n if (i === panelIndex) return previousSize\n if (!newCollapsedStates[i]) {\n const proportion = s / totalOtherSize\n return s - previousSize * proportion\n }\n return s\n })\n updateSizes(newSizes)\n }\n }\n },\n [panels, collapsedStates, currentSizes, panelCount, updateSizes]\n )\n\n const handleMouseDown = useCallback(\n (index: number, e: React.MouseEvent) => {\n // Check if either panel is non-resizable\n const panel1Props = panels[index]?.props || {}\n const panel2Props = panels[index + 1]?.props || {}\n\n if (panel1Props.resizable === false || panel2Props.resizable === false) {\n return // Don't allow dragging\n }\n\n // Don't allow dragging if either panel is collapsed\n if (collapsedStates[index] || collapsedStates[index + 1]) {\n return\n }\n\n e.preventDefault()\n const startPos = direction === 'horizontal' ? e.clientX : e.clientY\n draggingRef.current = {\n index,\n startPos,\n startSizes: [...currentSizes],\n }\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n if (!draggingRef.current || !containerRef.current) return\n\n const { index: dragIndex, startPos: dragStartPos, startSizes } = draggingRef.current\n const containerRect = containerRef.current.getBoundingClientRect()\n const containerSize = direction === 'horizontal' ? containerRect.width : containerRect.height\n const currentPos = direction === 'horizontal' ? moveEvent.clientX : moveEvent.clientY\n\n // Calculate delta as percentage\n const gutterCount = panelCount - 1\n const totalGutterSize = gutterCount * gutterSize\n const availableSize = containerSize - totalGutterSize\n const deltaPixels = currentPos - dragStartPos\n const deltaPercent = (deltaPixels / availableSize) * 100\n\n // Get min sizes for panels\n const panel1Props = panels[dragIndex]?.props || {}\n const panel2Props = panels[dragIndex + 1]?.props || {}\n const minSize1 = panel1Props.minSize ?? minSize\n const minSize2 = panel2Props.minSize ?? minSize\n const minPercent1 = (minSize1 / availableSize) * 100\n const minPercent2 = (minSize2 / availableSize) * 100\n\n // Calculate new sizes\n let newSize1 = startSizes[dragIndex] + deltaPercent\n let newSize2 = startSizes[dragIndex + 1] - deltaPercent\n\n // Apply min constraints\n if (newSize1 < minPercent1) {\n newSize1 = minPercent1\n newSize2 = startSizes[dragIndex] + startSizes[dragIndex + 1] - minPercent1\n }\n if (newSize2 < minPercent2) {\n newSize2 = minPercent2\n newSize1 = startSizes[dragIndex] + startSizes[dragIndex + 1] - minPercent2\n }\n\n // Apply max constraints\n const maxSize1 = panel1Props.maxSize\n const maxSize2 = panel2Props.maxSize\n if (maxSize1) {\n const maxPercent1 = (maxSize1 / availableSize) * 100\n if (newSize1 > maxPercent1) {\n newSize1 = maxPercent1\n newSize2 = startSizes[dragIndex] + startSizes[dragIndex + 1] - maxPercent1\n }\n }\n if (maxSize2) {\n const maxPercent2 = (maxSize2 / availableSize) * 100\n if (newSize2 > maxPercent2) {\n newSize2 = maxPercent2\n newSize1 = startSizes[dragIndex] + startSizes[dragIndex + 1] - maxPercent2\n }\n }\n\n const newSizes = [...startSizes]\n newSizes[dragIndex] = newSize1\n newSizes[dragIndex + 1] = newSize2\n updateSizes(newSizes)\n }\n\n const handleMouseUp = () => {\n draggingRef.current = null\n document.removeEventListener('mousemove', handleMouseMove)\n document.removeEventListener('mouseup', handleMouseUp)\n document.body.style.cursor = ''\n document.body.style.userSelect = ''\n }\n\n document.addEventListener('mousemove', handleMouseMove)\n document.addEventListener('mouseup', handleMouseUp)\n document.body.style.cursor = direction === 'horizontal' ? 'col-resize' : 'row-resize'\n document.body.style.userSelect = 'none'\n },\n [direction, currentSizes, panelCount, gutterSize, panels, minSize, updateSizes, collapsedStates]\n )\n\n const handleKeyDown = useCallback(\n (index: number, e: React.KeyboardEvent) => {\n // Don't allow keyboard resize if either panel is collapsed\n if (collapsedStates[index] || collapsedStates[index + 1]) {\n return\n }\n\n const step = e.shiftKey ? 10 : 1\n let delta = 0\n\n if (direction === 'horizontal') {\n if (e.key === 'ArrowLeft') delta = -step\n else if (e.key === 'ArrowRight') delta = step\n } else {\n if (e.key === 'ArrowUp') delta = -step\n else if (e.key === 'ArrowDown') delta = step\n }\n\n if (delta !== 0) {\n e.preventDefault()\n const newSizes = [...currentSizes]\n const minPercent = 5 // Minimum 5% when using keyboard\n\n let newSize1 = newSizes[index] + delta\n let newSize2 = newSizes[index + 1] - delta\n\n if (newSize1 >= minPercent && newSize2 >= minPercent) {\n newSizes[index] = newSize1\n newSizes[index + 1] = newSize2\n updateSizes(newSizes)\n }\n }\n },\n [direction, currentSizes, updateSizes, collapsedStates]\n )\n\n const isHorizontal = direction === 'horizontal'\n\n // Determine if gutter should show collapse buttons\n const getCollapseConfig = (index: number) => {\n const panel1 = panels[index]\n const panel2 = panels[index + 1]\n const panel1Collapsible = panel1?.props.collapsible\n const panel2Collapsible = panel2?.props.collapsible\n const panel1Collapsed = collapsedStates[index]\n const panel2Collapsed = collapsedStates[index + 1]\n\n return {\n showStart: panel1Collapsible && !panel2Collapsed,\n showEnd: panel2Collapsible && !panel1Collapsed,\n panel1Collapsed,\n panel2Collapsed,\n }\n }\n\n return (\n <div\n ref={containerRef}\n className={`flex ${isHorizontal ? 'flex-row' : 'flex-col'} h-full w-full ${className}`}\n >\n {panels.map((panel, index) => {\n const panelProps = panel.props\n const isLast = index === panels.length - 1\n const isCollapsed = collapsedStates[index]\n const canResize = panelProps.resizable !== false && !isCollapsed\n\n return (\n <React.Fragment key={index}>\n <div\n ref={(el) => {\n panelsRef.current[index] = el\n }}\n className={`overflow-auto ${panelProps.className || ''}`}\n style={{\n [isHorizontal ? 'width' : 'height']: isCollapsed\n ? '0px'\n : `calc(${currentSizes[index]}% - ${((panelCount - 1) * gutterSize) / panelCount}px)`,\n flexShrink: 0,\n overflow: isCollapsed ? 'hidden' : 'auto',\n }}\n data-collapsed={isCollapsed}\n >\n {panelProps.children}\n </div>\n {!isLast && (\n <div\n role=\"separator\"\n aria-orientation={isHorizontal ? 'vertical' : 'horizontal'}\n aria-valuenow={Math.round(currentSizes[index])}\n tabIndex={canResize ? 0 : -1}\n className={`\n flex-shrink-0 bg-base-300 transition-colors duration-150 relative group\n ${canResize ? 'hover:bg-primary/30 active:bg-primary/50' : ''}\n ${canResize ? (isHorizontal ? 'cursor-col-resize' : 'cursor-row-resize') : 'cursor-default'}\n `}\n style={{\n [isHorizontal ? 'width' : 'height']: `${gutterSize}px`,\n }}\n onMouseDown={(e) => handleMouseDown(index, e)}\n onKeyDown={(e) => handleKeyDown(index, e)}\n >\n {/* Collapse buttons */}\n {(() => {\n const { showStart, showEnd, panel1Collapsed, panel2Collapsed } = getCollapseConfig(index)\n\n if (!showStart && !showEnd) {\n // Just show grip indicator\n return (\n <div\n className={`\n absolute inset-0 flex items-center justify-center\n ${isHorizontal ? 'flex-col gap-0.5' : 'flex-row gap-0.5'}\n `}\n >\n <div className=\"w-1 h-1 rounded-full bg-base-content/30 group-hover:bg-primary/60\" />\n <div className=\"w-1 h-1 rounded-full bg-base-content/30 group-hover:bg-primary/60\" />\n <div className=\"w-1 h-1 rounded-full bg-base-content/30 group-hover:bg-primary/60\" />\n </div>\n )\n }\n\n return (\n <div\n className={`\n absolute inset-0 flex items-center justify-center\n ${isHorizontal ? 'flex-col' : 'flex-row'}\n `}\n >\n {showStart && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n toggleCollapse(index)\n }}\n className={`\n p-0.5 rounded hover:bg-base-content/20 transition-colors\n ${isHorizontal ? '' : ''}\n `}\n aria-label={panel1Collapsed ? 'Expand panel' : 'Collapse panel'}\n >\n <svg\n className={`w-3 h-3 text-base-content/50 hover:text-base-content transition-transform ${\n panel1Collapsed\n ? isHorizontal ? 'rotate-180' : '-rotate-90'\n : isHorizontal ? 'rotate-0' : 'rotate-90'\n }`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n )}\n {showEnd && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n toggleCollapse(index + 1)\n }}\n className=\"p-0.5 rounded hover:bg-base-content/20 transition-colors\"\n aria-label={panel2Collapsed ? 'Expand panel' : 'Collapse panel'}\n >\n <svg\n className={`w-3 h-3 text-base-content/50 hover:text-base-content transition-transform ${\n panel2Collapsed\n ? isHorizontal ? 'rotate-0' : 'rotate-90'\n : isHorizontal ? 'rotate-180' : '-rotate-90'\n }`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n )}\n </div>\n )\n })()}\n </div>\n )}\n </React.Fragment>\n )\n })}\n </div>\n )\n}\n\nSplitter.Panel = Panel\n"],"names":["Panel","children","Splitter","direction","sizes","defaultSizes","onSizesChange","gutterSize","minSize","className","containerRef","useRef","panelsRef","draggingRef","panels","React","child","panelCount","collapsedStates","setCollapsedStates","useState","panel","sizesBeforeCollapseRef","getInitialSizes","useCallback","panelDefaultSizes","hasAnyPanelSize","definedTotal","sum","s","undefinedCount","remainingSize","sizePerUndefined","equalSize","internalSizes","setInternalSizes","getControlledSizes","panelSizes","i","currentSizes","useEffect","newCollapsedStates","p","updateSizes","newSizes","toggleCollapse","panelIndex","newCollapsed","collapsedSize","sizeToRedistribute","otherPanels","_","sizePerPanel","previousSize","totalOtherSize","proportion","handleMouseDown","index","e","panel1Props","panel2Props","startPos","handleMouseMove","moveEvent","dragIndex","dragStartPos","startSizes","containerRect","containerSize","currentPos","totalGutterSize","availableSize","deltaPercent","minSize1","minSize2","minPercent1","minPercent2","newSize1","newSize2","maxSize1","maxSize2","maxPercent1","maxPercent2","handleMouseUp","handleKeyDown","step","delta","minPercent","isHorizontal","getCollapseConfig","panel1","panel2","panel1Collapsible","panel2Collapsible","panel1Collapsed","panel2Collapsed","jsx","panelProps","isLast","isCollapsed","canResize","jsxs","el","showStart","showEnd"],"mappings":"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"}
|