bo-ui-kit 0.1.1 → 0.2.1

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/index.js CHANGED
@@ -1,12 +1,13 @@
1
- import { jsxs as h, jsx as t } from "react/jsx-runtime";
2
- import * as i from "react";
3
- import { cva as j } from "class-variance-authority";
4
- import { clsx as G } from "clsx";
5
- import { twMerge as B } from "tailwind-merge";
1
+ import { jsxs as b, jsx as r, Fragment as _ } from "react/jsx-runtime";
2
+ import * as o from "react";
3
+ import { cva as N } from "class-variance-authority";
4
+ import { clsx as ie } from "clsx";
5
+ import { twMerge as le } from "tailwind-merge";
6
+ import { createPortal as de } from "react-dom";
6
7
  function f(...e) {
7
- return B(G(e));
8
+ return le(ie(e));
8
9
  }
9
- const P = j(
10
+ const ce = N(
10
11
  // 공통: gap-0 + 라벨 자체 padding 으로 Figma 의 LabelFrame 구조를 재현
11
12
  "inline-flex shrink-0 items-center justify-center gap-0 whitespace-nowrap border font-medium transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50",
12
13
  {
@@ -16,7 +17,7 @@ const P = j(
16
17
  outline: "border-border bg-card text-foreground shadow-xs hover:bg-secondary/50",
17
18
  secondary: "border-transparent bg-secondary text-foreground hover:bg-secondary/80",
18
19
  destructive: "border-border bg-destructive text-primary-foreground shadow-btn hover:bg-destructive/90",
19
- "destructive-outline": "border-border bg-background text-destructive-foreground shadow-xs hover:bg-destructive/10",
20
+ "destructive-tinted": "border-transparent bg-destructive/[0.08] text-destructive-foreground hover:bg-destructive/[0.12]",
20
21
  ghost: "border-transparent bg-transparent text-foreground hover:bg-secondary",
21
22
  link: "border-transparent bg-transparent text-foreground underline-offset-4 hover:underline"
22
23
  },
@@ -33,68 +34,72 @@ const P = j(
33
34
  size: "md"
34
35
  }
35
36
  }
36
- ), q = i.forwardRef(
37
- ({ className: e, variant: n, size: l, type: o = "button", icon: a, rightIcon: d, children: s, ...u }, c) => /* @__PURE__ */ h(
37
+ ), C = o.forwardRef(
38
+ ({ className: e, variant: t, size: n, type: s = "button", icon: a, rightIcon: l, pill: d, children: i, ...c }, u) => /* @__PURE__ */ b(
38
39
  "button",
39
40
  {
40
- ref: c,
41
- type: o,
42
- className: f(P({ variant: n, size: l }), e),
41
+ ref: u,
42
+ type: s,
43
+ className: f(
44
+ ce({ variant: t, size: n }),
45
+ d && "!rounded-radius-full",
46
+ e
47
+ ),
43
48
  "data-node-id": "1692:74",
44
- ...u,
49
+ ...c,
45
50
  children: [
46
- a ? /* @__PURE__ */ t("span", { className: "inline-flex shrink-0 opacity-80", children: a }) : null,
47
- s != null ? /* @__PURE__ */ t("span", { "data-label": !0, className: "px-1", children: s }) : null,
48
- d ? /* @__PURE__ */ t("span", { className: "inline-flex shrink-0 opacity-80", children: d }) : null
51
+ a ? /* @__PURE__ */ r("span", { className: "inline-flex shrink-0 opacity-80", children: a }) : null,
52
+ i != null ? /* @__PURE__ */ r("span", { "data-label": !0, className: "px-1", children: i }) : null,
53
+ l ? /* @__PURE__ */ r("span", { className: "inline-flex shrink-0 opacity-80", children: l }) : null
49
54
  ]
50
55
  }
51
56
  )
52
57
  );
53
- q.displayName = "Button";
54
- const C = i.forwardRef(
58
+ C.displayName = "Button";
59
+ const ue = o.forwardRef(
55
60
  ({
56
61
  checked: e,
57
- defaultChecked: n,
58
- indeterminate: l = !1,
59
- disabled: o = !1,
62
+ defaultChecked: t,
63
+ indeterminate: n = !1,
64
+ disabled: s = !1,
60
65
  mobile: a = !1,
61
- onCheckedChange: d,
62
- className: s,
63
- ...u
66
+ onCheckedChange: l,
67
+ className: d,
68
+ ...i
64
69
  }, c) => {
65
- const x = e !== void 0, [b, g] = i.useState(n ?? !1), k = x ? e : b, m = i.useRef(null);
66
- i.useImperativeHandle(c, () => m.current);
67
- const v = k && !l, y = k && l;
68
- i.useEffect(() => {
69
- m.current && (m.current.indeterminate = y);
70
- }, [y]);
71
- const N = (w) => {
72
- const z = w.target.checked;
73
- x || g(z), d == null || d(z);
70
+ const u = e !== void 0, [x, m] = o.useState(t ?? !1), p = u ? e : x, h = o.useRef(null);
71
+ o.useImperativeHandle(c, () => h.current);
72
+ const v = p && !n, w = p && n;
73
+ o.useEffect(() => {
74
+ h.current && (h.current.indeterminate = w);
75
+ }, [w]);
76
+ const S = (y) => {
77
+ const k = y.target.checked;
78
+ u || m(k), l == null || l(k);
74
79
  };
75
- return /* @__PURE__ */ h(
80
+ return /* @__PURE__ */ b(
76
81
  "label",
77
82
  {
78
83
  className: f(
79
84
  "inline-flex shrink-0 items-center justify-center",
80
- o ? "cursor-not-allowed opacity-[0.64]" : "cursor-pointer",
81
- s
85
+ s ? "cursor-not-allowed opacity-[0.64]" : "cursor-pointer",
86
+ d
82
87
  ),
83
88
  children: [
84
- /* @__PURE__ */ t(
89
+ /* @__PURE__ */ r(
85
90
  "input",
86
91
  {
87
- ref: m,
92
+ ref: h,
88
93
  type: "checkbox",
89
94
  className: "peer sr-only",
90
- checked: x ? e : void 0,
91
- defaultChecked: x ? void 0 : n,
92
- disabled: o,
93
- onChange: N,
94
- ...u
95
+ checked: u ? e : void 0,
96
+ defaultChecked: u ? void 0 : t,
97
+ disabled: s,
98
+ onChange: S,
99
+ ...i
95
100
  }
96
101
  ),
97
- /* @__PURE__ */ h(
102
+ /* @__PURE__ */ b(
98
103
  "span",
99
104
  {
100
105
  "aria-hidden": !0,
@@ -105,7 +110,7 @@ const C = i.forwardRef(
105
110
  v ? "border-transparent bg-primary text-primary-foreground" : "border-input bg-card shadow-xs"
106
111
  ),
107
112
  children: [
108
- v && /* @__PURE__ */ t(
113
+ v && /* @__PURE__ */ r(
109
114
  "svg",
110
115
  {
111
116
  viewBox: "0 0 8 8",
@@ -114,7 +119,7 @@ const C = i.forwardRef(
114
119
  strokeWidth: "1.5",
115
120
  className: a ? "size-2.5" : "size-2",
116
121
  "aria-hidden": !0,
117
- children: /* @__PURE__ */ t(
122
+ children: /* @__PURE__ */ r(
118
123
  "path",
119
124
  {
120
125
  d: "M1 4.2 3 6l4-4.5",
@@ -124,7 +129,7 @@ const C = i.forwardRef(
124
129
  )
125
130
  }
126
131
  ),
127
- y && /* @__PURE__ */ t("span", { className: f("h-0.5 rounded-full bg-primary", a ? "w-2" : "w-1.5") })
132
+ w && /* @__PURE__ */ r("span", { className: f("h-0.5 rounded-full bg-primary", a ? "w-2" : "w-1.5") })
128
133
  ]
129
134
  }
130
135
  )
@@ -133,8 +138,8 @@ const C = i.forwardRef(
133
138
  );
134
139
  }
135
140
  );
136
- C.displayName = "Checkbox";
137
- const F = j(
141
+ ue.displayName = "Checkbox";
142
+ const fe = N(
138
143
  "flex w-full items-center gap-1 rounded-radius border bg-card text-sm text-foreground shadow-xs transition-colors focus-within:ring-[3px] focus-within:ring-offset-0 has-[:disabled]:cursor-not-allowed has-[:disabled]:opacity-[0.64]",
139
144
  {
140
145
  variants: {
@@ -150,118 +155,118 @@ const F = j(
150
155
  },
151
156
  defaultVariants: { inputSize: "md", invalid: !1 }
152
157
  }
153
- ), W = i.forwardRef(
158
+ ), me = o.forwardRef(
154
159
  ({
155
160
  className: e,
156
- containerClassName: n,
157
- inputSize: l,
158
- invalid: o = !1,
161
+ containerClassName: t,
162
+ inputSize: n,
163
+ invalid: s = !1,
159
164
  leftIcon: a,
160
- rightIcon: d,
161
- prefix: s,
162
- suffix: u,
165
+ rightIcon: l,
166
+ prefix: d,
167
+ suffix: i,
163
168
  type: c = "text",
164
- ...x
165
- }, b) => /* @__PURE__ */ h(
169
+ ...u
170
+ }, x) => /* @__PURE__ */ b(
166
171
  "div",
167
172
  {
168
- className: f(F({ inputSize: l, invalid: o }), n),
173
+ className: f(fe({ inputSize: n, invalid: s }), t),
169
174
  "data-node-id": "7745:699",
170
175
  children: [
171
- a ? /* @__PURE__ */ t("span", { className: "inline-flex shrink-0 opacity-80 [&_svg]:size-4", children: a }) : null,
172
- s != null ? /* @__PURE__ */ t("span", { className: "shrink-0 text-muted-foreground", children: s }) : null,
173
- /* @__PURE__ */ t(
176
+ a ? /* @__PURE__ */ r("span", { className: "inline-flex shrink-0 opacity-80 [&_svg]:size-4", children: a }) : null,
177
+ d != null ? /* @__PURE__ */ r("span", { className: "shrink-0 text-muted-foreground", children: d }) : null,
178
+ /* @__PURE__ */ r(
174
179
  "input",
175
180
  {
176
- ref: b,
181
+ ref: x,
177
182
  type: c,
178
183
  className: f(
179
184
  "min-w-0 flex-1 bg-transparent px-1 text-foreground outline-none placeholder:text-muted-foreground",
180
185
  e
181
186
  ),
182
- ...x
187
+ ...u
183
188
  }
184
189
  ),
185
- u != null ? /* @__PURE__ */ t("span", { className: "shrink-0 text-muted-foreground", children: u }) : null,
186
- d ? /* @__PURE__ */ t("span", { className: "inline-flex shrink-0 opacity-80 [&_svg]:size-4", children: d }) : null
190
+ i != null ? /* @__PURE__ */ r("span", { className: "shrink-0 text-muted-foreground", children: i }) : null,
191
+ l ? /* @__PURE__ */ r("span", { className: "inline-flex shrink-0 opacity-80 [&_svg]:size-4", children: l }) : null
187
192
  ]
188
193
  }
189
194
  )
190
195
  );
191
- W.displayName = "Input";
192
- const K = i.forwardRef(
193
- ({ className: e, ...n }, l) => /* @__PURE__ */ t(
196
+ me.displayName = "Input";
197
+ const pe = o.forwardRef(
198
+ ({ className: e, ...t }, n) => /* @__PURE__ */ r(
194
199
  "label",
195
200
  {
196
- ref: l,
201
+ ref: n,
197
202
  className: f(
198
203
  "inline-flex items-center text-xs font-medium text-foreground",
199
204
  "peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
200
205
  e
201
206
  ),
202
207
  "data-node-id": "7658:2157",
203
- ...n
208
+ ...t
204
209
  }
205
210
  )
206
211
  );
207
- K.displayName = "Label";
208
- const $ = i.forwardRef(
209
- ({ className: e, label: n, required: l = !1, htmlFor: o, description: a, error: d, validity: s, children: u, ...c }, x) => /* @__PURE__ */ h(
212
+ pe.displayName = "Label";
213
+ const xe = o.forwardRef(
214
+ ({ className: e, label: t, required: n = !1, htmlFor: s, description: a, error: l, validity: d, children: i, ...c }, u) => /* @__PURE__ */ b(
210
215
  "div",
211
216
  {
212
- ref: x,
217
+ ref: u,
213
218
  className: f("flex w-full flex-col gap-2", e),
214
219
  "data-node-id": "7745:713",
215
220
  ...c,
216
221
  children: [
217
- /* @__PURE__ */ h("div", { className: "flex flex-col gap-1.5", children: [
218
- n != null && /* @__PURE__ */ h(
222
+ /* @__PURE__ */ b("div", { className: "flex flex-col gap-1.5", children: [
223
+ t != null && /* @__PURE__ */ b(
219
224
  "label",
220
225
  {
221
- htmlFor: o,
226
+ htmlFor: s,
222
227
  className: "flex items-center gap-1.5 text-sm font-medium leading-5 text-foreground",
223
228
  children: [
224
- n,
225
- l && /* @__PURE__ */ t("span", { className: "text-destructive-foreground", "aria-hidden": !0, children: "*" })
229
+ t,
230
+ n && /* @__PURE__ */ r("span", { className: "text-destructive-foreground", "aria-hidden": !0, children: "*" })
226
231
  ]
227
232
  }
228
233
  ),
229
- u
234
+ i
230
235
  ] }),
231
- d != null ? /* @__PURE__ */ t("p", { className: "text-xs leading-[14px] tracking-[0.12px] text-destructive-foreground", children: d }) : a != null ? /* @__PURE__ */ t("p", { className: "text-xs leading-[14px] tracking-[0.12px] text-muted-foreground", children: a }) : null,
232
- s != null && /* @__PURE__ */ t("div", { className: "rounded-radius-lg bg-secondary p-2", children: /* @__PURE__ */ t("p", { className: "text-xs leading-[14px] tracking-[0.12px] text-foreground", children: s }) })
236
+ l != null ? /* @__PURE__ */ r("p", { className: "text-xs leading-[14px] tracking-[0.12px] text-destructive-foreground", children: l }) : a != null ? /* @__PURE__ */ r("p", { className: "text-xs leading-[14px] tracking-[0.12px] text-muted-foreground", children: a }) : null,
237
+ d != null && /* @__PURE__ */ r("div", { className: "rounded-radius-lg bg-secondary p-2", children: /* @__PURE__ */ r("p", { className: "text-xs leading-[14px] tracking-[0.12px] text-foreground", children: d }) })
233
238
  ]
234
239
  }
235
240
  )
236
241
  );
237
- $.displayName = "Field";
238
- const _ = i.createContext(!1), H = i.forwardRef(
242
+ xe.displayName = "Field";
243
+ const G = o.createContext(!1), be = o.forwardRef(
239
244
  ({
240
245
  className: e,
241
- isLarge: n = !1,
242
- title: l = "Verification code",
243
- showTitle: o = !0,
246
+ isLarge: t = !1,
247
+ title: n = "Verification code",
248
+ showTitle: s = !0,
244
249
  belowText: a = "Enter the 6-digit code sent to your email.",
245
- showBelowText: d = !0,
246
- children: s,
247
- ...u
248
- }, c) => /* @__PURE__ */ t(_.Provider, { value: n, children: /* @__PURE__ */ h(
250
+ showBelowText: l = !0,
251
+ children: d,
252
+ ...i
253
+ }, c) => /* @__PURE__ */ r(G.Provider, { value: t, children: /* @__PURE__ */ b(
249
254
  "div",
250
255
  {
251
256
  ref: c,
252
257
  className: f("flex flex-col items-center gap-2", e),
253
258
  "data-node-id": "8060:1580",
254
- ...u,
259
+ ...i,
255
260
  children: [
256
- o ? /* @__PURE__ */ t("p", { className: "w-full text-center text-sm font-medium text-foreground", children: l }) : null,
257
- /* @__PURE__ */ t("div", { className: "flex items-center justify-center gap-2", children: s }),
258
- d ? /* @__PURE__ */ t("p", { className: "w-full text-center text-xs text-muted-foreground", children: a }) : null
261
+ s ? /* @__PURE__ */ r("p", { className: "w-full text-center text-sm font-medium text-foreground", children: n }) : null,
262
+ /* @__PURE__ */ r("div", { className: "flex items-center justify-center gap-2", children: d }),
263
+ l ? /* @__PURE__ */ r("p", { className: "w-full text-center text-xs text-muted-foreground", children: a }) : null
259
264
  ]
260
265
  }
261
266
  ) })
262
267
  );
263
- H.displayName = "InputOTP";
264
- const U = j(
268
+ be.displayName = "InputOTP";
269
+ const ge = N(
265
270
  "relative flex shrink-0 items-center justify-center rounded-radius border bg-card text-sm text-foreground shadow-xs transition-[color,box-shadow]",
266
271
  {
267
272
  variants: {
@@ -274,67 +279,67 @@ const U = j(
274
279
  },
275
280
  defaultVariants: { isLarge: !1, active: !1 }
276
281
  }
277
- ), J = i.forwardRef(
278
- ({ className: e, char: n, active: l = !1, isLarge: o, ...a }, d) => {
279
- const s = i.useContext(_);
280
- return /* @__PURE__ */ t(
282
+ ), ve = o.forwardRef(
283
+ ({ className: e, char: t, active: n = !1, isLarge: s, ...a }, l) => {
284
+ const d = o.useContext(G);
285
+ return /* @__PURE__ */ r(
281
286
  "div",
282
287
  {
283
- ref: d,
284
- className: f(U({ isLarge: o ?? s, active: l }), e),
288
+ ref: l,
289
+ className: f(ge({ isLarge: s ?? d, active: n }), e),
285
290
  ...a,
286
- children: n != null ? /* @__PURE__ */ t("span", { className: "text-center", children: n }) : null
291
+ children: t != null ? /* @__PURE__ */ r("span", { className: "text-center", children: t }) : null
287
292
  }
288
293
  );
289
294
  }
290
295
  );
291
- J.displayName = "InputOTPSlot";
292
- const Q = i.forwardRef(({ className: e, ...n }, l) => /* @__PURE__ */ t(
296
+ ve.displayName = "InputOTPSlot";
297
+ const he = o.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ r(
293
298
  "div",
294
299
  {
295
- ref: l,
300
+ ref: n,
296
301
  role: "separator",
297
302
  className: f("flex w-3 shrink-0 items-center justify-center", e),
298
- ...n,
299
- children: /* @__PURE__ */ t("div", { className: "h-0.5 w-full rounded-full bg-border" })
303
+ ...t,
304
+ children: /* @__PURE__ */ r("div", { className: "h-0.5 w-full rounded-full bg-border" })
300
305
  }
301
306
  ));
302
- Q.displayName = "InputOTPSeparator";
303
- const X = i.forwardRef(
307
+ he.displayName = "InputOTPSeparator";
308
+ const we = o.forwardRef(
304
309
  ({
305
310
  className: e,
306
- value: n = 50,
307
- min: l = 0,
308
- max: o = 100,
311
+ value: t = 50,
312
+ min: n = 0,
313
+ max: s = 100,
309
314
  label: a = "Label",
310
- valueLabel: d,
311
- showLabels: s = !0,
312
- showSecondaryLabel: u = !0,
315
+ valueLabel: l,
316
+ showLabels: d = !0,
317
+ showSecondaryLabel: i = !0,
313
318
  ...c
314
- }, x) => {
315
- const b = o - l || 1, g = Math.min(100, Math.max(0, (n - l) / b * 100));
316
- return /* @__PURE__ */ h(
319
+ }, u) => {
320
+ const x = s - n || 1, m = Math.min(100, Math.max(0, (t - n) / x * 100));
321
+ return /* @__PURE__ */ b(
317
322
  "div",
318
323
  {
319
- ref: x,
324
+ ref: u,
320
325
  role: "meter",
321
- "aria-valuenow": n,
322
- "aria-valuemin": l,
323
- "aria-valuemax": o,
326
+ "aria-valuenow": t,
327
+ "aria-valuemin": n,
328
+ "aria-valuemax": s,
324
329
  "aria-label": a,
325
330
  className: f("flex w-full flex-col gap-2", e),
326
331
  "data-node-id": "7664:31",
327
332
  ...c,
328
333
  children: [
329
- s ? /* @__PURE__ */ h("div", { className: "flex items-center justify-between", children: [
330
- a != null ? /* @__PURE__ */ t("span", { className: "text-xs font-medium text-foreground", children: a }) : null,
331
- u ? /* @__PURE__ */ t("span", { className: "text-xs font-medium text-foreground", children: d ?? `${Math.round(g)}%` }) : null
334
+ d ? /* @__PURE__ */ b("div", { className: "flex items-center justify-between", children: [
335
+ a != null ? /* @__PURE__ */ r("span", { className: "text-xs font-medium text-foreground", children: a }) : null,
336
+ i ? /* @__PURE__ */ r("span", { className: "text-xs font-medium text-foreground", children: l ?? `${Math.round(m)}%` }) : null
332
337
  ] }) : null,
333
- /* @__PURE__ */ t("div", { className: "relative h-2 w-full overflow-hidden bg-input", "data-node-id": "7664:42", children: /* @__PURE__ */ t(
338
+ /* @__PURE__ */ r("div", { className: "relative h-2 w-full overflow-hidden bg-input", "data-node-id": "7664:42", children: /* @__PURE__ */ r(
334
339
  "div",
335
340
  {
336
341
  className: "absolute inset-y-0 left-0 bg-primary transition-[width]",
337
- style: { width: `${g}%` },
342
+ style: { width: `${m}%` },
338
343
  "data-node-id": "7664:44"
339
344
  }
340
345
  ) })
@@ -343,8 +348,8 @@ const X = i.forwardRef(
343
348
  );
344
349
  }
345
350
  );
346
- X.displayName = "Meter";
347
- const A = j(
351
+ we.displayName = "Meter";
352
+ const W = N(
348
353
  "inline-flex shrink-0 items-center justify-center gap-1 rounded-radius-lg text-sm text-foreground transition-colors outline-none focus-visible:ring-[3px] focus-visible:ring-offset-0 focus-visible:ring-disabled/[0.07] disabled:pointer-events-none disabled:opacity-50 data-[state=off]:hover:bg-card/50 data-[state=on]:bg-secondary/[0.64] [&_svg]:size-4 [&_svg]:shrink-0",
349
354
  {
350
355
  variants: {
@@ -370,29 +375,29 @@ const A = j(
370
375
  ],
371
376
  defaultVariants: { variant: "default", size: "md", iconOnly: !1 }
372
377
  }
373
- ), Y = i.forwardRef(
378
+ ), ye = o.forwardRef(
374
379
  ({
375
380
  className: e,
376
- variant: n,
377
- size: l,
378
- iconOnly: o,
381
+ variant: t,
382
+ size: n,
383
+ iconOnly: s,
379
384
  pressed: a,
380
- defaultPressed: d = !1,
381
- onPressedChange: s,
382
- onClick: u,
385
+ defaultPressed: l = !1,
386
+ onPressedChange: d,
387
+ onClick: i,
383
388
  ...c
384
- }, x) => {
385
- const b = a !== void 0, [g, k] = i.useState(d), m = b ? a : g;
386
- return /* @__PURE__ */ t(
389
+ }, u) => {
390
+ const x = a !== void 0, [m, p] = o.useState(l), h = x ? a : m;
391
+ return /* @__PURE__ */ r(
387
392
  "button",
388
393
  {
389
- ref: x,
394
+ ref: u,
390
395
  type: "button",
391
- "aria-pressed": m,
392
- "data-state": m ? "on" : "off",
393
- className: f(A({ variant: n, size: l, iconOnly: o }), e),
396
+ "aria-pressed": h,
397
+ "data-state": h ? "on" : "off",
398
+ className: f(W({ variant: t, size: n, iconOnly: s }), e),
394
399
  onClick: (v) => {
395
- b || k((y) => !y), s == null || s(!m), u == null || u(v);
400
+ x || p((w) => !w), d == null || d(!h), i == null || i(v);
396
401
  },
397
402
  "data-node-id": "5685:204",
398
403
  ...c
@@ -400,76 +405,76 @@ const A = j(
400
405
  );
401
406
  }
402
407
  );
403
- Y.displayName = "Toggle";
404
- const M = i.createContext(
408
+ ye.displayName = "Toggle";
409
+ const F = o.createContext(
405
410
  null
406
- ), Z = i.forwardRef(
407
- (e, n) => {
411
+ ), Ne = o.forwardRef(
412
+ (e, t) => {
408
413
  const {
409
- type: l,
410
- variant: o = "outline",
414
+ type: n,
415
+ variant: s = "outline",
411
416
  size: a = "md",
412
- orientation: d = "horizontal",
413
- className: s,
414
- children: u
415
- } = e, c = e.value !== void 0, [x, b] = i.useState(() => e.defaultValue == null ? [] : Array.isArray(e.defaultValue) ? e.defaultValue : [e.defaultValue]), g = c ? Array.isArray(e.value) ? e.value : e.value ? [e.value] : [] : x, k = (m) => {
416
- var y, N;
417
+ orientation: l = "horizontal",
418
+ className: d,
419
+ children: i
420
+ } = e, c = e.value !== void 0, [u, x] = o.useState(() => e.defaultValue == null ? [] : Array.isArray(e.defaultValue) ? e.defaultValue : [e.defaultValue]), m = c ? Array.isArray(e.value) ? e.value : e.value ? [e.value] : [] : u, p = (h) => {
421
+ var w, S;
417
422
  let v;
418
- l === "single" ? (v = g[0] === m ? [] : [m], c || b(v), (y = e.onValueChange) == null || y.call(
423
+ n === "single" ? (v = m[0] === h ? [] : [h], c || x(v), (w = e.onValueChange) == null || w.call(
419
424
  e,
420
425
  v[0] ?? ""
421
- )) : (v = g.includes(m) ? g.filter((w) => w !== m) : [...g, m], c || b(v), (N = e.onValueChange) == null || N.call(e, v));
426
+ )) : (v = m.includes(h) ? m.filter((y) => y !== h) : [...m, h], c || x(v), (S = e.onValueChange) == null || S.call(e, v));
422
427
  };
423
- return /* @__PURE__ */ t(
424
- M.Provider,
428
+ return /* @__PURE__ */ r(
429
+ F.Provider,
425
430
  {
426
- value: { value: g, toggle: k, variant: o, size: a, orientation: d },
427
- children: /* @__PURE__ */ t(
431
+ value: { value: m, toggle: p, variant: s, size: a, orientation: l },
432
+ children: /* @__PURE__ */ r(
428
433
  "div",
429
434
  {
430
- ref: n,
435
+ ref: t,
431
436
  role: "group",
432
437
  "data-node-id": "5686:270",
433
438
  className: f(
434
439
  "inline-flex w-fit overflow-hidden rounded-radius-lg",
435
- d === "vertical" ? "flex-col [&>*:not(:first-child)]:-mt-px" : "flex-row [&>*:not(:first-child)]:-ml-px",
436
- s
440
+ l === "vertical" ? "flex-col [&>*:not(:first-child)]:-mt-px" : "flex-row [&>*:not(:first-child)]:-ml-px",
441
+ d
437
442
  ),
438
- children: u
443
+ children: i
439
444
  }
440
445
  )
441
446
  }
442
447
  );
443
448
  }
444
449
  );
445
- Z.displayName = "ToggleGroup";
446
- const ee = i.forwardRef(({ value: e, iconOnly: n, className: l, onClick: o, ...a }, d) => {
447
- const s = i.useContext(M);
448
- if (!s) throw new Error("ToggleGroupItem must be used within ToggleGroup");
449
- const u = s.value.includes(e);
450
- return /* @__PURE__ */ t(
450
+ Ne.displayName = "ToggleGroup";
451
+ const ke = o.forwardRef(({ value: e, iconOnly: t, className: n, onClick: s, ...a }, l) => {
452
+ const d = o.useContext(F);
453
+ if (!d) throw new Error("ToggleGroupItem must be used within ToggleGroup");
454
+ const i = d.value.includes(e);
455
+ return /* @__PURE__ */ r(
451
456
  "button",
452
457
  {
453
- ref: d,
458
+ ref: l,
454
459
  type: "button",
455
- "aria-pressed": u,
456
- "data-state": u ? "on" : "off",
460
+ "aria-pressed": i,
461
+ "data-state": i ? "on" : "off",
457
462
  className: f(
458
- A({ variant: s.variant, size: s.size, iconOnly: n }),
463
+ W({ variant: d.variant, size: d.size, iconOnly: t }),
459
464
  // twMerge 가 커스텀 radius 키(rounded-radius-lg)를 충돌로 인식 못 하므로 !important 로 강제.
460
465
  // 그룹이 rounded+overflow-hidden 이라 바깥 모서리는 그룹이 둥글게 클립한다.
461
466
  "!rounded-none focus-visible:z-10",
462
- l
467
+ n
463
468
  ),
464
469
  onClick: (c) => {
465
- s.toggle(e), o == null || o(c);
470
+ d.toggle(e), s == null || s(c);
466
471
  },
467
472
  ...a
468
473
  }
469
474
  );
470
475
  });
471
- ee.displayName = "ToggleGroupItem";
472
- const te = j(
476
+ ke.displayName = "ToggleGroupItem";
477
+ const ze = N(
473
478
  "flex w-full select-none items-center justify-between gap-1 rounded-radius border bg-card text-sm text-foreground shadow-xs transition-colors outline-none focus-visible:ring-[3px] focus-visible:ring-offset-0 disabled:cursor-not-allowed disabled:opacity-[0.64]",
474
479
  {
475
480
  variants: {
@@ -482,8 +487,8 @@ const te = j(
482
487
  defaultVariants: { inputSize: "md", invalid: !1 }
483
488
  }
484
489
  );
485
- function re({ className: e }) {
486
- return /* @__PURE__ */ t(
490
+ function Se({ className: e }) {
491
+ return /* @__PURE__ */ r(
487
492
  "svg",
488
493
  {
489
494
  viewBox: "0 0 24 24",
@@ -492,12 +497,12 @@ function re({ className: e }) {
492
497
  strokeWidth: "2",
493
498
  className: e,
494
499
  "aria-hidden": !0,
495
- children: /* @__PURE__ */ t("path", { d: "m6 9 6 6 6-6", strokeLinecap: "round", strokeLinejoin: "round" })
500
+ children: /* @__PURE__ */ r("path", { d: "m6 9 6 6 6-6", strokeLinecap: "round", strokeLinejoin: "round" })
496
501
  }
497
502
  );
498
503
  }
499
- function ne() {
500
- return /* @__PURE__ */ t(
504
+ function Re() {
505
+ return /* @__PURE__ */ r(
501
506
  "svg",
502
507
  {
503
508
  viewBox: "0 0 24 24",
@@ -506,135 +511,135 @@ function ne() {
506
511
  strokeWidth: "2.2",
507
512
  className: "size-4",
508
513
  "aria-hidden": !0,
509
- children: /* @__PURE__ */ t("path", { d: "M20 6 9 17l-5-5", strokeLinecap: "round", strokeLinejoin: "round" })
514
+ children: /* @__PURE__ */ r("path", { d: "M20 6 9 17l-5-5", strokeLinecap: "round", strokeLinejoin: "round" })
510
515
  }
511
516
  );
512
517
  }
513
- const se = i.forwardRef(
518
+ const Te = o.forwardRef(
514
519
  ({
515
520
  options: e,
516
- value: n,
517
- defaultValue: l,
518
- onValueChange: o,
521
+ value: t,
522
+ defaultValue: n,
523
+ onValueChange: s,
519
524
  placeholder: a = "Select…",
520
- disabled: d = !1,
521
- inputSize: s,
522
- invalid: u,
525
+ disabled: l = !1,
526
+ inputSize: d,
527
+ invalid: i,
523
528
  className: c,
524
- contentClassName: x,
525
- id: b,
526
- name: g
527
- }, k) => {
528
- const m = n !== void 0, [v, y] = i.useState(
529
- l
530
- ), N = m ? n : v, [w, z] = i.useState(!1), L = i.useRef(null), T = i.useRef(null), I = e.find((r) => r.value === N);
531
- i.useEffect(() => {
532
- if (!w) return;
533
- const r = (p) => {
534
- L.current && !L.current.contains(p.target) && z(!1);
529
+ contentClassName: u,
530
+ id: x,
531
+ name: m
532
+ }, p) => {
533
+ const h = t !== void 0, [v, w] = o.useState(
534
+ n
535
+ ), S = h ? t : v, [y, k] = o.useState(!1), L = o.useRef(null), j = o.useRef(null), A = e.find((g) => g.value === S);
536
+ o.useEffect(() => {
537
+ if (!y) return;
538
+ const g = (z) => {
539
+ L.current && !L.current.contains(z.target) && k(!1);
535
540
  };
536
- return document.addEventListener("mousedown", r), () => document.removeEventListener("mousedown", r);
537
- }, [w]), i.useEffect(() => {
541
+ return document.addEventListener("mousedown", g), () => document.removeEventListener("mousedown", g);
542
+ }, [y]), o.useEffect(() => {
538
543
  var R;
539
- if (!w) return;
540
- const r = (R = T.current) == null ? void 0 : R.querySelectorAll(
544
+ if (!y) return;
545
+ const g = (R = j.current) == null ? void 0 : R.querySelectorAll(
541
546
  "[data-select-item]:not([disabled])"
542
547
  );
543
- if (!(r != null && r.length)) return;
544
- (Array.from(r).find(
545
- (S) => S.dataset.value === N
546
- ) ?? r[0]).focus();
547
- }, [w, N]);
548
- const V = (r) => {
549
- m || y(r), o == null || o(r), z(!1);
550
- }, O = (r) => {
551
- var E;
552
- const p = Array.from(
553
- ((E = T.current) == null ? void 0 : E.querySelectorAll(
548
+ if (!(g != null && g.length)) return;
549
+ (Array.from(g).find(
550
+ (T) => T.dataset.value === S
551
+ ) ?? g[0]).focus();
552
+ }, [y, S]);
553
+ const ae = (g) => {
554
+ h || w(g), s == null || s(g), k(!1);
555
+ }, O = (g) => {
556
+ var P;
557
+ const z = Array.from(
558
+ ((P = j.current) == null ? void 0 : P.querySelectorAll(
554
559
  "[data-select-item]:not([disabled])"
555
560
  )) ?? []
556
- ), R = p.findIndex((D) => D === document.activeElement), S = p[(R + r + p.length) % p.length];
557
- S == null || S.focus();
561
+ ), R = z.findIndex((oe) => oe === document.activeElement), T = z[(R + g + z.length) % z.length];
562
+ T == null || T.focus();
558
563
  };
559
- return /* @__PURE__ */ h("div", { ref: L, className: "relative", children: [
560
- /* @__PURE__ */ h(
564
+ return /* @__PURE__ */ b("div", { ref: L, className: "relative", children: [
565
+ /* @__PURE__ */ b(
561
566
  "button",
562
567
  {
563
- ref: k,
568
+ ref: p,
564
569
  type: "button",
565
- id: b,
566
- name: g,
567
- disabled: d,
570
+ id: x,
571
+ name: m,
572
+ disabled: l,
568
573
  "aria-haspopup": "listbox",
569
- "aria-expanded": w,
574
+ "aria-expanded": y,
570
575
  "data-node-id": "7751:1561",
571
- className: f(te({ inputSize: s, invalid: u }), c),
572
- onClick: () => z((r) => !r),
573
- onKeyDown: (r) => {
574
- (r.key === "ArrowDown" || r.key === "Enter" || r.key === " ") && (r.preventDefault(), z(!0));
576
+ className: f(ze({ inputSize: d, invalid: i }), c),
577
+ onClick: () => k((g) => !g),
578
+ onKeyDown: (g) => {
579
+ (g.key === "ArrowDown" || g.key === "Enter" || g.key === " ") && (g.preventDefault(), k(!0));
575
580
  },
576
581
  children: [
577
- /* @__PURE__ */ t(
582
+ /* @__PURE__ */ r(
578
583
  "span",
579
584
  {
580
585
  className: f(
581
586
  "truncate",
582
- !I && "text-muted-foreground"
587
+ !A && "text-muted-foreground"
583
588
  ),
584
- children: I ? I.label : a
589
+ children: A ? A.label : a
585
590
  }
586
591
  ),
587
- /* @__PURE__ */ t(
588
- re,
592
+ /* @__PURE__ */ r(
593
+ Se,
589
594
  {
590
595
  className: f(
591
596
  "size-4 shrink-0 opacity-50 transition-transform",
592
- w && "rotate-180"
597
+ y && "rotate-180"
593
598
  )
594
599
  }
595
600
  )
596
601
  ]
597
602
  }
598
603
  ),
599
- w && /* @__PURE__ */ t(
604
+ y && /* @__PURE__ */ r(
600
605
  "div",
601
606
  {
602
- ref: T,
607
+ ref: j,
603
608
  role: "listbox",
604
609
  tabIndex: -1,
605
610
  className: f(
606
- "absolute left-0 top-full z-50 mt-1 flex max-h-64 w-full flex-col gap-px overflow-auto rounded-radius-xl border border-border bg-popover p-1 shadow-popover",
607
- x
611
+ "absolute left-0 top-full z-50 mt-1 flex max-h-64 w-full flex-col gap-px overflow-auto rounded-radius-xl border border-border bg-popover p-1 shadow-overlay",
612
+ u
608
613
  ),
609
- onKeyDown: (r) => {
610
- var p, R;
611
- r.key === "Escape" ? (z(!1), (R = (p = L.current) == null ? void 0 : p.querySelector("button")) == null || R.focus()) : r.key === "ArrowDown" ? (r.preventDefault(), O(1)) : r.key === "ArrowUp" && (r.preventDefault(), O(-1));
614
+ onKeyDown: (g) => {
615
+ var z, R;
616
+ g.key === "Escape" ? (k(!1), (R = (z = L.current) == null ? void 0 : z.querySelector("button")) == null || R.focus()) : g.key === "ArrowDown" ? (g.preventDefault(), O(1)) : g.key === "ArrowUp" && (g.preventDefault(), O(-1));
612
617
  },
613
- children: e.map((r) => {
614
- const p = r.value === N;
615
- return /* @__PURE__ */ h(
618
+ children: e.map((g) => {
619
+ const z = g.value === S;
620
+ return /* @__PURE__ */ b(
616
621
  "button",
617
622
  {
618
623
  type: "button",
619
624
  role: "option",
620
- "aria-selected": p,
621
- disabled: r.disabled,
625
+ "aria-selected": z,
626
+ disabled: g.disabled,
622
627
  "data-select-item": "",
623
- "data-value": r.value,
628
+ "data-value": g.value,
624
629
  className: f(
625
630
  "flex h-7 w-full items-center gap-0.5 rounded-radius-lg px-0.5 text-left text-xs font-medium text-accent-foreground outline-none transition-colors",
626
631
  "hover:bg-accent focus-visible:bg-accent",
627
632
  "disabled:pointer-events-none disabled:opacity-[0.64]",
628
- p && "bg-primary/[0.04]"
633
+ z && "bg-primary/[0.04]"
629
634
  ),
630
- onClick: () => V(r.value),
635
+ onClick: () => ae(g.value),
631
636
  children: [
632
- /* @__PURE__ */ t("span", { className: "flex size-7 shrink-0 items-center justify-center", children: p ? /* @__PURE__ */ t(ne, {}) : null }),
633
- r.icon ? /* @__PURE__ */ t("span", { className: "inline-flex size-4 shrink-0 items-center justify-center [&_svg]:size-4", children: r.icon }) : null,
634
- /* @__PURE__ */ t("span", { className: "min-w-0 flex-1 truncate", children: r.label })
637
+ /* @__PURE__ */ r("span", { className: "flex size-7 shrink-0 items-center justify-center", children: z ? /* @__PURE__ */ r(Re, {}) : null }),
638
+ g.icon ? /* @__PURE__ */ r("span", { className: "inline-flex size-4 shrink-0 items-center justify-center [&_svg]:size-4", children: g.icon }) : null,
639
+ /* @__PURE__ */ r("span", { className: "min-w-0 flex-1 truncate", children: g.label })
635
640
  ]
636
641
  },
637
- r.value
642
+ g.value
638
643
  );
639
644
  })
640
645
  }
@@ -642,24 +647,1133 @@ const se = i.forwardRef(
642
647
  ] });
643
648
  }
644
649
  );
645
- se.displayName = "Select";
650
+ Te.displayName = "Select";
651
+ const Ie = N(
652
+ "relative inline-flex shrink-0 cursor-pointer items-center rounded-radius-full p-0.5 outline-none transition-colors shadow-[inset_0_2px_4px_0_rgb(0_0_0_/_0.05)] focus-visible:ring-[3px] focus-visible:ring-offset-0 focus-visible:ring-disabled/[0.07] disabled:cursor-not-allowed disabled:opacity-[0.64] data-[state=on]:bg-success data-[state=off]:bg-input",
653
+ {
654
+ variants: {
655
+ size: { md: "h-[18px] w-[30px]", lg: "h-6 w-11" }
656
+ },
657
+ defaultVariants: { size: "md" }
658
+ }
659
+ ), De = N(
660
+ "pointer-events-none block rounded-radius-full bg-card shadow-xs transition-transform",
661
+ {
662
+ variants: {
663
+ size: {
664
+ md: "size-[14px] data-[state=on]:translate-x-3",
665
+ lg: "size-5 data-[state=on]:translate-x-5"
666
+ }
667
+ },
668
+ defaultVariants: { size: "md" }
669
+ }
670
+ ), Le = o.forwardRef(
671
+ ({ className: e, size: t, checked: n, defaultChecked: s = !1, onCheckedChange: a, onClick: l, disabled: d, ...i }, c) => {
672
+ const u = n !== void 0, [x, m] = o.useState(s), p = u ? n : x, h = p ? "on" : "off";
673
+ return /* @__PURE__ */ r(
674
+ "button",
675
+ {
676
+ ref: c,
677
+ type: "button",
678
+ role: "switch",
679
+ "aria-checked": p,
680
+ disabled: d,
681
+ "data-state": h,
682
+ className: f(Ie({ size: t }), e),
683
+ onClick: (v) => {
684
+ u || m((w) => !w), a == null || a(!p), l == null || l(v);
685
+ },
686
+ "data-node-id": "7715:1962",
687
+ ...i,
688
+ children: /* @__PURE__ */ r("span", { "data-state": h, className: De({ size: t }) })
689
+ }
690
+ );
691
+ }
692
+ );
693
+ Le.displayName = "Switch";
694
+ const _e = o.forwardRef(
695
+ ({ className: e, orientation: t = "horizontal", decorative: n = !0, ...s }, a) => /* @__PURE__ */ r(
696
+ "div",
697
+ {
698
+ ref: a,
699
+ role: n ? "none" : "separator",
700
+ "aria-orientation": n ? void 0 : t,
701
+ "data-node-id": "3605:3065",
702
+ className: f(
703
+ "shrink-0 bg-border",
704
+ t === "horizontal" ? "h-px w-full" : "h-full w-px",
705
+ e
706
+ ),
707
+ ...s
708
+ }
709
+ )
710
+ );
711
+ _e.displayName = "Separator";
712
+ const Ee = o.forwardRef(
713
+ ({ className: e, ...t }, n) => /* @__PURE__ */ r(
714
+ "div",
715
+ {
716
+ ref: n,
717
+ "data-node-id": "7669:1885",
718
+ className: f("animate-pulse rounded-radius-lg bg-secondary", e),
719
+ ...t
720
+ }
721
+ )
722
+ );
723
+ Ee.displayName = "Skeleton";
724
+ const je = N("animate-spin", {
725
+ variants: {
726
+ size: { sm: "size-4", md: "size-6", lg: "size-8" }
727
+ },
728
+ defaultVariants: { size: "md" }
729
+ }), H = o.forwardRef(
730
+ ({ className: e, size: t, ...n }, s) => /* @__PURE__ */ b(
731
+ "svg",
732
+ {
733
+ ref: s,
734
+ viewBox: "0 0 24 24",
735
+ fill: "none",
736
+ role: "status",
737
+ "aria-label": "로딩 중",
738
+ "data-node-id": "7707:393",
739
+ className: f(je({ size: t }), e),
740
+ ...n,
741
+ children: [
742
+ /* @__PURE__ */ r("circle", { cx: "12", cy: "12", r: "9", stroke: "currentColor", strokeWidth: "2.5", className: "opacity-20" }),
743
+ /* @__PURE__ */ r(
744
+ "path",
745
+ {
746
+ d: "M21 12a9 9 0 0 0-9-9",
747
+ stroke: "currentColor",
748
+ strokeWidth: "2.5",
749
+ strokeLinecap: "round"
750
+ }
751
+ )
752
+ ]
753
+ }
754
+ )
755
+ );
756
+ H.displayName = "Spinner";
757
+ const Ae = N(
758
+ "flex w-full resize-y rounded-radius border bg-background text-sm text-foreground shadow-xs outline-none transition-colors placeholder:text-muted-foreground focus-visible:ring-[3px] focus-visible:ring-offset-0 disabled:cursor-not-allowed disabled:opacity-[0.64]",
759
+ {
760
+ variants: {
761
+ inputSize: {
762
+ sm: "min-h-16 px-2 py-1",
763
+ md: "min-h-[76px] px-3 py-1.5",
764
+ lg: "min-h-24 px-3 py-2"
765
+ },
766
+ invalid: {
767
+ true: "border-destructive focus-visible:ring-destructive/[0.15]",
768
+ false: "border-input focus-visible:border-disabled/30 focus-visible:ring-disabled/[0.07]"
769
+ }
770
+ },
771
+ defaultVariants: { inputSize: "md", invalid: !1 }
772
+ }
773
+ ), Ce = o.forwardRef(
774
+ ({ className: e, inputSize: t, invalid: n, ...s }, a) => /* @__PURE__ */ r(
775
+ "textarea",
776
+ {
777
+ ref: a,
778
+ "data-node-id": "7751:1067",
779
+ className: f(Ae({ inputSize: t, invalid: n }), e),
780
+ ...s
781
+ }
782
+ )
783
+ );
784
+ Ce.displayName = "Textarea";
785
+ const Me = N(
786
+ "relative inline-flex shrink-0 select-none items-center justify-center overflow-hidden bg-secondary font-medium text-muted-foreground",
787
+ {
788
+ variants: {
789
+ size: {
790
+ xs: "size-6 text-xs",
791
+ sm: "size-7 text-xs",
792
+ md: "size-8 text-sm",
793
+ lg: "size-9 text-sm",
794
+ xl: "size-10 text-base",
795
+ "2xl": "size-12 text-base"
796
+ },
797
+ shape: { circle: "rounded-radius-full", square: "rounded-radius" }
798
+ },
799
+ defaultVariants: { size: "md", shape: "circle" }
800
+ }
801
+ ), K = o.forwardRef(
802
+ ({ className: e, size: t, shape: n, src: s, alt: a, fallback: l, ring: d, ...i }, c) => {
803
+ const [u, x] = o.useState(!1), m = s && !u;
804
+ return /* @__PURE__ */ r(
805
+ "div",
806
+ {
807
+ ref: c,
808
+ "data-node-id": "1696:153",
809
+ className: f(
810
+ Me({ size: t, shape: n }),
811
+ d && "ring-2 ring-background",
812
+ e
813
+ ),
814
+ ...i,
815
+ children: m ? /* @__PURE__ */ r(
816
+ "img",
817
+ {
818
+ src: s,
819
+ alt: a,
820
+ className: "size-full object-cover",
821
+ onError: () => x(!0)
822
+ }
823
+ ) : /* @__PURE__ */ r("span", { children: l })
824
+ }
825
+ );
826
+ }
827
+ );
828
+ K.displayName = "Avatar";
829
+ const Ve = o.forwardRef(
830
+ ({ className: e, size: t = "md", max: n, children: s, ...a }, l) => {
831
+ const d = o.Children.toArray(s).filter(
832
+ o.isValidElement
833
+ ), i = n != null ? d.slice(0, n) : d, c = n != null ? d.length - i.length : 0;
834
+ return /* @__PURE__ */ b(
835
+ "div",
836
+ {
837
+ ref: l,
838
+ "data-node-id": "1696:220",
839
+ className: f(
840
+ "flex items-center [&>*:not(:first-child)]:-ml-3",
841
+ e
842
+ ),
843
+ ...a,
844
+ children: [
845
+ i.map(
846
+ (u, x) => o.cloneElement(u, {
847
+ key: u.key ?? x,
848
+ ring: !0,
849
+ size: u.props.size ?? t
850
+ })
851
+ ),
852
+ c > 0 && /* @__PURE__ */ r(K, { size: t, ring: !0, fallback: `+${c}` })
853
+ ]
854
+ }
855
+ );
856
+ }
857
+ );
858
+ Ve.displayName = "AvatarGroup";
859
+ const Oe = N(
860
+ "inline-flex h-5 items-center justify-center gap-1 rounded-radius-full px-2 py-0.5 text-xs font-medium leading-[14px] tracking-[0.12px] whitespace-nowrap",
861
+ {
862
+ variants: {
863
+ color: {
864
+ info: "",
865
+ success: "",
866
+ warning: "",
867
+ destructive: "",
868
+ neutral: ""
869
+ },
870
+ variant: { fill: "", tinted: "" }
871
+ },
872
+ compoundVariants: [
873
+ { variant: "fill", color: "info", class: "bg-info text-primary-foreground" },
874
+ { variant: "fill", color: "success", class: "bg-success text-primary-foreground" },
875
+ { variant: "fill", color: "warning", class: "bg-warning text-primary-foreground" },
876
+ { variant: "fill", color: "destructive", class: "bg-destructive text-primary-foreground" },
877
+ { variant: "fill", color: "neutral", class: "bg-foreground text-background" },
878
+ { variant: "tinted", color: "info", class: "bg-info/[0.08] text-info-foreground" },
879
+ { variant: "tinted", color: "success", class: "bg-success/[0.08] text-success-foreground" },
880
+ { variant: "tinted", color: "warning", class: "bg-warning/[0.08] text-warning-foreground" },
881
+ { variant: "tinted", color: "destructive", class: "bg-destructive/[0.08] text-destructive-foreground" },
882
+ { variant: "tinted", color: "neutral", class: "bg-foreground/[0.08] text-foreground" }
883
+ ],
884
+ defaultVariants: { color: "neutral", variant: "fill" }
885
+ }
886
+ ), Pe = o.forwardRef(
887
+ ({ className: e, color: t, variant: n, ...s }, a) => /* @__PURE__ */ r(
888
+ "span",
889
+ {
890
+ ref: a,
891
+ "data-node-id": "9929:48567",
892
+ className: f(Oe({ color: t, variant: n }), e),
893
+ ...s
894
+ }
895
+ )
896
+ );
897
+ Pe.displayName = "Badge";
898
+ const Be = N(
899
+ "flex items-center rounded-radius border border-input bg-background text-foreground shadow-xs transition-colors focus-within:border-disabled/30 focus-within:ring-[3px] focus-within:ring-offset-0 focus-within:ring-disabled/[0.07] has-[:disabled]:cursor-not-allowed has-[:disabled]:opacity-[0.64]",
900
+ {
901
+ variants: { size: { sm: "h-7", md: "h-8", lg: "h-9" } },
902
+ defaultVariants: { size: "md" }
903
+ }
904
+ );
905
+ function B({ dir: e, ...t }) {
906
+ return /* @__PURE__ */ r(
907
+ "button",
908
+ {
909
+ type: "button",
910
+ tabIndex: -1,
911
+ className: "inline-flex h-full w-9 shrink-0 items-center justify-center text-foreground transition-colors hover:bg-secondary/50 disabled:opacity-40 [&_svg]:size-4",
912
+ ...t,
913
+ children: /* @__PURE__ */ r("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", "aria-hidden": !0, children: e === "dec" ? /* @__PURE__ */ r("path", { d: "M5 12h14", strokeLinecap: "round" }) : /* @__PURE__ */ r("path", { d: "M12 5v14M5 12h14", strokeLinecap: "round" }) })
914
+ }
915
+ );
916
+ }
917
+ const Ge = o.forwardRef(
918
+ ({ className: e, size: t, value: n, defaultValue: s = 0, onValueChange: a, min: l, max: d, step: i = 1, disabled: c, ...u }, x) => {
919
+ const m = n !== void 0, [p, h] = o.useState(s), v = m ? n : p, w = (y) => Math.min(d ?? 1 / 0, Math.max(l ?? -1 / 0, y)), S = (y) => {
920
+ const k = w(y);
921
+ m || h(k), a == null || a(k);
922
+ };
923
+ return /* @__PURE__ */ b("div", { className: f(Be({ size: t }), e), "data-node-id": "7781:5501", children: [
924
+ /* @__PURE__ */ r(B, { dir: "dec", disabled: c || l != null && v <= l, onClick: () => S(v - i), "aria-label": "감소" }),
925
+ /* @__PURE__ */ r(
926
+ "input",
927
+ {
928
+ ref: x,
929
+ type: "text",
930
+ inputMode: "numeric",
931
+ disabled: c,
932
+ value: v,
933
+ onChange: (y) => {
934
+ const k = Number(y.target.value);
935
+ Number.isNaN(k) || S(k);
936
+ },
937
+ className: "min-w-0 flex-1 bg-transparent text-center text-sm text-foreground outline-none",
938
+ ...u
939
+ }
940
+ ),
941
+ /* @__PURE__ */ r(B, { dir: "inc", disabled: c || d != null && v >= d, onClick: () => S(v + i), "aria-label": "증가" })
942
+ ] });
943
+ }
944
+ );
945
+ Ge.displayName = "NumberField";
946
+ const q = o.createContext(null);
947
+ let We = 0;
948
+ const Fe = o.forwardRef(
949
+ ({ className: e, value: t, defaultValue: n, onValueChange: s, name: a, disabled: l, children: d, ...i }, c) => {
950
+ const u = t !== void 0, [x, m] = o.useState(n), p = u ? t : x, h = o.useMemo(() => a ?? `radio-group-${++We}`, [a]);
951
+ return /* @__PURE__ */ r(
952
+ q.Provider,
953
+ {
954
+ value: {
955
+ value: p,
956
+ name: h,
957
+ disabled: l,
958
+ onValueChange: (v) => {
959
+ u || m(v), s == null || s(v);
960
+ }
961
+ },
962
+ children: /* @__PURE__ */ r(
963
+ "div",
964
+ {
965
+ ref: c,
966
+ role: "radiogroup",
967
+ "data-node-id": "7669:1454",
968
+ className: f("flex flex-col gap-3", e),
969
+ ...i,
970
+ children: d
971
+ }
972
+ )
973
+ }
974
+ );
975
+ }
976
+ );
977
+ Fe.displayName = "RadioGroup";
978
+ const He = o.forwardRef(
979
+ ({ className: e, value: t, title: n, description: s, disabled: a, cardStyle: l, children: d, ...i }, c) => {
980
+ const u = o.useContext(q);
981
+ if (!u) throw new Error("RadioGroupItem must be used within RadioGroup");
982
+ const x = a || u.disabled, m = u.value === t;
983
+ return /* @__PURE__ */ b(
984
+ "label",
985
+ {
986
+ ref: c,
987
+ className: f(
988
+ "flex items-start gap-2",
989
+ l && "rounded-radius border border-border p-3",
990
+ x ? "cursor-not-allowed opacity-[0.64]" : "cursor-pointer",
991
+ e
992
+ ),
993
+ ...i,
994
+ children: [
995
+ /* @__PURE__ */ r(
996
+ "input",
997
+ {
998
+ type: "radio",
999
+ name: u.name,
1000
+ value: t,
1001
+ checked: m,
1002
+ disabled: x,
1003
+ onChange: () => {
1004
+ var p;
1005
+ return (p = u.onValueChange) == null ? void 0 : p.call(u, t);
1006
+ },
1007
+ className: "peer sr-only"
1008
+ }
1009
+ ),
1010
+ /* @__PURE__ */ r(
1011
+ "span",
1012
+ {
1013
+ "aria-hidden": !0,
1014
+ className: f(
1015
+ "mt-0.5 flex size-4 shrink-0 items-center justify-center rounded-radius-full border shadow-xs transition-colors",
1016
+ "peer-focus-visible:ring-[3px] peer-focus-visible:ring-offset-0 peer-focus-visible:ring-disabled/[0.07]",
1017
+ m ? "border-foreground bg-foreground" : "border-input bg-background"
1018
+ ),
1019
+ children: m && /* @__PURE__ */ r("span", { className: "size-1.5 rounded-radius-full bg-card" })
1020
+ }
1021
+ ),
1022
+ (n != null || s != null || d != null) && /* @__PURE__ */ b("span", { className: "flex min-w-0 flex-1 flex-col gap-1.5", children: [
1023
+ n != null && /* @__PURE__ */ r("span", { className: "text-base leading-6 text-foreground", children: n }),
1024
+ d,
1025
+ s != null && /* @__PURE__ */ r("span", { className: "text-xs leading-[14px] tracking-[0.12px] text-muted-foreground", children: s })
1026
+ ] })
1027
+ ]
1028
+ }
1029
+ );
1030
+ }
1031
+ );
1032
+ He.displayName = "RadioGroupItem";
1033
+ const Ke = N(
1034
+ "inline-flex w-full items-center gap-0 bg-background p-0.5",
1035
+ {
1036
+ variants: {
1037
+ segStyle: { rounded: "rounded-radius-full", regular: "rounded-radius", sharp: "rounded-none" }
1038
+ },
1039
+ defaultVariants: { segStyle: "rounded" }
1040
+ }
1041
+ ), qe = N(
1042
+ "flex flex-1 items-center justify-center gap-1 px-3 py-2 text-sm font-medium outline-none transition-colors focus-visible:ring-[3px] focus-visible:ring-offset-0 focus-visible:ring-disabled/[0.07] focus-visible:z-10 disabled:pointer-events-none disabled:opacity-[0.64]",
1043
+ {
1044
+ variants: {
1045
+ segStyle: { rounded: "rounded-radius-full", regular: "rounded-radius-lg", sharp: "rounded-none" },
1046
+ active: {
1047
+ true: "bg-card text-foreground shadow-xs",
1048
+ false: "text-muted-foreground hover:text-foreground"
1049
+ }
1050
+ },
1051
+ defaultVariants: { segStyle: "rounded", active: !1 }
1052
+ }
1053
+ ), $e = o.forwardRef(
1054
+ ({ className: e, options: t, value: n, defaultValue: s, onValueChange: a, segStyle: l, ...d }, i) => {
1055
+ var h;
1056
+ const c = n !== void 0, [u, x] = o.useState(s ?? ((h = t[0]) == null ? void 0 : h.value)), m = c ? n : u, p = (v) => {
1057
+ c || x(v), a == null || a(v);
1058
+ };
1059
+ return /* @__PURE__ */ r(
1060
+ "div",
1061
+ {
1062
+ ref: i,
1063
+ role: "radiogroup",
1064
+ "data-node-id": "9705:88227",
1065
+ className: f(Ke({ segStyle: l }), e),
1066
+ ...d,
1067
+ children: t.map((v) => {
1068
+ const w = v.value === m;
1069
+ return /* @__PURE__ */ r(
1070
+ "button",
1071
+ {
1072
+ type: "button",
1073
+ role: "radio",
1074
+ "aria-checked": w,
1075
+ disabled: v.disabled,
1076
+ className: qe({ segStyle: l, active: w }),
1077
+ onClick: () => p(v.value),
1078
+ children: v.label
1079
+ },
1080
+ v.value
1081
+ );
1082
+ })
1083
+ }
1084
+ );
1085
+ }
1086
+ );
1087
+ $e.displayName = "SegmentedControl";
1088
+ const $ = o.createContext(null), M = () => {
1089
+ const e = o.useContext($);
1090
+ if (!e) throw new Error("Tabs components must be used within <Tabs>");
1091
+ return e;
1092
+ }, Ue = o.forwardRef(
1093
+ ({ className: e, value: t, defaultValue: n, onValueChange: s, variant: a = "default", children: l, ...d }, i) => {
1094
+ const c = t !== void 0, [u, x] = o.useState(n), m = c ? t : u;
1095
+ return /* @__PURE__ */ r(
1096
+ $.Provider,
1097
+ {
1098
+ value: {
1099
+ value: m,
1100
+ variant: a,
1101
+ setValue: (p) => {
1102
+ c || x(p), s == null || s(p);
1103
+ }
1104
+ },
1105
+ children: /* @__PURE__ */ r("div", { ref: i, "data-node-id": "7722:82", className: f("flex flex-col gap-3", e), ...d, children: l })
1106
+ }
1107
+ );
1108
+ }
1109
+ );
1110
+ Ue.displayName = "Tabs";
1111
+ const Ze = o.forwardRef(
1112
+ ({ className: e, ...t }, n) => {
1113
+ const { variant: s } = M();
1114
+ return /* @__PURE__ */ r(
1115
+ "div",
1116
+ {
1117
+ ref: n,
1118
+ role: "tablist",
1119
+ className: f(
1120
+ "inline-flex items-center",
1121
+ s === "default" ? "gap-0.5 rounded-radius-lg bg-secondary p-0.5" : "gap-1 border-b border-border",
1122
+ e
1123
+ ),
1124
+ ...t
1125
+ }
1126
+ );
1127
+ }
1128
+ );
1129
+ Ze.displayName = "TabsList";
1130
+ const Je = o.forwardRef(
1131
+ ({ className: e, value: t, ...n }, s) => {
1132
+ const { value: a, setValue: l, variant: d } = M(), i = a === t;
1133
+ return /* @__PURE__ */ r(
1134
+ "button",
1135
+ {
1136
+ ref: s,
1137
+ type: "button",
1138
+ role: "tab",
1139
+ "aria-selected": i,
1140
+ "data-state": i ? "active" : "inactive",
1141
+ onClick: () => l(t),
1142
+ className: f(
1143
+ "inline-flex min-w-9 items-center justify-center gap-1 text-sm font-medium outline-none transition-colors",
1144
+ "focus-visible:ring-[3px] focus-visible:ring-offset-0 focus-visible:ring-disabled/[0.07] disabled:pointer-events-none disabled:opacity-[0.64]",
1145
+ d === "default" ? f(
1146
+ "rounded-radius-lg px-2 py-1.5",
1147
+ i ? "bg-card text-foreground shadow-xs" : "text-muted-foreground hover:text-foreground"
1148
+ ) : f(
1149
+ "-mb-px border-b-2 px-2 pb-2",
1150
+ i ? "border-foreground text-foreground" : "border-transparent text-muted-foreground hover:text-foreground"
1151
+ ),
1152
+ e
1153
+ ),
1154
+ ...n
1155
+ }
1156
+ );
1157
+ }
1158
+ );
1159
+ Je.displayName = "TabsTrigger";
1160
+ const Qe = o.forwardRef(
1161
+ ({ className: e, value: t, ...n }, s) => {
1162
+ const { value: a } = M();
1163
+ return a !== t ? null : /* @__PURE__ */ r("div", { ref: s, role: "tabpanel", className: f("text-sm text-foreground", e), ...n });
1164
+ }
1165
+ );
1166
+ Qe.displayName = "TabsContent";
1167
+ const U = o.createContext(null), Xe = o.forwardRef((e, t) => {
1168
+ const { type: n = "single", className: s, children: a } = e, l = e.value !== void 0, [d, i] = o.useState(() => {
1169
+ const m = e.defaultValue;
1170
+ return m == null ? [] : Array.isArray(m) ? m : [m];
1171
+ }), c = e.value, u = l ? Array.isArray(c) ? c : c ? [c] : [] : d, x = (m) => {
1172
+ var h, v;
1173
+ let p;
1174
+ n === "multiple" ? (p = u.includes(m) ? u.filter((w) => w !== m) : [...u, m], l || i(p), (h = e.onValueChange) == null || h.call(e, p)) : (p = u.includes(m) ? [] : [m], l || i(p), (v = e.onValueChange) == null || v.call(e, p[0] ?? ""));
1175
+ };
1176
+ return /* @__PURE__ */ r(U.Provider, { value: { isOpen: (m) => u.includes(m), toggle: x }, children: /* @__PURE__ */ r("div", { ref: t, "data-node-id": "1673:58", className: f("w-full", s), children: a }) });
1177
+ });
1178
+ Xe.displayName = "Accordion";
1179
+ const Ye = o.forwardRef(
1180
+ ({ className: e, value: t, title: n, icon: s, showSeparator: a = !0, children: l, ...d }, i) => {
1181
+ const c = o.useContext(U);
1182
+ if (!c) throw new Error("AccordionItem must be used within Accordion");
1183
+ const u = c.isOpen(t);
1184
+ return /* @__PURE__ */ b(
1185
+ "div",
1186
+ {
1187
+ ref: i,
1188
+ className: f("w-full", a && "border-b border-border", e),
1189
+ ...d,
1190
+ children: [
1191
+ /* @__PURE__ */ b(
1192
+ "button",
1193
+ {
1194
+ type: "button",
1195
+ "aria-expanded": u,
1196
+ onClick: () => c.toggle(t),
1197
+ className: "flex w-full items-center gap-1 py-4 text-left outline-none focus-visible:ring-[3px] focus-visible:ring-offset-0 focus-visible:ring-disabled/[0.07]",
1198
+ children: [
1199
+ /* @__PURE__ */ b("span", { className: "flex flex-1 items-center gap-2.5 text-sm font-medium text-foreground", children: [
1200
+ s ? /* @__PURE__ */ r("span", { className: "inline-flex shrink-0 [&_svg]:size-5", children: s }) : null,
1201
+ n
1202
+ ] }),
1203
+ /* @__PURE__ */ r(
1204
+ "svg",
1205
+ {
1206
+ viewBox: "0 0 24 24",
1207
+ fill: "none",
1208
+ stroke: "currentColor",
1209
+ strokeWidth: "2",
1210
+ "aria-hidden": !0,
1211
+ className: f("size-5 shrink-0 text-foreground transition-transform", u && "rotate-180"),
1212
+ children: /* @__PURE__ */ r("path", { d: "m6 9 6 6 6-6", strokeLinecap: "round", strokeLinejoin: "round" })
1213
+ }
1214
+ )
1215
+ ]
1216
+ }
1217
+ ),
1218
+ u && /* @__PURE__ */ r("div", { className: "pb-4 text-sm text-muted-foreground", children: l })
1219
+ ]
1220
+ }
1221
+ );
1222
+ }
1223
+ );
1224
+ Ye.displayName = "AccordionItem";
1225
+ const et = o.forwardRef(
1226
+ ({ className: e, title: t, open: n, defaultOpen: s = !1, onOpenChange: a, disabled: l, children: d, ...i }, c) => {
1227
+ const u = n !== void 0, [x, m] = o.useState(s), p = u ? n : x;
1228
+ return /* @__PURE__ */ b("div", { ref: c, "data-node-id": "5677:165", className: f("w-full", e), ...i, children: [
1229
+ /* @__PURE__ */ b(
1230
+ "button",
1231
+ {
1232
+ type: "button",
1233
+ "aria-expanded": p,
1234
+ disabled: l,
1235
+ onClick: () => {
1236
+ u || m((h) => !h), a == null || a(!p);
1237
+ },
1238
+ className: "flex w-full items-center gap-1 text-left text-sm text-foreground outline-none focus-visible:ring-[3px] focus-visible:ring-offset-0 focus-visible:ring-disabled/[0.07] disabled:cursor-not-allowed disabled:opacity-[0.64]",
1239
+ children: [
1240
+ /* @__PURE__ */ r("span", { className: "min-w-0 flex-1", children: t }),
1241
+ /* @__PURE__ */ r(
1242
+ "svg",
1243
+ {
1244
+ viewBox: "0 0 24 24",
1245
+ fill: "none",
1246
+ stroke: "currentColor",
1247
+ strokeWidth: "2",
1248
+ "aria-hidden": !0,
1249
+ className: f("size-5 shrink-0 transition-transform", p && "rotate-180"),
1250
+ children: /* @__PURE__ */ r("path", { d: "m6 9 6 6 6-6", strokeLinecap: "round", strokeLinejoin: "round" })
1251
+ }
1252
+ )
1253
+ ]
1254
+ }
1255
+ ),
1256
+ p && /* @__PURE__ */ r("div", { className: "pt-2 text-sm text-muted-foreground", children: d })
1257
+ ] });
1258
+ }
1259
+ );
1260
+ et.displayName = "Collapsible";
1261
+ function tt() {
1262
+ return /* @__PURE__ */ r("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", "aria-hidden": !0, className: "size-4 shrink-0 opacity-80", children: /* @__PURE__ */ r("path", { d: "m9 18 6-6-6-6", strokeLinecap: "round", strokeLinejoin: "round" }) });
1263
+ }
1264
+ const rt = o.forwardRef(
1265
+ ({ className: e, items: t, separator: n = "chevron", ...s }, a) => /* @__PURE__ */ r("nav", { ref: a, "aria-label": "breadcrumb", "data-node-id": "5665:4391", className: f("flex items-center", e), ...s, children: /* @__PURE__ */ r("ol", { className: "flex items-center gap-1 text-sm", children: t.map((l, d) => {
1266
+ const i = d === t.length - 1;
1267
+ return /* @__PURE__ */ b("li", { className: "flex items-center gap-1", children: [
1268
+ l.href && !i ? /* @__PURE__ */ r("a", { href: l.href, className: "text-muted-foreground transition-colors hover:text-foreground", children: l.label }) : /* @__PURE__ */ r("span", { className: i ? "text-foreground" : "text-muted-foreground", "aria-current": i ? "page" : void 0, children: l.label }),
1269
+ !i && (n === "slash" ? /* @__PURE__ */ r("span", { className: "text-muted-foreground/60", "aria-hidden": !0, children: "/" }) : /* @__PURE__ */ r("span", { className: "text-muted-foreground", "aria-hidden": !0, children: /* @__PURE__ */ r(tt, {}) }))
1270
+ ] }, d);
1271
+ }) }) })
1272
+ );
1273
+ rt.displayName = "Breadcrumb";
1274
+ const nt = N(
1275
+ "relative flex w-full flex-wrap items-center gap-3 overflow-hidden rounded-radius-xl border px-3.5 py-3 text-sm",
1276
+ {
1277
+ variants: {
1278
+ type: {
1279
+ default: "border-border bg-card [&_[data-alert-icon]]:text-foreground",
1280
+ info: "border-info/[0.32] bg-info/[0.04] [&_[data-alert-icon]]:text-info",
1281
+ success: "border-success/[0.32] bg-success/[0.04] [&_[data-alert-icon]]:text-success",
1282
+ warning: "border-warning/[0.32] bg-warning/[0.04] [&_[data-alert-icon]]:text-warning",
1283
+ error: "border-destructive/[0.32] bg-destructive/[0.04] [&_[data-alert-icon]]:text-destructive"
1284
+ }
1285
+ },
1286
+ defaultVariants: { type: "default" }
1287
+ }
1288
+ );
1289
+ function Z({ type: e }) {
1290
+ return /* @__PURE__ */ b("svg", { ...{ viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, "aria-hidden": !0, className: "size-full" }, strokeLinecap: "round", strokeLinejoin: "round", children: [
1291
+ e === "success" && /* @__PURE__ */ b(_, { children: [
1292
+ /* @__PURE__ */ r("circle", { cx: "12", cy: "12", r: "9" }),
1293
+ /* @__PURE__ */ r("path", { d: "m8.5 12 2.5 2.5 4.5-5" })
1294
+ ] }),
1295
+ e === "warning" && /* @__PURE__ */ b(_, { children: [
1296
+ /* @__PURE__ */ r("path", { d: "M12 3 2 20h20L12 3Z" }),
1297
+ /* @__PURE__ */ r("path", { d: "M12 9v5M12 17.5v.5" })
1298
+ ] }),
1299
+ e === "error" && /* @__PURE__ */ b(_, { children: [
1300
+ /* @__PURE__ */ r("circle", { cx: "12", cy: "12", r: "9" }),
1301
+ /* @__PURE__ */ r("path", { d: "m9 9 6 6M15 9l-6 6" })
1302
+ ] }),
1303
+ (e === "info" || e === "default") && /* @__PURE__ */ b(_, { children: [
1304
+ /* @__PURE__ */ r("circle", { cx: "12", cy: "12", r: "9" }),
1305
+ /* @__PURE__ */ r("path", { d: "M12 11v5M12 8v.5" })
1306
+ ] })
1307
+ ] });
1308
+ }
1309
+ const st = o.forwardRef(
1310
+ ({ className: e, type: t = "default", title: n, icon: s, action: a, children: l, ...d }, i) => /* @__PURE__ */ b("div", { ref: i, role: "alert", "data-node-id": "5655:4958", className: f(nt({ type: t }), e), ...d, children: [
1311
+ /* @__PURE__ */ b("div", { className: "flex min-w-[240px] flex-1 items-start gap-2", children: [
1312
+ s !== !1 && /* @__PURE__ */ r("span", { "data-alert-icon": !0, className: "inline-flex size-5 shrink-0 [&_svg]:size-5", children: s ?? /* @__PURE__ */ r(Z, { type: t ?? "default" }) }),
1313
+ /* @__PURE__ */ b("div", { className: "flex min-w-0 flex-1 flex-col gap-1 leading-5", children: [
1314
+ n != null && /* @__PURE__ */ r("p", { className: "font-medium text-foreground", children: n }),
1315
+ l != null && /* @__PURE__ */ r("p", { className: "text-muted-foreground", children: l })
1316
+ ] })
1317
+ ] }),
1318
+ a && /* @__PURE__ */ r("div", { className: "flex shrink-0 items-start gap-2", children: a })
1319
+ ] })
1320
+ );
1321
+ st.displayName = "Alert";
1322
+ const at = N("inline-flex size-5 shrink-0 [&_svg]:size-5", {
1323
+ variants: {
1324
+ type: {
1325
+ default: "text-foreground",
1326
+ loading: "text-muted-foreground",
1327
+ info: "text-info",
1328
+ success: "text-success",
1329
+ warning: "text-warning",
1330
+ error: "text-destructive"
1331
+ }
1332
+ },
1333
+ defaultVariants: { type: "default" }
1334
+ }), ot = o.forwardRef(
1335
+ ({ className: e, type: t = "default", title: n, icon: s, action: a, children: l, ...d }, i) => {
1336
+ const u = s ?? (t === "loading" ? /* @__PURE__ */ r(H, { size: "sm" }) : /* @__PURE__ */ r(Z, { type: t === "info" || t === "success" || t === "warning" || t === "error" ? t : "default" }));
1337
+ return /* @__PURE__ */ b(
1338
+ "div",
1339
+ {
1340
+ ref: i,
1341
+ role: "status",
1342
+ "data-node-id": "7728:238",
1343
+ className: f(
1344
+ "flex w-full flex-wrap items-center gap-3 rounded-radius-xl border border-border bg-popover px-3.5 py-3 text-sm shadow-overlay",
1345
+ e
1346
+ ),
1347
+ ...d,
1348
+ children: [
1349
+ /* @__PURE__ */ b("div", { className: "flex min-w-[240px] flex-1 items-start gap-2", children: [
1350
+ s !== !1 && /* @__PURE__ */ r("span", { className: at({ type: t }), children: u }),
1351
+ /* @__PURE__ */ b("div", { className: "flex min-w-0 flex-1 flex-col gap-1 leading-5", children: [
1352
+ n != null && /* @__PURE__ */ r("p", { className: "font-medium text-foreground", children: n }),
1353
+ l != null && /* @__PURE__ */ r("p", { className: "text-muted-foreground", children: l })
1354
+ ] })
1355
+ ] }),
1356
+ a && /* @__PURE__ */ r("div", { className: "flex shrink-0 items-start gap-2", children: a })
1357
+ ]
1358
+ }
1359
+ );
1360
+ }
1361
+ );
1362
+ ot.displayName = "Toast";
1363
+ const it = {
1364
+ top: "bottom-full left-1/2 mb-1.5 -translate-x-1/2",
1365
+ bottom: "top-full left-1/2 mt-1.5 -translate-x-1/2",
1366
+ left: "right-full top-1/2 mr-1.5 -translate-y-1/2",
1367
+ right: "left-full top-1/2 ml-1.5 -translate-y-1/2"
1368
+ }, lt = o.forwardRef(
1369
+ ({ className: e, content: t, side: n = "top", children: s, ...a }, l) => /* @__PURE__ */ b("span", { ref: l, className: f("group relative inline-flex", e), ...a, children: [
1370
+ s,
1371
+ /* @__PURE__ */ r(
1372
+ "span",
1373
+ {
1374
+ role: "tooltip",
1375
+ className: f(
1376
+ "pointer-events-none absolute z-50 w-max max-w-xs whitespace-nowrap rounded-radius-lg border border-border bg-popover px-2 py-1 text-xs text-popover-foreground opacity-0 shadow-overlay transition-opacity duration-150",
1377
+ "group-hover:opacity-100 group-focus-within:opacity-100",
1378
+ it[n]
1379
+ ),
1380
+ children: t
1381
+ }
1382
+ )
1383
+ ] })
1384
+ );
1385
+ lt.displayName = "Tooltip";
1386
+ const dt = o.forwardRef(
1387
+ ({ className: e, bordered: t = !0, children: n, ...s }, a) => /* @__PURE__ */ r(
1388
+ "div",
1389
+ {
1390
+ ref: a,
1391
+ "data-node-id": "7669:1745",
1392
+ className: f(
1393
+ "max-h-[204px] overflow-auto",
1394
+ // 얇은 커스텀 스크롤바
1395
+ "[scrollbar-width:thin] [&::-webkit-scrollbar]:w-1.5 [&::-webkit-scrollbar]:h-1.5",
1396
+ "[&::-webkit-scrollbar-track]:bg-transparent",
1397
+ "[&::-webkit-scrollbar-thumb]:rounded-radius-full [&::-webkit-scrollbar-thumb]:bg-foreground/20 hover:[&::-webkit-scrollbar-thumb]:bg-foreground/30",
1398
+ t && "rounded-radius border border-border px-4 py-2",
1399
+ e
1400
+ ),
1401
+ ...s,
1402
+ children: n
1403
+ }
1404
+ )
1405
+ );
1406
+ dt.displayName = "ScrollArea";
1407
+ function J({ children: e }) {
1408
+ const [t] = o.useState(
1409
+ () => typeof document < "u" ? document.body : null
1410
+ );
1411
+ return t ? de(e, t) : null;
1412
+ }
1413
+ function Q(e, t) {
1414
+ o.useEffect(() => {
1415
+ if (!e) return;
1416
+ const n = (a) => {
1417
+ a.key === "Escape" && t();
1418
+ };
1419
+ document.addEventListener("keydown", n);
1420
+ const s = document.body.style.overflow;
1421
+ return document.body.style.overflow = "hidden", () => {
1422
+ document.removeEventListener("keydown", n), document.body.style.overflow = s;
1423
+ };
1424
+ }, [e, t]);
1425
+ }
1426
+ const X = "fixed inset-0 z-50 bg-[rgb(16_16_18_/_0.32)] backdrop-blur-sm";
1427
+ function V(e, t, n) {
1428
+ const s = e !== void 0, [a, l] = o.useState(t), d = s ? e : a, i = o.useCallback(
1429
+ (c) => {
1430
+ s || l(c), n == null || n(c);
1431
+ },
1432
+ [s, n]
1433
+ );
1434
+ return [d, i];
1435
+ }
1436
+ const ct = 'a[href],button:not([disabled]),textarea:not([disabled]),input:not([disabled]),select:not([disabled]),[tabindex]:not([tabindex="-1"])';
1437
+ function Y(e, t) {
1438
+ o.useEffect(() => {
1439
+ if (!e) return;
1440
+ const n = t.current;
1441
+ if (!n) return;
1442
+ const s = document.activeElement, a = () => Array.from(n.querySelectorAll(ct)).filter(
1443
+ (i) => i.offsetParent !== null
1444
+ ), l = setTimeout(() => {
1445
+ const i = t.current;
1446
+ i && !i.contains(document.activeElement) && i.focus();
1447
+ }, 0), d = (i) => {
1448
+ if (i.key !== "Tab") return;
1449
+ const c = a();
1450
+ if (c.length === 0) {
1451
+ i.preventDefault(), n.focus();
1452
+ return;
1453
+ }
1454
+ const u = c[0], x = c[c.length - 1], m = document.activeElement;
1455
+ i.shiftKey && (m === u || m === n) ? (i.preventDefault(), x.focus()) : !i.shiftKey && m === x && (i.preventDefault(), u.focus());
1456
+ };
1457
+ return n.addEventListener("keydown", d), () => {
1458
+ clearTimeout(l), n.removeEventListener("keydown", d), s != null && s.isConnected && s.focus();
1459
+ };
1460
+ }, [e, t]);
1461
+ }
1462
+ function ee() {
1463
+ const e = o.useId(), t = o.useId(), [n, s] = o.useState(!1), [a, l] = o.useState(!1);
1464
+ return {
1465
+ titleId: e,
1466
+ descId: t,
1467
+ setHasTitle: s,
1468
+ setHasDesc: l,
1469
+ labelProps: {
1470
+ "aria-labelledby": n ? e : void 0,
1471
+ "aria-describedby": a ? t : void 0
1472
+ }
1473
+ };
1474
+ }
1475
+ function E(e) {
1476
+ o.useEffect(() => (e(!0), () => e(!1)), [e]);
1477
+ }
1478
+ const te = o.createContext(null), I = () => {
1479
+ const e = o.useContext(te);
1480
+ if (!e) throw new Error("Dialog parts must be used within <Dialog>");
1481
+ return e;
1482
+ };
1483
+ function ut({ open: e, defaultOpen: t = !1, onOpenChange: n, role: s = "dialog", dismissable: a = !0, children: l }) {
1484
+ const [d, i] = V(e, t, n), c = ee();
1485
+ return /* @__PURE__ */ r(te.Provider, { value: { open: d, setOpen: i, role: s, dismissable: a, ...c }, children: l });
1486
+ }
1487
+ const ft = o.forwardRef(
1488
+ ({ onClick: e, ...t }, n) => {
1489
+ const { setOpen: s } = I();
1490
+ return /* @__PURE__ */ r("button", { ref: n, type: "button", onClick: (a) => {
1491
+ s(!0), e == null || e(a);
1492
+ }, ...t });
1493
+ }
1494
+ );
1495
+ ft.displayName = "DialogTrigger";
1496
+ const mt = o.forwardRef(
1497
+ ({ onClick: e, ...t }, n) => {
1498
+ const { setOpen: s } = I();
1499
+ return /* @__PURE__ */ r("button", { ref: n, type: "button", onClick: (a) => {
1500
+ s(!1), e == null || e(a);
1501
+ }, ...t });
1502
+ }
1503
+ );
1504
+ mt.displayName = "DialogClose";
1505
+ const re = o.forwardRef(
1506
+ ({ className: e, showClose: t = !0, children: n, ...s }, a) => {
1507
+ const { open: l, setOpen: d, role: i, dismissable: c, labelProps: u } = I(), x = o.useRef(null), m = o.useCallback(
1508
+ (p) => {
1509
+ x.current = p, typeof a == "function" ? a(p) : a && (a.current = p);
1510
+ },
1511
+ [a]
1512
+ );
1513
+ return Q(l, () => c && d(!1)), Y(l, x), l ? /* @__PURE__ */ r(J, { children: /* @__PURE__ */ r(
1514
+ "div",
1515
+ {
1516
+ className: f(X, "flex items-center justify-center p-4"),
1517
+ onClick: () => c && d(!1),
1518
+ children: /* @__PURE__ */ b(
1519
+ "div",
1520
+ {
1521
+ ref: m,
1522
+ role: i,
1523
+ "aria-modal": !0,
1524
+ tabIndex: -1,
1525
+ ...u,
1526
+ onClick: (p) => p.stopPropagation(),
1527
+ className: f(
1528
+ "relative flex w-full max-w-[448px] flex-col overflow-hidden rounded-radius-2xl border border-border bg-popover outline-none",
1529
+ // Figma: 기본 Dialog 패널은 그림자 없음(border 만). AlertDialog 만 popover 그림자.
1530
+ i === "alertdialog" && "shadow-overlay",
1531
+ e
1532
+ ),
1533
+ ...s,
1534
+ children: [
1535
+ t && /* @__PURE__ */ r(
1536
+ "button",
1537
+ {
1538
+ type: "button",
1539
+ "aria-label": "닫기",
1540
+ onClick: () => d(!1),
1541
+ className: "absolute right-4 top-4 inline-flex size-6 items-center justify-center rounded-radius text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground",
1542
+ children: /* @__PURE__ */ r("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", className: "size-4", "aria-hidden": !0, children: /* @__PURE__ */ r("path", { d: "M18 6 6 18M6 6l12 12", strokeLinecap: "round" }) })
1543
+ }
1544
+ ),
1545
+ n
1546
+ ]
1547
+ }
1548
+ )
1549
+ }
1550
+ ) }) : null;
1551
+ }
1552
+ );
1553
+ re.displayName = "DialogContent";
1554
+ const pt = ({ className: e, ...t }) => /* @__PURE__ */ r("div", { className: f("flex flex-col gap-1 p-6", e), ...t }), xt = ({ className: e, id: t, ...n }) => {
1555
+ const { titleId: s, setHasTitle: a } = I();
1556
+ return E(a), /* @__PURE__ */ r(
1557
+ "h2",
1558
+ {
1559
+ id: t ?? s,
1560
+ className: f("text-xl font-semibold leading-7 tracking-[-0.2px] text-foreground", e),
1561
+ ...n
1562
+ }
1563
+ );
1564
+ }, bt = ({ className: e, id: t, ...n }) => {
1565
+ const { descId: s, setHasDesc: a } = I();
1566
+ return E(a), /* @__PURE__ */ r("p", { id: t ?? s, className: f("text-sm leading-5 text-muted-foreground", e), ...n });
1567
+ }, gt = ({ className: e, ...t }) => /* @__PURE__ */ r(
1568
+ "div",
1569
+ {
1570
+ className: f("flex items-center justify-end gap-2 border-t border-border bg-secondary/[0.72] px-6 py-4", e),
1571
+ ...t
1572
+ }
1573
+ );
1574
+ function It({
1575
+ open: e,
1576
+ defaultOpen: t = !1,
1577
+ onOpenChange: n,
1578
+ title: s,
1579
+ description: a,
1580
+ cancelText: l = "취소",
1581
+ actionText: d = "확인",
1582
+ onAction: i,
1583
+ onCancel: c,
1584
+ destructive: u,
1585
+ children: x
1586
+ }) {
1587
+ const [m, p] = V(e, t, n);
1588
+ return /* @__PURE__ */ r(ut, { open: m, onOpenChange: p, role: "alertdialog", dismissable: !1, children: /* @__PURE__ */ b(re, { showClose: !1, children: [
1589
+ /* @__PURE__ */ b(pt, { children: [
1590
+ /* @__PURE__ */ r(xt, { children: s }),
1591
+ a != null && /* @__PURE__ */ r(bt, { children: a }),
1592
+ x
1593
+ ] }),
1594
+ /* @__PURE__ */ b(gt, { children: [
1595
+ /* @__PURE__ */ r(C, { variant: "secondary", onClick: () => {
1596
+ c == null || c(), p(!1);
1597
+ }, children: l }),
1598
+ /* @__PURE__ */ r(
1599
+ C,
1600
+ {
1601
+ variant: u ? "destructive" : "default",
1602
+ onClick: () => {
1603
+ i == null || i(), p(!1);
1604
+ },
1605
+ children: d
1606
+ }
1607
+ )
1608
+ ] })
1609
+ ] }) });
1610
+ }
1611
+ const ne = o.createContext(null), D = () => {
1612
+ const e = o.useContext(ne);
1613
+ if (!e) throw new Error("Sheet parts must be used within <Sheet>");
1614
+ return e;
1615
+ };
1616
+ function vt({ open: e, defaultOpen: t = !1, onOpenChange: n, children: s }) {
1617
+ const [a, l] = V(e, t, n), d = ee();
1618
+ return /* @__PURE__ */ r(ne.Provider, { value: { open: a, setOpen: l, ...d }, children: s });
1619
+ }
1620
+ const ht = o.forwardRef(
1621
+ ({ onClick: e, ...t }, n) => {
1622
+ const { setOpen: s } = D();
1623
+ return /* @__PURE__ */ r("button", { ref: n, type: "button", onClick: (a) => {
1624
+ s(!0), e == null || e(a);
1625
+ }, ...t });
1626
+ }
1627
+ );
1628
+ ht.displayName = "SheetTrigger";
1629
+ const wt = o.forwardRef(
1630
+ ({ onClick: e, ...t }, n) => {
1631
+ const { setOpen: s } = D();
1632
+ return /* @__PURE__ */ r("button", { ref: n, type: "button", onClick: (a) => {
1633
+ s(!1), e == null || e(a);
1634
+ }, ...t });
1635
+ }
1636
+ );
1637
+ wt.displayName = "SheetClose";
1638
+ const yt = {
1639
+ right: "inset-y-0 right-0 h-full w-full max-w-sm border-l rounded-l-radius-2xl",
1640
+ left: "inset-y-0 left-0 h-full w-full max-w-sm border-r rounded-r-radius-2xl",
1641
+ top: "inset-x-0 top-0 w-full border-b rounded-b-radius-2xl",
1642
+ bottom: "inset-x-0 bottom-0 w-full border-t rounded-t-radius-2xl"
1643
+ }, Nt = {
1644
+ right: "inset-y-4 right-4 w-full max-w-sm",
1645
+ left: "inset-y-4 left-4 w-full max-w-sm",
1646
+ top: "inset-x-4 top-4",
1647
+ bottom: "inset-x-4 bottom-4"
1648
+ }, se = o.forwardRef(
1649
+ ({ className: e, side: t = "right", inset: n = !1, showClose: s = !0, children: a, ...l }, d) => {
1650
+ const { open: i, setOpen: c, labelProps: u } = D(), x = o.useRef(null), m = o.useCallback(
1651
+ (p) => {
1652
+ x.current = p, typeof d == "function" ? d(p) : d && (d.current = p);
1653
+ },
1654
+ [d]
1655
+ );
1656
+ return Q(i, () => c(!1)), Y(i, x), i ? /* @__PURE__ */ r(J, { children: /* @__PURE__ */ r("div", { className: X, onClick: () => c(!1), children: /* @__PURE__ */ b(
1657
+ "div",
1658
+ {
1659
+ ref: m,
1660
+ role: "dialog",
1661
+ "aria-modal": !0,
1662
+ tabIndex: -1,
1663
+ ...u,
1664
+ onClick: (p) => p.stopPropagation(),
1665
+ className: f(
1666
+ "fixed flex flex-col overflow-auto border-border bg-popover shadow-overlay outline-none",
1667
+ n ? f(Nt[t], "rounded-radius-2xl border") : yt[t],
1668
+ e
1669
+ ),
1670
+ ...l,
1671
+ children: [
1672
+ s && /* @__PURE__ */ r(
1673
+ "button",
1674
+ {
1675
+ type: "button",
1676
+ "aria-label": "닫기",
1677
+ onClick: () => c(!1),
1678
+ className: "absolute right-4 top-4 inline-flex size-6 items-center justify-center rounded-radius text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground",
1679
+ children: /* @__PURE__ */ r("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", className: "size-4", "aria-hidden": !0, children: /* @__PURE__ */ r("path", { d: "M18 6 6 18M6 6l12 12", strokeLinecap: "round" }) })
1680
+ }
1681
+ ),
1682
+ a
1683
+ ]
1684
+ }
1685
+ ) }) }) : null;
1686
+ }
1687
+ );
1688
+ se.displayName = "SheetContent";
1689
+ const Dt = ({ className: e, ...t }) => /* @__PURE__ */ r("div", { className: f("flex flex-col gap-1 p-6", e), ...t }), Lt = ({ className: e, id: t, ...n }) => {
1690
+ const { titleId: s, setHasTitle: a } = D();
1691
+ return E(a), /* @__PURE__ */ r(
1692
+ "h2",
1693
+ {
1694
+ id: t ?? s,
1695
+ className: f("text-xl font-semibold leading-7 tracking-[-0.2px] text-foreground", e),
1696
+ ...n
1697
+ }
1698
+ );
1699
+ }, _t = ({ className: e, id: t, ...n }) => {
1700
+ const { descId: s, setHasDesc: a } = D();
1701
+ return E(a), /* @__PURE__ */ r("p", { id: t ?? s, className: f("text-sm leading-5 text-muted-foreground", e), ...n });
1702
+ }, Et = ({ className: e, ...t }) => /* @__PURE__ */ r("div", { className: f("mt-auto flex items-center justify-end gap-2 border-t border-border px-6 py-4", e), ...t });
1703
+ function jt({ open: e, defaultOpen: t, onOpenChange: n, side: s = "bottom", inset: a = !0, children: l, ...d }) {
1704
+ return /* @__PURE__ */ r(vt, { open: e, defaultOpen: t, onOpenChange: n, children: /* @__PURE__ */ r(se, { side: s, inset: a, ...d, children: l }) });
1705
+ }
646
1706
  export {
647
- q as Button,
648
- C as Checkbox,
649
- $ as Field,
650
- W as Input,
651
- H as InputOTP,
652
- Q as InputOTPSeparator,
653
- J as InputOTPSlot,
654
- K as Label,
655
- X as Meter,
656
- se as Select,
657
- Y as Toggle,
658
- Z as ToggleGroup,
659
- ee as ToggleGroupItem,
660
- P as buttonVariants,
661
- F as inputVariants,
662
- te as selectTriggerVariants,
663
- U as slotVariants,
664
- A as toggleVariants
1707
+ Xe as Accordion,
1708
+ Ye as AccordionItem,
1709
+ st as Alert,
1710
+ It as AlertDialog,
1711
+ K as Avatar,
1712
+ Ve as AvatarGroup,
1713
+ Pe as Badge,
1714
+ rt as Breadcrumb,
1715
+ C as Button,
1716
+ ue as Checkbox,
1717
+ et as Collapsible,
1718
+ ut as Dialog,
1719
+ mt as DialogClose,
1720
+ re as DialogContent,
1721
+ bt as DialogDescription,
1722
+ gt as DialogFooter,
1723
+ pt as DialogHeader,
1724
+ xt as DialogTitle,
1725
+ ft as DialogTrigger,
1726
+ jt as Drawer,
1727
+ _t as DrawerDescription,
1728
+ Et as DrawerFooter,
1729
+ Dt as DrawerHeader,
1730
+ Lt as DrawerTitle,
1731
+ xe as Field,
1732
+ me as Input,
1733
+ be as InputOTP,
1734
+ he as InputOTPSeparator,
1735
+ ve as InputOTPSlot,
1736
+ pe as Label,
1737
+ we as Meter,
1738
+ Ge as NumberField,
1739
+ Fe as RadioGroup,
1740
+ He as RadioGroupItem,
1741
+ dt as ScrollArea,
1742
+ $e as SegmentedControl,
1743
+ Te as Select,
1744
+ _e as Separator,
1745
+ vt as Sheet,
1746
+ wt as SheetClose,
1747
+ se as SheetContent,
1748
+ _t as SheetDescription,
1749
+ Et as SheetFooter,
1750
+ Dt as SheetHeader,
1751
+ Lt as SheetTitle,
1752
+ ht as SheetTrigger,
1753
+ Ee as Skeleton,
1754
+ H as Spinner,
1755
+ Le as Switch,
1756
+ Ue as Tabs,
1757
+ Qe as TabsContent,
1758
+ Ze as TabsList,
1759
+ Je as TabsTrigger,
1760
+ Ce as Textarea,
1761
+ ot as Toast,
1762
+ ye as Toggle,
1763
+ Ne as ToggleGroup,
1764
+ ke as ToggleGroupItem,
1765
+ lt as Tooltip,
1766
+ nt as alertVariants,
1767
+ Me as avatarVariants,
1768
+ Oe as badgeVariants,
1769
+ ce as buttonVariants,
1770
+ fe as inputVariants,
1771
+ Be as numberFieldVariants,
1772
+ qe as segmentVariants,
1773
+ ze as selectTriggerVariants,
1774
+ ge as slotVariants,
1775
+ je as spinnerVariants,
1776
+ Ie as switchVariants,
1777
+ Ae as textareaVariants,
1778
+ W as toggleVariants
665
1779
  };