@hyebin4334/admin-ui 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1257 @@
1
+ 'use strict';
2
+
3
+ var reactSlot = require('@radix-ui/react-slot');
4
+ var classVarianceAuthority = require('class-variance-authority');
5
+ var clsx = require('clsx');
6
+ var tailwindMerge = require('tailwind-merge');
7
+ var lucideReact = require('lucide-react');
8
+ var jsxRuntime = require('react/jsx-runtime');
9
+ var CheckboxPrimitive = require('@radix-ui/react-checkbox');
10
+ require('react');
11
+ var LabelPrimitive = require('@radix-ui/react-label');
12
+ var SeparatorPrimitive = require('@radix-ui/react-separator');
13
+ var SelectPrimitive = require('@radix-ui/react-select');
14
+ var TabsPrimitive = require('@radix-ui/react-tabs');
15
+ var SwitchPrimitive = require('@radix-ui/react-switch');
16
+ var AvatarPrimitive = require('@radix-ui/react-avatar');
17
+
18
+ function _interopNamespace(e) {
19
+ if (e && e.__esModule) return e;
20
+ var n = Object.create(null);
21
+ if (e) {
22
+ Object.keys(e).forEach(function (k) {
23
+ if (k !== 'default') {
24
+ var d = Object.getOwnPropertyDescriptor(e, k);
25
+ Object.defineProperty(n, k, d.get ? d : {
26
+ enumerable: true,
27
+ get: function () { return e[k]; }
28
+ });
29
+ }
30
+ });
31
+ }
32
+ n.default = e;
33
+ return Object.freeze(n);
34
+ }
35
+
36
+ var CheckboxPrimitive__namespace = /*#__PURE__*/_interopNamespace(CheckboxPrimitive);
37
+ var LabelPrimitive__namespace = /*#__PURE__*/_interopNamespace(LabelPrimitive);
38
+ var SeparatorPrimitive__namespace = /*#__PURE__*/_interopNamespace(SeparatorPrimitive);
39
+ var SelectPrimitive__namespace = /*#__PURE__*/_interopNamespace(SelectPrimitive);
40
+ var TabsPrimitive__namespace = /*#__PURE__*/_interopNamespace(TabsPrimitive);
41
+ var SwitchPrimitive__namespace = /*#__PURE__*/_interopNamespace(SwitchPrimitive);
42
+ var AvatarPrimitive__namespace = /*#__PURE__*/_interopNamespace(AvatarPrimitive);
43
+
44
+ // src/components/badge.tsx
45
+ function cn(...inputs) {
46
+ return tailwindMerge.twMerge(clsx.clsx(inputs));
47
+ }
48
+ var badgeVariants = classVarianceAuthority.cva(
49
+ "inline-flex items-center justify-center border w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",
50
+ {
51
+ variants: {
52
+ variant: {
53
+ default: "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
54
+ primary: "border-transparent bg-primary-800 text-white",
55
+ secondary: "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
56
+ destructive: "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
57
+ outline: "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
58
+ error: "border-transparent bg-red-50 text-red-500",
59
+ warning: "border-transparent bg-warning-badgeDark text-warning-badgeLight",
60
+ info: "border border-info-dark bg-info-light text-info-dark",
61
+ "status-waiting": "border-transparent bg-[#D1D9E8] text-[#262626]",
62
+ "status-progress": "border-transparent bg-[#F4F6FA] text-[#404040]",
63
+ "status-complete": "border-transparent bg-[#434E70] text-white",
64
+ "status-failed": "border-transparent bg-[#FFEBEB] text-[#ED1515]",
65
+ "status-deleted": "border-transparent bg-[#ED1515] text-[#FFEBEB]"
66
+ },
67
+ size: {
68
+ xs: "text-xs py-0.5 px-1",
69
+ sm: "text-xs py-1 px-2",
70
+ md: "text-xs py-1.5 px-2.5",
71
+ lg: "text-sm py-2 px-3"
72
+ },
73
+ fontWeight: {
74
+ regular: "font-normal",
75
+ medium: "font-medium",
76
+ semibold: "font-semibold",
77
+ bold: "font-bold"
78
+ },
79
+ rounded: {
80
+ full: "rounded-full",
81
+ lg: "rounded-lg",
82
+ md: "rounded-md",
83
+ sm: "rounded-sm",
84
+ xs: "rounded-xs",
85
+ none: "rounded-none"
86
+ }
87
+ },
88
+ defaultVariants: {
89
+ variant: "default",
90
+ size: "sm",
91
+ fontWeight: "medium",
92
+ rounded: "full"
93
+ }
94
+ }
95
+ );
96
+ function Badge({
97
+ className,
98
+ variant,
99
+ size,
100
+ fontWeight,
101
+ rounded,
102
+ asChild = false,
103
+ ...props
104
+ }) {
105
+ const Comp = asChild ? reactSlot.Slot : "span";
106
+ return /* @__PURE__ */ jsxRuntime.jsx(
107
+ Comp,
108
+ {
109
+ "data-slot": "badge",
110
+ className: cn(
111
+ badgeVariants({ variant, size, fontWeight, rounded }),
112
+ className
113
+ ),
114
+ ...props
115
+ }
116
+ );
117
+ }
118
+ var buttonVariants = classVarianceAuthority.cva(
119
+ "inline-flex items-center justify-center cursor-pointer gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-3 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
120
+ {
121
+ variants: {
122
+ variant: {
123
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
124
+ destructive: "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
125
+ outline: "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 disabled:bg-neutral-200/30 disabled:border-neutral-200 disabled:text-neutral-300 disabled:opacity-100",
126
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
127
+ ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
128
+ link: "text-primary underline-offset-4 hover:underline"
129
+ },
130
+ size: {
131
+ default: "h-9 px-4 py-2 has-[>svg]:px-3",
132
+ sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
133
+ lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
134
+ icon: "size-9",
135
+ "icon-sm": "size-8",
136
+ "icon-lg": "size-10"
137
+ }
138
+ },
139
+ defaultVariants: {
140
+ variant: "default",
141
+ size: "default"
142
+ }
143
+ }
144
+ );
145
+ function Button({
146
+ className,
147
+ variant,
148
+ size,
149
+ asChild = false,
150
+ ...props
151
+ }) {
152
+ const Comp = asChild ? reactSlot.Slot : "button";
153
+ return /* @__PURE__ */ jsxRuntime.jsx(
154
+ Comp,
155
+ {
156
+ "data-slot": "button",
157
+ className: cn(buttonVariants({ variant, size, className })),
158
+ ...props
159
+ }
160
+ );
161
+ }
162
+ function Card({ className, ...props }) {
163
+ return /* @__PURE__ */ jsxRuntime.jsx(
164
+ "div",
165
+ {
166
+ "data-slot": "card",
167
+ className: cn(
168
+ "bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",
169
+ className
170
+ ),
171
+ ...props
172
+ }
173
+ );
174
+ }
175
+ function CardHeader({ className, ...props }) {
176
+ return /* @__PURE__ */ jsxRuntime.jsx(
177
+ "div",
178
+ {
179
+ "data-slot": "card-header",
180
+ className: cn(
181
+ "@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",
182
+ className
183
+ ),
184
+ ...props
185
+ }
186
+ );
187
+ }
188
+ function CardTitle({ className, ...props }) {
189
+ return /* @__PURE__ */ jsxRuntime.jsx(
190
+ "div",
191
+ {
192
+ "data-slot": "card-title",
193
+ className: cn("leading-none font-semibold", className),
194
+ ...props
195
+ }
196
+ );
197
+ }
198
+ function CardDescription({ className, ...props }) {
199
+ return /* @__PURE__ */ jsxRuntime.jsx(
200
+ "div",
201
+ {
202
+ "data-slot": "card-description",
203
+ className: cn("text-muted-foreground text-sm", className),
204
+ ...props
205
+ }
206
+ );
207
+ }
208
+ function CardContent({ className, ...props }) {
209
+ return /* @__PURE__ */ jsxRuntime.jsx(
210
+ "div",
211
+ {
212
+ "data-slot": "card-content",
213
+ className: cn("px-6", className),
214
+ ...props
215
+ }
216
+ );
217
+ }
218
+ function Checkbox({
219
+ className,
220
+ ...props
221
+ }) {
222
+ return /* @__PURE__ */ jsxRuntime.jsx(
223
+ CheckboxPrimitive__namespace.Root,
224
+ {
225
+ "data-slot": "checkbox",
226
+ className: cn(
227
+ "peer border-input dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-6 shrink-0 rounded-[2px] border-[1.5px] shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50",
228
+ className
229
+ ),
230
+ ...props,
231
+ children: /* @__PURE__ */ jsxRuntime.jsx(
232
+ CheckboxPrimitive__namespace.Indicator,
233
+ {
234
+ "data-slot": "checkbox-indicator",
235
+ className: "grid place-content-center text-current transition-none",
236
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CheckIcon, { className: "size-4" })
237
+ }
238
+ )
239
+ }
240
+ );
241
+ }
242
+ function Label({
243
+ className,
244
+ ...props
245
+ }) {
246
+ return /* @__PURE__ */ jsxRuntime.jsx(
247
+ LabelPrimitive__namespace.Root,
248
+ {
249
+ "data-slot": "label",
250
+ className: cn(
251
+ "flex items-center text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
252
+ className
253
+ ),
254
+ ...props
255
+ }
256
+ );
257
+ }
258
+ function Separator({
259
+ className,
260
+ orientation = "horizontal",
261
+ decorative = true,
262
+ ...props
263
+ }) {
264
+ return /* @__PURE__ */ jsxRuntime.jsx(
265
+ SeparatorPrimitive__namespace.Root,
266
+ {
267
+ "data-slot": "separator",
268
+ decorative,
269
+ orientation,
270
+ className: cn(
271
+ "bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px",
272
+ className
273
+ ),
274
+ ...props
275
+ }
276
+ );
277
+ }
278
+ function FieldGroup({ className, ...props }) {
279
+ return /* @__PURE__ */ jsxRuntime.jsx(
280
+ "div",
281
+ {
282
+ "data-slot": "field-group",
283
+ className: cn(
284
+ "group/field-group @container/field-group flex w-full flex-col gap-7 data-[slot=checkbox-group]:gap-3 [&>[data-slot=field-group]]:gap-4",
285
+ className
286
+ ),
287
+ ...props
288
+ }
289
+ );
290
+ }
291
+ var fieldVariants = classVarianceAuthority.cva(
292
+ "group/field flex w-full gap-2 data-[invalid=true]:text-destructive",
293
+ {
294
+ variants: {
295
+ orientation: {
296
+ vertical: ["flex-col [&>*]:w-full [&>.sr-only]:w-auto"],
297
+ horizontal: [
298
+ "flex-row items-center",
299
+ "[&>[data-slot=field-label]]:flex-auto",
300
+ "has-[>[data-slot=field-content]]:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px"
301
+ ],
302
+ responsive: [
303
+ "flex-col [&>*]:w-full [&>.sr-only]:w-auto @md/field-group:flex-row @md/field-group:items-center @md/field-group:[&>*]:w-auto",
304
+ "@md/field-group:[&>[data-slot=field-label]]:flex-auto",
305
+ "@md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px"
306
+ ]
307
+ }
308
+ },
309
+ defaultVariants: {
310
+ orientation: "vertical"
311
+ }
312
+ }
313
+ );
314
+ function Field({
315
+ className,
316
+ orientation = "vertical",
317
+ ...props
318
+ }) {
319
+ return /* @__PURE__ */ jsxRuntime.jsx(
320
+ "div",
321
+ {
322
+ role: "group",
323
+ "data-slot": "field",
324
+ "data-orientation": orientation,
325
+ className: cn(fieldVariants({ orientation }), className),
326
+ ...props
327
+ }
328
+ );
329
+ }
330
+ function FieldLabel({
331
+ className,
332
+ isRequired,
333
+ ...props
334
+ }) {
335
+ return /* @__PURE__ */ jsxRuntime.jsx(
336
+ Label,
337
+ {
338
+ "data-required": isRequired,
339
+ "data-slot": "field-label",
340
+ className: cn(
341
+ "group/field-label peer/field-label flex w-fit text-base leading-4 font-normal",
342
+ "has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col has-[>[data-slot=field]]:rounded-md has-[>[data-slot=field]]:border [&>*]:data-[slot=field]:p-4",
343
+ "has-data-[state=checked]:bg-primary/5 has-data-[state=checked]:border-primary dark:has-data-[state=checked]:bg-primary/10",
344
+ "data-[required=true]:after:text-destructive data-[required=true]:after:text-sm data-[required=true]:after:leading-4 data-[required=true]:after:font-light data-[required=true]:after:content-['*']",
345
+ className
346
+ ),
347
+ ...props
348
+ }
349
+ );
350
+ }
351
+ function FieldDescription({ className, ...props }) {
352
+ return /* @__PURE__ */ jsxRuntime.jsx(
353
+ "p",
354
+ {
355
+ "data-slot": "field-description",
356
+ className: cn(
357
+ "text-primary-400 text-xs leading-normal font-normal group-has-[[data-orientation=horizontal]]/field:text-balance",
358
+ "last:mt-0 nth-last-2:-mt-1 [[data-variant=legend]+&]:-mt-1.5",
359
+ "[&>a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4",
360
+ className
361
+ ),
362
+ ...props
363
+ }
364
+ );
365
+ }
366
+ function normalizeInputValue(value) {
367
+ return value === null ? "" : value;
368
+ }
369
+ function Input({ className, type, value, defaultValue, ...props }) {
370
+ return /* @__PURE__ */ jsxRuntime.jsx(
371
+ "input",
372
+ {
373
+ type,
374
+ "data-slot": "input",
375
+ value: normalizeInputValue(value),
376
+ defaultValue: normalizeInputValue(defaultValue),
377
+ className: cn(
378
+ "file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:border-[#e5e5e5] disabled:bg-[#f5f5f5] disabled:text-[#d4d4d4] disabled:opacity-100 disabled:placeholder:text-[#d4d4d4] md:text-sm",
379
+ "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
380
+ "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
381
+ className
382
+ ),
383
+ ...props
384
+ }
385
+ );
386
+ }
387
+ function Pagination({ className, ...props }) {
388
+ return /* @__PURE__ */ jsxRuntime.jsx(
389
+ "nav",
390
+ {
391
+ role: "navigation",
392
+ "aria-label": "pagination",
393
+ "data-slot": "pagination",
394
+ className: cn("flex w-full justify-end", className),
395
+ ...props
396
+ }
397
+ );
398
+ }
399
+ function PaginationContent({
400
+ className,
401
+ ...props
402
+ }) {
403
+ return /* @__PURE__ */ jsxRuntime.jsx(
404
+ "ul",
405
+ {
406
+ "data-slot": "pagination-content",
407
+ className: cn("flex flex-row items-center gap-1", className),
408
+ ...props
409
+ }
410
+ );
411
+ }
412
+ function PaginationItem({ ...props }) {
413
+ return /* @__PURE__ */ jsxRuntime.jsx("li", { "data-slot": "pagination-item", ...props });
414
+ }
415
+ function PaginationLink({
416
+ className,
417
+ isActive,
418
+ size = "icon",
419
+ ...props
420
+ }) {
421
+ return /* @__PURE__ */ jsxRuntime.jsx(
422
+ "a",
423
+ {
424
+ "aria-current": isActive ? "page" : void 0,
425
+ "data-slot": "pagination-link",
426
+ "data-active": isActive,
427
+ className: cn(
428
+ buttonVariants({
429
+ variant: isActive ? "default" : "outline",
430
+ size
431
+ }),
432
+ className
433
+ ),
434
+ ...props
435
+ }
436
+ );
437
+ }
438
+ function PaginationPrevious({
439
+ className,
440
+ ...props
441
+ }) {
442
+ return /* @__PURE__ */ jsxRuntime.jsxs(
443
+ PaginationLink,
444
+ {
445
+ "aria-label": "Go to previous page",
446
+ size: "default",
447
+ className: cn("gap-1 border px-2.5", className),
448
+ ...props,
449
+ children: [
450
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeftIcon, { size: 20 }),
451
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "hidden", children: "Previous" })
452
+ ]
453
+ }
454
+ );
455
+ }
456
+ function PaginationNext({
457
+ className,
458
+ ...props
459
+ }) {
460
+ return /* @__PURE__ */ jsxRuntime.jsxs(
461
+ PaginationLink,
462
+ {
463
+ "aria-label": "Go to next page",
464
+ size: "default",
465
+ className: cn("gap-1 px-2.5 sm:pr-2.5", className),
466
+ ...props,
467
+ children: [
468
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "hidden", children: "Next" }),
469
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, {})
470
+ ]
471
+ }
472
+ );
473
+ }
474
+ function Select({
475
+ ...props
476
+ }) {
477
+ return /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Root, { "data-slot": "select", ...props });
478
+ }
479
+ function SelectValue({
480
+ ...props
481
+ }) {
482
+ return /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Value, { "data-slot": "select-value", ...props });
483
+ }
484
+ function SelectTrigger({
485
+ className,
486
+ size = "default",
487
+ children,
488
+ ...props
489
+ }) {
490
+ return /* @__PURE__ */ jsxRuntime.jsxs(
491
+ SelectPrimitive__namespace.Trigger,
492
+ {
493
+ "data-slot": "select-trigger",
494
+ "data-size": size,
495
+ className: cn(
496
+ "border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-white px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:border-[#e5e5e5] disabled:bg-[#f5f5f5] disabled:text-[#d4d4d4] disabled:opacity-100 data-[disabled]:cursor-not-allowed data-[disabled]:border-[#e5e5e5] data-[disabled]:bg-[#f5f5f5] data-[disabled]:text-[#d4d4d4] data-[disabled]:opacity-100 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 disabled:[&_*]:!text-[#d4d4d4] data-[disabled]:[&_*]:!text-[#d4d4d4] [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
497
+ className
498
+ ),
499
+ ...props,
500
+ children: [
501
+ children,
502
+ /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Icon, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "size-4 opacity-50" }) })
503
+ ]
504
+ }
505
+ );
506
+ }
507
+ function SelectContent({
508
+ className,
509
+ children,
510
+ position = "popper",
511
+ align = "center",
512
+ ...props
513
+ }) {
514
+ return /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsxs(
515
+ SelectPrimitive__namespace.Content,
516
+ {
517
+ "data-slot": "select-content",
518
+ className: cn(
519
+ "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md",
520
+ position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
521
+ className
522
+ ),
523
+ position,
524
+ align,
525
+ ...props,
526
+ children: [
527
+ /* @__PURE__ */ jsxRuntime.jsx(SelectScrollUpButton, {}),
528
+ /* @__PURE__ */ jsxRuntime.jsx(
529
+ SelectPrimitive__namespace.Viewport,
530
+ {
531
+ className: cn(
532
+ "p-1",
533
+ position === "popper" && "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"
534
+ ),
535
+ children
536
+ }
537
+ ),
538
+ /* @__PURE__ */ jsxRuntime.jsx(SelectScrollDownButton, {})
539
+ ]
540
+ }
541
+ ) });
542
+ }
543
+ function SelectItem({
544
+ className,
545
+ children,
546
+ ...props
547
+ }) {
548
+ return /* @__PURE__ */ jsxRuntime.jsxs(
549
+ SelectPrimitive__namespace.Item,
550
+ {
551
+ "data-slot": "select-item",
552
+ className: cn(
553
+ "focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",
554
+ className
555
+ ),
556
+ ...props,
557
+ children: [
558
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute right-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.ItemIndicator, { children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CheckIcon, { className: "size-4" }) }) }),
559
+ /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.ItemText, { children })
560
+ ]
561
+ }
562
+ );
563
+ }
564
+ function SelectScrollUpButton({
565
+ className,
566
+ ...props
567
+ }) {
568
+ return /* @__PURE__ */ jsxRuntime.jsx(
569
+ SelectPrimitive__namespace.ScrollUpButton,
570
+ {
571
+ "data-slot": "select-scroll-up-button",
572
+ className: cn(
573
+ "flex cursor-default items-center justify-center py-1",
574
+ className
575
+ ),
576
+ ...props,
577
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUpIcon, { className: "size-4" })
578
+ }
579
+ );
580
+ }
581
+ function SelectScrollDownButton({
582
+ className,
583
+ ...props
584
+ }) {
585
+ return /* @__PURE__ */ jsxRuntime.jsx(
586
+ SelectPrimitive__namespace.ScrollDownButton,
587
+ {
588
+ "data-slot": "select-scroll-down-button",
589
+ className: cn(
590
+ "flex cursor-default items-center justify-center py-1",
591
+ className
592
+ ),
593
+ ...props,
594
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "size-4" })
595
+ }
596
+ );
597
+ }
598
+ function Table({ className, ...props }) {
599
+ return /* @__PURE__ */ jsxRuntime.jsx(
600
+ "div",
601
+ {
602
+ "data-slot": "table-container",
603
+ className: "relative w-full overflow-x-auto",
604
+ children: /* @__PURE__ */ jsxRuntime.jsx(
605
+ "table",
606
+ {
607
+ "data-slot": "table",
608
+ className: cn("w-full caption-bottom text-sm", className),
609
+ ...props
610
+ }
611
+ )
612
+ }
613
+ );
614
+ }
615
+ function TableHeader({ className, ...props }) {
616
+ return /* @__PURE__ */ jsxRuntime.jsx(
617
+ "thead",
618
+ {
619
+ "data-slot": "table-header",
620
+ className: cn("[&_tr]:border-t [&_tr]:border-b", className),
621
+ ...props
622
+ }
623
+ );
624
+ }
625
+ function TableBody({ className, ...props }) {
626
+ return /* @__PURE__ */ jsxRuntime.jsx(
627
+ "tbody",
628
+ {
629
+ "data-slot": "table-body",
630
+ className: cn("[&_tr:last-child]:border-0", className),
631
+ ...props
632
+ }
633
+ );
634
+ }
635
+ function TableRow({ className, ...props }) {
636
+ return /* @__PURE__ */ jsxRuntime.jsx(
637
+ "tr",
638
+ {
639
+ "data-slot": "table-row",
640
+ className: cn(
641
+ "hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors",
642
+ className
643
+ ),
644
+ ...props
645
+ }
646
+ );
647
+ }
648
+ function TableHead({ className, ...props }) {
649
+ return /* @__PURE__ */ jsxRuntime.jsx(
650
+ "th",
651
+ {
652
+ "data-slot": "table-head",
653
+ className: cn(
654
+ "h-13 bg-[#fcfcfc] px-2 text-left align-middle font-medium whitespace-nowrap text-[#404040] [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",
655
+ className
656
+ ),
657
+ ...props
658
+ }
659
+ );
660
+ }
661
+ function TableCell({ className, ...props }) {
662
+ return /* @__PURE__ */ jsxRuntime.jsx(
663
+ "td",
664
+ {
665
+ "data-slot": "table-cell",
666
+ className: cn(
667
+ "bg-white p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",
668
+ className
669
+ ),
670
+ ...props
671
+ }
672
+ );
673
+ }
674
+ function Tabs({
675
+ className,
676
+ ...props
677
+ }) {
678
+ return /* @__PURE__ */ jsxRuntime.jsx(
679
+ TabsPrimitive__namespace.Root,
680
+ {
681
+ "data-slot": "tabs",
682
+ className: cn("flex flex-col gap-2", className),
683
+ ...props
684
+ }
685
+ );
686
+ }
687
+ function FilledTabsList({
688
+ className,
689
+ ...props
690
+ }) {
691
+ return /* @__PURE__ */ jsxRuntime.jsx(
692
+ TabsPrimitive__namespace.List,
693
+ {
694
+ "data-slot": "tabs-list",
695
+ className: cn(
696
+ "bg-primary-100 text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-[3px]",
697
+ className
698
+ ),
699
+ ...props
700
+ }
701
+ );
702
+ }
703
+ function FilledTabsTrigger({
704
+ className,
705
+ ...props
706
+ }) {
707
+ return /* @__PURE__ */ jsxRuntime.jsx(
708
+ TabsPrimitive__namespace.Trigger,
709
+ {
710
+ "data-slot": "tabs-trigger",
711
+ className: cn(
712
+ "data-[state=active]:bg-primary-800 data-[state=active]:text-primary-0 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
713
+ className
714
+ ),
715
+ ...props
716
+ }
717
+ );
718
+ }
719
+ function TabsContent({
720
+ className,
721
+ ...props
722
+ }) {
723
+ return /* @__PURE__ */ jsxRuntime.jsx(
724
+ TabsPrimitive__namespace.Content,
725
+ {
726
+ "data-slot": "tabs-content",
727
+ className: cn("flex-1 outline-none", className),
728
+ ...props
729
+ }
730
+ );
731
+ }
732
+ var MOCK_PRODUCTS = [
733
+ {
734
+ id: "1",
735
+ code: "P001",
736
+ name: "\uBCA0\uC774\uC9C1 \uD2F0\uC154\uCE20",
737
+ category: "\uC758\uB958",
738
+ price: 29e3,
739
+ stock: 120,
740
+ status: "selling"
741
+ },
742
+ {
743
+ id: "2",
744
+ code: "P002",
745
+ name: "\uB370\uC77C\uB9AC \uCCAD\uBC14\uC9C0",
746
+ category: "\uC758\uB958",
747
+ price: 49e3,
748
+ stock: 85,
749
+ status: "selling"
750
+ },
751
+ {
752
+ id: "3",
753
+ code: "P003",
754
+ name: "\uB7EC\uB2DD \uC2A4\uB2C8\uCEE4\uC988",
755
+ category: "\uC2E0\uBC1C",
756
+ price: 89e3,
757
+ stock: 0,
758
+ status: "soldout"
759
+ },
760
+ {
761
+ id: "4",
762
+ code: "P004",
763
+ name: "\uAC00\uC8FD \uC9C0\uAC11",
764
+ category: "\uC561\uC138\uC11C\uB9AC",
765
+ price: 39e3,
766
+ stock: 42,
767
+ status: "selling"
768
+ },
769
+ {
770
+ id: "5",
771
+ code: "P005",
772
+ name: "\uCE94\uBC84\uC2A4 \uBC31\uD329",
773
+ category: "\uAC00\uBC29",
774
+ price: 59e3,
775
+ stock: 18,
776
+ status: "selling"
777
+ },
778
+ {
779
+ id: "6",
780
+ code: "P006",
781
+ name: "\uC6B8 \uBA38\uD50C\uB7EC",
782
+ category: "\uC561\uC138\uC11C\uB9AC",
783
+ price: 32e3,
784
+ stock: 0,
785
+ status: "soldout"
786
+ },
787
+ {
788
+ id: "7",
789
+ code: "P007",
790
+ name: "\uCF54\uD2BC \uC591\uB9D0 \uC138\uD2B8",
791
+ category: "\uC758\uB958",
792
+ price: 12e3,
793
+ stock: 240,
794
+ status: "selling"
795
+ },
796
+ {
797
+ id: "8",
798
+ code: "P008",
799
+ name: "\uC120\uAE00\uB77C\uC2A4",
800
+ category: "\uC561\uC138\uC11C\uB9AC",
801
+ price: 75e3,
802
+ stock: 8,
803
+ status: "hidden"
804
+ }
805
+ ];
806
+ var STATUS_LABEL = {
807
+ selling: "\uD310\uB9E4\uC911",
808
+ soldout: "\uD488\uC808",
809
+ hidden: "\uC228\uAE40"
810
+ };
811
+ var STATUS_VARIANT = {
812
+ selling: "default",
813
+ soldout: "destructive",
814
+ hidden: "secondary"
815
+ };
816
+ function formatPrice(price) {
817
+ return `\u20A9${price.toLocaleString("ko-KR")}`;
818
+ }
819
+ function ProductListPage() {
820
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-6 p-6", children: [
821
+ /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "flex items-center justify-between", children: [
822
+ /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl font-semibold", children: "\uC0C1\uD488 \uAD00\uB9AC" }),
823
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { children: "+ \uC0C1\uD488 \uB4F1\uB85D" })
824
+ ] }),
825
+ /* @__PURE__ */ jsxRuntime.jsxs(Tabs, { defaultValue: "all", children: [
826
+ /* @__PURE__ */ jsxRuntime.jsxs(FilledTabsList, { children: [
827
+ /* @__PURE__ */ jsxRuntime.jsx(FilledTabsTrigger, { value: "all", children: "\uC804\uCCB4 (245)" }),
828
+ /* @__PURE__ */ jsxRuntime.jsx(FilledTabsTrigger, { value: "selling", children: "\uD310\uB9E4\uC911 (198)" }),
829
+ /* @__PURE__ */ jsxRuntime.jsx(FilledTabsTrigger, { value: "soldout", children: "\uD488\uC808 (32)" }),
830
+ /* @__PURE__ */ jsxRuntime.jsx(FilledTabsTrigger, { value: "hidden", children: "\uC228\uAE40 (15)" })
831
+ ] }),
832
+ /* @__PURE__ */ jsxRuntime.jsxs(TabsContent, { value: "all", className: "pt-6", children: [
833
+ /* @__PURE__ */ jsxRuntime.jsx(Card, { className: "mb-6", children: /* @__PURE__ */ jsxRuntime.jsxs(CardContent, { children: [
834
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-5 md:grid-cols-3 md:gap-x-8", children: [
835
+ /* @__PURE__ */ jsxRuntime.jsxs(Field, { children: [
836
+ /* @__PURE__ */ jsxRuntime.jsx(FieldLabel, { children: "\uCE74\uD14C\uACE0\uB9AC" }),
837
+ /* @__PURE__ */ jsxRuntime.jsxs(Select, { children: [
838
+ /* @__PURE__ */ jsxRuntime.jsx(SelectTrigger, { children: /* @__PURE__ */ jsxRuntime.jsx(SelectValue, { placeholder: "\uC804\uCCB4" }) }),
839
+ /* @__PURE__ */ jsxRuntime.jsxs(SelectContent, { children: [
840
+ /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: "all", children: "\uC804\uCCB4" }),
841
+ /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: "clothes", children: "\uC758\uB958" }),
842
+ /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: "shoes", children: "\uC2E0\uBC1C" }),
843
+ /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: "accessory", children: "\uC561\uC138\uC11C\uB9AC" }),
844
+ /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: "bag", children: "\uAC00\uBC29" })
845
+ ] })
846
+ ] })
847
+ ] }),
848
+ /* @__PURE__ */ jsxRuntime.jsxs(Field, { children: [
849
+ /* @__PURE__ */ jsxRuntime.jsx(FieldLabel, { children: "\uC0C1\uD0DC" }),
850
+ /* @__PURE__ */ jsxRuntime.jsxs(Select, { children: [
851
+ /* @__PURE__ */ jsxRuntime.jsx(SelectTrigger, { children: /* @__PURE__ */ jsxRuntime.jsx(SelectValue, { placeholder: "\uC804\uCCB4" }) }),
852
+ /* @__PURE__ */ jsxRuntime.jsxs(SelectContent, { children: [
853
+ /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: "all", children: "\uC804\uCCB4" }),
854
+ /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: "selling", children: "\uD310\uB9E4\uC911" }),
855
+ /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: "soldout", children: "\uD488\uC808" }),
856
+ /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: "hidden", children: "\uC228\uAE40" })
857
+ ] })
858
+ ] })
859
+ ] }),
860
+ /* @__PURE__ */ jsxRuntime.jsxs(Field, { children: [
861
+ /* @__PURE__ */ jsxRuntime.jsx(FieldLabel, { children: "\uD0A4\uC6CC\uB4DC" }),
862
+ /* @__PURE__ */ jsxRuntime.jsx(Input, { placeholder: "\uC0C1\uD488\uBA85 \uB610\uB294 \uCF54\uB4DC" })
863
+ ] })
864
+ ] }),
865
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-6 flex items-center justify-between", children: [
866
+ /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 text-sm", children: [
867
+ /* @__PURE__ */ jsxRuntime.jsx(Checkbox, { id: "include-soldout" }),
868
+ "\uD488\uC808 \uD3EC\uD568"
869
+ ] }),
870
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-2", children: [
871
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "outline", children: "\uCD08\uAE30\uD654" }),
872
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { children: "\uD544\uD130 \uC801\uC6A9" })
873
+ ] })
874
+ ] })
875
+ ] }) }),
876
+ /* @__PURE__ */ jsxRuntime.jsxs(Table, { children: [
877
+ /* @__PURE__ */ jsxRuntime.jsx(TableHeader, { children: /* @__PURE__ */ jsxRuntime.jsxs(TableRow, { children: [
878
+ /* @__PURE__ */ jsxRuntime.jsx(TableHead, { className: "w-12", children: /* @__PURE__ */ jsxRuntime.jsx(Checkbox, {}) }),
879
+ /* @__PURE__ */ jsxRuntime.jsx(TableHead, { children: "\uC0C1\uD488\uCF54\uB4DC" }),
880
+ /* @__PURE__ */ jsxRuntime.jsx(TableHead, { children: "\uC0C1\uD488\uBA85" }),
881
+ /* @__PURE__ */ jsxRuntime.jsx(TableHead, { children: "\uCE74\uD14C\uACE0\uB9AC" }),
882
+ /* @__PURE__ */ jsxRuntime.jsx(TableHead, { className: "text-right", children: "\uAC00\uACA9" }),
883
+ /* @__PURE__ */ jsxRuntime.jsx(TableHead, { className: "text-right", children: "\uC7AC\uACE0" }),
884
+ /* @__PURE__ */ jsxRuntime.jsx(TableHead, { children: "\uC0C1\uD0DC" }),
885
+ /* @__PURE__ */ jsxRuntime.jsx(TableHead, { className: "w-32 text-right", children: "\uC561\uC158" })
886
+ ] }) }),
887
+ /* @__PURE__ */ jsxRuntime.jsx(TableBody, { children: MOCK_PRODUCTS.map((p) => /* @__PURE__ */ jsxRuntime.jsxs(TableRow, { children: [
888
+ /* @__PURE__ */ jsxRuntime.jsx(TableCell, { children: /* @__PURE__ */ jsxRuntime.jsx(Checkbox, {}) }),
889
+ /* @__PURE__ */ jsxRuntime.jsx(TableCell, { className: "font-medium", children: p.code }),
890
+ /* @__PURE__ */ jsxRuntime.jsx(TableCell, { children: p.name }),
891
+ /* @__PURE__ */ jsxRuntime.jsx(TableCell, { children: p.category }),
892
+ /* @__PURE__ */ jsxRuntime.jsx(TableCell, { className: "text-right", children: formatPrice(p.price) }),
893
+ /* @__PURE__ */ jsxRuntime.jsx(TableCell, { className: "text-right", children: p.stock }),
894
+ /* @__PURE__ */ jsxRuntime.jsx(TableCell, { children: /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: STATUS_VARIANT[p.status], children: STATUS_LABEL[p.status] }) }),
895
+ /* @__PURE__ */ jsxRuntime.jsx(TableCell, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-1", children: [
896
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", children: "\uD3B8\uC9D1" }),
897
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", children: "\uC0AD\uC81C" })
898
+ ] }) })
899
+ ] }, p.id)) })
900
+ ] }),
901
+ /* @__PURE__ */ jsxRuntime.jsx(Pagination, { className: "mt-6", children: /* @__PURE__ */ jsxRuntime.jsxs(PaginationContent, { children: [
902
+ /* @__PURE__ */ jsxRuntime.jsx(PaginationItem, { children: /* @__PURE__ */ jsxRuntime.jsx(PaginationPrevious, { href: "#" }) }),
903
+ /* @__PURE__ */ jsxRuntime.jsx(PaginationItem, { children: /* @__PURE__ */ jsxRuntime.jsx(PaginationLink, { href: "#", isActive: true, children: "1" }) }),
904
+ /* @__PURE__ */ jsxRuntime.jsx(PaginationItem, { children: /* @__PURE__ */ jsxRuntime.jsx(PaginationLink, { href: "#", children: "2" }) }),
905
+ /* @__PURE__ */ jsxRuntime.jsx(PaginationItem, { children: /* @__PURE__ */ jsxRuntime.jsx(PaginationLink, { href: "#", children: "3" }) }),
906
+ /* @__PURE__ */ jsxRuntime.jsx(PaginationItem, { children: /* @__PURE__ */ jsxRuntime.jsx(PaginationNext, { href: "#" }) })
907
+ ] }) })
908
+ ] })
909
+ ] })
910
+ ] });
911
+ }
912
+ var buttonGroupVariants = classVarianceAuthority.cva(
913
+ "flex w-fit items-stretch [&>*]:focus-visible:z-10 [&>*]:focus-visible:relative [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-md has-[>[data-slot=button-group]]:gap-2",
914
+ {
915
+ variants: {
916
+ orientation: {
917
+ horizontal: "[&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:border-l-0 [&>*:not(:last-child)]:rounded-r-none",
918
+ vertical: "flex-col [&>*:not(:first-child)]:rounded-t-none [&>*:not(:first-child)]:border-t-0 [&>*:not(:last-child)]:rounded-b-none"
919
+ }
920
+ },
921
+ defaultVariants: {
922
+ orientation: "horizontal"
923
+ }
924
+ }
925
+ );
926
+ function ButtonGroup({
927
+ className,
928
+ orientation,
929
+ ...props
930
+ }) {
931
+ return /* @__PURE__ */ jsxRuntime.jsx(
932
+ "div",
933
+ {
934
+ role: "group",
935
+ "data-slot": "button-group",
936
+ "data-orientation": orientation,
937
+ className: cn(buttonGroupVariants({ orientation }), className),
938
+ ...props
939
+ }
940
+ );
941
+ }
942
+ function Switch({
943
+ className,
944
+ ...props
945
+ }) {
946
+ return /* @__PURE__ */ jsxRuntime.jsx(
947
+ SwitchPrimitive__namespace.Root,
948
+ {
949
+ "data-slot": "switch",
950
+ className: cn(
951
+ "peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50",
952
+ className
953
+ ),
954
+ ...props,
955
+ children: /* @__PURE__ */ jsxRuntime.jsx(
956
+ SwitchPrimitive__namespace.Thumb,
957
+ {
958
+ "data-slot": "switch-thumb",
959
+ className: cn(
960
+ "bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none block size-4 rounded-full ring-0 transition-transform data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0"
961
+ )
962
+ }
963
+ )
964
+ }
965
+ );
966
+ }
967
+ function normalizeTextareaValue(value) {
968
+ return value === null ? "" : value;
969
+ }
970
+ function Textarea({ className, value, defaultValue, ...props }) {
971
+ return /* @__PURE__ */ jsxRuntime.jsx(
972
+ "textarea",
973
+ {
974
+ "data-slot": "textarea",
975
+ value: normalizeTextareaValue(value),
976
+ defaultValue: normalizeTextareaValue(defaultValue),
977
+ className: cn(
978
+ "border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:border-[#e5e5e5] disabled:bg-[#f5f5f5] disabled:text-[#d4d4d4] disabled:opacity-100 md:text-sm",
979
+ className
980
+ ),
981
+ ...props
982
+ }
983
+ );
984
+ }
985
+ function ProductCreatePage() {
986
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-6 p-6", children: [
987
+ /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "flex items-center justify-between", children: [
988
+ /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl font-semibold", children: "\uC0C1\uD488 \uB4F1\uB85D" }),
989
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-2", children: [
990
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "outline", children: "\uCDE8\uC18C" }),
991
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "outline", children: "\uC784\uC2DC\uC800\uC7A5" }),
992
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { children: "\uC800\uC7A5" })
993
+ ] })
994
+ ] }),
995
+ /* @__PURE__ */ jsxRuntime.jsxs(Card, { children: [
996
+ /* @__PURE__ */ jsxRuntime.jsxs(CardHeader, { children: [
997
+ /* @__PURE__ */ jsxRuntime.jsx(CardTitle, { children: "\uAE30\uBCF8 \uC815\uBCF4" }),
998
+ /* @__PURE__ */ jsxRuntime.jsx(CardDescription, { children: "\uC0C1\uD488\uC758 \uAE30\uBCF8 \uC815\uBCF4\uB97C \uC785\uB825\uD558\uC138\uC694." })
999
+ ] }),
1000
+ /* @__PURE__ */ jsxRuntime.jsx(CardContent, { children: /* @__PURE__ */ jsxRuntime.jsxs(FieldGroup, { children: [
1001
+ /* @__PURE__ */ jsxRuntime.jsxs(Field, { children: [
1002
+ /* @__PURE__ */ jsxRuntime.jsx(FieldLabel, { htmlFor: "product-name", children: "\uC0C1\uD488\uBA85" }),
1003
+ /* @__PURE__ */ jsxRuntime.jsx(Input, { id: "product-name", placeholder: "\uC608) \uBCA0\uC774\uC9C1 \uD2F0\uC154\uCE20" })
1004
+ ] }),
1005
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-6 md:grid-cols-2", children: [
1006
+ /* @__PURE__ */ jsxRuntime.jsxs(Field, { children: [
1007
+ /* @__PURE__ */ jsxRuntime.jsx(FieldLabel, { htmlFor: "product-category", children: "\uCE74\uD14C\uACE0\uB9AC" }),
1008
+ /* @__PURE__ */ jsxRuntime.jsxs(Select, { children: [
1009
+ /* @__PURE__ */ jsxRuntime.jsx(SelectTrigger, { id: "product-category", children: /* @__PURE__ */ jsxRuntime.jsx(SelectValue, { placeholder: "\uCE74\uD14C\uACE0\uB9AC \uC120\uD0DD" }) }),
1010
+ /* @__PURE__ */ jsxRuntime.jsxs(SelectContent, { children: [
1011
+ /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: "clothes", children: "\uC758\uB958" }),
1012
+ /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: "shoes", children: "\uC2E0\uBC1C" }),
1013
+ /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: "accessory", children: "\uC561\uC138\uC11C\uB9AC" }),
1014
+ /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: "bag", children: "\uAC00\uBC29" })
1015
+ ] })
1016
+ ] })
1017
+ ] }),
1018
+ /* @__PURE__ */ jsxRuntime.jsxs(Field, { children: [
1019
+ /* @__PURE__ */ jsxRuntime.jsx(FieldLabel, { htmlFor: "product-code", children: "\uC0C1\uD488\uCF54\uB4DC" }),
1020
+ /* @__PURE__ */ jsxRuntime.jsx(Input, { id: "product-code", placeholder: "\uC790\uB3D9 \uC0DD\uC131\uB428" }),
1021
+ /* @__PURE__ */ jsxRuntime.jsx(FieldDescription, { children: "\uBE44\uC6CC\uB450\uBA74 \uC790\uB3D9 \uBC1C\uAE09\uB429\uB2C8\uB2E4." })
1022
+ ] })
1023
+ ] })
1024
+ ] }) })
1025
+ ] }),
1026
+ /* @__PURE__ */ jsxRuntime.jsxs(Card, { children: [
1027
+ /* @__PURE__ */ jsxRuntime.jsxs(CardHeader, { children: [
1028
+ /* @__PURE__ */ jsxRuntime.jsx(CardTitle, { children: "\uAC00\uACA9" }),
1029
+ /* @__PURE__ */ jsxRuntime.jsx(CardDescription, { children: "\uD310\uB9E4\uAC00, \uD560\uC778\uAC00 \uB4F1 \uAC00\uACA9 \uC815\uBCF4." })
1030
+ ] }),
1031
+ /* @__PURE__ */ jsxRuntime.jsx(CardContent, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-6 md:grid-cols-3", children: [
1032
+ /* @__PURE__ */ jsxRuntime.jsxs(Field, { children: [
1033
+ /* @__PURE__ */ jsxRuntime.jsx(FieldLabel, { htmlFor: "price-original", children: "\uC815\uAC00" }),
1034
+ /* @__PURE__ */ jsxRuntime.jsx(Input, { id: "price-original", type: "number", placeholder: "0" })
1035
+ ] }),
1036
+ /* @__PURE__ */ jsxRuntime.jsxs(Field, { children: [
1037
+ /* @__PURE__ */ jsxRuntime.jsx(FieldLabel, { htmlFor: "price-selling", children: "\uD310\uB9E4\uAC00" }),
1038
+ /* @__PURE__ */ jsxRuntime.jsx(Input, { id: "price-selling", type: "number", placeholder: "0" })
1039
+ ] }),
1040
+ /* @__PURE__ */ jsxRuntime.jsxs(Field, { children: [
1041
+ /* @__PURE__ */ jsxRuntime.jsx(FieldLabel, { htmlFor: "price-discount", children: "\uD560\uC778\uAC00" }),
1042
+ /* @__PURE__ */ jsxRuntime.jsx(Input, { id: "price-discount", type: "number", placeholder: "0" })
1043
+ ] })
1044
+ ] }) })
1045
+ ] }),
1046
+ /* @__PURE__ */ jsxRuntime.jsxs(Card, { children: [
1047
+ /* @__PURE__ */ jsxRuntime.jsx(CardHeader, { children: /* @__PURE__ */ jsxRuntime.jsx(CardTitle, { children: "\uC7AC\uACE0" }) }),
1048
+ /* @__PURE__ */ jsxRuntime.jsx(CardContent, { children: /* @__PURE__ */ jsxRuntime.jsxs(FieldGroup, { children: [
1049
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-6 md:grid-cols-2", children: [
1050
+ /* @__PURE__ */ jsxRuntime.jsxs(Field, { children: [
1051
+ /* @__PURE__ */ jsxRuntime.jsx(FieldLabel, { htmlFor: "stock-quantity", children: "\uC7AC\uACE0 \uC218\uB7C9" }),
1052
+ /* @__PURE__ */ jsxRuntime.jsx(Input, { id: "stock-quantity", type: "number", placeholder: "0" })
1053
+ ] }),
1054
+ /* @__PURE__ */ jsxRuntime.jsxs(Field, { children: [
1055
+ /* @__PURE__ */ jsxRuntime.jsx(FieldLabel, { htmlFor: "stock-safety", children: "\uC548\uC804 \uC7AC\uACE0" }),
1056
+ /* @__PURE__ */ jsxRuntime.jsx(Input, { id: "stock-safety", type: "number", placeholder: "0" }),
1057
+ /* @__PURE__ */ jsxRuntime.jsx(FieldDescription, { children: "\uC548\uC804 \uC7AC\uACE0 \uC774\uD558\uC77C \uB54C \uC54C\uB9BC \uBC1C\uC1A1" })
1058
+ ] })
1059
+ ] }),
1060
+ /* @__PURE__ */ jsxRuntime.jsx(Separator, {}),
1061
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
1062
+ /* @__PURE__ */ jsxRuntime.jsx(Switch, { id: "auto-soldout", defaultChecked: true }),
1063
+ /* @__PURE__ */ jsxRuntime.jsx(Label, { htmlFor: "auto-soldout", children: "\uC7AC\uACE0 0\uC77C \uB54C \uC790\uB3D9 \uD488\uC808 \uCC98\uB9AC" })
1064
+ ] })
1065
+ ] }) })
1066
+ ] }),
1067
+ /* @__PURE__ */ jsxRuntime.jsxs(Card, { children: [
1068
+ /* @__PURE__ */ jsxRuntime.jsxs(CardHeader, { children: [
1069
+ /* @__PURE__ */ jsxRuntime.jsx(CardTitle, { children: "\uC124\uBA85" }),
1070
+ /* @__PURE__ */ jsxRuntime.jsx(CardDescription, { children: "\uC0C1\uD488 \uC0C1\uC138 \uD398\uC774\uC9C0\uC5D0 \uD45C\uC2DC\uB420 \uC124\uBA85." })
1071
+ ] }),
1072
+ /* @__PURE__ */ jsxRuntime.jsx(CardContent, { children: /* @__PURE__ */ jsxRuntime.jsxs(Field, { children: [
1073
+ /* @__PURE__ */ jsxRuntime.jsx(FieldLabel, { htmlFor: "description", children: "\uC0C1\uD488 \uC124\uBA85" }),
1074
+ /* @__PURE__ */ jsxRuntime.jsx(
1075
+ Textarea,
1076
+ {
1077
+ id: "description",
1078
+ placeholder: "\uC0C1\uD488\uC5D0 \uB300\uD55C \uC0C1\uC138 \uC124\uBA85\uC744 \uC785\uB825\uD558\uC138\uC694",
1079
+ rows: 6
1080
+ }
1081
+ )
1082
+ ] }) })
1083
+ ] }),
1084
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-end", children: /* @__PURE__ */ jsxRuntime.jsxs(ButtonGroup, { children: [
1085
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "outline", children: "\uCDE8\uC18C" }),
1086
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "outline", children: "\uC784\uC2DC\uC800\uC7A5" }),
1087
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { children: "\uC800\uC7A5" })
1088
+ ] }) })
1089
+ ] });
1090
+ }
1091
+ function Avatar({
1092
+ className,
1093
+ ...props
1094
+ }) {
1095
+ return /* @__PURE__ */ jsxRuntime.jsx(
1096
+ AvatarPrimitive__namespace.Root,
1097
+ {
1098
+ "data-slot": "avatar",
1099
+ className: cn(
1100
+ "relative flex size-8 shrink-0 overflow-hidden rounded-full",
1101
+ className
1102
+ ),
1103
+ ...props
1104
+ }
1105
+ );
1106
+ }
1107
+ function AvatarFallback({
1108
+ className,
1109
+ ...props
1110
+ }) {
1111
+ return /* @__PURE__ */ jsxRuntime.jsx(
1112
+ AvatarPrimitive__namespace.Fallback,
1113
+ {
1114
+ "data-slot": "avatar-fallback",
1115
+ className: cn(
1116
+ "bg-muted flex size-full items-center justify-center rounded-full",
1117
+ className
1118
+ ),
1119
+ ...props
1120
+ }
1121
+ );
1122
+ }
1123
+ var MOCK_USERS = [
1124
+ {
1125
+ id: "1",
1126
+ code: "U0001",
1127
+ name: "\uAE40\uCCA0\uC218",
1128
+ email: "chulsoo.kim@example.com",
1129
+ joinedAt: "2026-01-15",
1130
+ status: "active"
1131
+ },
1132
+ {
1133
+ id: "2",
1134
+ code: "U0002",
1135
+ name: "\uC774\uC601\uD76C",
1136
+ email: "younghee.lee@example.com",
1137
+ joinedAt: "2026-02-03",
1138
+ status: "active"
1139
+ },
1140
+ {
1141
+ id: "3",
1142
+ code: "U0003",
1143
+ name: "\uBC15\uBBFC\uC218",
1144
+ email: "minsoo.park@example.com",
1145
+ joinedAt: "2026-02-18",
1146
+ status: "dormant"
1147
+ },
1148
+ {
1149
+ id: "4",
1150
+ code: "U0004",
1151
+ name: "\uCD5C\uC9C0\uC601",
1152
+ email: "jiyoung.choi@example.com",
1153
+ joinedAt: "2026-03-07",
1154
+ status: "active"
1155
+ },
1156
+ {
1157
+ id: "5",
1158
+ code: "U0005",
1159
+ name: "\uC815\uC720\uC9C4",
1160
+ email: "yujin.jung@example.com",
1161
+ joinedAt: "2026-03-22",
1162
+ status: "blocked"
1163
+ },
1164
+ {
1165
+ id: "6",
1166
+ code: "U0006",
1167
+ name: "\uAC15\uD638\uB3D9",
1168
+ email: "hodong.kang@example.com",
1169
+ joinedAt: "2026-04-10",
1170
+ status: "active"
1171
+ },
1172
+ {
1173
+ id: "7",
1174
+ code: "U0007",
1175
+ name: "\uC724\uC11C\uC5F0",
1176
+ email: "seoyeon.yoon@example.com",
1177
+ joinedAt: "2026-04-28",
1178
+ status: "active"
1179
+ },
1180
+ {
1181
+ id: "8",
1182
+ code: "U0008",
1183
+ name: "\uC784\uB3C4\uD604",
1184
+ email: "dohyun.lim@example.com",
1185
+ joinedAt: "2026-05-05",
1186
+ status: "dormant"
1187
+ }
1188
+ ];
1189
+ var STATUS_LABEL2 = {
1190
+ active: "\uD65C\uC131",
1191
+ dormant: "\uD734\uBA74",
1192
+ blocked: "\uCC28\uB2E8"
1193
+ };
1194
+ var STATUS_VARIANT2 = {
1195
+ active: "default",
1196
+ dormant: "secondary",
1197
+ blocked: "destructive"
1198
+ };
1199
+ function getInitials(name) {
1200
+ return name.slice(0, 2);
1201
+ }
1202
+ function UserListPage() {
1203
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-6 p-6", children: [
1204
+ /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "flex items-center justify-between", children: [
1205
+ /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl font-semibold", children: "\uD68C\uC6D0 \uAD00\uB9AC" }),
1206
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { children: "+ \uD68C\uC6D0 \uB4F1\uB85D" })
1207
+ ] }),
1208
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2 md:flex-row md:items-center", children: [
1209
+ /* @__PURE__ */ jsxRuntime.jsxs(Select, { defaultValue: "name", children: [
1210
+ /* @__PURE__ */ jsxRuntime.jsx(SelectTrigger, { className: "w-full md:w-[160px]", children: /* @__PURE__ */ jsxRuntime.jsx(SelectValue, { placeholder: "\uAC80\uC0C9 \uAE30\uC900" }) }),
1211
+ /* @__PURE__ */ jsxRuntime.jsxs(SelectContent, { children: [
1212
+ /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: "name", children: "\uC774\uB984" }),
1213
+ /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: "email", children: "\uC774\uBA54\uC77C" }),
1214
+ /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: "code", children: "\uD68C\uC6D0ID" })
1215
+ ] })
1216
+ ] }),
1217
+ /* @__PURE__ */ jsxRuntime.jsx(Input, { placeholder: "\uAC80\uC0C9\uC5B4 \uC785\uB825", className: "flex-1 md:max-w-md" }),
1218
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { children: "\uAC80\uC0C9" })
1219
+ ] }),
1220
+ /* @__PURE__ */ jsxRuntime.jsxs(Table, { children: [
1221
+ /* @__PURE__ */ jsxRuntime.jsx(TableHeader, { children: /* @__PURE__ */ jsxRuntime.jsxs(TableRow, { children: [
1222
+ /* @__PURE__ */ jsxRuntime.jsx(TableHead, { children: "\uD68C\uC6D0ID" }),
1223
+ /* @__PURE__ */ jsxRuntime.jsx(TableHead, { children: "\uD504\uB85C\uD544" }),
1224
+ /* @__PURE__ */ jsxRuntime.jsx(TableHead, { children: "\uC774\uB984" }),
1225
+ /* @__PURE__ */ jsxRuntime.jsx(TableHead, { children: "\uC774\uBA54\uC77C" }),
1226
+ /* @__PURE__ */ jsxRuntime.jsx(TableHead, { children: "\uAC00\uC785\uC77C" }),
1227
+ /* @__PURE__ */ jsxRuntime.jsx(TableHead, { children: "\uC0C1\uD0DC" }),
1228
+ /* @__PURE__ */ jsxRuntime.jsx(TableHead, { className: "w-32 text-right", children: "\uC561\uC158" })
1229
+ ] }) }),
1230
+ /* @__PURE__ */ jsxRuntime.jsx(TableBody, { children: MOCK_USERS.map((u) => /* @__PURE__ */ jsxRuntime.jsxs(TableRow, { children: [
1231
+ /* @__PURE__ */ jsxRuntime.jsx(TableCell, { className: "font-medium", children: u.code }),
1232
+ /* @__PURE__ */ jsxRuntime.jsx(TableCell, { children: /* @__PURE__ */ jsxRuntime.jsx(Avatar, { className: "size-8", children: /* @__PURE__ */ jsxRuntime.jsx(AvatarFallback, { className: "text-xs", children: getInitials(u.name) }) }) }),
1233
+ /* @__PURE__ */ jsxRuntime.jsx(TableCell, { children: u.name }),
1234
+ /* @__PURE__ */ jsxRuntime.jsx(TableCell, { className: "text-muted-foreground", children: u.email }),
1235
+ /* @__PURE__ */ jsxRuntime.jsx(TableCell, { children: u.joinedAt }),
1236
+ /* @__PURE__ */ jsxRuntime.jsx(TableCell, { children: /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: STATUS_VARIANT2[u.status], children: STATUS_LABEL2[u.status] }) }),
1237
+ /* @__PURE__ */ jsxRuntime.jsx(TableCell, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-1", children: [
1238
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", children: "\uC0C1\uC138" }),
1239
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", children: "\uCC28\uB2E8" })
1240
+ ] }) })
1241
+ ] }, u.id)) })
1242
+ ] }),
1243
+ /* @__PURE__ */ jsxRuntime.jsx(Pagination, { children: /* @__PURE__ */ jsxRuntime.jsxs(PaginationContent, { children: [
1244
+ /* @__PURE__ */ jsxRuntime.jsx(PaginationItem, { children: /* @__PURE__ */ jsxRuntime.jsx(PaginationPrevious, { href: "#" }) }),
1245
+ /* @__PURE__ */ jsxRuntime.jsx(PaginationItem, { children: /* @__PURE__ */ jsxRuntime.jsx(PaginationLink, { href: "#", isActive: true, children: "1" }) }),
1246
+ /* @__PURE__ */ jsxRuntime.jsx(PaginationItem, { children: /* @__PURE__ */ jsxRuntime.jsx(PaginationLink, { href: "#", children: "2" }) }),
1247
+ /* @__PURE__ */ jsxRuntime.jsx(PaginationItem, { children: /* @__PURE__ */ jsxRuntime.jsx(PaginationLink, { href: "#", children: "3" }) }),
1248
+ /* @__PURE__ */ jsxRuntime.jsx(PaginationItem, { children: /* @__PURE__ */ jsxRuntime.jsx(PaginationNext, { href: "#" }) })
1249
+ ] }) })
1250
+ ] });
1251
+ }
1252
+
1253
+ exports.ProductCreatePage = ProductCreatePage;
1254
+ exports.ProductListPage = ProductListPage;
1255
+ exports.UserListPage = UserListPage;
1256
+ //# sourceMappingURL=index.cjs.map
1257
+ //# sourceMappingURL=index.cjs.map