@7onic-ui/react 0.3.9 → 0.3.10
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 +2 -2
- package/dist/chart.mjs +3 -9
- package/dist/chart.mjs.map +1 -1
- package/dist/chunk-234NAXGV.mjs +252 -0
- package/dist/chunk-234NAXGV.mjs.map +1 -0
- package/dist/chunk-53MIUPSY.mjs +13 -0
- package/dist/chunk-53MIUPSY.mjs.map +1 -0
- package/dist/chunk-BN5BEA3V.mjs +195 -0
- package/dist/chunk-BN5BEA3V.mjs.map +1 -0
- package/dist/chunk-COW3B62M.mjs +214 -0
- package/dist/chunk-COW3B62M.mjs.map +1 -0
- package/dist/chunk-CTH6SN5Y.mjs +114 -0
- package/dist/chunk-CTH6SN5Y.mjs.map +1 -0
- package/dist/chunk-D3NTQNDW.mjs +440 -0
- package/dist/chunk-D3NTQNDW.mjs.map +1 -0
- package/dist/chunk-DDRYEJBJ.mjs +164 -0
- package/dist/chunk-DDRYEJBJ.mjs.map +1 -0
- package/dist/chunk-DJAEXCRU.mjs +190 -0
- package/dist/chunk-DJAEXCRU.mjs.map +1 -0
- package/dist/chunk-DRVHHEAY.mjs +145 -0
- package/dist/chunk-DRVHHEAY.mjs.map +1 -0
- package/dist/chunk-DTLNWOTR.mjs +482 -0
- package/dist/chunk-DTLNWOTR.mjs.map +1 -0
- package/dist/chunk-DYYQOHQR.mjs +214 -0
- package/dist/chunk-DYYQOHQR.mjs.map +1 -0
- package/dist/chunk-FHUAH6AJ.mjs +93 -0
- package/dist/chunk-FHUAH6AJ.mjs.map +1 -0
- package/dist/chunk-GD4YE5AE.mjs +209 -0
- package/dist/chunk-GD4YE5AE.mjs.map +1 -0
- package/dist/chunk-GRCJ35DX.mjs +144 -0
- package/dist/chunk-GRCJ35DX.mjs.map +1 -0
- package/dist/chunk-HHX4GABH.mjs +129 -0
- package/dist/chunk-HHX4GABH.mjs.map +1 -0
- package/dist/chunk-IPCIC2BI.mjs +148 -0
- package/dist/chunk-IPCIC2BI.mjs.map +1 -0
- package/dist/chunk-IY3R2VGB.mjs +272 -0
- package/dist/chunk-IY3R2VGB.mjs.map +1 -0
- package/dist/chunk-JCJEVXER.mjs +170 -0
- package/dist/chunk-JCJEVXER.mjs.map +1 -0
- package/dist/chunk-KBPYAMGS.mjs +157 -0
- package/dist/chunk-KBPYAMGS.mjs.map +1 -0
- package/dist/chunk-LJJ6K4IU.mjs +318 -0
- package/dist/chunk-LJJ6K4IU.mjs.map +1 -0
- package/dist/chunk-MRUVGHGP.mjs +375 -0
- package/dist/chunk-MRUVGHGP.mjs.map +1 -0
- package/dist/chunk-N4K2BDGM.mjs +153 -0
- package/dist/chunk-N4K2BDGM.mjs.map +1 -0
- package/dist/chunk-NWFMJWGX.mjs +165 -0
- package/dist/chunk-NWFMJWGX.mjs.map +1 -0
- package/dist/chunk-PTAPPOKU.mjs +117 -0
- package/dist/chunk-PTAPPOKU.mjs.map +1 -0
- package/dist/chunk-PVTBM7V7.mjs +316 -0
- package/dist/chunk-PVTBM7V7.mjs.map +1 -0
- package/dist/chunk-Q5WVLK2L.mjs +77 -0
- package/dist/chunk-Q5WVLK2L.mjs.map +1 -0
- package/dist/chunk-RKSB2N5L.mjs +206 -0
- package/dist/chunk-RKSB2N5L.mjs.map +1 -0
- package/dist/chunk-S4DGVKBK.mjs +151 -0
- package/dist/chunk-S4DGVKBK.mjs.map +1 -0
- package/dist/chunk-S4T4PU7F.mjs +114 -0
- package/dist/chunk-S4T4PU7F.mjs.map +1 -0
- package/dist/chunk-SZPZOGPC.mjs +394 -0
- package/dist/chunk-SZPZOGPC.mjs.map +1 -0
- package/dist/chunk-T546XBQG.mjs +443 -0
- package/dist/chunk-T546XBQG.mjs.map +1 -0
- package/dist/chunk-UWTT5AE6.mjs +145 -0
- package/dist/chunk-UWTT5AE6.mjs.map +1 -0
- package/dist/chunk-V5UFWYFI.mjs +255 -0
- package/dist/chunk-V5UFWYFI.mjs.map +1 -0
- package/dist/chunk-VUPGBB5X.mjs +150 -0
- package/dist/chunk-VUPGBB5X.mjs.map +1 -0
- package/dist/chunk-W6YNEU53.mjs +175 -0
- package/dist/chunk-W6YNEU53.mjs.map +1 -0
- package/dist/chunk-WWSN5YME.mjs +222 -0
- package/dist/chunk-WWSN5YME.mjs.map +1 -0
- package/dist/chunk-XK52LYR4.mjs +182 -0
- package/dist/chunk-XK52LYR4.mjs.map +1 -0
- package/dist/chunk-YIAH6KHV.mjs +164 -0
- package/dist/chunk-YIAH6KHV.mjs.map +1 -0
- package/dist/chunk-Z6JWWCNL.mjs +108 -0
- package/dist/chunk-Z6JWWCNL.mjs.map +1 -0
- package/dist/chunk-ZDRUTJ4T.mjs +119 -0
- package/dist/chunk-ZDRUTJ4T.mjs.map +1 -0
- package/dist/components/accordion.mjs +19 -0
- package/dist/components/accordion.mjs.map +1 -0
- package/dist/components/alert.mjs +15 -0
- package/dist/components/alert.mjs.map +1 -0
- package/dist/components/avatar.mjs +23 -0
- package/dist/components/avatar.mjs.map +1 -0
- package/dist/components/badge.mjs +11 -0
- package/dist/components/badge.mjs.map +1 -0
- package/dist/components/breadcrumb.mjs +23 -0
- package/dist/components/breadcrumb.mjs.map +1 -0
- package/dist/components/button-group.mjs +11 -0
- package/dist/components/button-group.mjs.map +1 -0
- package/dist/components/button.mjs +12 -0
- package/dist/components/button.mjs.map +1 -0
- package/dist/components/card.mjs +25 -0
- package/dist/components/card.mjs.map +1 -0
- package/dist/components/chat-input.mjs +15 -0
- package/dist/components/chat-input.mjs.map +1 -0
- package/dist/components/chat-message.mjs +17 -0
- package/dist/components/chat-message.mjs.map +1 -0
- package/dist/components/checkbox.mjs +12 -0
- package/dist/components/checkbox.mjs.map +1 -0
- package/dist/components/divider.mjs +11 -0
- package/dist/components/divider.mjs.map +1 -0
- package/dist/components/drawer.mjs +33 -0
- package/dist/components/drawer.mjs.map +1 -0
- package/dist/components/dropdown.mjs +35 -0
- package/dist/components/dropdown.mjs.map +1 -0
- package/dist/components/field.mjs +17 -0
- package/dist/components/field.mjs.map +1 -0
- package/dist/components/icon-button.mjs +12 -0
- package/dist/components/icon-button.mjs.map +1 -0
- package/dist/components/input.mjs +12 -0
- package/dist/components/input.mjs.map +1 -0
- package/dist/components/metric-card.mjs +23 -0
- package/dist/components/metric-card.mjs.map +1 -0
- package/dist/components/modal.mjs +57 -0
- package/dist/components/modal.mjs.map +1 -0
- package/dist/components/navigation-menu.mjs +27 -0
- package/dist/components/navigation-menu.mjs.map +1 -0
- package/dist/components/pagination.mjs +33 -0
- package/dist/components/pagination.mjs.map +1 -0
- package/dist/components/popover.mjs +23 -0
- package/dist/components/popover.mjs.map +1 -0
- package/dist/components/progress.mjs +11 -0
- package/dist/components/progress.mjs.map +1 -0
- package/dist/components/quick-reply.mjs +15 -0
- package/dist/components/quick-reply.mjs.map +1 -0
- package/dist/components/radio-group.mjs +16 -0
- package/dist/components/radio-group.mjs.map +1 -0
- package/dist/components/segmented.mjs +15 -0
- package/dist/components/segmented.mjs.map +1 -0
- package/dist/components/select.mjs +23 -0
- package/dist/components/select.mjs.map +1 -0
- package/dist/components/skeleton.mjs +11 -0
- package/dist/components/skeleton.mjs.map +1 -0
- package/dist/components/slider.mjs +11 -0
- package/dist/components/slider.mjs.map +1 -0
- package/dist/components/spinner.mjs +11 -0
- package/dist/components/spinner.mjs.map +1 -0
- package/dist/components/switch.mjs +12 -0
- package/dist/components/switch.mjs.map +1 -0
- package/dist/components/table.mjs +23 -0
- package/dist/components/table.mjs.map +1 -0
- package/dist/components/tabs.mjs +19 -0
- package/dist/components/tabs.mjs.map +1 -0
- package/dist/components/textarea.mjs +12 -0
- package/dist/components/textarea.mjs.map +1 -0
- package/dist/components/toast.mjs +13 -0
- package/dist/components/toast.mjs.map +1 -0
- package/dist/components/toggle-group.mjs +15 -0
- package/dist/components/toggle-group.mjs.map +1 -0
- package/dist/components/toggle.mjs +11 -0
- package/dist/components/toggle.mjs.map +1 -0
- package/dist/components/tooltip.mjs +21 -0
- package/dist/components/tooltip.mjs.map +1 -0
- package/dist/components/typing-indicator.mjs +11 -0
- package/dist/components/typing-indicator.mjs.map +1 -0
- package/dist/index.mjs +296 -7536
- package/dist/index.mjs.map +1 -1
- package/llms.txt +23 -23
- package/package.json +4 -3
- package/dist/chart.d.mts +0 -147
- package/dist/index.d.mts +0 -1535
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
cn
|
|
4
|
+
} from "./chunk-53MIUPSY.mjs";
|
|
5
|
+
|
|
6
|
+
// src/components/ui/select.tsx
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
import * as SelectPrimitive from "@radix-ui/react-select";
|
|
9
|
+
var triggerRadiusMap = {
|
|
10
|
+
none: "rounded-none",
|
|
11
|
+
sm: "rounded-sm",
|
|
12
|
+
base: "rounded",
|
|
13
|
+
default: "rounded-md",
|
|
14
|
+
lg: "rounded-lg",
|
|
15
|
+
xl: "rounded-xl",
|
|
16
|
+
"2xl": "rounded-2xl",
|
|
17
|
+
"3xl": "rounded-3xl",
|
|
18
|
+
full: "rounded-full"
|
|
19
|
+
};
|
|
20
|
+
var contentRadiusFromRoot = {
|
|
21
|
+
none: "md",
|
|
22
|
+
sm: "md",
|
|
23
|
+
base: "md",
|
|
24
|
+
default: "md",
|
|
25
|
+
lg: "lg",
|
|
26
|
+
xl: "xl",
|
|
27
|
+
"2xl": "xl",
|
|
28
|
+
"3xl": "xl",
|
|
29
|
+
full: "xl"
|
|
30
|
+
};
|
|
31
|
+
var contentRadiusMap = {
|
|
32
|
+
md: "rounded-md",
|
|
33
|
+
// 6px
|
|
34
|
+
lg: "rounded-lg",
|
|
35
|
+
// 8px
|
|
36
|
+
xl: "rounded-xl"
|
|
37
|
+
// 12px
|
|
38
|
+
};
|
|
39
|
+
var itemRadiusMap = {
|
|
40
|
+
md: "rounded",
|
|
41
|
+
// 4px — perceptual balance (67%)
|
|
42
|
+
lg: "rounded-md",
|
|
43
|
+
// 6px — perceptual balance (75%)
|
|
44
|
+
xl: "rounded-lg"
|
|
45
|
+
// 8px — perceptual balance (67%)
|
|
46
|
+
};
|
|
47
|
+
var triggerSizeMap = {
|
|
48
|
+
xs: "h-9 px-3 text-sm",
|
|
49
|
+
// 36px
|
|
50
|
+
sm: "h-10 px-3 text-md",
|
|
51
|
+
// 40px
|
|
52
|
+
default: "h-11 px-4 text-base",
|
|
53
|
+
// 44px
|
|
54
|
+
lg: "h-12 px-4 text-base",
|
|
55
|
+
// 48px
|
|
56
|
+
xl: "h-14 px-4 text-base"
|
|
57
|
+
// 56px
|
|
58
|
+
};
|
|
59
|
+
var triggerIconSizeMap = {
|
|
60
|
+
xs: "icon-xs",
|
|
61
|
+
// 14px
|
|
62
|
+
sm: "icon-xs",
|
|
63
|
+
// 14px
|
|
64
|
+
default: "icon-sm",
|
|
65
|
+
// 16px
|
|
66
|
+
lg: "icon-sm",
|
|
67
|
+
// 16px
|
|
68
|
+
xl: "icon-sm"
|
|
69
|
+
// 16px
|
|
70
|
+
};
|
|
71
|
+
var itemSizeFromTrigger = {
|
|
72
|
+
xs: "sm",
|
|
73
|
+
sm: "sm",
|
|
74
|
+
default: "md",
|
|
75
|
+
lg: "md",
|
|
76
|
+
xl: "lg"
|
|
77
|
+
};
|
|
78
|
+
var itemSizeMap = {
|
|
79
|
+
sm: "pl-2 pr-6 py-1.5 text-sm",
|
|
80
|
+
md: "pl-3 pr-8 py-1.5 text-base",
|
|
81
|
+
lg: "pl-3 pr-10 py-2.5 text-base"
|
|
82
|
+
};
|
|
83
|
+
var indicatorSizeMap = {
|
|
84
|
+
sm: "right-2 h-3 w-3",
|
|
85
|
+
md: "right-2 h-3.5 w-3.5",
|
|
86
|
+
lg: "right-3 h-4 w-4"
|
|
87
|
+
};
|
|
88
|
+
var labelSizeMap = {
|
|
89
|
+
sm: "px-2 py-1.5 text-xs",
|
|
90
|
+
md: "px-2 py-1.5 text-xs",
|
|
91
|
+
lg: "px-3 py-2.5 text-xs"
|
|
92
|
+
};
|
|
93
|
+
var flushItemPaddingMap = {
|
|
94
|
+
sm: "pl-3 pr-7",
|
|
95
|
+
md: "pl-4 pr-9",
|
|
96
|
+
lg: "pl-4 pr-11"
|
|
97
|
+
};
|
|
98
|
+
var flushIndicatorSizeMap = {
|
|
99
|
+
sm: "right-3 h-3 w-3",
|
|
100
|
+
md: "right-3 h-3.5 w-3.5",
|
|
101
|
+
lg: "right-4 h-4 w-4"
|
|
102
|
+
};
|
|
103
|
+
var flushLabelPaddingMap = {
|
|
104
|
+
sm: "px-3",
|
|
105
|
+
md: "px-3",
|
|
106
|
+
lg: "px-4"
|
|
107
|
+
};
|
|
108
|
+
var SelectRootContext = React.createContext({ size: "default", radius: "default" });
|
|
109
|
+
var SelectStyleContext = React.createContext({ contentRadius: "xl", itemSize: "md", flush: false });
|
|
110
|
+
var Select = ({
|
|
111
|
+
size = "default",
|
|
112
|
+
radius = "default",
|
|
113
|
+
...props
|
|
114
|
+
}) => /* @__PURE__ */ React.createElement(SelectRootContext.Provider, { value: { size, radius } }, /* @__PURE__ */ React.createElement(SelectPrimitive.Root, { ...props }));
|
|
115
|
+
var SelectValue = SelectPrimitive.Value;
|
|
116
|
+
var SelectGroup = SelectPrimitive.Group;
|
|
117
|
+
var SelectTrigger = React.forwardRef(({ className, children, ...props }, ref) => {
|
|
118
|
+
const { size, radius } = React.useContext(SelectRootContext);
|
|
119
|
+
return /* @__PURE__ */ React.createElement(
|
|
120
|
+
SelectPrimitive.Trigger,
|
|
121
|
+
{
|
|
122
|
+
ref,
|
|
123
|
+
className: cn(
|
|
124
|
+
"flex w-full items-center justify-between bg-background text-foreground hover:bg-background-muted",
|
|
125
|
+
"border border-border",
|
|
126
|
+
triggerRadiusMap[radius],
|
|
127
|
+
"transition-colors duration-micro outline-transparent",
|
|
128
|
+
"focus-visible:shadow-[0_0_0_2px_var(--color-focus-ring)] focus:[outline:2px_solid_transparent]",
|
|
129
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
130
|
+
"data-[placeholder]:text-foreground/30",
|
|
131
|
+
triggerSizeMap[size],
|
|
132
|
+
className
|
|
133
|
+
),
|
|
134
|
+
...props
|
|
135
|
+
},
|
|
136
|
+
children,
|
|
137
|
+
/* @__PURE__ */ React.createElement(SelectPrimitive.Icon, { asChild: true }, /* @__PURE__ */ React.createElement(
|
|
138
|
+
"svg",
|
|
139
|
+
{
|
|
140
|
+
className: cn("ml-2 shrink-0 text-text-muted", triggerIconSizeMap[size]),
|
|
141
|
+
fill: "none",
|
|
142
|
+
viewBox: "0 0 24 24",
|
|
143
|
+
stroke: "currentColor",
|
|
144
|
+
strokeWidth: 2,
|
|
145
|
+
"aria-hidden": "true"
|
|
146
|
+
},
|
|
147
|
+
/* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" })
|
|
148
|
+
))
|
|
149
|
+
);
|
|
150
|
+
});
|
|
151
|
+
SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
|
|
152
|
+
var SelectScrollUpButton = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React.createElement(
|
|
153
|
+
SelectPrimitive.ScrollUpButton,
|
|
154
|
+
{
|
|
155
|
+
ref,
|
|
156
|
+
className: cn("flex items-center justify-center py-1 cursor-default", className),
|
|
157
|
+
...props
|
|
158
|
+
},
|
|
159
|
+
/* @__PURE__ */ React.createElement("svg", { className: "icon-xs", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M5 15l7-7 7 7" }))
|
|
160
|
+
));
|
|
161
|
+
SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
|
|
162
|
+
var SelectScrollDownButton = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React.createElement(
|
|
163
|
+
SelectPrimitive.ScrollDownButton,
|
|
164
|
+
{
|
|
165
|
+
ref,
|
|
166
|
+
className: cn("flex items-center justify-center py-1 cursor-default", className),
|
|
167
|
+
...props
|
|
168
|
+
},
|
|
169
|
+
/* @__PURE__ */ React.createElement("svg", { className: "icon-xs", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }))
|
|
170
|
+
));
|
|
171
|
+
SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;
|
|
172
|
+
var SelectContent = React.forwardRef(({ className, children, position = "popper", sideOffset = 1, flush = false, onCloseAutoFocus, ...props }, ref) => {
|
|
173
|
+
const { size, radius } = React.useContext(SelectRootContext);
|
|
174
|
+
const itemSize = itemSizeFromTrigger[size];
|
|
175
|
+
const contentRadius = contentRadiusFromRoot[radius];
|
|
176
|
+
return /* @__PURE__ */ React.createElement(SelectPrimitive.Portal, null, /* @__PURE__ */ React.createElement(SelectStyleContext.Provider, { value: { contentRadius, itemSize, flush } }, /* @__PURE__ */ React.createElement(
|
|
177
|
+
SelectPrimitive.Content,
|
|
178
|
+
{
|
|
179
|
+
ref,
|
|
180
|
+
onCloseAutoFocus: (e) => {
|
|
181
|
+
e.preventDefault();
|
|
182
|
+
onCloseAutoFocus?.(e);
|
|
183
|
+
},
|
|
184
|
+
className: cn(
|
|
185
|
+
"relative z-popover min-w-[var(--radix-select-trigger-width)] overflow-hidden border border-border bg-background text-foreground shadow-lg",
|
|
186
|
+
flush ? "py-1" : "p-1",
|
|
187
|
+
contentRadiusMap[contentRadius],
|
|
188
|
+
position === "popper" && "max-h-[var(--radix-select-content-available-height)]",
|
|
189
|
+
className
|
|
190
|
+
),
|
|
191
|
+
position,
|
|
192
|
+
sideOffset,
|
|
193
|
+
...props
|
|
194
|
+
},
|
|
195
|
+
/* @__PURE__ */ React.createElement(SelectScrollUpButton, null),
|
|
196
|
+
/* @__PURE__ */ React.createElement(
|
|
197
|
+
SelectPrimitive.Viewport,
|
|
198
|
+
{
|
|
199
|
+
className: cn(
|
|
200
|
+
position === "popper" && "h-[var(--radix-select-content-available-height)] w-full"
|
|
201
|
+
)
|
|
202
|
+
},
|
|
203
|
+
children
|
|
204
|
+
),
|
|
205
|
+
/* @__PURE__ */ React.createElement(SelectScrollDownButton, null)
|
|
206
|
+
)));
|
|
207
|
+
});
|
|
208
|
+
SelectContent.displayName = SelectPrimitive.Content.displayName;
|
|
209
|
+
var SelectItem = React.forwardRef(({ className, children, ...props }, ref) => {
|
|
210
|
+
const { contentRadius, itemSize, flush } = React.useContext(SelectStyleContext);
|
|
211
|
+
return /* @__PURE__ */ React.createElement(
|
|
212
|
+
SelectPrimitive.Item,
|
|
213
|
+
{
|
|
214
|
+
ref,
|
|
215
|
+
className: cn(
|
|
216
|
+
"relative flex w-full cursor-default select-none items-center outline-none",
|
|
217
|
+
itemSizeMap[itemSize],
|
|
218
|
+
!flush && itemRadiusMap[contentRadius],
|
|
219
|
+
flush && flushItemPaddingMap[itemSize],
|
|
220
|
+
"transition-colors duration-fast",
|
|
221
|
+
"focus:bg-background-muted",
|
|
222
|
+
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
223
|
+
className
|
|
224
|
+
),
|
|
225
|
+
...props
|
|
226
|
+
},
|
|
227
|
+
/* @__PURE__ */ React.createElement(SelectPrimitive.ItemText, { className: "truncate" }, children),
|
|
228
|
+
/* @__PURE__ */ React.createElement("span", { className: cn("absolute flex items-center justify-center", flush ? flushIndicatorSizeMap[itemSize] : indicatorSizeMap[itemSize]) }, /* @__PURE__ */ React.createElement(SelectPrimitive.ItemIndicator, null, /* @__PURE__ */ React.createElement("svg", { className: "icon-xs", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 3, "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M5 13l4 4L19 7" }))))
|
|
229
|
+
);
|
|
230
|
+
});
|
|
231
|
+
SelectItem.displayName = SelectPrimitive.Item.displayName;
|
|
232
|
+
var SelectLabel = React.forwardRef(({ className, ...props }, ref) => {
|
|
233
|
+
const { itemSize, flush } = React.useContext(SelectStyleContext);
|
|
234
|
+
return /* @__PURE__ */ React.createElement(
|
|
235
|
+
SelectPrimitive.Label,
|
|
236
|
+
{
|
|
237
|
+
ref,
|
|
238
|
+
className: cn(
|
|
239
|
+
"font-semibold text-text-muted",
|
|
240
|
+
labelSizeMap[itemSize],
|
|
241
|
+
flush && flushLabelPaddingMap[itemSize],
|
|
242
|
+
className
|
|
243
|
+
),
|
|
244
|
+
...props
|
|
245
|
+
}
|
|
246
|
+
);
|
|
247
|
+
});
|
|
248
|
+
SelectLabel.displayName = SelectPrimitive.Label.displayName;
|
|
249
|
+
var SelectSeparator = React.forwardRef(({ className, ...props }, ref) => {
|
|
250
|
+
const { flush } = React.useContext(SelectStyleContext);
|
|
251
|
+
return /* @__PURE__ */ React.createElement(
|
|
252
|
+
SelectPrimitive.Separator,
|
|
253
|
+
{
|
|
254
|
+
ref,
|
|
255
|
+
className: cn("h-px bg-border my-1", !flush && "-mx-1", className),
|
|
256
|
+
...props
|
|
257
|
+
}
|
|
258
|
+
);
|
|
259
|
+
});
|
|
260
|
+
SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
|
|
261
|
+
|
|
262
|
+
export {
|
|
263
|
+
Select,
|
|
264
|
+
SelectValue,
|
|
265
|
+
SelectGroup,
|
|
266
|
+
SelectTrigger,
|
|
267
|
+
SelectContent,
|
|
268
|
+
SelectItem,
|
|
269
|
+
SelectLabel,
|
|
270
|
+
SelectSeparator
|
|
271
|
+
};
|
|
272
|
+
//# sourceMappingURL=chunk-IY3R2VGB.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/select.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { cn } from '@/lib/utils'\n\n// Radius (matches Input — set at Root, propagates to Trigger and Content)\ntype SelectRadius = 'none' | 'sm' | 'base' | 'default' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'\n\nconst triggerRadiusMap: Record<SelectRadius, string> = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n base: 'rounded',\n default: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n '2xl': 'rounded-2xl',\n '3xl': 'rounded-3xl',\n full: 'rounded-full',\n}\n\n// Auto-mapping: root radius → content radius (3 levels)\ntype SelectContentRadius = 'md' | 'lg' | 'xl'\n\nconst contentRadiusFromRoot: Record<SelectRadius, SelectContentRadius> = {\n none: 'md',\n sm: 'md',\n base: 'md',\n default: 'md',\n lg: 'lg',\n xl: 'xl',\n '2xl': 'xl',\n '3xl': 'xl',\n full: 'xl',\n}\n\nconst contentRadiusMap: Record<SelectContentRadius, string> = {\n md: 'rounded-md', // 6px\n lg: 'rounded-lg', // 8px\n xl: 'rounded-xl', // 12px\n}\n\nconst itemRadiusMap: Record<SelectContentRadius, string> = {\n md: 'rounded', // 4px — perceptual balance (67%)\n lg: 'rounded-md', // 6px — perceptual balance (75%)\n xl: 'rounded-lg', // 8px — perceptual balance (67%)\n}\n\n// Size variants (matches Input component)\ntype SelectSize = 'xs' | 'sm' | 'default' | 'lg' | 'xl'\n\n// Trigger sizes (identical to Input)\nconst triggerSizeMap: Record<SelectSize, string> = {\n xs: 'h-9 px-3 text-sm', // 36px\n sm: 'h-10 px-3 text-md', // 40px\n default: 'h-11 px-4 text-base', // 44px\n lg: 'h-12 px-4 text-base', // 48px\n xl: 'h-14 px-4 text-base', // 56px\n}\n\n// Trigger icon sizes (matches Input icon pattern)\nconst triggerIconSizeMap: Record<SelectSize, string> = {\n xs: 'icon-xs', // 14px\n sm: 'icon-xs', // 14px\n default: 'icon-sm', // 16px\n lg: 'icon-sm', // 16px\n xl: 'icon-sm', // 16px\n}\n\n// Auto-mapping: trigger size → content item size (3 levels)\ntype SelectItemSize = 'sm' | 'md' | 'lg'\n\nconst itemSizeFromTrigger: Record<SelectSize, SelectItemSize> = {\n xs: 'sm',\n sm: 'sm',\n default: 'md',\n lg: 'md',\n xl: 'lg',\n}\n\n// Item sizes (font matches Trigger for seamless selection, padding controls density)\nconst itemSizeMap: Record<SelectItemSize, string> = {\n sm: 'pl-2 pr-6 py-1.5 text-sm',\n md: 'pl-3 pr-8 py-1.5 text-base',\n lg: 'pl-3 pr-10 py-2.5 text-base',\n}\n\n// Item indicator (check mark) — right-aligned\nconst indicatorSizeMap: Record<SelectItemSize, string> = {\n sm: 'right-2 h-3 w-3',\n md: 'right-2 h-3.5 w-3.5',\n lg: 'right-3 h-4 w-4',\n}\n\n// Label sizes\nconst labelSizeMap: Record<SelectItemSize, string> = {\n sm: 'px-2 py-1.5 text-xs',\n md: 'px-2 py-1.5 text-xs',\n lg: 'px-3 py-2.5 text-xs',\n}\n\n// Flush mode — items span full width, no inner radius\nconst flushItemPaddingMap: Record<SelectItemSize, string> = {\n sm: 'pl-3 pr-7',\n md: 'pl-4 pr-9',\n lg: 'pl-4 pr-11',\n}\n\nconst flushIndicatorSizeMap: Record<SelectItemSize, string> = {\n sm: 'right-3 h-3 w-3',\n md: 'right-3 h-3.5 w-3.5',\n lg: 'right-4 h-4 w-4',\n}\n\nconst flushLabelPaddingMap: Record<SelectItemSize, string> = {\n sm: 'px-3',\n md: 'px-3',\n lg: 'px-4',\n}\n\n// Root context — set at Root, consumed by Trigger and Content\nconst SelectRootContext = React.createContext<{\n size: SelectSize\n radius: SelectRadius\n}>({ size: 'default', radius: 'default' })\n\n// Style context — set at Content, consumed by Item/Label\nconst SelectStyleContext = React.createContext<{\n contentRadius: SelectContentRadius\n itemSize: SelectItemSize\n flush: boolean\n}>({ contentRadius: 'xl', itemSize: 'md', flush: false })\n\n// Root — state management + size/radius context\nconst Select = ({\n size = 'default',\n radius = 'default',\n ...props\n}: React.ComponentPropsWithoutRef<typeof SelectPrimitive.Root> & {\n size?: SelectSize\n radius?: SelectRadius\n}) => (\n <SelectRootContext.Provider value={{ size, radius }}>\n <SelectPrimitive.Root {...props} />\n </SelectRootContext.Provider>\n)\n\n// Value — displays selected value or placeholder\nconst SelectValue = SelectPrimitive.Value\n\n// Group — groups related items\nconst SelectGroup = SelectPrimitive.Group\n\n// Trigger — the element that opens the select (reads size + radius from context)\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => {\n const { size, radius } = React.useContext(SelectRootContext)\n return (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n 'flex w-full items-center justify-between bg-background text-foreground hover:bg-background-muted',\n 'border border-border',\n triggerRadiusMap[radius],\n 'transition-colors duration-micro outline-transparent',\n 'focus-visible:shadow-[0_0_0_2px_var(--color-focus-ring)] focus:[outline:2px_solid_transparent]',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'data-[placeholder]:text-foreground/30',\n triggerSizeMap[size],\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <svg\n className={cn('ml-2 shrink-0 text-text-muted', triggerIconSizeMap[size])}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n aria-hidden=\"true\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n})\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\n// ScrollUpButton — scroll indicator at top\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn('flex items-center justify-center py-1 cursor-default', className)}\n {...props}\n >\n <svg className=\"icon-xs\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2} aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 15l7-7 7 7\" />\n </svg>\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\n// ScrollDownButton — scroll indicator at bottom\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn('flex items-center justify-center py-1 cursor-default', className)}\n {...props}\n >\n <svg className=\"icon-xs\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2} aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName\n\n// Content — the floating panel (reads size + radius from context, auto-maps both)\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content> & {\n flush?: boolean\n }\n>(({ className, children, position = 'popper', sideOffset = 1, flush = false, onCloseAutoFocus, ...props }, ref) => {\n const { size, radius } = React.useContext(SelectRootContext)\n const itemSize = itemSizeFromTrigger[size]\n const contentRadius = contentRadiusFromRoot[radius]\n return (\n <SelectPrimitive.Portal>\n <SelectStyleContext.Provider value={{ contentRadius, itemSize, flush }}>\n <SelectPrimitive.Content\n ref={ref}\n onCloseAutoFocus={(e) => {\n e.preventDefault()\n onCloseAutoFocus?.(e)\n }}\n className={cn(\n 'relative z-popover min-w-[var(--radix-select-trigger-width)] overflow-hidden border border-border bg-background text-foreground shadow-lg',\n flush ? 'py-1' : 'p-1',\n contentRadiusMap[contentRadius],\n position === 'popper' &&\n 'max-h-[var(--radix-select-content-available-height)]',\n className\n )}\n position={position}\n sideOffset={sideOffset}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n position === 'popper' &&\n 'h-[var(--radix-select-content-available-height)] w-full'\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectStyleContext.Provider>\n </SelectPrimitive.Portal>\n )\n})\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\n// Item — a single selectable item (with right-aligned check indicator)\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => {\n const { contentRadius, itemSize, flush } = React.useContext(SelectStyleContext)\n return (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex w-full cursor-default select-none items-center outline-none',\n itemSizeMap[itemSize],\n !flush && itemRadiusMap[contentRadius],\n flush && flushItemPaddingMap[itemSize],\n 'transition-colors duration-fast',\n 'focus:bg-background-muted',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n {...props}\n >\n <SelectPrimitive.ItemText className=\"truncate\">{children}</SelectPrimitive.ItemText>\n <span className={cn('absolute flex items-center justify-center', flush ? flushIndicatorSizeMap[itemSize] : indicatorSizeMap[itemSize])}>\n <SelectPrimitive.ItemIndicator>\n <svg className=\"icon-xs\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={3} aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n </SelectPrimitive.ItemIndicator>\n </span>\n </SelectPrimitive.Item>\n )\n})\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\n// Label — non-interactive group heading\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => {\n const { itemSize, flush } = React.useContext(SelectStyleContext)\n return (\n <SelectPrimitive.Label\n ref={ref}\n className={cn(\n 'font-semibold text-text-muted',\n labelSizeMap[itemSize],\n flush && flushLabelPaddingMap[itemSize],\n className\n )}\n {...props}\n />\n )\n})\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\n// Separator — visual divider between groups\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => {\n const { flush } = React.useContext(SelectStyleContext)\n return (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn('h-px bg-border my-1', !flush && '-mx-1', className)}\n {...props}\n />\n )\n})\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport type { SelectRadius, SelectSize }\n\nexport {\n Select,\n SelectTrigger,\n SelectValue,\n SelectContent,\n SelectItem,\n SelectGroup,\n SelectLabel,\n SelectSeparator,\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
cn
|
|
4
|
+
} from "./chunk-53MIUPSY.mjs";
|
|
5
|
+
|
|
6
|
+
// src/components/ui/drawer.tsx
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
import * as DialogPrimitive from "@radix-ui/react-dialog";
|
|
9
|
+
import { cva } from "class-variance-authority";
|
|
10
|
+
var DefaultCloseIcon = ({ className }) => /* @__PURE__ */ React.createElement(
|
|
11
|
+
"svg",
|
|
12
|
+
{
|
|
13
|
+
className,
|
|
14
|
+
fill: "none",
|
|
15
|
+
viewBox: "0 0 24 24",
|
|
16
|
+
stroke: "currentColor",
|
|
17
|
+
strokeWidth: 2,
|
|
18
|
+
"aria-hidden": "true"
|
|
19
|
+
},
|
|
20
|
+
/* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18L18 6M6 6l12 12" })
|
|
21
|
+
);
|
|
22
|
+
var ANIMATION_CLASSES = {
|
|
23
|
+
right: "data-[state=open]:animate-drawer-right-enter data-[state=closed]:animate-drawer-right-exit",
|
|
24
|
+
left: "data-[state=open]:animate-drawer-left-enter data-[state=closed]:animate-drawer-left-exit",
|
|
25
|
+
top: "data-[state=open]:animate-drawer-top-enter data-[state=closed]:animate-drawer-top-exit",
|
|
26
|
+
bottom: "data-[state=open]:animate-drawer-bottom-enter data-[state=closed]:animate-drawer-bottom-exit"
|
|
27
|
+
};
|
|
28
|
+
var drawerSizeHorizontal = cva("", {
|
|
29
|
+
variants: {
|
|
30
|
+
size: {
|
|
31
|
+
sm: "w-[320px]",
|
|
32
|
+
md: "w-[400px]",
|
|
33
|
+
lg: "w-[480px]",
|
|
34
|
+
xl: "w-[640px]",
|
|
35
|
+
full: "w-full"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
defaultVariants: { size: "md" }
|
|
39
|
+
});
|
|
40
|
+
var drawerSizeVertical = cva("", {
|
|
41
|
+
variants: {
|
|
42
|
+
size: {
|
|
43
|
+
sm: "h-[320px]",
|
|
44
|
+
md: "h-[400px]",
|
|
45
|
+
lg: "h-[480px]",
|
|
46
|
+
xl: "h-[640px]",
|
|
47
|
+
full: "h-full"
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
defaultVariants: { size: "md" }
|
|
51
|
+
});
|
|
52
|
+
function Drawer(props) {
|
|
53
|
+
return /* @__PURE__ */ React.createElement(DialogPrimitive.Root, { ...props });
|
|
54
|
+
}
|
|
55
|
+
var DrawerTrigger = DialogPrimitive.Trigger;
|
|
56
|
+
var DrawerPortal = DialogPrimitive.Portal;
|
|
57
|
+
var DrawerClose = DialogPrimitive.Close;
|
|
58
|
+
var DrawerOverlay = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React.createElement(
|
|
59
|
+
DialogPrimitive.Overlay,
|
|
60
|
+
{
|
|
61
|
+
ref,
|
|
62
|
+
className: cn(
|
|
63
|
+
"fixed inset-0 z-overlay bg-black/50",
|
|
64
|
+
"data-[state=open]:animate-modal-overlay-enter data-[state=closed]:animate-modal-overlay-exit",
|
|
65
|
+
className
|
|
66
|
+
),
|
|
67
|
+
...props
|
|
68
|
+
}
|
|
69
|
+
));
|
|
70
|
+
DrawerOverlay.displayName = "DrawerOverlay";
|
|
71
|
+
var SIDE_POSITION = {
|
|
72
|
+
right: "inset-y-0 right-0",
|
|
73
|
+
left: "inset-y-0 left-0",
|
|
74
|
+
top: "inset-x-0 top-0",
|
|
75
|
+
bottom: "inset-x-0 bottom-0"
|
|
76
|
+
};
|
|
77
|
+
var DrawerContent = React.forwardRef(({ className, children, side = "right", size = "md", showCloseButton = true, closeIcon, ...props }, ref) => {
|
|
78
|
+
const isHorizontal = side === "left" || side === "right";
|
|
79
|
+
const sizeClass = isHorizontal ? drawerSizeHorizontal({ size }) : drawerSizeVertical({ size });
|
|
80
|
+
return /* @__PURE__ */ React.createElement(DrawerPortal, null, /* @__PURE__ */ React.createElement(DrawerOverlay, null), /* @__PURE__ */ React.createElement(
|
|
81
|
+
DialogPrimitive.Content,
|
|
82
|
+
{
|
|
83
|
+
ref,
|
|
84
|
+
className: cn(
|
|
85
|
+
"fixed z-modal flex flex-col bg-background text-foreground shadow-xl",
|
|
86
|
+
"focus:outline-none",
|
|
87
|
+
SIDE_POSITION[side],
|
|
88
|
+
isHorizontal ? "max-w-full h-full" : "max-h-full w-full",
|
|
89
|
+
sizeClass,
|
|
90
|
+
ANIMATION_CLASSES[side],
|
|
91
|
+
className
|
|
92
|
+
),
|
|
93
|
+
...props
|
|
94
|
+
},
|
|
95
|
+
children,
|
|
96
|
+
showCloseButton && /* @__PURE__ */ React.createElement(DialogPrimitive.Close, { className: cn(
|
|
97
|
+
"absolute right-4 top-4 rounded-md p-1",
|
|
98
|
+
"text-text-muted hover:text-foreground",
|
|
99
|
+
"transition-colors duration-fast",
|
|
100
|
+
"focus-visible:focus-ring focus-visible:outline-none",
|
|
101
|
+
"disabled:pointer-events-none"
|
|
102
|
+
) }, closeIcon || /* @__PURE__ */ React.createElement(DefaultCloseIcon, { className: "icon-sm" }), /* @__PURE__ */ React.createElement("span", { className: "sr-only" }, "Close"))
|
|
103
|
+
));
|
|
104
|
+
});
|
|
105
|
+
DrawerContent.displayName = "DrawerContent";
|
|
106
|
+
var DrawerHeader = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React.createElement(
|
|
107
|
+
"div",
|
|
108
|
+
{
|
|
109
|
+
ref,
|
|
110
|
+
className: cn("flex flex-col gap-1.5 p-6 pb-0", className),
|
|
111
|
+
...props
|
|
112
|
+
}
|
|
113
|
+
));
|
|
114
|
+
DrawerHeader.displayName = "DrawerHeader";
|
|
115
|
+
var DrawerTitle = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React.createElement(
|
|
116
|
+
DialogPrimitive.Title,
|
|
117
|
+
{
|
|
118
|
+
ref,
|
|
119
|
+
className: cn("text-lg font-semibold text-foreground", className),
|
|
120
|
+
...props
|
|
121
|
+
}
|
|
122
|
+
));
|
|
123
|
+
DrawerTitle.displayName = "DrawerTitle";
|
|
124
|
+
var DrawerDescription = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React.createElement(
|
|
125
|
+
DialogPrimitive.Description,
|
|
126
|
+
{
|
|
127
|
+
ref,
|
|
128
|
+
className: cn("text-md text-text-muted", className),
|
|
129
|
+
...props
|
|
130
|
+
}
|
|
131
|
+
));
|
|
132
|
+
DrawerDescription.displayName = "DrawerDescription";
|
|
133
|
+
var DrawerBody = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React.createElement(
|
|
134
|
+
"div",
|
|
135
|
+
{
|
|
136
|
+
ref,
|
|
137
|
+
className: cn("flex-1 overflow-y-auto p-6", className),
|
|
138
|
+
...props
|
|
139
|
+
}
|
|
140
|
+
));
|
|
141
|
+
DrawerBody.displayName = "DrawerBody";
|
|
142
|
+
var DrawerFooter = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React.createElement(
|
|
143
|
+
"div",
|
|
144
|
+
{
|
|
145
|
+
ref,
|
|
146
|
+
className: cn(
|
|
147
|
+
"flex items-center justify-end gap-3 p-6 pt-0",
|
|
148
|
+
className
|
|
149
|
+
),
|
|
150
|
+
...props
|
|
151
|
+
}
|
|
152
|
+
));
|
|
153
|
+
DrawerFooter.displayName = "DrawerFooter";
|
|
154
|
+
|
|
155
|
+
export {
|
|
156
|
+
drawerSizeHorizontal,
|
|
157
|
+
drawerSizeVertical,
|
|
158
|
+
Drawer,
|
|
159
|
+
DrawerTrigger,
|
|
160
|
+
DrawerPortal,
|
|
161
|
+
DrawerClose,
|
|
162
|
+
DrawerOverlay,
|
|
163
|
+
DrawerContent,
|
|
164
|
+
DrawerHeader,
|
|
165
|
+
DrawerTitle,
|
|
166
|
+
DrawerDescription,
|
|
167
|
+
DrawerBody,
|
|
168
|
+
DrawerFooter
|
|
169
|
+
};
|
|
170
|
+
//# sourceMappingURL=chunk-JCJEVXER.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/drawer.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { cva } from 'class-variance-authority'\nimport { cn } from '@/lib/utils'\n\n// ─── Default Close Icon (built-in, no external dependency) ──\nconst DefaultCloseIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n aria-hidden=\"true\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n)\n\n// ─── Types ──────────────────────────────────────────────────\nexport type DrawerSide = 'left' | 'right' | 'top' | 'bottom'\nexport type DrawerSize = 'sm' | 'md' | 'lg' | 'xl' | 'full'\n\n// ─── Animation class mapping (static strings for Tailwind scanner) ──\nconst ANIMATION_CLASSES: Record<DrawerSide, string> = {\n right: 'data-[state=open]:animate-drawer-right-enter data-[state=closed]:animate-drawer-right-exit',\n left: 'data-[state=open]:animate-drawer-left-enter data-[state=closed]:animate-drawer-left-exit',\n top: 'data-[state=open]:animate-drawer-top-enter data-[state=closed]:animate-drawer-top-exit',\n bottom: 'data-[state=open]:animate-drawer-bottom-enter data-[state=closed]:animate-drawer-bottom-exit',\n}\n\n// ─── Size variants ──────────────────────────────────────────\nconst drawerSizeHorizontal = cva('', {\n variants: {\n size: {\n sm: 'w-[320px]',\n md: 'w-[400px]',\n lg: 'w-[480px]',\n xl: 'w-[640px]',\n full: 'w-full',\n },\n },\n defaultVariants: { size: 'md' },\n})\n\nconst drawerSizeVertical = cva('', {\n variants: {\n size: {\n sm: 'h-[320px]',\n md: 'h-[400px]',\n lg: 'h-[480px]',\n xl: 'h-[640px]',\n full: 'h-full',\n },\n },\n defaultVariants: { size: 'md' },\n})\n\n// ═══════════════════════════════════════════════════════════════\n// Drawer\n// ═══════════════════════════════════════════════════════════════\n\n// ─── Drawer (Root) — thin wrapper to expose as named export ──\nfunction Drawer(props: React.ComponentPropsWithoutRef<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root {...props} />\n}\n\n// ─── DrawerTrigger ──────────────────────────────────────────\nconst DrawerTrigger = DialogPrimitive.Trigger\n\n// ─── DrawerPortal ───────────────────────────────────────────\nconst DrawerPortal = DialogPrimitive.Portal\n\n// ─── DrawerClose ────────────────────────────────────────────\nconst DrawerClose = DialogPrimitive.Close\n\n// ─── DrawerOverlay ──────────────────────────────────────────\nconst DrawerOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fixed inset-0 z-overlay bg-black/50',\n 'data-[state=open]:animate-modal-overlay-enter data-[state=closed]:animate-modal-overlay-exit',\n className\n )}\n {...props}\n />\n))\nDrawerOverlay.displayName = 'DrawerOverlay'\n\n// ─── DrawerContent ──────────────────────────────────────────\nexport interface DrawerContentProps\n extends Omit<React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>, 'children'> {\n /** Side from which the drawer slides in */\n side?: DrawerSide\n /** Panel size (width for left/right, height for top/bottom) */\n size?: DrawerSize\n /** Show built-in close button */\n showCloseButton?: boolean\n /** Custom close icon (replaces default X) */\n closeIcon?: React.ReactNode\n children?: React.ReactNode\n}\n\nconst SIDE_POSITION: Record<DrawerSide, string> = {\n right: 'inset-y-0 right-0',\n left: 'inset-y-0 left-0',\n top: 'inset-x-0 top-0',\n bottom: 'inset-x-0 bottom-0',\n}\n\nconst DrawerContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n DrawerContentProps\n>(({ className, children, side = 'right', size = 'md', showCloseButton = true, closeIcon, ...props }, ref) => {\n const isHorizontal = side === 'left' || side === 'right'\n const sizeClass = isHorizontal\n ? drawerSizeHorizontal({ size })\n : drawerSizeVertical({ size })\n\n return (\n <DrawerPortal>\n <DrawerOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed z-modal flex flex-col bg-background text-foreground shadow-xl',\n 'focus:outline-none',\n SIDE_POSITION[side],\n isHorizontal ? 'max-w-full h-full' : 'max-h-full w-full',\n sizeClass,\n ANIMATION_CLASSES[side],\n className,\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close className={cn(\n 'absolute right-4 top-4 rounded-md p-1',\n 'text-text-muted hover:text-foreground',\n 'transition-colors duration-fast',\n 'focus-visible:focus-ring focus-visible:outline-none',\n 'disabled:pointer-events-none'\n )}>\n {closeIcon || <DefaultCloseIcon className=\"icon-sm\" />}\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DrawerPortal>\n )\n})\nDrawerContent.displayName = 'DrawerContent'\n\n// ─── DrawerHeader ───────────────────────────────────────────\nconst DrawerHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex flex-col gap-1.5 p-6 pb-0', className)}\n {...props}\n />\n))\nDrawerHeader.displayName = 'DrawerHeader'\n\n// ─── DrawerTitle ────────────────────────────────────────────\nconst DrawerTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn('text-lg font-semibold text-foreground', className)}\n {...props}\n />\n))\nDrawerTitle.displayName = 'DrawerTitle'\n\n// ─── DrawerDescription ─────────────────────────────────────\nconst DrawerDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('text-md text-text-muted', className)}\n {...props}\n />\n))\nDrawerDescription.displayName = 'DrawerDescription'\n\n// ─── DrawerBody ─────────────────────────────────────────────\nconst DrawerBody = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex-1 overflow-y-auto p-6', className)}\n {...props}\n />\n))\nDrawerBody.displayName = 'DrawerBody'\n\n// ─── DrawerFooter ───────────────────────────────────────────\nconst DrawerFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'flex items-center justify-end gap-3 p-6 pt-0',\n className\n )}\n {...props}\n />\n))\nDrawerFooter.displayName = 'DrawerFooter'\n\n// ─── Exports ────────────────────────────────────────────────\nexport {\n Drawer,\n DrawerTrigger,\n DrawerPortal,\n DrawerOverlay,\n DrawerContent,\n DrawerHeader,\n DrawerTitle,\n DrawerDescription,\n DrawerBody,\n DrawerFooter,\n DrawerClose,\n drawerSizeHorizontal,\n drawerSizeVertical,\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
cn
|
|
4
|
+
} from "./chunk-53MIUPSY.mjs";
|
|
5
|
+
|
|
6
|
+
// src/components/ui/quick-reply.tsx
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
import { Slot } from "@radix-ui/react-slot";
|
|
9
|
+
import { cva } from "class-variance-authority";
|
|
10
|
+
var colorMap = {
|
|
11
|
+
default: {
|
|
12
|
+
outline: "border border-border text-foreground bg-background hover:bg-background-muted",
|
|
13
|
+
filled: "bg-background-muted text-foreground hover:bg-background-elevated",
|
|
14
|
+
ghost: "text-foreground hover:bg-background-muted"
|
|
15
|
+
},
|
|
16
|
+
primary: {
|
|
17
|
+
outline: "border border-primary text-text-primary bg-background hover:bg-primary-tint",
|
|
18
|
+
filled: "bg-primary-tint text-text-primary hover:bg-primary/20",
|
|
19
|
+
ghost: "text-text-primary hover:bg-primary-tint"
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
var QuickReplyContext = React.createContext({
|
|
23
|
+
size: "default",
|
|
24
|
+
variant: "outline",
|
|
25
|
+
color: "default",
|
|
26
|
+
radius: "full"
|
|
27
|
+
});
|
|
28
|
+
var quickReplyRootVariants = cva(
|
|
29
|
+
"flex items-center",
|
|
30
|
+
{
|
|
31
|
+
variants: {
|
|
32
|
+
layout: {
|
|
33
|
+
scroll: "overflow-x-auto",
|
|
34
|
+
wrap: "flex-wrap"
|
|
35
|
+
},
|
|
36
|
+
gap: {
|
|
37
|
+
sm: "gap-1.5",
|
|
38
|
+
default: "gap-2",
|
|
39
|
+
lg: "gap-2.5"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
defaultVariants: {
|
|
43
|
+
layout: "scroll",
|
|
44
|
+
gap: "default"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
);
|
|
48
|
+
var quickReplyItemVariants = cva(
|
|
49
|
+
[
|
|
50
|
+
"inline-flex items-center justify-center",
|
|
51
|
+
"whitespace-nowrap font-semibold shrink-0",
|
|
52
|
+
"transition-colors duration-fast cursor-pointer",
|
|
53
|
+
"focus-visible:outline-none focus-visible:focus-ring",
|
|
54
|
+
"disabled:pointer-events-none disabled:opacity-50",
|
|
55
|
+
"select-none"
|
|
56
|
+
].join(" "),
|
|
57
|
+
{
|
|
58
|
+
variants: {
|
|
59
|
+
size: {
|
|
60
|
+
sm: "h-7 px-2.5 text-xs gap-1.5",
|
|
61
|
+
// 28px
|
|
62
|
+
default: "h-8 px-3 text-sm gap-1.5",
|
|
63
|
+
// 32px
|
|
64
|
+
lg: "h-9 px-3.5 text-md gap-1.5"
|
|
65
|
+
// 36px
|
|
66
|
+
},
|
|
67
|
+
radius: {
|
|
68
|
+
md: "rounded-md",
|
|
69
|
+
// 6px
|
|
70
|
+
lg: "rounded-lg",
|
|
71
|
+
// 8px
|
|
72
|
+
full: "rounded-full"
|
|
73
|
+
// 9999px
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
defaultVariants: {
|
|
77
|
+
size: "default",
|
|
78
|
+
radius: "full"
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
);
|
|
82
|
+
var iconSizeMap = {
|
|
83
|
+
sm: "icon-xs",
|
|
84
|
+
// 14px
|
|
85
|
+
default: "icon-xs",
|
|
86
|
+
// 14px
|
|
87
|
+
lg: "icon-sm"
|
|
88
|
+
// 16px
|
|
89
|
+
};
|
|
90
|
+
var QuickReply = React.forwardRef(
|
|
91
|
+
({
|
|
92
|
+
className,
|
|
93
|
+
layout = "scroll",
|
|
94
|
+
gap = "default",
|
|
95
|
+
variant = "outline",
|
|
96
|
+
color = "default",
|
|
97
|
+
size = "default",
|
|
98
|
+
radius = "full",
|
|
99
|
+
role = "group",
|
|
100
|
+
children,
|
|
101
|
+
...props
|
|
102
|
+
}, ref) => {
|
|
103
|
+
const contextValue = React.useMemo(
|
|
104
|
+
() => ({ size, variant, color, radius }),
|
|
105
|
+
[size, variant, color, radius]
|
|
106
|
+
);
|
|
107
|
+
return /* @__PURE__ */ React.createElement(QuickReplyContext.Provider, { value: contextValue }, /* @__PURE__ */ React.createElement(
|
|
108
|
+
"div",
|
|
109
|
+
{
|
|
110
|
+
ref,
|
|
111
|
+
role,
|
|
112
|
+
className: cn(quickReplyRootVariants({ layout, gap }), className),
|
|
113
|
+
...props
|
|
114
|
+
},
|
|
115
|
+
children
|
|
116
|
+
));
|
|
117
|
+
}
|
|
118
|
+
);
|
|
119
|
+
QuickReply.displayName = "QuickReply";
|
|
120
|
+
var QuickReplyItem = React.forwardRef(
|
|
121
|
+
({ className, icon, asChild = false, children, ...props }, ref) => {
|
|
122
|
+
const { size, variant, color, radius } = React.useContext(QuickReplyContext);
|
|
123
|
+
const Comp = asChild ? Slot : "button";
|
|
124
|
+
const colorClasses = colorMap[color][variant];
|
|
125
|
+
return /* @__PURE__ */ React.createElement(
|
|
126
|
+
Comp,
|
|
127
|
+
{
|
|
128
|
+
ref,
|
|
129
|
+
type: !asChild ? "button" : void 0,
|
|
130
|
+
...props,
|
|
131
|
+
className: cn(
|
|
132
|
+
quickReplyItemVariants({ size, radius }),
|
|
133
|
+
colorClasses,
|
|
134
|
+
className
|
|
135
|
+
)
|
|
136
|
+
},
|
|
137
|
+
icon && /* @__PURE__ */ React.createElement(
|
|
138
|
+
"span",
|
|
139
|
+
{
|
|
140
|
+
className: cn("shrink-0 [&>svg]:w-full [&>svg]:h-full", iconSizeMap[size]),
|
|
141
|
+
"aria-hidden": "true"
|
|
142
|
+
},
|
|
143
|
+
icon
|
|
144
|
+
),
|
|
145
|
+
children
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
);
|
|
149
|
+
QuickReplyItem.displayName = "QuickReplyItem";
|
|
150
|
+
|
|
151
|
+
export {
|
|
152
|
+
quickReplyRootVariants,
|
|
153
|
+
quickReplyItemVariants,
|
|
154
|
+
QuickReply,
|
|
155
|
+
QuickReplyItem
|
|
156
|
+
};
|
|
157
|
+
//# sourceMappingURL=chunk-KBPYAMGS.mjs.map
|