@evinvest/uikit 0.19.0 → 0.21.0
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/README.md +17 -5
- package/dist/components/accordion.js +136 -0
- package/dist/components/accordion.js.map +1 -0
- package/dist/components/alert-dialog.js +175 -0
- package/dist/components/alert-dialog.js.map +1 -0
- package/dist/components/alert.js +49 -0
- package/dist/components/alert.js.map +1 -0
- package/dist/components/avatar.js +54 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/badge.js +25 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/band.js +75 -0
- package/dist/components/band.js.map +1 -0
- package/dist/components/breadcrumb.js +132 -0
- package/dist/components/breadcrumb.js.map +1 -0
- package/dist/components/button-group.js +61 -0
- package/dist/components/button-group.js.map +1 -0
- package/dist/components/button.js +55 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/calendar.js +226 -0
- package/dist/components/calendar.js.map +1 -0
- package/dist/components/card.js +98 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/carousel.js +262 -0
- package/dist/components/carousel.js.map +1 -0
- package/dist/components/chart.js +151 -0
- package/dist/components/chart.js.map +1 -0
- package/dist/components/checkbox.js +68 -0
- package/dist/components/checkbox.js.map +1 -0
- package/dist/components/collapsible.js +60 -0
- package/dist/components/collapsible.js.map +1 -0
- package/dist/components/command.js +274 -0
- package/dist/components/command.js.map +1 -0
- package/dist/components/container.js +18 -0
- package/dist/components/container.js.map +1 -0
- package/dist/components/context-menu.js +337 -0
- package/dist/components/context-menu.js.map +1 -0
- package/dist/components/date-time-picker.js +301 -0
- package/dist/components/date-time-picker.js.map +1 -0
- package/dist/components/dialog.js +207 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/drawer.js +351 -0
- package/dist/components/drawer.js.map +1 -0
- package/dist/components/dropdown-menu.js +356 -0
- package/dist/components/dropdown-menu.js.map +1 -0
- package/dist/components/empty.js +91 -0
- package/dist/components/empty.js.map +1 -0
- package/dist/components/field-context.js +30 -0
- package/dist/components/field-context.js.map +1 -0
- package/dist/components/field.js +216 -0
- package/dist/components/field.js.map +1 -0
- package/dist/components/footer.js +89 -0
- package/dist/components/footer.js.map +1 -0
- package/dist/components/form.js +101 -0
- package/dist/components/form.js.map +1 -0
- package/dist/components/hover-card.js +90 -0
- package/dist/components/hover-card.js.map +1 -0
- package/dist/components/info-tip.js +161 -0
- package/dist/components/info-tip.js.map +1 -0
- package/dist/components/input-group.js +124 -0
- package/dist/components/input-group.js.map +1 -0
- package/dist/components/input-otp.js +120 -0
- package/dist/components/input-otp.js.map +1 -0
- package/dist/components/input.js +26 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/item.js +167 -0
- package/dist/components/item.js.map +1 -0
- package/dist/components/kbd.js +29 -0
- package/dist/components/kbd.js.map +1 -0
- package/dist/components/label.js +11 -0
- package/dist/components/label.js.map +1 -0
- package/dist/components/logo.js +41 -0
- package/dist/components/logo.js.map +1 -0
- package/dist/components/menubar.js +330 -0
- package/dist/components/menubar.js.map +1 -0
- package/dist/components/native-select.js +62 -0
- package/dist/components/native-select.js.map +1 -0
- package/dist/components/navigation-menu.js +204 -0
- package/dist/components/navigation-menu.js.map +1 -0
- package/dist/components/pagination.js +138 -0
- package/dist/components/pagination.js.map +1 -0
- package/dist/components/popover.js +104 -0
- package/dist/components/popover.js.map +1 -0
- package/dist/components/progress.js +30 -0
- package/dist/components/progress.js.map +1 -0
- package/dist/components/radio-group.js +113 -0
- package/dist/components/radio-group.js.map +1 -0
- package/dist/components/resizable.js +193 -0
- package/dist/components/resizable.js.map +1 -0
- package/dist/components/scroll-area.js +40 -0
- package/dist/components/scroll-area.js.map +1 -0
- package/dist/components/section-descriptor.js +88 -0
- package/dist/components/section-descriptor.js.map +1 -0
- package/dist/components/select-chevron.js +25 -0
- package/dist/components/select-chevron.js.map +1 -0
- package/dist/components/select.js +288 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/separator.js +31 -0
- package/dist/components/separator.js.map +1 -0
- package/dist/components/sheet.js +200 -0
- package/dist/components/sheet.js.map +1 -0
- package/dist/components/sidebar.js +326 -0
- package/dist/components/sidebar.js.map +1 -0
- package/dist/components/skeleton.js +18 -0
- package/dist/components/skeleton.js.map +1 -0
- package/dist/components/slider.js +138 -0
- package/dist/components/slider.js.map +1 -0
- package/dist/components/sonner.js +319 -0
- package/dist/components/sonner.js.map +1 -0
- package/dist/components/spinner.js +23 -0
- package/dist/components/spinner.js.map +1 -0
- package/dist/components/status-screen.js +145 -0
- package/dist/components/status-screen.js.map +1 -0
- package/dist/components/switch.js +54 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/table.js +124 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/tabs.js +133 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/terminal.js +206 -0
- package/dist/components/terminal.js.map +1 -0
- package/dist/components/textarea.js +22 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/components/toggle-group.js +105 -0
- package/dist/components/toggle-group.js.map +1 -0
- package/dist/components/toggle.js +53 -0
- package/dist/components/toggle.js.map +1 -0
- package/dist/components/tooltip.js +102 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/generated/accent.js +27 -0
- package/dist/generated/accent.js.map +1 -0
- package/dist/generated/accordion.js +13 -0
- package/dist/generated/accordion.js.map +1 -0
- package/dist/generated/alert-dialog.js +15 -0
- package/dist/generated/alert-dialog.js.map +1 -0
- package/dist/generated/alert.js +16 -0
- package/dist/generated/alert.js.map +1 -0
- package/dist/generated/avatar.js +9 -0
- package/dist/generated/avatar.js.map +1 -0
- package/dist/generated/badge.js +13 -0
- package/dist/generated/badge.js.map +1 -0
- package/dist/generated/band.js +39 -0
- package/dist/generated/band.js.map +1 -0
- package/dist/generated/breadcrumb.js +15 -0
- package/dist/generated/breadcrumb.js.map +1 -0
- package/dist/generated/button-group.js +14 -0
- package/dist/generated/button-group.js.map +1 -0
- package/dist/generated/button.js +30 -0
- package/dist/generated/button.js.map +1 -0
- package/dist/generated/calendar.js +29 -0
- package/dist/generated/calendar.js.map +1 -0
- package/dist/generated/card.js +17 -0
- package/dist/generated/card.js.map +1 -0
- package/dist/generated/carousel.js +31 -0
- package/dist/generated/carousel.js.map +1 -0
- package/dist/generated/chart.js +9 -0
- package/dist/generated/chart.js.map +1 -0
- package/dist/generated/checkbox.js +7 -0
- package/dist/generated/checkbox.js.map +1 -0
- package/dist/generated/command.js +27 -0
- package/dist/generated/command.js.map +1 -0
- package/dist/generated/container.js +5 -0
- package/dist/generated/container.js.map +1 -0
- package/dist/generated/context-menu.js +19 -0
- package/dist/generated/context-menu.js.map +1 -0
- package/dist/generated/date-time-picker.js +15 -0
- package/dist/generated/date-time-picker.js.map +1 -0
- package/dist/generated/dialog.js +17 -0
- package/dist/generated/dialog.js.map +1 -0
- package/dist/generated/drawer.js +26 -0
- package/dist/generated/drawer.js.map +1 -0
- package/dist/generated/dropdown-menu.js +21 -0
- package/dist/generated/dropdown-menu.js.map +1 -0
- package/dist/generated/empty.js +20 -0
- package/dist/generated/empty.js.map +1 -0
- package/dist/generated/field.js +33 -0
- package/dist/generated/field.js.map +1 -0
- package/dist/generated/focus.js +5 -0
- package/dist/generated/focus.js.map +1 -0
- package/dist/generated/form.js +11 -0
- package/dist/generated/form.js.map +1 -0
- package/dist/generated/hover-card.js +5 -0
- package/dist/generated/hover-card.js.map +1 -0
- package/dist/generated/input-group.js +29 -0
- package/dist/generated/input-group.js.map +1 -0
- package/dist/generated/input-otp.js +15 -0
- package/dist/generated/input-otp.js.map +1 -0
- package/dist/generated/input.js +11 -0
- package/dist/generated/input.js.map +1 -0
- package/dist/generated/item.js +40 -0
- package/dist/generated/item.js.map +1 -0
- package/dist/generated/kbd.js +7 -0
- package/dist/generated/kbd.js.map +1 -0
- package/dist/generated/label.js +5 -0
- package/dist/generated/label.js.map +1 -0
- package/dist/generated/menubar.js +27 -0
- package/dist/generated/menubar.js.map +1 -0
- package/dist/generated/navigation-menu.js +19 -0
- package/dist/generated/navigation-menu.js.map +1 -0
- package/dist/generated/popover.js +5 -0
- package/dist/generated/popover.js.map +1 -0
- package/dist/generated/progress.js +7 -0
- package/dist/generated/progress.js.map +1 -0
- package/dist/generated/radio-group.js +7 -0
- package/dist/generated/radio-group.js.map +1 -0
- package/dist/generated/resizable.js +11 -0
- package/dist/generated/resizable.js.map +1 -0
- package/dist/generated/scroll-area.js +14 -0
- package/dist/generated/scroll-area.js.map +1 -0
- package/dist/generated/select.js +15 -0
- package/dist/generated/select.js.map +1 -0
- package/dist/generated/separator.js +10 -0
- package/dist/generated/separator.js.map +1 -0
- package/dist/generated/sheet.js +25 -0
- package/dist/generated/sheet.js.map +1 -0
- package/dist/generated/sidebar.js +41 -0
- package/dist/generated/sidebar.js.map +1 -0
- package/dist/generated/skeleton.js +5 -0
- package/dist/generated/skeleton.js.map +1 -0
- package/dist/generated/slider.js +11 -0
- package/dist/generated/slider.js.map +1 -0
- package/dist/generated/sonner.js +30 -0
- package/dist/generated/sonner.js.map +1 -0
- package/dist/generated/switch.js +7 -0
- package/dist/generated/switch.js.map +1 -0
- package/dist/generated/table.js +21 -0
- package/dist/generated/table.js.map +1 -0
- package/dist/generated/tabs.js +11 -0
- package/dist/generated/tabs.js.map +1 -0
- package/dist/generated/terminal.js +70 -0
- package/dist/generated/terminal.js.map +1 -0
- package/dist/generated/textarea.js +11 -0
- package/dist/generated/textarea.js.map +1 -0
- package/dist/generated/toggle.js +18 -0
- package/dist/generated/toggle.js.map +1 -0
- package/dist/generated/tooltip.js +5 -0
- package/dist/generated/tooltip.js.map +1 -0
- package/dist/index.d.ts +43 -10
- package/dist/index.js +73 -8805
- package/dist/lib/cn.js +12 -0
- package/dist/lib/cn.js.map +1 -0
- package/dist/lib/focus.js +5 -0
- package/dist/lib/focus.js.map +1 -0
- package/dist/primitives/dismissable-layer.js +35 -0
- package/dist/primitives/dismissable-layer.js.map +1 -0
- package/dist/primitives/focus-scope.js +58 -0
- package/dist/primitives/focus-scope.js.map +1 -0
- package/dist/primitives/merge-refs.js +13 -0
- package/dist/primitives/merge-refs.js.map +1 -0
- package/dist/primitives/portal.js +19 -0
- package/dist/primitives/portal.js.map +1 -0
- package/dist/primitives/presence.js +45 -0
- package/dist/primitives/presence.js.map +1 -0
- package/dist/primitives/slot.js +39 -0
- package/dist/primitives/slot.js.map +1 -0
- package/dist/primitives/use-controllable-state.js +24 -0
- package/dist/primitives/use-controllable-state.js.map +1 -0
- package/dist/primitives/use-floating.js +128 -0
- package/dist/primitives/use-floating.js.map +1 -0
- package/dist/primitives/use-hover-intent.js +50 -0
- package/dist/primitives/use-hover-intent.js.map +1 -0
- package/dist/primitives/use-roving-focus.js +40 -0
- package/dist/primitives/use-roving-focus.js.map +1 -0
- package/dist/primitives/walk-elements.js +13 -0
- package/dist/primitives/walk-elements.js.map +1 -0
- package/package.json +5 -4
- package/styles/theme.css +5 -1
- package/styles/tokens.css +5 -1
- package/dist/index.js.map +0 -1
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { cn } from "../lib/cn.js";
|
|
5
|
+
import {
|
|
6
|
+
RESIZABLE_GROUP,
|
|
7
|
+
RESIZABLE_HANDLE,
|
|
8
|
+
RESIZABLE_HANDLE_GRIP,
|
|
9
|
+
RESIZABLE_PANEL
|
|
10
|
+
} from "../generated/resizable.js";
|
|
11
|
+
const ResizableContext = React.createContext(null);
|
|
12
|
+
function useResizable() {
|
|
13
|
+
const ctx = React.useContext(ResizableContext);
|
|
14
|
+
if (!ctx)
|
|
15
|
+
throw new Error("Resizable parts must be used within a ResizablePanelGroup");
|
|
16
|
+
return ctx;
|
|
17
|
+
}
|
|
18
|
+
function redistribute(sizes, index, delta) {
|
|
19
|
+
const before = sizes[index];
|
|
20
|
+
const after = sizes[index + 1];
|
|
21
|
+
if (before === void 0 || after === void 0) return sizes;
|
|
22
|
+
const moved = Math.max(-before, Math.min(after, delta));
|
|
23
|
+
const next = sizes.slice();
|
|
24
|
+
next[index] = before + moved;
|
|
25
|
+
next[index + 1] = after - moved;
|
|
26
|
+
return next;
|
|
27
|
+
}
|
|
28
|
+
function ResizablePanelGroup({
|
|
29
|
+
className,
|
|
30
|
+
direction = "horizontal",
|
|
31
|
+
keyboardStep = 10,
|
|
32
|
+
onLayout,
|
|
33
|
+
children,
|
|
34
|
+
...props
|
|
35
|
+
}) {
|
|
36
|
+
const [sizes, setSizes] = React.useState([]);
|
|
37
|
+
const groupRef = React.useRef(null);
|
|
38
|
+
const register = React.useCallback((index, defaultSize) => {
|
|
39
|
+
setSizes((prev) => {
|
|
40
|
+
if (prev[index] !== void 0) return prev;
|
|
41
|
+
const next = prev.slice();
|
|
42
|
+
while (next.length <= index) next.push(0);
|
|
43
|
+
next[index] = defaultSize;
|
|
44
|
+
return next;
|
|
45
|
+
});
|
|
46
|
+
}, []);
|
|
47
|
+
React.useEffect(() => {
|
|
48
|
+
if (sizes.length) onLayout?.(sizes);
|
|
49
|
+
}, [sizes, onLayout]);
|
|
50
|
+
const value = React.useMemo(
|
|
51
|
+
() => ({ sizes, setSizes, register, direction, keyboardStep, groupRef }),
|
|
52
|
+
[sizes, register, direction, keyboardStep]
|
|
53
|
+
);
|
|
54
|
+
return /* @__PURE__ */ jsx(ResizableContext.Provider, { value, children: /* @__PURE__ */ jsx(
|
|
55
|
+
"div",
|
|
56
|
+
{
|
|
57
|
+
ref: groupRef,
|
|
58
|
+
"data-slot": "resizable-panel-group",
|
|
59
|
+
"data-panel-group-direction": direction,
|
|
60
|
+
className: cn(RESIZABLE_GROUP, className),
|
|
61
|
+
...props,
|
|
62
|
+
children
|
|
63
|
+
}
|
|
64
|
+
) });
|
|
65
|
+
}
|
|
66
|
+
function ResizablePanel({
|
|
67
|
+
className,
|
|
68
|
+
index,
|
|
69
|
+
defaultSize = 50,
|
|
70
|
+
style,
|
|
71
|
+
children,
|
|
72
|
+
...props
|
|
73
|
+
}) {
|
|
74
|
+
const { sizes, register } = useResizable();
|
|
75
|
+
React.useEffect(() => {
|
|
76
|
+
register(index, defaultSize);
|
|
77
|
+
}, [register, index, defaultSize]);
|
|
78
|
+
const basis = sizes[index] ?? defaultSize;
|
|
79
|
+
return /* @__PURE__ */ jsx(
|
|
80
|
+
"div",
|
|
81
|
+
{
|
|
82
|
+
"data-slot": "resizable-panel",
|
|
83
|
+
className: cn(RESIZABLE_PANEL, className),
|
|
84
|
+
style: { flex: `${basis} 1 0%`, ...style },
|
|
85
|
+
...props,
|
|
86
|
+
children
|
|
87
|
+
}
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
function ResizableHandle({
|
|
91
|
+
className,
|
|
92
|
+
index,
|
|
93
|
+
withHandle,
|
|
94
|
+
children,
|
|
95
|
+
...props
|
|
96
|
+
}) {
|
|
97
|
+
const { setSizes, direction, keyboardStep, groupRef } = useResizable();
|
|
98
|
+
const draggingRef = React.useRef(false);
|
|
99
|
+
const resize = React.useCallback(
|
|
100
|
+
(delta) => setSizes((prev) => redistribute(prev, index, delta)),
|
|
101
|
+
[setSizes, index]
|
|
102
|
+
);
|
|
103
|
+
const onPointerMove = React.useCallback(
|
|
104
|
+
(event) => {
|
|
105
|
+
if (!draggingRef.current) return;
|
|
106
|
+
const rect = groupRef.current?.getBoundingClientRect();
|
|
107
|
+
if (!rect) return;
|
|
108
|
+
const span = direction === "vertical" ? rect.height : rect.width;
|
|
109
|
+
if (span <= 0) return;
|
|
110
|
+
const px = direction === "vertical" ? event.movementY : event.movementX;
|
|
111
|
+
resize(px / span * 100);
|
|
112
|
+
},
|
|
113
|
+
[direction, resize, groupRef]
|
|
114
|
+
);
|
|
115
|
+
const onPointerUp = React.useCallback(() => {
|
|
116
|
+
draggingRef.current = false;
|
|
117
|
+
window.removeEventListener("pointermove", onPointerMove);
|
|
118
|
+
window.removeEventListener("pointerup", onPointerUp);
|
|
119
|
+
}, [onPointerMove]);
|
|
120
|
+
const onPointerDown = (event) => {
|
|
121
|
+
event.preventDefault();
|
|
122
|
+
draggingRef.current = true;
|
|
123
|
+
window.addEventListener("pointermove", onPointerMove);
|
|
124
|
+
window.addEventListener("pointerup", onPointerUp);
|
|
125
|
+
};
|
|
126
|
+
React.useEffect(() => () => onPointerUp(), [onPointerUp]);
|
|
127
|
+
const onKeyDown = (event) => {
|
|
128
|
+
let delta;
|
|
129
|
+
switch (event.key) {
|
|
130
|
+
case "ArrowLeft":
|
|
131
|
+
case "ArrowUp":
|
|
132
|
+
delta = -keyboardStep;
|
|
133
|
+
break;
|
|
134
|
+
case "ArrowRight":
|
|
135
|
+
case "ArrowDown":
|
|
136
|
+
delta = keyboardStep;
|
|
137
|
+
break;
|
|
138
|
+
default:
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (direction === "horizontal" && (event.key === "ArrowUp" || event.key === "ArrowDown") || direction === "vertical" && (event.key === "ArrowLeft" || event.key === "ArrowRight"))
|
|
142
|
+
return;
|
|
143
|
+
event.preventDefault();
|
|
144
|
+
resize(delta);
|
|
145
|
+
};
|
|
146
|
+
return /* @__PURE__ */ jsxs(
|
|
147
|
+
"div",
|
|
148
|
+
{
|
|
149
|
+
"data-slot": "resizable-handle",
|
|
150
|
+
"data-panel-group-direction": direction,
|
|
151
|
+
role: "separator",
|
|
152
|
+
"aria-orientation": direction === "horizontal" ? "vertical" : "horizontal",
|
|
153
|
+
tabIndex: 0,
|
|
154
|
+
className: cn(RESIZABLE_HANDLE, className),
|
|
155
|
+
onPointerDown,
|
|
156
|
+
onKeyDown,
|
|
157
|
+
...props,
|
|
158
|
+
children: [
|
|
159
|
+
withHandle && /* @__PURE__ */ jsx("div", { className: RESIZABLE_HANDLE_GRIP, children: /* @__PURE__ */ jsxs(
|
|
160
|
+
"svg",
|
|
161
|
+
{
|
|
162
|
+
className: "size-2.5",
|
|
163
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
164
|
+
width: "15",
|
|
165
|
+
height: "15",
|
|
166
|
+
viewBox: "0 0 24 24",
|
|
167
|
+
fill: "none",
|
|
168
|
+
stroke: "currentColor",
|
|
169
|
+
strokeWidth: "2",
|
|
170
|
+
strokeLinecap: "round",
|
|
171
|
+
strokeLinejoin: "round",
|
|
172
|
+
"aria-hidden": "true",
|
|
173
|
+
children: [
|
|
174
|
+
/* @__PURE__ */ jsx("circle", { cx: "9", cy: "12", r: "1" }),
|
|
175
|
+
/* @__PURE__ */ jsx("circle", { cx: "9", cy: "5", r: "1" }),
|
|
176
|
+
/* @__PURE__ */ jsx("circle", { cx: "9", cy: "19", r: "1" }),
|
|
177
|
+
/* @__PURE__ */ jsx("circle", { cx: "15", cy: "12", r: "1" }),
|
|
178
|
+
/* @__PURE__ */ jsx("circle", { cx: "15", cy: "5", r: "1" }),
|
|
179
|
+
/* @__PURE__ */ jsx("circle", { cx: "15", cy: "19", r: "1" })
|
|
180
|
+
]
|
|
181
|
+
}
|
|
182
|
+
) }),
|
|
183
|
+
children
|
|
184
|
+
]
|
|
185
|
+
}
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
export {
|
|
189
|
+
ResizableHandle,
|
|
190
|
+
ResizablePanel,
|
|
191
|
+
ResizablePanelGroup
|
|
192
|
+
};
|
|
193
|
+
//# sourceMappingURL=resizable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/resizable.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport {\n RESIZABLE_GROUP,\n RESIZABLE_HANDLE,\n RESIZABLE_HANDLE_GRIP,\n RESIZABLE_PANEL,\n} from \"../generated/resizable\";\n\nexport type ResizableDirection = \"horizontal\" | \"vertical\";\n\ninterface ResizableContextValue {\n sizes: number[];\n setSizes: React.Dispatch<React.SetStateAction<number[]>>;\n register: (index: number, defaultSize: number) => void;\n direction: ResizableDirection;\n keyboardStep: number;\n groupRef: React.RefObject<HTMLDivElement | null>;\n}\n\nconst ResizableContext = React.createContext<ResizableContextValue | null>(null);\n\nfunction useResizable(): ResizableContextValue {\n const ctx = React.useContext(ResizableContext);\n if (!ctx)\n throw new Error(\"Resizable parts must be used within a ResizablePanelGroup\");\n return ctx;\n}\n\n/** Grows the panel before `index` by `delta` %, shrinking the one after it. */\nfunction redistribute(sizes: number[], index: number, delta: number): number[] {\n const before = sizes[index];\n const after = sizes[index + 1];\n if (before === undefined || after === undefined) return sizes;\n const moved = Math.max(-before, Math.min(after, delta));\n const next = sizes.slice();\n next[index] = before + moved;\n next[index + 1] = after - moved;\n return next;\n}\n\nexport interface ResizablePanelGroupProps\n extends React.ComponentProps<\"div\"> {\n direction?: ResizableDirection;\n keyboardStep?: number;\n onLayout?: (sizes: number[]) => void;\n}\n\nexport function ResizablePanelGroup({\n className,\n direction = \"horizontal\",\n keyboardStep = 10,\n onLayout,\n children,\n ...props\n}: ResizablePanelGroupProps) {\n const [sizes, setSizes] = React.useState<number[]>([]);\n const groupRef = React.useRef<HTMLDivElement>(null);\n\n const register = React.useCallback((index: number, defaultSize: number) => {\n setSizes((prev) => {\n if (prev[index] !== undefined) return prev;\n const next = prev.slice();\n while (next.length <= index) next.push(0);\n next[index] = defaultSize;\n return next;\n });\n }, []);\n\n React.useEffect(() => {\n if (sizes.length) onLayout?.(sizes);\n }, [sizes, onLayout]);\n\n const value = React.useMemo<ResizableContextValue>(\n () => ({ sizes, setSizes, register, direction, keyboardStep, groupRef }),\n [sizes, register, direction, keyboardStep],\n );\n\n return (\n <ResizableContext.Provider value={value}>\n <div\n ref={groupRef}\n data-slot=\"resizable-panel-group\"\n data-panel-group-direction={direction}\n className={cn(RESIZABLE_GROUP, className)}\n {...props}\n >\n {children}\n </div>\n </ResizableContext.Provider>\n );\n}\n\nexport interface ResizablePanelProps extends React.ComponentProps<\"div\"> {\n index: number;\n defaultSize?: number;\n}\n\nexport function ResizablePanel({\n className,\n index,\n defaultSize = 50,\n style,\n children,\n ...props\n}: ResizablePanelProps) {\n const { sizes, register } = useResizable();\n React.useEffect(() => {\n register(index, defaultSize);\n }, [register, index, defaultSize]);\n const basis = sizes[index] ?? defaultSize;\n return (\n <div\n data-slot=\"resizable-panel\"\n className={cn(RESIZABLE_PANEL, className)}\n style={{ flex: `${basis} 1 0%`, ...style }}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport interface ResizableHandleProps extends React.ComponentProps<\"div\"> {\n index: number;\n withHandle?: boolean;\n}\n\nexport function ResizableHandle({\n className,\n index,\n withHandle,\n children,\n ...props\n}: ResizableHandleProps) {\n const { setSizes, direction, keyboardStep, groupRef } = useResizable();\n const draggingRef = React.useRef(false);\n\n const resize = React.useCallback(\n (delta: number) => setSizes((prev) => redistribute(prev, index, delta)),\n [setSizes, index],\n );\n\n const onPointerMove = React.useCallback(\n (event: PointerEvent) => {\n if (!draggingRef.current) return;\n const rect = groupRef.current?.getBoundingClientRect();\n if (!rect) return;\n const span = direction === \"vertical\" ? rect.height : rect.width;\n if (span <= 0) return;\n const px = direction === \"vertical\" ? event.movementY : event.movementX;\n resize((px / span) * 100);\n },\n [direction, resize, groupRef],\n );\n\n const onPointerUp = React.useCallback(() => {\n draggingRef.current = false;\n window.removeEventListener(\"pointermove\", onPointerMove);\n window.removeEventListener(\"pointerup\", onPointerUp);\n }, [onPointerMove]);\n\n const onPointerDown = (event: React.PointerEvent) => {\n event.preventDefault();\n draggingRef.current = true;\n window.addEventListener(\"pointermove\", onPointerMove);\n window.addEventListener(\"pointerup\", onPointerUp);\n };\n\n React.useEffect(() => () => onPointerUp(), [onPointerUp]);\n\n const onKeyDown = (event: React.KeyboardEvent) => {\n let delta: number;\n switch (event.key) {\n case \"ArrowLeft\":\n case \"ArrowUp\":\n delta = -keyboardStep;\n break;\n case \"ArrowRight\":\n case \"ArrowDown\":\n delta = keyboardStep;\n break;\n default:\n return;\n }\n if (\n (direction === \"horizontal\" &&\n (event.key === \"ArrowUp\" || event.key === \"ArrowDown\")) ||\n (direction === \"vertical\" &&\n (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\"))\n )\n return;\n event.preventDefault();\n resize(delta);\n };\n\n return (\n <div\n data-slot=\"resizable-handle\"\n data-panel-group-direction={direction}\n role=\"separator\"\n aria-orientation={direction === \"horizontal\" ? \"vertical\" : \"horizontal\"}\n tabIndex={0}\n className={cn(RESIZABLE_HANDLE, className)}\n onPointerDown={onPointerDown}\n onKeyDown={onKeyDown}\n {...props}\n >\n {withHandle && (\n <div className={RESIZABLE_HANDLE_GRIP}>\n <svg\n className=\"size-2.5\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"15\"\n height=\"15\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"9\" cy=\"12\" r=\"1\" />\n <circle cx=\"9\" cy=\"5\" r=\"1\" />\n <circle cx=\"9\" cy=\"19\" r=\"1\" />\n <circle cx=\"15\" cy=\"12\" r=\"1\" />\n <circle cx=\"15\" cy=\"5\" r=\"1\" />\n <circle cx=\"15\" cy=\"19\" r=\"1\" />\n </svg>\n </div>\n )}\n {children}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { cn } from "../lib/cn.js";
|
|
4
|
+
import {
|
|
5
|
+
SCROLL_AREA_THUMB,
|
|
6
|
+
SCROLL_AREA_VIEWPORT,
|
|
7
|
+
SCROLLBAR_BASE,
|
|
8
|
+
scrollBarOrientations
|
|
9
|
+
} from "../generated/scroll-area.js";
|
|
10
|
+
function ScrollArea({
|
|
11
|
+
className,
|
|
12
|
+
children,
|
|
13
|
+
...props
|
|
14
|
+
}) {
|
|
15
|
+
return /* @__PURE__ */ jsxs("div", { "data-slot": "scroll-area", className: cn("relative", className), ...props, children: [
|
|
16
|
+
/* @__PURE__ */ jsx("div", { "data-slot": "scroll-area-viewport", className: SCROLL_AREA_VIEWPORT, children }),
|
|
17
|
+
/* @__PURE__ */ jsx(ScrollBar, {})
|
|
18
|
+
] });
|
|
19
|
+
}
|
|
20
|
+
function ScrollBar({
|
|
21
|
+
className,
|
|
22
|
+
orientation = "vertical",
|
|
23
|
+
...props
|
|
24
|
+
}) {
|
|
25
|
+
return /* @__PURE__ */ jsx(
|
|
26
|
+
"div",
|
|
27
|
+
{
|
|
28
|
+
"data-slot": "scroll-area-scrollbar",
|
|
29
|
+
"data-orientation": orientation,
|
|
30
|
+
className: cn(SCROLLBAR_BASE, scrollBarOrientations[orientation], className),
|
|
31
|
+
...props,
|
|
32
|
+
children: /* @__PURE__ */ jsx("div", { "data-slot": "scroll-area-thumb", className: SCROLL_AREA_THUMB })
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
export {
|
|
37
|
+
ScrollArea,
|
|
38
|
+
ScrollBar
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=scroll-area.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/scroll-area.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport {\n SCROLL_AREA_THUMB,\n SCROLL_AREA_VIEWPORT,\n SCROLLBAR_BASE,\n scrollBarOrientations,\n type ScrollBarOrientation,\n} from \"../generated/scroll-area\";\n\nexport type { ScrollBarOrientation };\n\n// Dep-light scroll area: a viewport `div` with native `overflow` scrolling.\n// Custom scrollbar thumb tracking is omitted — native overflow does the work;\n// `ScrollBar` is a static decorative element kept for class parity.\n\nexport function ScrollArea({\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div data-slot=\"scroll-area\" className={cn(\"relative\", className)} {...props}>\n <div data-slot=\"scroll-area-viewport\" className={SCROLL_AREA_VIEWPORT}>\n {children}\n </div>\n <ScrollBar />\n </div>\n );\n}\n\nexport interface ScrollBarProps extends React.ComponentProps<\"div\"> {\n orientation?: ScrollBarOrientation;\n}\n\nexport function ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: ScrollBarProps) {\n return (\n <div\n data-slot=\"scroll-area-scrollbar\"\n data-orientation={orientation}\n className={cn(SCROLLBAR_BASE, scrollBarOrientations[orientation], className)}\n {...props}\n >\n <div data-slot=\"scroll-area-thumb\" className={SCROLL_AREA_THUMB} />\n </div>\n );\n}\n"],"mappings":"AAsBI,SACE,KADF;AAtBJ,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAQA,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,SACE,qBAAC,SAAI,aAAU,eAAc,WAAW,GAAG,YAAY,SAAS,GAAI,GAAG,OACrE;AAAA,wBAAC,SAAI,aAAU,wBAAuB,WAAW,sBAC9C,UACH;AAAA,IACA,oBAAC,aAAU;AAAA,KACb;AAEJ;AAMO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA,cAAc;AAAA,EACd,GAAG;AACL,GAAmB;AACjB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,oBAAkB;AAAA,MAClB,WAAW,GAAG,gBAAgB,sBAAsB,WAAW,GAAG,SAAS;AAAA,MAC1E,GAAG;AAAA,MAEJ,8BAAC,SAAI,aAAU,qBAAoB,WAAW,mBAAmB;AAAA;AAAA,EACnE;AAEJ;","names":[]}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { cn } from "../lib/cn.js";
|
|
4
|
+
import { FIELD_TITLE, FIELD_DESCRIPTION } from "../generated/field.js";
|
|
5
|
+
const SECTION_DESCRIPTOR = "flex flex-col gap-2 rounded-lg border border-border bg-hover p-4 text-left";
|
|
6
|
+
function InfoGlyph({ className }) {
|
|
7
|
+
return /* @__PURE__ */ jsxs(
|
|
8
|
+
"svg",
|
|
9
|
+
{
|
|
10
|
+
viewBox: "0 0 24 24",
|
|
11
|
+
fill: "none",
|
|
12
|
+
stroke: "currentColor",
|
|
13
|
+
strokeWidth: 2,
|
|
14
|
+
strokeLinecap: "round",
|
|
15
|
+
strokeLinejoin: "round",
|
|
16
|
+
"aria-hidden": true,
|
|
17
|
+
className: cn("size-4 shrink-0", className),
|
|
18
|
+
children: [
|
|
19
|
+
/* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "10" }),
|
|
20
|
+
/* @__PURE__ */ jsx("path", { d: "M12 16v-4" }),
|
|
21
|
+
/* @__PURE__ */ jsx("path", { d: "M12 8h.01" })
|
|
22
|
+
]
|
|
23
|
+
}
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
function SectionDescriptor({
|
|
27
|
+
title,
|
|
28
|
+
icon = true,
|
|
29
|
+
collapsible = false,
|
|
30
|
+
defaultOpen = false,
|
|
31
|
+
className,
|
|
32
|
+
children,
|
|
33
|
+
...props
|
|
34
|
+
}) {
|
|
35
|
+
const titleContent = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
36
|
+
icon && /* @__PURE__ */ jsx(InfoGlyph, { className: "text-accent-debug" }),
|
|
37
|
+
/* @__PURE__ */ jsx("span", { children: title })
|
|
38
|
+
] });
|
|
39
|
+
if (collapsible) {
|
|
40
|
+
return /* @__PURE__ */ jsxs(
|
|
41
|
+
"details",
|
|
42
|
+
{
|
|
43
|
+
"data-slot": "section-descriptor",
|
|
44
|
+
"data-collapsible": "",
|
|
45
|
+
open: defaultOpen,
|
|
46
|
+
className: cn(SECTION_DESCRIPTOR, className),
|
|
47
|
+
...props,
|
|
48
|
+
children: [
|
|
49
|
+
/* @__PURE__ */ jsx(
|
|
50
|
+
"summary",
|
|
51
|
+
{
|
|
52
|
+
"data-slot": "section-descriptor-title",
|
|
53
|
+
className: cn(
|
|
54
|
+
FIELD_TITLE,
|
|
55
|
+
"cursor-pointer list-none [&::-webkit-details-marker]:hidden"
|
|
56
|
+
),
|
|
57
|
+
children: titleContent
|
|
58
|
+
}
|
|
59
|
+
),
|
|
60
|
+
/* @__PURE__ */ jsx(
|
|
61
|
+
"p",
|
|
62
|
+
{
|
|
63
|
+
"data-slot": "section-descriptor-body",
|
|
64
|
+
className: cn(FIELD_DESCRIPTION, "mt-2"),
|
|
65
|
+
children
|
|
66
|
+
}
|
|
67
|
+
)
|
|
68
|
+
]
|
|
69
|
+
}
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
return /* @__PURE__ */ jsxs(
|
|
73
|
+
"section",
|
|
74
|
+
{
|
|
75
|
+
"data-slot": "section-descriptor",
|
|
76
|
+
className: cn(SECTION_DESCRIPTOR, className),
|
|
77
|
+
...props,
|
|
78
|
+
children: [
|
|
79
|
+
/* @__PURE__ */ jsx("div", { "data-slot": "section-descriptor-title", className: FIELD_TITLE, children: titleContent }),
|
|
80
|
+
/* @__PURE__ */ jsx("p", { "data-slot": "section-descriptor-body", className: FIELD_DESCRIPTION, children })
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
export {
|
|
86
|
+
SectionDescriptor
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=section-descriptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/section-descriptor.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { FIELD_TITLE, FIELD_DESCRIPTION } from \"../generated/field\";\n\n/**\n * `SectionDescriptor` — a static, always-visible block that explains a whole\n * feature (withdrawals, fund shares, an operator action). It reads as neutral body\n * copy, NOT a coloured alert: the title reuses `FIELD_TITLE`, the body reuses\n * `FIELD_DESCRIPTION`, inside a subtle bordered container. Content-agnostic — the\n * strings are injected by the caller.\n *\n * With `collapsible`, it renders as a native `<details>`/`<summary>` disclosure,\n * which carries keyboard support and find-in-page auto-expand for free.\n */\nconst SECTION_DESCRIPTOR =\n \"flex flex-col gap-2 rounded-lg border border-border bg-hover p-4 text-left\";\n\n// lucide `info`, inlined per the kit's no-lucide-dep icon convention.\nfunction InfoGlyph({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"size-4 shrink-0\", className)}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4\" />\n <path d=\"M12 8h.01\" />\n </svg>\n );\n}\n\nexport interface SectionDescriptorProps extends Omit<\n React.ComponentProps<\"section\">,\n \"title\"\n> {\n title: React.ReactNode;\n /** Show the leading ⓘ mark. Defaults to true. */\n icon?: boolean;\n /** Render as a collapsible `<details>` disclosure. */\n collapsible?: boolean;\n /** Initial open state when `collapsible`. */\n defaultOpen?: boolean;\n}\n\nexport function SectionDescriptor({\n title,\n icon = true,\n collapsible = false,\n defaultOpen = false,\n className,\n children,\n ...props\n}: SectionDescriptorProps) {\n const titleContent = (\n <>\n {icon && <InfoGlyph className=\"text-accent-debug\" />}\n <span>{title}</span>\n </>\n );\n\n if (collapsible) {\n return (\n <details\n data-slot=\"section-descriptor\"\n data-collapsible=\"\"\n open={defaultOpen}\n className={cn(SECTION_DESCRIPTOR, className)}\n {...(props as Record<string, unknown>)}\n >\n <summary\n data-slot=\"section-descriptor-title\"\n className={cn(\n FIELD_TITLE,\n \"cursor-pointer list-none [&::-webkit-details-marker]:hidden\",\n )}\n >\n {titleContent}\n </summary>\n <p\n data-slot=\"section-descriptor-body\"\n className={cn(FIELD_DESCRIPTION, \"mt-2\")}\n >\n {children}\n </p>\n </details>\n );\n }\n\n return (\n <section\n data-slot=\"section-descriptor\"\n className={cn(SECTION_DESCRIPTOR, className)}\n {...props}\n >\n <div data-slot=\"section-descriptor-title\" className={FIELD_TITLE}>\n {titleContent}\n </div>\n <p data-slot=\"section-descriptor-body\" className={FIELD_DESCRIPTION}>\n {children}\n </p>\n </section>\n );\n}\n"],"mappings":"AAoBI,SAwCA,UA9BE,KAVF;AApBJ,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB,SAAS,aAAa,yBAAyB;AAY/C,MAAM,qBACJ;AAGF,SAAS,UAAU,EAAE,UAAU,GAA2B;AACxD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAa;AAAA,MACb,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,eAAW;AAAA,MACX,WAAW,GAAG,mBAAmB,SAAS;AAAA,MAE1C;AAAA,4BAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK;AAAA,QAC/B,oBAAC,UAAK,GAAE,aAAY;AAAA,QACpB,oBAAC,UAAK,GAAE,aAAY;AAAA;AAAA;AAAA,EACtB;AAEJ;AAeO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA,OAAO;AAAA,EACP,cAAc;AAAA,EACd,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA2B;AACzB,QAAM,eACJ,iCACG;AAAA,YAAQ,oBAAC,aAAU,WAAU,qBAAoB;AAAA,IAClD,oBAAC,UAAM,iBAAM;AAAA,KACf;AAGF,MAAI,aAAa;AACf,WACE;AAAA,MAAC;AAAA;AAAA,QACC,aAAU;AAAA,QACV,oBAAiB;AAAA,QACjB,MAAM;AAAA,QACN,WAAW,GAAG,oBAAoB,SAAS;AAAA,QAC1C,GAAI;AAAA,QAEL;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,aAAU;AAAA,cACV,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,cACF;AAAA,cAEC;AAAA;AAAA,UACH;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,aAAU;AAAA,cACV,WAAW,GAAG,mBAAmB,MAAM;AAAA,cAEtC;AAAA;AAAA,UACH;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,oBAAoB,SAAS;AAAA,MAC1C,GAAG;AAAA,MAEJ;AAAA,4BAAC,SAAI,aAAU,4BAA2B,WAAW,aAClD,wBACH;AAAA,QACA,oBAAC,OAAE,aAAU,2BAA0B,WAAW,mBAC/C,UACH;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
function SelectChevron({ className }) {
|
|
4
|
+
return /* @__PURE__ */ jsx(
|
|
5
|
+
"svg",
|
|
6
|
+
{
|
|
7
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
8
|
+
width: "24",
|
|
9
|
+
height: "24",
|
|
10
|
+
viewBox: "0 0 24 24",
|
|
11
|
+
fill: "none",
|
|
12
|
+
stroke: "currentColor",
|
|
13
|
+
strokeWidth: "2",
|
|
14
|
+
strokeLinecap: "round",
|
|
15
|
+
strokeLinejoin: "round",
|
|
16
|
+
className,
|
|
17
|
+
"aria-hidden": "true",
|
|
18
|
+
children: /* @__PURE__ */ jsx("path", { d: "m6 9 6 6 6-6" })
|
|
19
|
+
}
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
export {
|
|
23
|
+
SelectChevron
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=select-chevron.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/select-chevron.tsx"],"sourcesContent":["import * as React from \"react\";\n\n/** The kit's select arrow, shared by `SelectTrigger` and `NativeSelect`. */\nexport function SelectChevron({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n"],"mappings":"AAkBM;AAlBN,YAAY,WAAW;AAGhB,SAAS,cAAc,EAAE,UAAU,GAA2B;AACnE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf;AAAA,MACA,eAAY;AAAA,MAEZ,8BAAC,UAAK,GAAE,gBAAe;AAAA;AAAA,EACzB;AAEJ;","names":[]}
|