@t3q-ui/design-system 0.0.0-stage → 1.56.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,4274 @@
1
+ import { clsx } from 'clsx';
2
+ import { extendTailwindMerge } from 'tailwind-merge';
3
+ import { cva } from 'class-variance-authority';
4
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
5
+ import * as React12 from 'react';
6
+ import { forwardRef, createContext, useMemo, useContext, useState, useEffect, useRef, useCallback } from 'react';
7
+ import LottieImport from 'react-lottie';
8
+ import { Slot, Slottable } from '@radix-ui/react-slot';
9
+ import * as TooltipPrimitive from '@radix-ui/react-tooltip';
10
+ import * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group';
11
+ import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
12
+ import * as DialogPrimitive from '@radix-ui/react-dialog';
13
+ import * as lucide from 'lucide-react';
14
+ import { X, Info, TriangleAlert, Check, CircleX, CircleCheck, ChevronRightIcon, ChevronsLeft, ChevronLeft, ChevronsRight, ChevronRight } from 'lucide-react';
15
+ import * as SeparatorPrimitive from '@radix-ui/react-separator';
16
+ import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
17
+ import { useFormContext, FormProvider, Controller } from 'react-hook-form';
18
+ import * as TabsPrimitive from '@radix-ui/react-tabs';
19
+ import { ModuleRegistry, AllCommunityModule, ClientSideRowModelModule, themeQuartz } from 'ag-grid-community';
20
+ import { AgGridReact } from 'ag-grid-react';
21
+
22
+ function cn(...inputs) {
23
+ return twMerge(clsx(inputs));
24
+ }
25
+ var fontSize = [
26
+ "h1",
27
+ "h2",
28
+ "h3",
29
+ "h4",
30
+ "h5",
31
+ "h6",
32
+ "base-semibold",
33
+ "base-medium",
34
+ "base-regular",
35
+ "large-medium",
36
+ "large-semibold",
37
+ "small-bold-h",
38
+ "small-medium-h",
39
+ "small-regular-h",
40
+ "small-bold",
41
+ "small-medium",
42
+ "small-regular",
43
+ "xsmall-bold",
44
+ "xsmall-medium",
45
+ "xsmall-regular"
46
+ ];
47
+ var borderRadius = ["none", "xsmall", "small", "medium", "large", "xlarge", "full"];
48
+ var twMerge = extendTailwindMerge({
49
+ extend: {
50
+ classGroups: {
51
+ "font-size": fontSize.map((item) => "text-" + item),
52
+ "border-radius": borderRadius.map((item) => "rounded-" + item)
53
+ }
54
+ }
55
+ });
56
+
57
+ // src/utils/sanitizeUserText.ts
58
+ function sanitizeUserText(node) {
59
+ if (typeof node === "string") return node.replace(/[\r\n]+/g, " ");
60
+ if (Array.isArray(node)) return node.map(sanitizeUserText);
61
+ return node;
62
+ }
63
+ var alertVariants = cva(
64
+ "relative w-full rounded-medium p-[16px] grid has-[>svg]:grid-cols-[24px_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-[8px] gap-y-[8px] items-start [&>svg]:size-[20px] [&>svg]:text-current [&>svg]:m-[2px]",
65
+ {
66
+ variants: {
67
+ variant: {
68
+ primary: "[&>svg]:text-sys-alert-primary-icon text-sys-alert-primary-text bg-sys-alert-primary-background",
69
+ info: "[&>svg]:text-sys-alert-info-icon text-sys-alert-info-text bg-sys-alert-info-background",
70
+ success: "[&>svg]:text-sys-alert-success-icon text-sys-alert-success-text bg-sys-alert-success-background",
71
+ warning: "[&>svg]:text-sys-alert-warning-icon text-sys-alert-warning-text bg-sys-alert-warning-background",
72
+ danger: "[&>svg]:text-sys-alert-danger-icon text-sys-alert-danger-text bg-sys-alert-danger-background"
73
+ }
74
+ },
75
+ defaultVariants: {
76
+ variant: "primary"
77
+ }
78
+ }
79
+ );
80
+ function Alert({
81
+ className,
82
+ variant,
83
+ ...props
84
+ }) {
85
+ return /* @__PURE__ */ jsx(
86
+ "div",
87
+ {
88
+ "data-slot": "alert",
89
+ role: "alert",
90
+ className: cn(alertVariants({ variant }), className),
91
+ ...props
92
+ }
93
+ );
94
+ }
95
+ function AlertTitle({ className, children, ...props }) {
96
+ return /* @__PURE__ */ jsx(
97
+ "div",
98
+ {
99
+ "data-slot": "alert-title",
100
+ className: cn("text-h5 col-start-2 line-clamp-1 whitespace-pre", className),
101
+ ...props,
102
+ children: sanitizeUserText(children)
103
+ }
104
+ );
105
+ }
106
+ function AlertDescription({ className, children, ...props }) {
107
+ return /* @__PURE__ */ jsx(
108
+ "div",
109
+ {
110
+ "data-slot": "alert-description",
111
+ className: cn("text-base-medium col-start-2 whitespace-pre-wrap", className),
112
+ ...props,
113
+ children: sanitizeUserText(children)
114
+ }
115
+ );
116
+ }
117
+ function AlertActions({ className, ...props }) {
118
+ return /* @__PURE__ */ jsx(
119
+ "div",
120
+ {
121
+ "data-slot": "alert-actions",
122
+ className: cn(
123
+ "col-start-2 mt-[4px] flex flex-wrap items-center gap-[8px]",
124
+ "[&>button]:px-0 [&>button]:text-current [&>button]:underline [&>button:hover]:text-current [&>button:active]:text-current",
125
+ className
126
+ ),
127
+ ...props
128
+ }
129
+ );
130
+ }
131
+
132
+ // src/components/spinner/spinner.json
133
+ var spinner_default = {
134
+ v: "5.9.0",
135
+ fr: 30,
136
+ ip: 0,
137
+ op: 31,
138
+ w: 500,
139
+ h: 500,
140
+ nm: "\uCEF4\uD3EC\uC9C0\uC158 1",
141
+ ddd: 0,
142
+ assets: [],
143
+ layers: [
144
+ {
145
+ ddd: 0,
146
+ ind: 1,
147
+ ty: 4,
148
+ nm: "\uBAA8\uC591 \uB808\uC774\uC5B4 9",
149
+ sr: 1,
150
+ ks: {
151
+ o: {
152
+ a: 1,
153
+ k: [
154
+ {
155
+ i: { x: [0.667], y: [1] },
156
+ o: { x: [0.333], y: [0] },
157
+ t: 15,
158
+ s: [100]
159
+ },
160
+ { i: { x: [0.667], y: [1] }, o: { x: [0.333], y: [0] }, t: 18, s: [0] },
161
+ {
162
+ i: { x: [0.667], y: [1] },
163
+ o: { x: [0.333], y: [0] },
164
+ t: 26.5,
165
+ s: [0]
166
+ },
167
+ { t: 30, s: [100] }
168
+ ],
169
+ ix: 11
170
+ },
171
+ r: { a: 0, k: 0, ix: 10 },
172
+ p: { a: 0, k: [335.637, 338.637, 0], ix: 2, l: 2 },
173
+ a: { a: 0, k: [-137.363, -106.363, 0], ix: 1, l: 2 },
174
+ s: {
175
+ a: 1,
176
+ k: [
177
+ {
178
+ i: { x: [0.667, 0.667, 0.667], y: [1, 1, 1] },
179
+ o: { x: [0.333, 0.333, 0.333], y: [0, 0, 0] },
180
+ t: 15,
181
+ s: [100, 100, 100]
182
+ },
183
+ {
184
+ i: { x: [0.667, 0.667, 0.667], y: [1, 1, 1] },
185
+ o: { x: [0.333, 0.333, 0.333], y: [0, 0, 0] },
186
+ t: 18,
187
+ s: [0, 0, 100]
188
+ },
189
+ {
190
+ i: { x: [0.667, 0.667, 0.667], y: [1, 1, 1] },
191
+ o: { x: [0.333, 0.333, 0.333], y: [0, 0, 0] },
192
+ t: 26.5,
193
+ s: [0, 0, 100]
194
+ },
195
+ { t: 30, s: [100, 100, 100] }
196
+ ],
197
+ ix: 6,
198
+ l: 2
199
+ }
200
+ },
201
+ ao: 0,
202
+ shapes: [
203
+ {
204
+ ty: "gr",
205
+ it: [
206
+ {
207
+ ty: "rc",
208
+ d: 1,
209
+ s: { a: 0, k: [71.273, 71.273], ix: 2 },
210
+ p: { a: 0, k: [0, 0], ix: 3 },
211
+ r: { a: 0, k: 12, ix: 4 },
212
+ nm: "\uC0AC\uAC01\uD615 \uD328\uC2A4 1",
213
+ mn: "ADBE Vector Shape - Rect",
214
+ hd: false
215
+ },
216
+ {
217
+ ty: "fl",
218
+ c: { a: 0, k: [1, 1, 1, 1], ix: 4 },
219
+ o: { a: 0, k: 100, ix: 5 },
220
+ r: 1,
221
+ bm: 0,
222
+ nm: "\uCE60 1",
223
+ mn: "ADBE Vector Graphic - Fill",
224
+ hd: false
225
+ },
226
+ {
227
+ ty: "tr",
228
+ p: { a: 0, k: [-137.363, -106.363], ix: 2 },
229
+ a: { a: 0, k: [0, 0], ix: 1 },
230
+ s: { a: 0, k: [100, 100], ix: 3 },
231
+ r: { a: 0, k: 0, ix: 6 },
232
+ o: { a: 0, k: 100, ix: 7 },
233
+ sk: { a: 0, k: 0, ix: 4 },
234
+ sa: { a: 0, k: 0, ix: 5 },
235
+ nm: "\uBCC0\uD615"
236
+ }
237
+ ],
238
+ nm: "\uC0AC\uAC01\uD615 1",
239
+ np: 3,
240
+ cix: 2,
241
+ bm: 0,
242
+ ix: 1,
243
+ mn: "ADBE Vector Group",
244
+ hd: false
245
+ }
246
+ ],
247
+ ip: 0,
248
+ op: 900,
249
+ st: 0,
250
+ bm: 0
251
+ },
252
+ {
253
+ ddd: 0,
254
+ ind: 2,
255
+ ty: 4,
256
+ nm: "\uBAA8\uC591 \uB808\uC774\uC5B4 8",
257
+ sr: 1,
258
+ ks: {
259
+ o: {
260
+ a: 1,
261
+ k: [
262
+ {
263
+ i: { x: [0.667], y: [1] },
264
+ o: { x: [0.333], y: [0] },
265
+ t: 16.5,
266
+ s: [100]
267
+ },
268
+ { t: 19.5, s: [0] }
269
+ ],
270
+ ix: 11
271
+ },
272
+ r: { a: 0, k: 0, ix: 10 },
273
+ p: { a: 0, k: [246.637, 338.637, 0], ix: 2, l: 2 },
274
+ a: { a: 0, k: [-137.363, -106.363, 0], ix: 1, l: 2 },
275
+ s: {
276
+ a: 1,
277
+ k: [
278
+ {
279
+ i: { x: [0.667, 0.667, 0.667], y: [1, 1, 1] },
280
+ o: { x: [0.333, 0.333, 0.333], y: [0, 0, 0] },
281
+ t: 3,
282
+ s: [0, 0, 100]
283
+ },
284
+ {
285
+ i: { x: [0.667, 0.667, 0.667], y: [1, 1, 1] },
286
+ o: { x: [0.333, 0.333, 0.333], y: [0, 0, 0] },
287
+ t: 6,
288
+ s: [100, 100, 100]
289
+ },
290
+ {
291
+ i: { x: [0.667, 0.667, 0.667], y: [1, 1, 1] },
292
+ o: { x: [0.333, 0.333, 0.333], y: [0, 0, 0] },
293
+ t: 16.5,
294
+ s: [100, 100, 100]
295
+ },
296
+ { t: 19.5, s: [0, 0, 100] }
297
+ ],
298
+ ix: 6,
299
+ l: 2
300
+ }
301
+ },
302
+ ao: 0,
303
+ shapes: [
304
+ {
305
+ ty: "gr",
306
+ it: [
307
+ {
308
+ ty: "rc",
309
+ d: 1,
310
+ s: { a: 0, k: [71.273, 71.273], ix: 2 },
311
+ p: { a: 0, k: [0, 0], ix: 3 },
312
+ r: { a: 0, k: 12, ix: 4 },
313
+ nm: "\uC0AC\uAC01\uD615 \uD328\uC2A4 1",
314
+ mn: "ADBE Vector Shape - Rect",
315
+ hd: false
316
+ },
317
+ {
318
+ ty: "fl",
319
+ c: { a: 0, k: [1, 1, 1, 1], ix: 4 },
320
+ o: { a: 0, k: 100, ix: 5 },
321
+ r: 1,
322
+ bm: 0,
323
+ nm: "\uCE60 1",
324
+ mn: "ADBE Vector Graphic - Fill",
325
+ hd: false
326
+ },
327
+ {
328
+ ty: "tr",
329
+ p: { a: 0, k: [-137.363, -106.363], ix: 2 },
330
+ a: { a: 0, k: [0, 0], ix: 1 },
331
+ s: { a: 0, k: [100, 100], ix: 3 },
332
+ r: { a: 0, k: 0, ix: 6 },
333
+ o: { a: 0, k: 100, ix: 7 },
334
+ sk: { a: 0, k: 0, ix: 4 },
335
+ sa: { a: 0, k: 0, ix: 5 },
336
+ nm: "\uBCC0\uD615"
337
+ }
338
+ ],
339
+ nm: "\uC0AC\uAC01\uD615 1",
340
+ np: 3,
341
+ cix: 2,
342
+ bm: 0,
343
+ ix: 1,
344
+ mn: "ADBE Vector Group",
345
+ hd: false
346
+ }
347
+ ],
348
+ ip: 0,
349
+ op: 900,
350
+ st: 0,
351
+ bm: 0
352
+ },
353
+ {
354
+ ddd: 0,
355
+ ind: 3,
356
+ ty: 4,
357
+ nm: "\uBAA8\uC591 \uB808\uC774\uC5B4 7",
358
+ sr: 1,
359
+ ks: {
360
+ o: { a: 0, k: 100, ix: 11 },
361
+ r: { a: 0, k: 0, ix: 10 },
362
+ p: { a: 0, k: [157.637, 338.637, 0], ix: 2, l: 2 },
363
+ a: { a: 0, k: [-137.363, -106.363, 0], ix: 1, l: 2 },
364
+ s: {
365
+ a: 1,
366
+ k: [
367
+ {
368
+ i: { x: [0.667, 0.667, 0.667], y: [1, 1, 1] },
369
+ o: { x: [0.333, 0.333, 0.333], y: [0, 0, 0] },
370
+ t: 4.5,
371
+ s: [0, 0, 100]
372
+ },
373
+ {
374
+ i: { x: [0.667, 0.667, 0.667], y: [1, 1, 1] },
375
+ o: { x: [0.333, 0.333, 0.333], y: [0, 0, 0] },
376
+ t: 7.5,
377
+ s: [100, 100, 100]
378
+ },
379
+ {
380
+ i: { x: [0.667, 0.667, 0.667], y: [1, 1, 1] },
381
+ o: { x: [0.333, 0.333, 0.333], y: [0, 0, 0] },
382
+ t: 22.5,
383
+ s: [100, 100, 100]
384
+ },
385
+ { t: 25.5, s: [0, 0, 100] }
386
+ ],
387
+ ix: 6,
388
+ l: 2
389
+ }
390
+ },
391
+ ao: 0,
392
+ shapes: [
393
+ {
394
+ ty: "gr",
395
+ it: [
396
+ {
397
+ ty: "rc",
398
+ d: 1,
399
+ s: { a: 0, k: [71.273, 71.273], ix: 2 },
400
+ p: { a: 0, k: [0, 0], ix: 3 },
401
+ r: { a: 0, k: 12, ix: 4 },
402
+ nm: "\uC0AC\uAC01\uD615 \uD328\uC2A4 1",
403
+ mn: "ADBE Vector Shape - Rect",
404
+ hd: false
405
+ },
406
+ {
407
+ ty: "fl",
408
+ c: { a: 0, k: [1, 1, 1, 1], ix: 4 },
409
+ o: { a: 0, k: 100, ix: 5 },
410
+ r: 1,
411
+ bm: 0,
412
+ nm: "\uCE60 1",
413
+ mn: "ADBE Vector Graphic - Fill",
414
+ hd: false
415
+ },
416
+ {
417
+ ty: "tr",
418
+ p: { a: 0, k: [-137.363, -106.363], ix: 2 },
419
+ a: { a: 0, k: [0, 0], ix: 1 },
420
+ s: { a: 0, k: [100, 100], ix: 3 },
421
+ r: { a: 0, k: 0, ix: 6 },
422
+ o: { a: 0, k: 100, ix: 7 },
423
+ sk: { a: 0, k: 0, ix: 4 },
424
+ sa: { a: 0, k: 0, ix: 5 },
425
+ nm: "\uBCC0\uD615"
426
+ }
427
+ ],
428
+ nm: "\uC0AC\uAC01\uD615 1",
429
+ np: 3,
430
+ cix: 2,
431
+ bm: 0,
432
+ ix: 1,
433
+ mn: "ADBE Vector Group",
434
+ hd: false
435
+ }
436
+ ],
437
+ ip: 0,
438
+ op: 900,
439
+ st: 0,
440
+ bm: 0
441
+ },
442
+ {
443
+ ddd: 0,
444
+ ind: 4,
445
+ ty: 4,
446
+ nm: "\uBAA8\uC591 \uB808\uC774\uC5B4 6",
447
+ sr: 1,
448
+ ks: {
449
+ o: { a: 0, k: 100, ix: 11 },
450
+ r: { a: 0, k: 0, ix: 10 },
451
+ p: { a: 0, k: [335.637, 252.637, 0], ix: 2, l: 2 },
452
+ a: { a: 0, k: [-137.363, -106.363, 0], ix: 1, l: 2 },
453
+ s: {
454
+ a: 1,
455
+ k: [
456
+ {
457
+ i: { x: [0.667, 0.667, 0.667], y: [1, 1, 1] },
458
+ o: { x: [0.333, 0.333, 0.333], y: [0, 0, 0] },
459
+ t: 9,
460
+ s: [100, 100, 100]
461
+ },
462
+ {
463
+ i: { x: [0.667, 0.667, 0.667], y: [1, 1, 1] },
464
+ o: { x: [0.333, 0.333, 0.333], y: [0, 0, 0] },
465
+ t: 12,
466
+ s: [0, 0, 100]
467
+ },
468
+ {
469
+ i: { x: [0.667, 0.667, 0.667], y: [1, 1, 1] },
470
+ o: { x: [0.333, 0.333, 0.333], y: [0, 0, 0] },
471
+ t: 25,
472
+ s: [0, 0, 100]
473
+ },
474
+ { t: 28, s: [100, 100, 100] }
475
+ ],
476
+ ix: 6,
477
+ l: 2
478
+ }
479
+ },
480
+ ao: 0,
481
+ shapes: [
482
+ {
483
+ ty: "gr",
484
+ it: [
485
+ {
486
+ ty: "rc",
487
+ d: 1,
488
+ s: { a: 0, k: [71.273, 71.273], ix: 2 },
489
+ p: { a: 0, k: [0, 0], ix: 3 },
490
+ r: { a: 0, k: 12, ix: 4 },
491
+ nm: "\uC0AC\uAC01\uD615 \uD328\uC2A4 1",
492
+ mn: "ADBE Vector Shape - Rect",
493
+ hd: false
494
+ },
495
+ {
496
+ ty: "fl",
497
+ c: { a: 0, k: [1, 1, 1, 1], ix: 4 },
498
+ o: { a: 0, k: 100, ix: 5 },
499
+ r: 1,
500
+ bm: 0,
501
+ nm: "\uCE60 1",
502
+ mn: "ADBE Vector Graphic - Fill",
503
+ hd: false
504
+ },
505
+ {
506
+ ty: "tr",
507
+ p: { a: 0, k: [-137.363, -106.363], ix: 2 },
508
+ a: { a: 0, k: [0, 0], ix: 1 },
509
+ s: { a: 0, k: [100, 100], ix: 3 },
510
+ r: { a: 0, k: 0, ix: 6 },
511
+ o: { a: 0, k: 100, ix: 7 },
512
+ sk: { a: 0, k: 0, ix: 4 },
513
+ sa: { a: 0, k: 0, ix: 5 },
514
+ nm: "\uBCC0\uD615"
515
+ }
516
+ ],
517
+ nm: "\uC0AC\uAC01\uD615 1",
518
+ np: 3,
519
+ cix: 2,
520
+ bm: 0,
521
+ ix: 1,
522
+ mn: "ADBE Vector Group",
523
+ hd: false
524
+ }
525
+ ],
526
+ ip: 0,
527
+ op: 900,
528
+ st: 0,
529
+ bm: 0
530
+ },
531
+ {
532
+ ddd: 0,
533
+ ind: 5,
534
+ ty: 4,
535
+ nm: "\uBAA8\uC591 \uB808\uC774\uC5B4 5",
536
+ sr: 1,
537
+ ks: {
538
+ o: {
539
+ a: 1,
540
+ k: [
541
+ {
542
+ i: { x: [0.833], y: [0.833] },
543
+ o: { x: [0.167], y: [0.167] },
544
+ t: 0,
545
+ s: [100]
546
+ },
547
+ {
548
+ i: { x: [0.833], y: [0.833] },
549
+ o: { x: [0.167], y: [0.167] },
550
+ t: 15,
551
+ s: [0]
552
+ },
553
+ { t: 30, s: [100] }
554
+ ],
555
+ ix: 11
556
+ },
557
+ r: { a: 0, k: 0, ix: 10 },
558
+ p: { a: 0, k: [246.637, 252.637, 0], ix: 2, l: 2 },
559
+ a: { a: 0, k: [-137.363, -106.363, 0], ix: 1, l: 2 },
560
+ s: { a: 0, k: [100, 100, 100], ix: 6, l: 2 }
561
+ },
562
+ ao: 0,
563
+ shapes: [
564
+ {
565
+ ty: "gr",
566
+ it: [
567
+ {
568
+ ty: "rc",
569
+ d: 1,
570
+ s: { a: 0, k: [71.273, 71.273], ix: 2 },
571
+ p: { a: 0, k: [0, 0], ix: 3 },
572
+ r: { a: 0, k: 12, ix: 4 },
573
+ nm: "\uC0AC\uAC01\uD615 \uD328\uC2A4 1",
574
+ mn: "ADBE Vector Shape - Rect",
575
+ hd: false
576
+ },
577
+ {
578
+ ty: "fl",
579
+ c: { a: 0, k: [1, 1, 1, 1], ix: 4 },
580
+ o: { a: 0, k: 100, ix: 5 },
581
+ r: 1,
582
+ bm: 0,
583
+ nm: "\uCE60 1",
584
+ mn: "ADBE Vector Graphic - Fill",
585
+ hd: false
586
+ },
587
+ {
588
+ ty: "tr",
589
+ p: { a: 0, k: [-137.363, -106.363], ix: 2 },
590
+ a: { a: 0, k: [0, 0], ix: 1 },
591
+ s: { a: 0, k: [100, 100], ix: 3 },
592
+ r: { a: 0, k: 0, ix: 6 },
593
+ o: { a: 0, k: 100, ix: 7 },
594
+ sk: { a: 0, k: 0, ix: 4 },
595
+ sa: { a: 0, k: 0, ix: 5 },
596
+ nm: "\uBCC0\uD615"
597
+ }
598
+ ],
599
+ nm: "\uC0AC\uAC01\uD615 1",
600
+ np: 3,
601
+ cix: 2,
602
+ bm: 0,
603
+ ix: 1,
604
+ mn: "ADBE Vector Group",
605
+ hd: false
606
+ }
607
+ ],
608
+ ip: 0,
609
+ op: 900,
610
+ st: 0,
611
+ bm: 0
612
+ },
613
+ {
614
+ ddd: 0,
615
+ ind: 6,
616
+ ty: 4,
617
+ nm: "\uBAA8\uC591 \uB808\uC774\uC5B4 4",
618
+ sr: 1,
619
+ ks: {
620
+ o: {
621
+ a: 1,
622
+ k: [
623
+ {
624
+ i: { x: [0.667], y: [1] },
625
+ o: { x: [0.333], y: [0] },
626
+ t: 7.5,
627
+ s: [0]
628
+ },
629
+ { t: 15, s: [100] }
630
+ ],
631
+ ix: 11
632
+ },
633
+ r: { a: 0, k: 0, ix: 10 },
634
+ p: { a: 0, k: [157.637, 252.637, 0], ix: 2, l: 2 },
635
+ a: { a: 0, k: [-137.363, -106.363, 0], ix: 1, l: 2 },
636
+ s: {
637
+ a: 1,
638
+ k: [
639
+ {
640
+ i: { x: [0.667, 0.667, 0.667], y: [1, 1, 1] },
641
+ o: { x: [0.333, 0.333, 0.333], y: [0, 0, 0] },
642
+ t: 10.5,
643
+ s: [0, 0, 100]
644
+ },
645
+ {
646
+ i: { x: [0.667, 0.667, 0.667], y: [1, 1, 1] },
647
+ o: { x: [0.333, 0.333, 0.333], y: [0, 0, 0] },
648
+ t: 13.5,
649
+ s: [100, 100, 100]
650
+ },
651
+ {
652
+ i: { x: [0.667, 0.667, 0.667], y: [1, 1, 1] },
653
+ o: { x: [0.333, 0.333, 0.333], y: [0, 0, 0] },
654
+ t: 24,
655
+ s: [100, 100, 100]
656
+ },
657
+ { t: 27, s: [0, 0, 100] }
658
+ ],
659
+ ix: 6,
660
+ l: 2
661
+ }
662
+ },
663
+ ao: 0,
664
+ shapes: [
665
+ {
666
+ ty: "gr",
667
+ it: [
668
+ {
669
+ ty: "rc",
670
+ d: 1,
671
+ s: { a: 0, k: [71.273, 71.273], ix: 2 },
672
+ p: { a: 0, k: [0, 0], ix: 3 },
673
+ r: { a: 0, k: 12, ix: 4 },
674
+ nm: "\uC0AC\uAC01\uD615 \uD328\uC2A4 1",
675
+ mn: "ADBE Vector Shape - Rect",
676
+ hd: false
677
+ },
678
+ {
679
+ ty: "fl",
680
+ c: { a: 0, k: [1, 1, 1, 1], ix: 4 },
681
+ o: { a: 0, k: 100, ix: 5 },
682
+ r: 1,
683
+ bm: 0,
684
+ nm: "\uCE60 1",
685
+ mn: "ADBE Vector Graphic - Fill",
686
+ hd: false
687
+ },
688
+ {
689
+ ty: "tr",
690
+ p: { a: 0, k: [-137.363, -106.363], ix: 2 },
691
+ a: { a: 0, k: [0, 0], ix: 1 },
692
+ s: { a: 0, k: [100, 100], ix: 3 },
693
+ r: { a: 0, k: 0, ix: 6 },
694
+ o: { a: 0, k: 100, ix: 7 },
695
+ sk: { a: 0, k: 0, ix: 4 },
696
+ sa: { a: 0, k: 0, ix: 5 },
697
+ nm: "\uBCC0\uD615"
698
+ }
699
+ ],
700
+ nm: "\uC0AC\uAC01\uD615 1",
701
+ np: 3,
702
+ cix: 2,
703
+ bm: 0,
704
+ ix: 1,
705
+ mn: "ADBE Vector Group",
706
+ hd: false
707
+ }
708
+ ],
709
+ ip: 0,
710
+ op: 900,
711
+ st: 0,
712
+ bm: 0
713
+ },
714
+ {
715
+ ddd: 0,
716
+ ind: 7,
717
+ ty: 4,
718
+ nm: "\uBAA8\uC591 \uB808\uC774\uC5B4 3",
719
+ sr: 1,
720
+ ks: {
721
+ o: { a: 0, k: 100, ix: 11 },
722
+ r: { a: 0, k: 0, ix: 10 },
723
+ p: { a: 0, k: [335.637, 165.637, 0], ix: 2, l: 2 },
724
+ a: { a: 0, k: [-137.363, -106.363, 0], ix: 1, l: 2 },
725
+ s: {
726
+ a: 1,
727
+ k: [
728
+ {
729
+ i: { x: [0.667, 0.667, 0.667], y: [1, 1, 1] },
730
+ o: { x: [0.333, 0.333, 0.333], y: [0, 0, 0] },
731
+ t: 7.5,
732
+ s: [100, 100, 100]
733
+ },
734
+ {
735
+ i: { x: [0.667, 0.667, 0.667], y: [1, 1, 1] },
736
+ o: { x: [0.333, 0.333, 0.333], y: [0, 0, 0] },
737
+ t: 10.5,
738
+ s: [0, 0, 100]
739
+ },
740
+ {
741
+ i: { x: [0.667, 0.667, 0.667], y: [1, 1, 1] },
742
+ o: { x: [0.333, 0.333, 0.333], y: [0, 0, 0] },
743
+ t: 19,
744
+ s: [0, 0, 100]
745
+ },
746
+ { t: 22, s: [100, 100, 100] }
747
+ ],
748
+ ix: 6,
749
+ l: 2
750
+ }
751
+ },
752
+ ao: 0,
753
+ shapes: [
754
+ {
755
+ ty: "gr",
756
+ it: [
757
+ {
758
+ ty: "rc",
759
+ d: 1,
760
+ s: { a: 0, k: [71.273, 71.273], ix: 2 },
761
+ p: { a: 0, k: [0, 0], ix: 3 },
762
+ r: { a: 0, k: 12, ix: 4 },
763
+ nm: "\uC0AC\uAC01\uD615 \uD328\uC2A4 1",
764
+ mn: "ADBE Vector Shape - Rect",
765
+ hd: false
766
+ },
767
+ {
768
+ ty: "fl",
769
+ c: { a: 0, k: [1, 1, 1, 1], ix: 4 },
770
+ o: { a: 0, k: 100, ix: 5 },
771
+ r: 1,
772
+ bm: 0,
773
+ nm: "\uCE60 1",
774
+ mn: "ADBE Vector Graphic - Fill",
775
+ hd: false
776
+ },
777
+ {
778
+ ty: "tr",
779
+ p: { a: 0, k: [-137.363, -106.363], ix: 2 },
780
+ a: { a: 0, k: [0, 0], ix: 1 },
781
+ s: { a: 0, k: [100, 100], ix: 3 },
782
+ r: { a: 0, k: 0, ix: 6 },
783
+ o: { a: 0, k: 100, ix: 7 },
784
+ sk: { a: 0, k: 0, ix: 4 },
785
+ sa: { a: 0, k: 0, ix: 5 },
786
+ nm: "\uBCC0\uD615"
787
+ }
788
+ ],
789
+ nm: "\uC0AC\uAC01\uD615 1",
790
+ np: 3,
791
+ cix: 2,
792
+ bm: 0,
793
+ ix: 1,
794
+ mn: "ADBE Vector Group",
795
+ hd: false
796
+ }
797
+ ],
798
+ ip: 0,
799
+ op: 900,
800
+ st: 0,
801
+ bm: 0
802
+ },
803
+ {
804
+ ddd: 0,
805
+ ind: 8,
806
+ ty: 4,
807
+ nm: "\uBAA8\uC591 \uB808\uC774\uC5B4 2",
808
+ sr: 1,
809
+ ks: {
810
+ o: { a: 0, k: 100, ix: 11 },
811
+ r: { a: 0, k: 0, ix: 10 },
812
+ p: { a: 0, k: [246.637, 165.637, 0], ix: 2, l: 2 },
813
+ a: { a: 0, k: [-137.363, -106.363, 0], ix: 1, l: 2 },
814
+ s: {
815
+ a: 1,
816
+ k: [
817
+ {
818
+ i: { x: [0.667, 0.667, 0.667], y: [1, 1, 1] },
819
+ o: { x: [0.333, 0.333, 0.333], y: [0, 0, 0] },
820
+ t: 2,
821
+ s: [100, 100, 100]
822
+ },
823
+ {
824
+ i: { x: [0.667, 0.667, 0.667], y: [1, 1, 1] },
825
+ o: { x: [0.333, 0.333, 0.333], y: [0, 0, 0] },
826
+ t: 5,
827
+ s: [0, 0, 100]
828
+ },
829
+ {
830
+ i: { x: [0.667, 0.667, 0.667], y: [1, 1, 1] },
831
+ o: { x: [0.333, 0.333, 0.333], y: [0, 0, 0] },
832
+ t: 17.5,
833
+ s: [0, 0, 100]
834
+ },
835
+ { t: 20.5, s: [100, 100, 100] }
836
+ ],
837
+ ix: 6,
838
+ l: 2
839
+ }
840
+ },
841
+ ao: 0,
842
+ shapes: [
843
+ {
844
+ ty: "gr",
845
+ it: [
846
+ {
847
+ ty: "rc",
848
+ d: 1,
849
+ s: { a: 0, k: [71.273, 71.273], ix: 2 },
850
+ p: { a: 0, k: [0, 0], ix: 3 },
851
+ r: { a: 0, k: 12, ix: 4 },
852
+ nm: "\uC0AC\uAC01\uD615 \uD328\uC2A4 1",
853
+ mn: "ADBE Vector Shape - Rect",
854
+ hd: false
855
+ },
856
+ {
857
+ ty: "fl",
858
+ c: { a: 0, k: [1, 1, 1, 1], ix: 4 },
859
+ o: { a: 0, k: 100, ix: 5 },
860
+ r: 1,
861
+ bm: 0,
862
+ nm: "\uCE60 1",
863
+ mn: "ADBE Vector Graphic - Fill",
864
+ hd: false
865
+ },
866
+ {
867
+ ty: "tr",
868
+ p: { a: 0, k: [-137.363, -106.363], ix: 2 },
869
+ a: { a: 0, k: [0, 0], ix: 1 },
870
+ s: { a: 0, k: [100, 100], ix: 3 },
871
+ r: { a: 0, k: 0, ix: 6 },
872
+ o: { a: 0, k: 100, ix: 7 },
873
+ sk: { a: 0, k: 0, ix: 4 },
874
+ sa: { a: 0, k: 0, ix: 5 },
875
+ nm: "\uBCC0\uD615"
876
+ }
877
+ ],
878
+ nm: "\uC0AC\uAC01\uD615 1",
879
+ np: 3,
880
+ cix: 2,
881
+ bm: 0,
882
+ ix: 1,
883
+ mn: "ADBE Vector Group",
884
+ hd: false
885
+ }
886
+ ],
887
+ ip: 0,
888
+ op: 900,
889
+ st: 0,
890
+ bm: 0
891
+ },
892
+ {
893
+ ddd: 0,
894
+ ind: 9,
895
+ ty: 4,
896
+ nm: "\uBAA8\uC591 \uB808\uC774\uC5B4 1",
897
+ sr: 1,
898
+ ks: {
899
+ o: {
900
+ a: 1,
901
+ k: [
902
+ {
903
+ i: { x: [0.667], y: [1] },
904
+ o: { x: [0.333], y: [0] },
905
+ t: 0,
906
+ s: [100]
907
+ },
908
+ {
909
+ i: { x: [0.667], y: [1] },
910
+ o: { x: [0.333], y: [0] },
911
+ t: 7.5,
912
+ s: [0]
913
+ },
914
+ { t: 15, s: [100] }
915
+ ],
916
+ ix: 11
917
+ },
918
+ r: { a: 0, k: 0, ix: 10 },
919
+ p: { a: 0, k: [157.637, 165.637, 0], ix: 2, l: 2 },
920
+ a: { a: 0, k: [-137.363, -106.363, 0], ix: 1, l: 2 },
921
+ s: {
922
+ a: 1,
923
+ k: [
924
+ {
925
+ i: { x: [0.667, 0.667, 0.667], y: [1, 1, 1] },
926
+ o: { x: [0.333, 0.333, 0.333], y: [0, 0, 0] },
927
+ t: 0,
928
+ s: [100, 100, 100]
929
+ },
930
+ {
931
+ i: { x: [0.667, 0.667, 0.667], y: [1, 1, 1] },
932
+ o: { x: [0.333, 0.333, 0.333], y: [0, 0, 0] },
933
+ t: 3,
934
+ s: [0, 0, 100]
935
+ },
936
+ {
937
+ i: { x: [0.667, 0.667, 0.667], y: [1, 1, 1] },
938
+ o: { x: [0.333, 0.333, 0.333], y: [0, 0, 0] },
939
+ t: 11.5,
940
+ s: [0, 0, 100]
941
+ },
942
+ { t: 15, s: [100, 100, 100] }
943
+ ],
944
+ ix: 6,
945
+ l: 2
946
+ }
947
+ },
948
+ ao: 0,
949
+ shapes: [
950
+ {
951
+ ty: "gr",
952
+ it: [
953
+ {
954
+ ty: "rc",
955
+ d: 1,
956
+ s: { a: 0, k: [71.273, 71.273], ix: 2 },
957
+ p: { a: 0, k: [0, 0], ix: 3 },
958
+ r: { a: 0, k: 12, ix: 4 },
959
+ nm: "\uC0AC\uAC01\uD615 \uD328\uC2A4 1",
960
+ mn: "ADBE Vector Shape - Rect",
961
+ hd: false
962
+ },
963
+ {
964
+ ty: "fl",
965
+ c: { a: 0, k: [1, 1, 1, 1], ix: 4 },
966
+ o: { a: 0, k: 100, ix: 5 },
967
+ r: 1,
968
+ bm: 0,
969
+ nm: "\uCE60 1",
970
+ mn: "ADBE Vector Graphic - Fill",
971
+ hd: false
972
+ },
973
+ {
974
+ ty: "tr",
975
+ p: { a: 0, k: [-137.363, -106.363], ix: 2 },
976
+ a: { a: 0, k: [0, 0], ix: 1 },
977
+ s: { a: 0, k: [100, 100], ix: 3 },
978
+ r: { a: 0, k: 0, ix: 6 },
979
+ o: { a: 0, k: 100, ix: 7 },
980
+ sk: { a: 0, k: 0, ix: 4 },
981
+ sa: { a: 0, k: 0, ix: 5 },
982
+ nm: "\uBCC0\uD615"
983
+ }
984
+ ],
985
+ nm: "\uC0AC\uAC01\uD615 1",
986
+ np: 3,
987
+ cix: 2,
988
+ bm: 0,
989
+ ix: 1,
990
+ mn: "ADBE Vector Group",
991
+ hd: false
992
+ }
993
+ ],
994
+ ip: 0,
995
+ op: 900,
996
+ st: 0,
997
+ bm: 0
998
+ }
999
+ ],
1000
+ markers: []
1001
+ };
1002
+ var Lottie = LottieImport.default ?? LottieImport;
1003
+ var sizeVariants = {
1004
+ small: 16,
1005
+ medium: 24,
1006
+ large: 48,
1007
+ xlarge: 96
1008
+ };
1009
+ var dotSizeVariants = {
1010
+ small: "w-[8px] h-[8px]",
1011
+ medium: "w-[12px] h-[12px]",
1012
+ large: "w-[24px] h-[24px]",
1013
+ xlarge: "w-[48px] h-[48px]"
1014
+ };
1015
+ var spinnerVariants = cva("tds-spinner [&_path]:fill-current", {
1016
+ variants: {
1017
+ variant: {
1018
+ auto: "text-sys-background",
1019
+ primary: "text-primary30",
1020
+ primaryBold: "text-primary40",
1021
+ secondary: "text-secondary60",
1022
+ secondaryBold: "text-sys-text-main",
1023
+ danger: "text-danger30",
1024
+ dangerBold: "text-danger40",
1025
+ warning: "text-warning30",
1026
+ warningBold: "text-warning40",
1027
+ info: "text-info30",
1028
+ infoBold: "text-info40",
1029
+ successBadgeText: "text-sys-badge-success-text",
1030
+ /** 부모의 글자색을 그대로 — Badge 처럼 색이 이미 정해진 곳 안에서 */
1031
+ current: "text-current"
1032
+ }
1033
+ },
1034
+ defaultVariants: {
1035
+ variant: "primary"
1036
+ }
1037
+ });
1038
+ function Spinner({
1039
+ size = "medium",
1040
+ variant,
1041
+ shape = "spinner",
1042
+ ...props
1043
+ }) {
1044
+ const lottieWrapperRef = useRef(null);
1045
+ useEffect(() => {
1046
+ lottieWrapperRef.current?.querySelector("[tabindex]")?.setAttribute("tabindex", "-1");
1047
+ });
1048
+ if (shape === "dot") {
1049
+ const px = sizeVariants[size];
1050
+ return /* @__PURE__ */ jsx(
1051
+ "div",
1052
+ {
1053
+ ...props,
1054
+ className: cn(
1055
+ spinnerVariants({ variant }),
1056
+ "inline-flex items-center justify-center",
1057
+ props.className
1058
+ ),
1059
+ style: { width: px, height: px, ...props.style },
1060
+ children: /* @__PURE__ */ jsx(
1061
+ "span",
1062
+ {
1063
+ "aria-hidden": true,
1064
+ className: cn("rounded-full bg-current animate-pulse", dotSizeVariants[size])
1065
+ }
1066
+ )
1067
+ }
1068
+ );
1069
+ }
1070
+ return /* @__PURE__ */ jsx(
1071
+ "div",
1072
+ {
1073
+ ...props,
1074
+ ref: lottieWrapperRef,
1075
+ className: cn(spinnerVariants({ variant }), props.className),
1076
+ children: /* @__PURE__ */ jsx(
1077
+ Lottie,
1078
+ {
1079
+ height: sizeVariants[size],
1080
+ width: sizeVariants[size],
1081
+ ariaRole: "presentation",
1082
+ ariaLabel: "",
1083
+ isClickToPauseDisabled: true,
1084
+ isPaused: false,
1085
+ options: {
1086
+ loop: true,
1087
+ autoplay: true,
1088
+ animationData: spinner_default,
1089
+ rendererSettings: {
1090
+ preserveAspectRatio: "xMidYMid slice"
1091
+ // 여백 없이 꽉 차게 설정
1092
+ }
1093
+ }
1094
+ }
1095
+ )
1096
+ }
1097
+ );
1098
+ }
1099
+ var buttonLoadingVariants = {
1100
+ primaryBold: "auto",
1101
+ primary: "primary",
1102
+ primaryLink: "primaryBold",
1103
+ dangerBold: "auto",
1104
+ danger: "danger",
1105
+ dangerLink: "dangerBold",
1106
+ secondaryBold: "auto",
1107
+ secondary: "secondary",
1108
+ secondaryLink: "secondaryBold",
1109
+ warningBold: "secondaryBold",
1110
+ warning: "warningBold",
1111
+ warningLink: "warningBold",
1112
+ primaryOutline: "primary",
1113
+ secondaryOutline: "secondaryBold",
1114
+ dangerOutline: "danger",
1115
+ warningOutline: "warningBold"
1116
+ };
1117
+ var defaultButtonVariants = {
1118
+ variant: "primary",
1119
+ shape: "normal",
1120
+ spacing: "normal",
1121
+ weight: "bold",
1122
+ loading: false
1123
+ };
1124
+ var buttonWeightVariants = {
1125
+ regular: "font-normal",
1126
+ // 400 (Tailwind 표준 유틸, DS 토큰값과 동일)
1127
+ medium: "font-medium",
1128
+ // 500
1129
+ semibold: "font-semibold",
1130
+ // 600
1131
+ bold: "font-bold"
1132
+ // 700
1133
+ };
1134
+ var buttonVariants = cva(
1135
+ "flex flex-row items-center justify-center whitespace-nowrap leading-[0] transition-colors hover:cursor-pointer disabled:pointer-events-none text-[14px]",
1136
+ {
1137
+ variants: {
1138
+ variant: {
1139
+ primary: "bg-sys-button-primary-subtle-background text-sys-button-primary-subtle-text hover:bg-sys-button-primary-subtle-background-hover active:bg-sys-button-primary-subtle-background-press",
1140
+ primaryBold: "bg-sys-button-primary-background text-sys-button-primary-text hover:bg-sys-button-primary-background-hover active:bg-sys-button-primary-background-press",
1141
+ primaryLink: "text-sys-button-primary-link-text hover:text-sys-button-primary-link-text-hover hover:underline active:text-sys-button-primary-link-text-press",
1142
+ danger: "bg-sys-button-danger-subtle-background text-sys-button-danger-subtle-text hover:bg-sys-button-danger-subtle-background-hover active:bg-sys-button-danger-subtle-background-press",
1143
+ dangerBold: "bg-sys-button-danger-background text-sys-button-danger-text hover:bg-sys-button-danger-background-hover active:bg-sys-button-danger-background-press",
1144
+ dangerLink: "text-sys-button-danger-link-text hover:text-sys-button-danger-link-text-hover hover:underline active:text-sys-button-danger-link-text-press",
1145
+ secondary: "bg-sys-button-secondary-subtle-background text-sys-button-secondary-subtle-text hover:bg-sys-button-secondary-subtle-background-hover active:bg-sys-button-secondary-subtle-background-press",
1146
+ secondaryBold: "bg-sys-button-secondary-background text-sys-button-secondary-text hover:bg-sys-button-secondary-background-hover active:bg-sys-button-secondary-background-press",
1147
+ secondaryLink: "text-sys-button-secondary-link-text hover:text-sys-button-secondary-link-text-hover hover:underline active:text-sys-button-secondary-link-text-press",
1148
+ warning: "bg-sys-button-warning-subtle-background text-sys-button-warning-subtle-text hover:bg-sys-button-warning-subtle-background-hover active:bg-sys-button-warning-subtle-background-press",
1149
+ warningBold: "bg-sys-button-warning-background text-sys-button-warning-text hover:bg-sys-button-warning-background-hover active:bg-sys-button-warning-background-press",
1150
+ warningLink: "text-sys-button-warning-link-text hover:text-sys-button-warning-link-text-hover hover:underline active:text-sys-button-warning-link-text-press",
1151
+ primaryOutline: "border border-sys-button-primary-outline-border text-sys-button-primary-outline-text hover:bg-sys-button-primary-outline-background-hover active:bg-sys-button-primary-outline-background-press",
1152
+ secondaryOutline: "border border-sys-button-secondary-outline-border text-sys-button-secondary-outline-text hover:bg-sys-button-secondary-outline-background-hover active:bg-sys-button-secondary-outline-background-press",
1153
+ dangerOutline: "border border-sys-button-danger-outline-border text-sys-button-danger-outline-text hover:bg-sys-button-danger-outline-background-hover active:bg-sys-button-danger-outline-background-press",
1154
+ warningOutline: "border border-sys-button-warning-outline-border text-sys-button-warning-outline-text hover:bg-sys-button-warning-outline-background-hover active:bg-sys-button-warning-outline-background-press"
1155
+ },
1156
+ spacing: {
1157
+ normal: "p-[6px] max-h-[36px]",
1158
+ compact: "p-[2px] max-h-[28px]"
1159
+ },
1160
+ shape: {
1161
+ normal: "rounded-small",
1162
+ rounded: "rounded-full"
1163
+ },
1164
+ weight: buttonWeightVariants,
1165
+ loading: {
1166
+ true: "relative pointer-events-none text-transparent",
1167
+ false: "disabled:text-sys-button-disabled-text disabled:bg-sys-button-disabled-background"
1168
+ }
1169
+ },
1170
+ compoundVariants: [
1171
+ {
1172
+ variant: "primaryOutline",
1173
+ loading: false,
1174
+ className: "disabled:border-sys-button-disabled-outline"
1175
+ },
1176
+ {
1177
+ variant: "secondaryOutline",
1178
+ loading: false,
1179
+ className: "disabled:border-sys-button-disabled-outline"
1180
+ },
1181
+ {
1182
+ variant: "dangerOutline",
1183
+ loading: false,
1184
+ className: "disabled:border-sys-button-disabled-outline"
1185
+ },
1186
+ {
1187
+ variant: "warningOutline",
1188
+ loading: false,
1189
+ className: "disabled:border-sys-button-disabled-outline"
1190
+ }
1191
+ ],
1192
+ defaultVariants: defaultButtonVariants
1193
+ }
1194
+ );
1195
+ var Button = React12.forwardRef(
1196
+ ({
1197
+ className,
1198
+ variant,
1199
+ shape,
1200
+ spacing,
1201
+ weight,
1202
+ asChild = false,
1203
+ loading,
1204
+ type,
1205
+ children,
1206
+ ...props
1207
+ }, ref) => {
1208
+ const Comp = asChild ? Slot : "button";
1209
+ const resolvedWeightClass = buttonWeightVariants[weight ?? defaultButtonVariants.weight];
1210
+ const processedChildren = React12.useMemo(() => {
1211
+ const flatten = (nodes) => React12.Children.toArray(nodes).flatMap(
1212
+ (child) => React12.isValidElement(child) && child.type === React12.Fragment ? flatten(child.props.children) : [child]
1213
+ );
1214
+ const childrenArray = flatten(children);
1215
+ const result = [];
1216
+ let textBuffer = [];
1217
+ const flushTextBuffer = () => {
1218
+ if (textBuffer.length > 0) {
1219
+ const combinedText = textBuffer.join("");
1220
+ result.push(
1221
+ /* @__PURE__ */ jsx(
1222
+ "span",
1223
+ {
1224
+ className: "box-border flex items-center justify-center px-[4px] h-[24px] shrink-0",
1225
+ children: /* @__PURE__ */ jsx("span", { className: "flex flex-col justify-center leading-[0] shrink-0 text-[14px]", children: /* @__PURE__ */ jsx("span", { className: cn("text-[14px] leading-[24px]", resolvedWeightClass), children: combinedText }) })
1226
+ },
1227
+ `text-${result.length}`
1228
+ )
1229
+ );
1230
+ textBuffer = [];
1231
+ }
1232
+ };
1233
+ childrenArray.forEach((child) => {
1234
+ if (typeof child === "string" || typeof child === "number") {
1235
+ textBuffer.push(String(child));
1236
+ } else {
1237
+ flushTextBuffer();
1238
+ result.push(child);
1239
+ }
1240
+ });
1241
+ flushTextBuffer();
1242
+ return /* @__PURE__ */ jsx("span", { className: "flex items-center justify-center shrink-0", children: result });
1243
+ }, [children, resolvedWeightClass]);
1244
+ return /* @__PURE__ */ jsxs(
1245
+ Comp,
1246
+ {
1247
+ type: asChild ? type : type ?? "button",
1248
+ className: cn(buttonVariants({ variant, shape, spacing, weight, loading }), className),
1249
+ ref,
1250
+ ...props,
1251
+ children: [
1252
+ loading && /* @__PURE__ */ jsx("span", { className: "absolute left-1/2 top-1/2 aspect-square -translate-x-1/2 -translate-y-1/2", children: /* @__PURE__ */ jsx(
1253
+ Spinner,
1254
+ {
1255
+ variant: buttonLoadingVariants[variant ?? defaultButtonVariants["variant"]],
1256
+ size: "medium"
1257
+ }
1258
+ ) }),
1259
+ /* @__PURE__ */ jsx(Slottable, { children: asChild ? children : processedChildren })
1260
+ ]
1261
+ }
1262
+ );
1263
+ }
1264
+ );
1265
+ Button.displayName = "Button";
1266
+ var stackVariant = cva("flex", {
1267
+ variants: {
1268
+ direction: {
1269
+ row: "flex-row",
1270
+ "row-reverse": "flex-row-reverse",
1271
+ column: "flex-col",
1272
+ "column-reverse": "flex-col-reverse"
1273
+ },
1274
+ justifyContent: {
1275
+ center: "justify-center",
1276
+ end: "justify-end",
1277
+ start: "justify-start",
1278
+ "flex-start": "justify-start",
1279
+ "flex-end": "justify-end",
1280
+ "space-around": "justify-around",
1281
+ "space-between": "justify-between",
1282
+ "space-evenly": "justify-evenly",
1283
+ stretch: "justify-stretch",
1284
+ normal: ""
1285
+ // Basic keywords
1286
+ },
1287
+ alignItems: {
1288
+ center: "items-center",
1289
+ end: "items-end",
1290
+ start: "items-start",
1291
+ "flex-start": "items-start",
1292
+ "flex-end": "items-end",
1293
+ stretch: "items-stretch",
1294
+ normal: ""
1295
+ // Basic keywords
1296
+ }
1297
+ },
1298
+ defaultVariants: {
1299
+ direction: "row",
1300
+ justifyContent: "normal",
1301
+ alignItems: "normal"
1302
+ }
1303
+ });
1304
+ var Stack = forwardRef(
1305
+ ({ direction = "row", spacing, justifyContent, alignItems, children, ...props }, ref) => {
1306
+ return /* @__PURE__ */ jsx(
1307
+ "div",
1308
+ {
1309
+ ref,
1310
+ ...props,
1311
+ className: cn(stackVariant({ direction, justifyContent, alignItems }), props.className),
1312
+ style: {
1313
+ gap: Number(spacing) ? `${spacing}px` : `${spacing}`,
1314
+ ...props.style
1315
+ },
1316
+ children
1317
+ }
1318
+ );
1319
+ }
1320
+ );
1321
+ Stack.displayName = "Stack";
1322
+ var BADGE_OUTLINE_ACCENT = {
1323
+ primary: { border: "border-primary30", icon: "text-primary30" },
1324
+ secondary: { border: "border-secondary50", icon: "text-secondary50" },
1325
+ success: { border: "border-success30", icon: "text-success30" },
1326
+ danger: { border: "border-danger30", icon: "text-danger30" },
1327
+ warning: { border: "border-warning40", icon: "text-warning40" },
1328
+ info: { border: "border-info40", icon: "text-info40" },
1329
+ etc: { border: "border-etc30", icon: "text-etc30" }
1330
+ };
1331
+ var badgeVariants = cva(
1332
+ // whitespace-nowrap: 좁은 표 칸에서 "최고 성능" 뱃지가 세로로 한 글자씩 쪼개져 심판 "vertical badge" 감점 (2026-10-19 15차 D1)
1333
+ // [&>svg]: 상태 뱃지의 아이콘은 자식으로 바로 넣는다(`<Badge variant='success'><CheckCircle />완료</Badge>`) — lucide 기본 24px 가 20px 뱃지를 넘지 않게 16px 로(2026-10-30)
1334
+ "inline-flex items-center justify-center whitespace-nowrap px-[2px] py-[2px] leading-none transition-colors overflow-clip [&>svg]:size-[16px] [&>svg]:shrink-0",
1335
+ {
1336
+ variants: {
1337
+ /** small(기본): 20px·12px — 상태·건수·탭·개수 뱃지 모두 이 크기. medium: 24px·14px — 특별히 크게 보여야 할 때만 */
1338
+ size: {
1339
+ small: "min-h-[20px] min-w-[20px] text-small-bold",
1340
+ medium: "min-h-[24px] min-w-[24px] text-h6"
1341
+ },
1342
+ variant: {
1343
+ primary: "bg-sys-badge-primary-background text-sys-badge-primary-text",
1344
+ primaryBold: "bg-primary30 text-secondary10",
1345
+ secondary: "bg-sys-badge-secondary-background text-sys-badge-secondary-text",
1346
+ secondaryBold: "bg-secondary60 text-secondary10",
1347
+ danger: "bg-sys-badge-danger-background text-sys-badge-danger-text",
1348
+ dangerBold: "bg-danger30 text-secondary10",
1349
+ warning: "bg-sys-badge-warning-background text-sys-badge-warning-text",
1350
+ warningBold: "bg-warning30 text-grayscale80",
1351
+ success: "bg-sys-badge-success-background text-sys-badge-success-text",
1352
+ successBold: "bg-success30 text-secondary10",
1353
+ info: "bg-sys-badge-info-background text-sys-badge-info-text",
1354
+ infoBold: "bg-info30 text-grayscale80",
1355
+ etc: "bg-sys-badge-etc-background text-sys-badge-etc-text",
1356
+ etcBold: "bg-etc30 text-secondary10"
1357
+ },
1358
+ rounded: {
1359
+ default: "rounded-xsmall",
1360
+ full: "rounded-full"
1361
+ },
1362
+ /** tint(기본): 연한 채움. outline: 흰 바탕 + 1px accent 테두리(subtle 변형에만 — 2026-10-17 이슈 47 6차, 상태 뱃지용) */
1363
+ appearance: {
1364
+ tint: "",
1365
+ outline: ""
1366
+ }
1367
+ },
1368
+ // outline × subtle 7색: 테두리는 {hue}30, 밝은 색(warning·info)은 40, secondary 는 50 — 흰 바탕에서 선이 보이는 가장 연한 단계.
1369
+ // 1px 테두리만큼 py 를 1px 줄여 높이 20px 유지. bold 변형은 appearance 를 무시한다(채움 그대로)
1370
+ compoundVariants: Object.keys(BADGE_OUTLINE_ACCENT).map((tone) => ({
1371
+ appearance: "outline",
1372
+ variant: tone,
1373
+ class: `bg-sys-background border py-[1px] ${BADGE_OUTLINE_ACCENT[tone].border}`
1374
+ })),
1375
+ defaultVariants: {
1376
+ variant: "primary",
1377
+ // 기본 4px(rounded-xsmall) — 라운드 한 계열: 뱃지·태그 4 · 칩·버튼·입력 6 · 표 8. pill 은 호출자가 rounded='full' 로만 (2026-10-18 10차 ②)
1378
+ rounded: "default",
1379
+ appearance: "tint",
1380
+ size: "small"
1381
+ }
1382
+ }
1383
+ );
1384
+ function Badge({ className, variant, rounded, appearance, size, children, ...props }) {
1385
+ const wrappedChildren = React12.Children.map(children, (child) => {
1386
+ if (typeof child === "string" || typeof child === "number") {
1387
+ return /* @__PURE__ */ jsx("span", { className: "px-[3px]", children: child });
1388
+ }
1389
+ return child;
1390
+ });
1391
+ return /* @__PURE__ */ jsx(
1392
+ "div",
1393
+ {
1394
+ className: cn(badgeVariants({ variant, rounded, appearance, size }), className),
1395
+ ...props,
1396
+ children: wrappedChildren
1397
+ }
1398
+ );
1399
+ }
1400
+ var TooltipProvider = TooltipPrimitive.Provider;
1401
+ var Tooltip = TooltipPrimitive.Root;
1402
+ var TooltipTrigger = React12.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(TooltipPrimitive.Trigger, { type: "button", ref, className: cn(className), ...props }));
1403
+ TooltipTrigger.displayName = TooltipPrimitive.Trigger.displayName;
1404
+ var TooltipContent = React12.forwardRef(({ className, sideOffset = 4, children, ...props }, ref) => /* @__PURE__ */ jsx(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsx(
1405
+ TooltipPrimitive.Content,
1406
+ {
1407
+ ref,
1408
+ sideOffset,
1409
+ className: cn(
1410
+ "z-[var(--root-z-index)] overflow-hidden rounded-small bg-secondary70 px-[6px] py-[4px] text-small-regular text-sys-background whitespace-pre-wrap break-keep wrap-break-word animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-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 origin-[--radix-tooltip-content-transform-origin]",
1411
+ className
1412
+ ),
1413
+ ...props,
1414
+ children: sanitizeUserText(children)
1415
+ }
1416
+ ) }));
1417
+ TooltipContent.displayName = TooltipPrimitive.Content.displayName;
1418
+ var ToggleGroupContext = React12.createContext({
1419
+ variant: "default",
1420
+ spacing: false
1421
+ });
1422
+ function ToggleGroup({
1423
+ type = "single",
1424
+ variant = "default",
1425
+ spacing = false,
1426
+ className,
1427
+ ...props
1428
+ }) {
1429
+ const rootClass = variant === "outline" && !spacing ? "inline-flex rounded-small border border-secondary30 divide-x divide-secondary30" : "flex flex-wrap gap-1";
1430
+ return /* @__PURE__ */ jsx(ToggleGroupContext.Provider, { value: { variant, spacing }, children: /* @__PURE__ */ jsx(
1431
+ ToggleGroupPrimitive.Root,
1432
+ {
1433
+ ...{ type, ...props },
1434
+ "data-slot": "toggle-group",
1435
+ className: cn(rootClass, className)
1436
+ }
1437
+ ) });
1438
+ }
1439
+ function ToggleGroupItem({
1440
+ value,
1441
+ count,
1442
+ countVariant = "secondary",
1443
+ children,
1444
+ className,
1445
+ ...props
1446
+ }) {
1447
+ const { variant, spacing } = React12.useContext(ToggleGroupContext);
1448
+ const shapeClass = variant === "outline" && !spacing ? "rounded-none first:rounded-l-small last:rounded-r-small" : variant === "outline" && spacing ? "rounded-small border border-secondary30" : "rounded-small";
1449
+ const focusClass = variant === "outline" && !spacing ? "focus-visible:relative focus-visible:z-10 focus-visible:outline-[2px] focus-visible:outline-sys-focus-ring-main focus-visible:outline-offset-[2px]" : "focus-visible:outline-[2px] focus-visible:outline-sys-focus-ring-main focus-visible:outline-offset-[1px]";
1450
+ return /* @__PURE__ */ jsxs(
1451
+ ToggleGroupPrimitive.Item,
1452
+ {
1453
+ value,
1454
+ "data-slot": "toggle-group-item",
1455
+ className: cn(
1456
+ // whitespace-nowrap: 좁은 자리에서 항목 라벨이 한 글자씩 줄바꿈되지 않게 (2026-10-16 홀드아웃 6 schedule-list 지적)
1457
+ "inline-flex items-center justify-center gap-[4px] px-[12px] h-[32px] whitespace-nowrap",
1458
+ "text-base-medium leading-none transition-colors",
1459
+ "text-sys-text-subtler hover:bg-secondary-o10 hover:text-sys-text-main",
1460
+ "data-[state=on]:bg-primary-o10 data-[state=on]:hover:bg-primary-o20 data-[state=on]:text-sys-text-main",
1461
+ "disabled:pointer-events-none disabled:opacity-50",
1462
+ focusClass,
1463
+ shapeClass,
1464
+ className
1465
+ ),
1466
+ ...props,
1467
+ children: [
1468
+ children,
1469
+ count !== void 0 && /* @__PURE__ */ jsx(Badge, { "data-slot": "toggle-group-count", size: "small", rounded: "full", variant: countVariant, children: count })
1470
+ ]
1471
+ }
1472
+ );
1473
+ }
1474
+ var iconButtonVariants = cva(
1475
+ "inline-flex items-center justify-center h-fit whitespace-nowrap text-h6 transition-colors hover:cursor-pointer disabled:pointer-events-none disabled:text-sys-button-disabled-text disabled:bg-sys-button-disabled-background",
1476
+ {
1477
+ variants: {
1478
+ variant: {
1479
+ primary: "bg-sys-button-primary-subtle-background text-sys-button-primary-subtle-text hover:bg-sys-button-primary-subtle-background-hover active:bg-sys-button-primary-subtle-background-press",
1480
+ primaryBold: "bg-sys-button-primary-background text-sys-button-primary-text hover:bg-sys-button-primary-background-hover active:bg-sys-button-primary-background-press",
1481
+ primaryLink: "text-sys-button-primary-link-text hover:text-sys-button-primary-link-text-hover active:text-sys-button-primary-link-text-press",
1482
+ danger: "bg-sys-button-danger-subtle-background text-sys-button-danger-subtle-text hover:bg-sys-button-danger-subtle-background-hover active:bg-sys-button-danger-subtle-background-press",
1483
+ dangerBold: "bg-sys-button-danger-background text-sys-button-danger-text hover:bg-sys-button-danger-background-hover active:bg-sys-button-danger-background-press",
1484
+ dangerLink: "text-sys-button-danger-link-text hover:text-sys-button-danger-link-text-hover active:text-sys-button-danger-link-text-press",
1485
+ secondary: "bg-sys-button-secondary-subtle-background text-sys-button-secondary-subtle-text hover:bg-sys-button-secondary-subtle-background-hover active:bg-sys-button-secondary-subtle-background-press",
1486
+ secondaryBold: "bg-sys-button-secondary-background text-sys-button-secondary-text hover:bg-sys-button-secondary-background-hover active:bg-sys-button-secondary-background-press",
1487
+ secondaryLink: "text-sys-button-secondary-link-text hover:text-sys-button-secondary-link-text-hover active:text-sys-button-secondary-link-text-press",
1488
+ warning: "bg-sys-button-warning-subtle-background text-sys-button-warning-subtle-text hover:bg-sys-button-warning-subtle-background-hover active:bg-sys-button-warning-subtle-background-press",
1489
+ warningBold: "bg-sys-button-warning-background text-sys-button-warning-text hover:bg-sys-button-warning-background-hover active:bg-sys-button-warning-background-press",
1490
+ warningLink: "text-sys-button-warning-link-text hover:text-sys-button-warning-link-text-hover active:text-sys-button-warning-link-text-press",
1491
+ outline: "border border-secondary30 text-sys-text-subtler text-base-medium"
1492
+ },
1493
+ spacing: {
1494
+ normal: "p-[6px]",
1495
+ compact: "p-[2px] max-h-[28px] max-w-[28px]"
1496
+ },
1497
+ shape: {
1498
+ normal: "rounded-small",
1499
+ rounded: "rounded-full"
1500
+ }
1501
+ },
1502
+ defaultVariants: {
1503
+ variant: "primary",
1504
+ shape: "normal",
1505
+ spacing: "normal"
1506
+ }
1507
+ }
1508
+ );
1509
+ var IconButton = React12.forwardRef(
1510
+ ({ className, variant, shape, spacing, asChild = false, type, ...props }, ref) => {
1511
+ const Comp = asChild ? Slot : "button";
1512
+ return /* @__PURE__ */ jsx(
1513
+ Comp,
1514
+ {
1515
+ className: cn(iconButtonVariants({ variant, shape, spacing }), className),
1516
+ ref,
1517
+ type: asChild ? type : type ?? "button",
1518
+ ...props
1519
+ }
1520
+ );
1521
+ }
1522
+ );
1523
+ IconButton.displayName = "IconButton";
1524
+ function Card({ className, ...props }) {
1525
+ return /* @__PURE__ */ jsx(
1526
+ "div",
1527
+ {
1528
+ "data-slot": "card",
1529
+ className: cn(
1530
+ "rounded-medium shadow-gray-small bg-sys-background flex flex-col border border-sys-divider-subtle",
1531
+ className
1532
+ ),
1533
+ ...props
1534
+ }
1535
+ );
1536
+ }
1537
+ function CardHeader({ className, ...props }) {
1538
+ return /* @__PURE__ */ jsx(
1539
+ "div",
1540
+ {
1541
+ "data-slot": "card-header",
1542
+ className: cn("flex flex-col px-[16px] gap-[8px]", className),
1543
+ ...props
1544
+ }
1545
+ );
1546
+ }
1547
+ function CardTitle({ className, children, ...props }) {
1548
+ return /* @__PURE__ */ jsx(
1549
+ "div",
1550
+ {
1551
+ "data-slot": "card-title",
1552
+ className: cn("text-sys-text-main text-h5 whitespace-pre-wrap", className),
1553
+ ...props,
1554
+ children: sanitizeUserText(children)
1555
+ }
1556
+ );
1557
+ }
1558
+ function CardDescription({ className, children, ...props }) {
1559
+ return /* @__PURE__ */ jsx(
1560
+ "div",
1561
+ {
1562
+ "data-slot": "card-description",
1563
+ className: cn("text-sys-text-subtler text-small-regular-h whitespace-pre-wrap", className),
1564
+ ...props,
1565
+ children: sanitizeUserText(children)
1566
+ }
1567
+ );
1568
+ }
1569
+ function CardContent({ className, ...props }) {
1570
+ return /* @__PURE__ */ jsx(
1571
+ "div",
1572
+ {
1573
+ "data-slot": "card-content",
1574
+ className: cn("px-[16px] text-sys-text-subtler text-small-regular-h", className),
1575
+ ...props
1576
+ }
1577
+ );
1578
+ }
1579
+ function CardFooter({ className, ...props }) {
1580
+ return /* @__PURE__ */ jsx(
1581
+ "div",
1582
+ {
1583
+ "data-slot": "card-footer",
1584
+ className: cn(
1585
+ "flex items-center px-[16px] text-sys-text-subtle text-small-medium",
1586
+ className
1587
+ ),
1588
+ ...props
1589
+ }
1590
+ );
1591
+ }
1592
+ function CardThumbnail({ className, ...props }) {
1593
+ return /* @__PURE__ */ jsx(
1594
+ "div",
1595
+ {
1596
+ "data-slot": "card-thumbnail",
1597
+ className: cn("rounded-t-medium overflow-hidden", className),
1598
+ ...props
1599
+ }
1600
+ );
1601
+ }
1602
+ var defaultVariants = {
1603
+ size: "medium"
1604
+ };
1605
+ var checkboxVariants = cva(
1606
+ "peer shrink-0 rounded-xsmall bg-sys-background border-[2px] border-sys-divider-main hover:bg-secondary-o10 focus-visible:outline-[2px] focus-visible:outline-sys-focus-ring-main focus-visible:outline-offset-[1px] disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary30 data-[state=checked]:border-primary30 data-[state=checked]:hover:bg-primary40 data-[state=checked]:hover:border-primary40",
1607
+ {
1608
+ variants: {
1609
+ size: {
1610
+ small: "w-[12px] h-[12px]",
1611
+ medium: "w-[16px] h-[16px]",
1612
+ large: "w-[24px] h-[24px]"
1613
+ }
1614
+ },
1615
+ defaultVariants
1616
+ }
1617
+ );
1618
+ var Checkbox = React12.forwardRef(
1619
+ ({ className, size = defaultVariants.size, indeterminate = false, ...props }, ref) => {
1620
+ return /* @__PURE__ */ jsx(
1621
+ CheckboxPrimitive.Root,
1622
+ {
1623
+ ref,
1624
+ className: cn(checkboxVariants({ size }), className),
1625
+ ...props,
1626
+ children: /* @__PURE__ */ jsx(
1627
+ CheckboxPrimitive.Indicator,
1628
+ {
1629
+ className: cn("flex items-center justify-center text-current"),
1630
+ children: indeterminate ? /* @__PURE__ */ jsx(IndeterminateIcon, { size }) : /* @__PURE__ */ jsx(CheckIcon, { size })
1631
+ }
1632
+ )
1633
+ }
1634
+ );
1635
+ }
1636
+ );
1637
+ Checkbox.displayName = CheckboxPrimitive.Root.displayName;
1638
+ function CheckIcon({ size }) {
1639
+ if (!size) return null;
1640
+ switch (size) {
1641
+ case "small":
1642
+ return /* @__PURE__ */ jsx("svg", { width: "8", height: "6", viewBox: "0 0 8 6", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ jsx(
1643
+ "path",
1644
+ {
1645
+ fillRule: "evenodd",
1646
+ clipRule: "evenodd",
1647
+ d: "M7.22148 0.621289C7.51437 0.914182 7.51437 1.38906 7.22148 1.68195L3.43693 5.4665C3.43528 5.46817 3.43363 5.46984 3.43197 5.47151C3.28494 5.61853 3.09206 5.69175 2.89936 5.69117C2.70817 5.69061 2.51714 5.61739 2.37126 5.47151C2.3696 5.46984 2.36794 5.46817 2.3663 5.4665L0.780317 3.88052C0.487423 3.58762 0.487423 3.11275 0.780317 2.81986C1.07321 2.52696 1.54808 2.52696 1.84098 2.81986L2.90161 3.88049L6.16082 0.621289C6.45371 0.328396 6.92858 0.328396 7.22148 0.621289Z",
1648
+ fill: "var(--color-sys-background)"
1649
+ }
1650
+ ) });
1651
+ case "medium":
1652
+ return /* @__PURE__ */ jsx(
1653
+ "svg",
1654
+ {
1655
+ width: "10",
1656
+ height: "8",
1657
+ viewBox: "0 0 10 8",
1658
+ fill: "none",
1659
+ xmlns: "http://www.w3.org/2000/svg",
1660
+ children: /* @__PURE__ */ jsx(
1661
+ "path",
1662
+ {
1663
+ fillRule: "evenodd",
1664
+ clipRule: "evenodd",
1665
+ d: "M9.2953 0.828385C9.68583 1.21891 9.68583 1.85207 9.2953 2.2426L4.24923 7.28867C4.24704 7.2909 4.24484 7.29313 4.24262 7.29534C4.04812 7.48985 3.79342 7.58748 3.53848 7.58823C3.28155 7.589 3.02438 7.49137 2.82835 7.29534C2.82614 7.29313 2.82394 7.29092 2.82176 7.28869L0.707088 5.17402C0.316564 4.7835 0.316564 4.15033 0.707088 3.75981C1.09761 3.36928 1.73078 3.36928 2.1213 3.75981L3.53549 5.17399L7.88109 0.828385C8.27161 0.437861 8.90478 0.437861 9.2953 0.828385Z",
1666
+ fill: "var(--color-sys-background)"
1667
+ }
1668
+ )
1669
+ }
1670
+ );
1671
+ case "large":
1672
+ return /* @__PURE__ */ jsx(
1673
+ "svg",
1674
+ {
1675
+ width: "14",
1676
+ height: "12",
1677
+ viewBox: "0 0 14 12",
1678
+ fill: "none",
1679
+ xmlns: "http://www.w3.org/2000/svg",
1680
+ children: /* @__PURE__ */ jsx(
1681
+ "path",
1682
+ {
1683
+ fillRule: "evenodd",
1684
+ clipRule: "evenodd",
1685
+ d: "M13.4431 1.24258C14.0289 1.82836 14.0289 2.77811 13.4431 3.3639L5.87394 10.933C5.87066 10.9364 5.86737 10.9397 5.86406 10.943C5.57001 11.2371 5.18425 11.3835 4.79885 11.3823C4.41645 11.3812 4.03441 11.2348 3.74264 10.943C3.73934 10.9397 3.73606 10.9364 3.7328 10.9331L0.560755 7.76103C-0.025032 7.17525 -0.025032 6.2255 0.560755 5.63971C1.14654 5.05393 2.09629 5.05393 2.68207 5.63971L4.80335 7.76099L11.3218 1.24258C11.9075 0.656792 12.8573 0.656791 13.4431 1.24258Z",
1686
+ fill: "var(--color-sys-background)"
1687
+ }
1688
+ )
1689
+ }
1690
+ );
1691
+ }
1692
+ }
1693
+ function IndeterminateIcon({ size }) {
1694
+ if (!size) return null;
1695
+ switch (size) {
1696
+ case "small":
1697
+ return /* @__PURE__ */ jsx("svg", { width: "8", height: "2", viewBox: "0 0 8 2", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ jsx(
1698
+ "path",
1699
+ {
1700
+ fillRule: "evenodd",
1701
+ clipRule: "evenodd",
1702
+ d: "M0.25 1C0.25 0.585786 0.585787 0.25 1 0.25H7C7.41421 0.25 7.75 0.585786 7.75 1C7.75 1.41421 7.41421 1.75 7 1.75H1C0.585786 1.75 0.25 1.41421 0.25 1Z",
1703
+ fill: "var(--color-sys-background)"
1704
+ }
1705
+ ) });
1706
+ case "medium":
1707
+ return /* @__PURE__ */ jsx(
1708
+ "svg",
1709
+ {
1710
+ width: "10",
1711
+ height: "2",
1712
+ viewBox: "0 0 10 2",
1713
+ fill: "none",
1714
+ xmlns: "http://www.w3.org/2000/svg",
1715
+ children: /* @__PURE__ */ jsx(
1716
+ "path",
1717
+ {
1718
+ fillRule: "evenodd",
1719
+ clipRule: "evenodd",
1720
+ d: "M0 1C0 0.447715 0.447715 0 1 0H9C9.55229 0 10 0.447715 10 1C10 1.55228 9.55228 2 9 2H1C0.447715 2 0 1.55228 0 1Z",
1721
+ fill: "var(--color-sys-background)"
1722
+ }
1723
+ )
1724
+ }
1725
+ );
1726
+ case "large":
1727
+ return /* @__PURE__ */ jsx(
1728
+ "svg",
1729
+ {
1730
+ width: "16",
1731
+ height: "4",
1732
+ viewBox: "0 0 16 4",
1733
+ fill: "none",
1734
+ xmlns: "http://www.w3.org/2000/svg",
1735
+ children: /* @__PURE__ */ jsx(
1736
+ "path",
1737
+ {
1738
+ fillRule: "evenodd",
1739
+ clipRule: "evenodd",
1740
+ d: "M0.5 2C0.5 1.17157 1.17157 0.5 2 0.5H14C14.8284 0.5 15.5 1.17157 15.5 2C15.5 2.82843 14.8284 3.5 14 3.5H2C1.17157 3.5 0.5 2.82843 0.5 2Z",
1741
+ fill: "var(--color-sys-background)"
1742
+ }
1743
+ )
1744
+ }
1745
+ );
1746
+ }
1747
+ }
1748
+ function useRestoreFocusToOpener({
1749
+ onOpenAutoFocus,
1750
+ onCloseAutoFocus
1751
+ }) {
1752
+ const openerRef = useRef(null);
1753
+ const handleOpenAutoFocus = useCallback(
1754
+ (event) => {
1755
+ openerRef.current = document.activeElement instanceof HTMLElement ? document.activeElement : null;
1756
+ onOpenAutoFocus?.(event);
1757
+ },
1758
+ [onOpenAutoFocus]
1759
+ );
1760
+ const handleCloseAutoFocus = useCallback(
1761
+ (event) => {
1762
+ onCloseAutoFocus?.(event);
1763
+ if (event.defaultPrevented) return;
1764
+ const opener = openerRef.current;
1765
+ if (!opener || opener === document.body || !opener.isConnected) return;
1766
+ event.preventDefault();
1767
+ opener.focus({ preventScroll: true });
1768
+ },
1769
+ [onCloseAutoFocus]
1770
+ );
1771
+ return { onOpenAutoFocus: handleOpenAutoFocus, onCloseAutoFocus: handleCloseAutoFocus };
1772
+ }
1773
+ var Dialog = DialogPrimitive.Root;
1774
+ var DialogTrigger = DialogPrimitive.Trigger;
1775
+ var DialogPortal = DialogPrimitive.Portal;
1776
+ var DialogClose = DialogPrimitive.Close;
1777
+ var DialogOverlay = React12.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1778
+ DialogPrimitive.Overlay,
1779
+ {
1780
+ ...props,
1781
+ ref,
1782
+ className: cn(
1783
+ "fixed inset-0 z-[var(--root-z-index)] bg-sys-blanket",
1784
+ "data-[state=open]:animate-[fade-in_0ms_ease-out,zoom-in_0ms_ease-out]",
1785
+ "data-[state=closed]:animate-[fade-out_0ms_ease-in,zoom-out_0ms_ease-in]",
1786
+ className
1787
+ )
1788
+ }
1789
+ ));
1790
+ DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
1791
+ var dialogContentVariants = cva(null, {
1792
+ variants: {
1793
+ width: {
1794
+ small: "w-[400px]",
1795
+ medium: "w-[600px]",
1796
+ large: "w-[800px]",
1797
+ xlarge: "w-[1000px]"
1798
+ }
1799
+ },
1800
+ defaultVariants: {
1801
+ width: "small"
1802
+ }
1803
+ });
1804
+ var DialogContent = React12.forwardRef(
1805
+ ({
1806
+ children,
1807
+ className,
1808
+ width,
1809
+ overlayClassName,
1810
+ hideCloseButton,
1811
+ onOpenAutoFocus,
1812
+ onCloseAutoFocus,
1813
+ ...props
1814
+ }, ref) => {
1815
+ const focusHandlers = useRestoreFocusToOpener({ onOpenAutoFocus, onCloseAutoFocus });
1816
+ return /* @__PURE__ */ jsxs(DialogPortal, { children: [
1817
+ /* @__PURE__ */ jsx(DialogOverlay, { className: overlayClassName }),
1818
+ /* @__PURE__ */ jsxs(
1819
+ DialogPrimitive.Content,
1820
+ {
1821
+ ref,
1822
+ ...focusHandlers,
1823
+ className: cn(
1824
+ "fixed left-[50%] top-[50%] z-[var(--root-z-index)] translate-x-[-50%] translate-y-[-50%] w-full max-w-[70vw]",
1825
+ "flex flex-col gap-[16px] rounded-medium bg-sys-background p-[32px] shadow-gray-medium duration-200",
1826
+ "data-[state=open]:animate-[fade-in_0ms_ease-out,zoom-in_0ms_ease-out]",
1827
+ "data-[state=closed]:animate-[fade-out_0ms_ease-in,zoom-out_0ms_ease-in]",
1828
+ dialogContentVariants({ width }),
1829
+ className
1830
+ ),
1831
+ ...props,
1832
+ children: [
1833
+ children,
1834
+ !hideCloseButton && /* @__PURE__ */ jsx(
1835
+ IconButton,
1836
+ {
1837
+ asChild: true,
1838
+ variant: "secondaryLink",
1839
+ className: cn("absolute right-[32px] top-[32px]"),
1840
+ children: /* @__PURE__ */ jsxs(DialogPrimitive.Close, { children: [
1841
+ /* @__PURE__ */ jsx(X, {}),
1842
+ /* @__PURE__ */ jsx("span", { className: "sr-only a11y", children: "Close" })
1843
+ ] })
1844
+ }
1845
+ )
1846
+ ]
1847
+ }
1848
+ )
1849
+ ] });
1850
+ }
1851
+ );
1852
+ DialogContent.displayName = DialogPrimitive.Content.displayName;
1853
+ var DialogHeader = (props) => /* @__PURE__ */ jsx(
1854
+ "div",
1855
+ {
1856
+ ...props,
1857
+ className: cn("flex flex-col gap-[16px] text-center sm:text-left", props.className)
1858
+ }
1859
+ );
1860
+ DialogHeader.displayName = "DialogHeader";
1861
+ var DialogFooter = (props) => /* @__PURE__ */ jsx(
1862
+ "div",
1863
+ {
1864
+ ...props,
1865
+ className: cn("flex flex-col-reverse gap-[8px] sm:flex-row sm:justify-end", props.className)
1866
+ }
1867
+ );
1868
+ DialogFooter.displayName = "DialogFooter";
1869
+ var variantToIcon = {
1870
+ normal: null,
1871
+ success: /* @__PURE__ */ jsx(CircleCheck, { className: "text-success30" }),
1872
+ info: /* @__PURE__ */ jsx(Info, { className: "text-sys-text-subtler" }),
1873
+ warning: /* @__PURE__ */ jsx(TriangleAlert, { className: "text-critical30" }),
1874
+ danger: /* @__PURE__ */ jsx(CircleX, { className: "text-danger30" })
1875
+ };
1876
+ var DialogTitle = React12.forwardRef(({ variant, children, ...props }, ref) => {
1877
+ if (variant) {
1878
+ return /* @__PURE__ */ jsxs(Stack, { spacing: 8, children: [
1879
+ variantToIcon[variant],
1880
+ /* @__PURE__ */ jsx(
1881
+ DialogPrimitive.Title,
1882
+ {
1883
+ ...props,
1884
+ ref,
1885
+ className: cn("text-h4 text-sys-text-main whitespace-pre-wrap", props.className),
1886
+ children: sanitizeUserText(children)
1887
+ }
1888
+ )
1889
+ ] });
1890
+ } else {
1891
+ return /* @__PURE__ */ jsx(
1892
+ DialogPrimitive.Title,
1893
+ {
1894
+ ...props,
1895
+ ref,
1896
+ className: cn("text-h4 text-sys-text-main whitespace-pre-wrap", props.className),
1897
+ children: sanitizeUserText(children)
1898
+ }
1899
+ );
1900
+ }
1901
+ });
1902
+ DialogTitle.displayName = DialogPrimitive.Title.displayName;
1903
+ var DialogDescription = React12.forwardRef(({ children, ...props }, ref) => /* @__PURE__ */ jsx(
1904
+ DialogPrimitive.Description,
1905
+ {
1906
+ ...props,
1907
+ ref,
1908
+ className: cn("text-base-regular text-sys-text-main whitespace-pre-wrap", props.className),
1909
+ children: sanitizeUserText(children)
1910
+ }
1911
+ ));
1912
+ DialogDescription.displayName = DialogPrimitive.Description.displayName;
1913
+ var Separator = React12.forwardRef(({ className, orientation = "horizontal", decorative = true, ...props }, ref) => /* @__PURE__ */ jsx(
1914
+ SeparatorPrimitive.Root,
1915
+ {
1916
+ ref,
1917
+ decorative,
1918
+ orientation,
1919
+ className: cn(
1920
+ "shrink-0 bg-sys-divider-subtle",
1921
+ orientation === "horizontal" ? "h-[1px] w-full" : "h-full w-[1px]",
1922
+ className
1923
+ ),
1924
+ ...props
1925
+ }
1926
+ ));
1927
+ Separator.displayName = SeparatorPrimitive.Root.displayName;
1928
+ var DrawerModalContext = React12.createContext(true);
1929
+ var Drawer = ({ modal = true, ...props }) => /* @__PURE__ */ jsx(DrawerModalContext.Provider, { value: modal, children: /* @__PURE__ */ jsx(DialogPrimitive.Root, { modal, ...props }) });
1930
+ Drawer.displayName = "Drawer";
1931
+ var DrawerTrigger = DialogPrimitive.Trigger;
1932
+ var DrawerClose = DialogPrimitive.Close;
1933
+ var DrawerPortal = DialogPrimitive.Portal;
1934
+ var DrawerOverlay = React12.forwardRef(({ ...props }, ref) => /* @__PURE__ */ jsx(
1935
+ DialogPrimitive.Overlay,
1936
+ {
1937
+ ...props,
1938
+ className: cn(
1939
+ "fixed inset-0 z-[var(--root-z-index)] bg-sys-blanket",
1940
+ "data-[state=open]:animate-fade-in",
1941
+ "data-[state=closed]:animate-fade-out",
1942
+ props.className
1943
+ ),
1944
+ ref
1945
+ }
1946
+ ));
1947
+ DrawerOverlay.displayName = DialogPrimitive.Overlay.displayName;
1948
+ var sheetVariants = cva(
1949
+ "fixed z-[var(--root-z-index)] flex flex-col overflow-hidden bg-sys-background shadow-gray-medium",
1950
+ {
1951
+ variants: {
1952
+ side: {
1953
+ top: [
1954
+ "inset-x-0 top-0 bottom-auto",
1955
+ "data-[state=open]:animate-slide-in-from-top",
1956
+ "data-[state=closed]:animate-slide-out-to-top"
1957
+ ],
1958
+ bottom: [
1959
+ "inset-x-0 bottom-0 top-auto",
1960
+ "data-[state=open]:animate-slide-in-from-bottom",
1961
+ "data-[state=closed]:animate-slide-out-to-bottom"
1962
+ ],
1963
+ left: [
1964
+ "inset-y-0 left-0 right-auto h-full",
1965
+ "data-[state=open]:animate-slide-in-from-left",
1966
+ "data-[state=closed]:animate-slide-out-to-left"
1967
+ ],
1968
+ right: [
1969
+ "inset-y-0 right-0 left-auto h-full",
1970
+ "data-[state=open]:animate-slide-in-from-right",
1971
+ "data-[state=closed]:animate-slide-out-to-right"
1972
+ ]
1973
+ },
1974
+ size: {
1975
+ small: "w-[360px] max-w-[70vw]",
1976
+ medium: "w-[480px] max-w-[70vw]",
1977
+ large: "w-[720px] max-w-[70vw]",
1978
+ xLarge: "w-[1080px] max-w-[70vw]"
1979
+ }
1980
+ },
1981
+ defaultVariants: {
1982
+ side: "right",
1983
+ size: "large"
1984
+ }
1985
+ }
1986
+ );
1987
+ var DrawerContent = React12.forwardRef(
1988
+ ({ side, size, children, onOpenAutoFocus, onCloseAutoFocus, onInteractOutside, ...props }, ref) => {
1989
+ const focusHandlers = useRestoreFocusToOpener({ onOpenAutoFocus, onCloseAutoFocus });
1990
+ const modal = React12.useContext(DrawerModalContext);
1991
+ return /* @__PURE__ */ jsxs(DrawerPortal, { children: [
1992
+ modal ? /* @__PURE__ */ jsx(DrawerOverlay, {}) : null,
1993
+ /* @__PURE__ */ jsxs(
1994
+ DialogPrimitive.Content,
1995
+ {
1996
+ ...props,
1997
+ ...focusHandlers,
1998
+ onInteractOutside: (e) => {
1999
+ onInteractOutside?.(e);
2000
+ if (!modal && !e.defaultPrevented) e.preventDefault();
2001
+ },
2002
+ ref,
2003
+ className: cn(
2004
+ sheetVariants({ side, size }),
2005
+ !modal && "border-l border-sys-border-subtle shadow-none",
2006
+ props.className
2007
+ ),
2008
+ children: [
2009
+ /* @__PURE__ */ jsxs(
2010
+ DialogPrimitive.Close,
2011
+ {
2012
+ className: cn("absolute right-[24px] top-[24px] disabled:pointer-events-none"),
2013
+ children: [
2014
+ /* @__PURE__ */ jsx(X, { size: 24 }),
2015
+ /* @__PURE__ */ jsx("span", { className: "sr-only a11y", children: "Close" })
2016
+ ]
2017
+ }
2018
+ ),
2019
+ children
2020
+ ]
2021
+ }
2022
+ )
2023
+ ] });
2024
+ }
2025
+ );
2026
+ DrawerContent.displayName = DialogPrimitive.Content.displayName;
2027
+ var DrawerHeader = ({ ...props }) => /* @__PURE__ */ jsx("div", { ...props, className: cn("flex flex-col gap-[8px] text-left p-[24px]", props.className) });
2028
+ DrawerHeader.displayName = "DrawerHeader";
2029
+ var DrawerBody = ({ ...props }) => /* @__PURE__ */ jsx(
2030
+ "div",
2031
+ {
2032
+ tabIndex: 0,
2033
+ ...props,
2034
+ className: cn(
2035
+ "flex-1 min-h-0 overflow-y-auto scrollbar-gutter-stable",
2036
+ // DrawerContent 가 overflow-hidden 이라 바깥 outline 은 잘린다 → 안쪽 링
2037
+ "outline-none focus-visible:ring-[2px] focus-visible:ring-inset focus-visible:ring-sys-focus-ring-main",
2038
+ props.className
2039
+ )
2040
+ }
2041
+ );
2042
+ DrawerBody.displayName = "DrawerBody";
2043
+ var DrawerFooter = ({ ...props }) => /* @__PURE__ */ jsx(
2044
+ "div",
2045
+ {
2046
+ ...props,
2047
+ className: cn("flex gap-[8px] justify-end mt-[16px] px-[24px] pb-[26px]", props.className)
2048
+ }
2049
+ );
2050
+ DrawerFooter.displayName = "DrawerFooter";
2051
+ var DrawerTitle = React12.forwardRef(({ ...props }, ref) => /* @__PURE__ */ jsx(
2052
+ DialogPrimitive.Title,
2053
+ {
2054
+ ref,
2055
+ ...props,
2056
+ className: cn("text-h4 text-sys-text-main", props.className)
2057
+ }
2058
+ ));
2059
+ DrawerTitle.displayName = DialogPrimitive.Title.displayName;
2060
+ var DrawerDescription = React12.forwardRef(({ ...props }, ref) => /* @__PURE__ */ jsx(
2061
+ DialogPrimitive.Description,
2062
+ {
2063
+ ref,
2064
+ ...props,
2065
+ className: cn("text-base-regular text-sys-text-main", props.className)
2066
+ }
2067
+ ));
2068
+ DrawerDescription.displayName = DialogPrimitive.Description.displayName;
2069
+ function DropdownMenu({ ...props }) {
2070
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Root, { "data-slot": "dropdown-menu", ...props });
2071
+ }
2072
+ function DropdownMenuPortal({
2073
+ ...props
2074
+ }) {
2075
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { "data-slot": "dropdown-menu-portal", ...props });
2076
+ }
2077
+ function DropdownMenuTrigger({
2078
+ ...props
2079
+ }) {
2080
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Trigger, { "data-slot": "dropdown-menu-trigger", ...props });
2081
+ }
2082
+ function DropdownMenuContent({
2083
+ className,
2084
+ sideOffset = 4,
2085
+ ...props
2086
+ }) {
2087
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(
2088
+ DropdownMenuPrimitive.Content,
2089
+ {
2090
+ "data-slot": "dropdown-menu-content",
2091
+ sideOffset,
2092
+ className: cn(
2093
+ "bg-sys-background text-base-regular",
2094
+ "overflow-x-hidden overflow-y-auto shadow-gray-small rounded-xsmall p-[4px] border border-sys-divider-subtler",
2095
+ "max-h-(--radix-dropdown-menu-content-available-height) ",
2096
+ "min-w-[200px] origin-(--radix-dropdown-menu-content-transform-origin)",
2097
+ "data-[state=open]:animate-[fade-in_150ms_ease-out,zoom-in_150ms_ease-out]",
2098
+ "data-[state=closed]:animate-[fade-out_150ms_ease-in,zoom-out_150ms_ease-in]",
2099
+ "data-[side=top]:animate-[slide-in-bottom_150ms_ease-out]",
2100
+ "data-[side=bottom]:animate-[slide-in-top_150ms_ease-out]",
2101
+ "data-[side=left]:animate-[slide-in-right_150ms_ease-out]",
2102
+ "data-[side=right]:animate-[slide-in-left_150ms_ease-out]",
2103
+ className
2104
+ ),
2105
+ ...props
2106
+ }
2107
+ ) });
2108
+ }
2109
+ function DropdownMenuGroup({ ...props }) {
2110
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Group, { "data-slot": "dropdown-menu-group", ...props });
2111
+ }
2112
+ function DropdownMenuItem({
2113
+ className,
2114
+ variant = "default",
2115
+ keepOpen = false,
2116
+ onSelect,
2117
+ ...props
2118
+ }) {
2119
+ const handleSelect = React12.useCallback(
2120
+ (event) => {
2121
+ onSelect?.(event);
2122
+ if (keepOpen) event.preventDefault();
2123
+ },
2124
+ [onSelect, keepOpen]
2125
+ );
2126
+ return /* @__PURE__ */ jsx(
2127
+ DropdownMenuPrimitive.Item,
2128
+ {
2129
+ "data-slot": "dropdown-menu-item",
2130
+ "data-variant": variant,
2131
+ onSelect: handleSelect,
2132
+ className: cn(
2133
+ "relative flex cursor-default items-center gap-[12px] rounded-xsmall p-[6px] text-base-regular outline-hidden select-none",
2134
+ "data-[variant=danger]:text-danger30",
2135
+ "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:size-[20px]",
2136
+ "focus:bg-secondary-o10",
2137
+ "data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
2138
+ className
2139
+ ),
2140
+ ...props
2141
+ }
2142
+ );
2143
+ }
2144
+ function DropdownMenuSeparator({
2145
+ className,
2146
+ ...props
2147
+ }) {
2148
+ return /* @__PURE__ */ jsx(
2149
+ DropdownMenuPrimitive.Separator,
2150
+ {
2151
+ "data-slot": "dropdown-menu-separator",
2152
+ className: cn("bg-sys-divider-subtle -mx-[1px] my-[1px] h-[1px]", className),
2153
+ ...props
2154
+ }
2155
+ );
2156
+ }
2157
+ function DropdownMenuSub({ ...props }) {
2158
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Sub, { "data-slot": "dropdown-menu-sub", ...props });
2159
+ }
2160
+ function DropdownMenuSubTrigger({
2161
+ className,
2162
+ children,
2163
+ ...props
2164
+ }) {
2165
+ return /* @__PURE__ */ jsxs(
2166
+ DropdownMenuPrimitive.SubTrigger,
2167
+ {
2168
+ "data-slot": "dropdown-menu-sub-trigger",
2169
+ className: cn(
2170
+ "relative flex cursor-default items-center gap-[12px] rounded-xsmall p-[6px] text-base-regular outline-hidden select-none",
2171
+ "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:size-[20px]",
2172
+ "focus:bg-secondary-o10",
2173
+ "data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
2174
+ className
2175
+ ),
2176
+ ...props,
2177
+ children: [
2178
+ children,
2179
+ /* @__PURE__ */ jsx(ChevronRightIcon, { className: "ml-auto size-[20px]" })
2180
+ ]
2181
+ }
2182
+ );
2183
+ }
2184
+ function DropdownMenuSubContent({
2185
+ className,
2186
+ ...props
2187
+ }) {
2188
+ return /* @__PURE__ */ jsx(
2189
+ DropdownMenuPrimitive.SubContent,
2190
+ {
2191
+ "data-slot": "dropdown-menu-sub-content",
2192
+ className: cn(
2193
+ "bg-sys-background text-base-regular",
2194
+ "overflow-x-hidden overflow-y-auto z-[var(--root-z-index)] shadow-gray-small rounded-xsmall p-[4px] border border-sys-divider-subtler",
2195
+ "max-h-(--radix-dropdown-menu-content-available-height) ",
2196
+ "min-w-[200px] origin-(--radix-dropdown-menu-content-transform-origin)",
2197
+ "data-[state=open]:animate-[fade-in_150ms_ease-out,zoom-in_150ms_ease-out]",
2198
+ "data-[state=closed]:animate-[fade-out_150ms_ease-in,zoom-out_150ms_ease-in]",
2199
+ "data-[side=top]:animate-[slide-in-bottom_150ms_ease-out]",
2200
+ "data-[side=bottom]:animate-[slide-in-top_150ms_ease-out]",
2201
+ "data-[side=left]:animate-[slide-in-right_150ms_ease-out]",
2202
+ "data-[side=right]:animate-[slide-in-left_150ms_ease-out]",
2203
+ className
2204
+ ),
2205
+ ...props
2206
+ }
2207
+ );
2208
+ }
2209
+ var Form = FormProvider;
2210
+ var FormFieldContext = React12.createContext({});
2211
+ var FormField = ({
2212
+ ...props
2213
+ }) => {
2214
+ return /* @__PURE__ */ jsx(FormFieldContext.Provider, { value: { name: props.name }, children: /* @__PURE__ */ jsx(Controller, { ...props }) });
2215
+ };
2216
+ var useFormField = () => {
2217
+ const fieldContext = React12.useContext(FormFieldContext);
2218
+ const itemContext = React12.useContext(FormItemContext);
2219
+ const { getFieldState, formState } = useFormContext();
2220
+ const fieldState = getFieldState(fieldContext.name, formState);
2221
+ if (!fieldContext) {
2222
+ throw new Error("useFormField should be used within <FormField>");
2223
+ }
2224
+ const { id } = itemContext;
2225
+ return {
2226
+ id,
2227
+ name: fieldContext.name,
2228
+ formItemId: `${id}-form-item`,
2229
+ formDescriptionId: `${id}-form-item-description`,
2230
+ formMessageId: `${id}-form-item-message`,
2231
+ ...fieldState
2232
+ };
2233
+ };
2234
+ var FormItemContext = React12.createContext({});
2235
+ var FormItem = React12.forwardRef(
2236
+ ({ className, ...props }, ref) => {
2237
+ const id = React12.useId();
2238
+ return /* @__PURE__ */ jsx(FormItemContext.Provider, { value: { id }, children: /* @__PURE__ */ jsx("div", { ref, className: cn("space-y-[4px]", className), ...props }) });
2239
+ }
2240
+ );
2241
+ FormItem.displayName = "FormItem";
2242
+ var FormLabel = React12.forwardRef(({ className, required, ...props }, ref) => {
2243
+ const { error, formItemId } = useFormField();
2244
+ if (required) {
2245
+ return /* @__PURE__ */ jsxs(Stack, { direction: "row", justifyContent: "start", children: [
2246
+ /* @__PURE__ */ jsx(
2247
+ "label",
2248
+ {
2249
+ ref,
2250
+ className: cn(
2251
+ error && "text-destructive",
2252
+ "inline-block text-sys-text-subtle text-base-medium",
2253
+ className
2254
+ ),
2255
+ htmlFor: formItemId,
2256
+ ...props
2257
+ }
2258
+ ),
2259
+ /* @__PURE__ */ jsx("span", { className: "text-base-medium text-danger30", children: "*" })
2260
+ ] });
2261
+ }
2262
+ return /* @__PURE__ */ jsx(
2263
+ "label",
2264
+ {
2265
+ ref,
2266
+ className: cn(
2267
+ error && "text-destructive",
2268
+ "inline-block text-sys-text-subtle text-base-medium",
2269
+ className
2270
+ ),
2271
+ htmlFor: formItemId,
2272
+ ...props
2273
+ }
2274
+ );
2275
+ });
2276
+ FormLabel.displayName = "FormLabel";
2277
+ var FormControlContext = React12.createContext(null);
2278
+ var useFormControlContext = () => React12.useContext(FormControlContext);
2279
+ var formControlVariants = cva("", {
2280
+ variants: {
2281
+ maxWidth: {
2282
+ default: "max-w-[var(--max-w-form-control)]",
2283
+ narrow: "max-w-[var(--max-w-form-control-narrow)]",
2284
+ full: ""
2285
+ }
2286
+ },
2287
+ defaultVariants: {
2288
+ maxWidth: "default"
2289
+ }
2290
+ });
2291
+ var FormControl = React12.forwardRef(({ className, maxWidth, ...props }, ref) => {
2292
+ const { error, formItemId, formDescriptionId, formMessageId } = useFormField();
2293
+ const isInvalid = !!error;
2294
+ return /* @__PURE__ */ jsx(FormControlContext.Provider, { value: { isInvalid }, children: /* @__PURE__ */ jsx(
2295
+ Slot,
2296
+ {
2297
+ ref,
2298
+ id: formItemId,
2299
+ className: cn(formControlVariants({ maxWidth }), className),
2300
+ "aria-describedby": !error ? `${formDescriptionId}` : `${formDescriptionId} ${formMessageId}`,
2301
+ "aria-invalid": isInvalid,
2302
+ ...props
2303
+ }
2304
+ ) });
2305
+ });
2306
+ FormControl.displayName = "FormControl";
2307
+ var FormDescription = React12.forwardRef(
2308
+ ({ className, icon = true, ...props }, ref) => {
2309
+ const { formDescriptionId, error } = useFormField();
2310
+ if (error) return null;
2311
+ return /* @__PURE__ */ jsxs(Stack, { spacing: 5, className: "pt-[2px]", children: [
2312
+ icon ? /* @__PURE__ */ jsx(Info, { size: 16, "aria-hidden": true, className: "text-sys-text-subtle" }) : null,
2313
+ /* @__PURE__ */ jsx(
2314
+ "p",
2315
+ {
2316
+ ref,
2317
+ id: formDescriptionId,
2318
+ className: cn("text-small-regular text-sys-text-subtle", className),
2319
+ ...props
2320
+ }
2321
+ )
2322
+ ] });
2323
+ }
2324
+ );
2325
+ FormDescription.displayName = "FormDescription";
2326
+ var FormMessage = React12.forwardRef(({ className, children, ...props }, ref) => {
2327
+ const { error, formMessageId } = useFormField();
2328
+ const body = error ? String(error?.message ?? "") : children;
2329
+ if (!body) {
2330
+ return null;
2331
+ }
2332
+ return /* @__PURE__ */ jsxs(Stack, { spacing: 5, className: "pt-[2px]", children: [
2333
+ /* @__PURE__ */ jsx(TriangleAlert, { size: 16, className: "text-danger30" }),
2334
+ /* @__PURE__ */ jsx(
2335
+ "p",
2336
+ {
2337
+ ref,
2338
+ id: formMessageId,
2339
+ className: cn("text-small-regular text-danger30", className),
2340
+ ...props,
2341
+ children: body
2342
+ }
2343
+ )
2344
+ ] });
2345
+ });
2346
+ FormMessage.displayName = "FormMessage";
2347
+ var FormValidMessage = React12.forwardRef(({ className, children, ...props }, ref) => {
2348
+ if (!children) {
2349
+ return null;
2350
+ }
2351
+ return /* @__PURE__ */ jsxs(Stack, { spacing: 5, className: "pt-[2px]", children: [
2352
+ /* @__PURE__ */ jsx(Check, { size: 16, className: "text-success30" }),
2353
+ /* @__PURE__ */ jsx("p", { ref, className: cn("text-small-regular text-success30", className), ...props, children })
2354
+ ] });
2355
+ });
2356
+ FormValidMessage.displayName = "FormValidMessage";
2357
+ var FormHeader = React12.forwardRef(
2358
+ ({ className, title, description, children, ...props }, ref) => {
2359
+ return /* @__PURE__ */ jsxs(
2360
+ "div",
2361
+ {
2362
+ ref,
2363
+ className: cn("flex flex-col gap-[2px] items-start w-full", className),
2364
+ ...props,
2365
+ children: [
2366
+ title && /* @__PURE__ */ jsx("h2", { className: "text-h4 text-sys-text-main w-full", children: title }),
2367
+ description && /* @__PURE__ */ jsx("p", { className: "text-base-regular text-sys-text-main", children: description }),
2368
+ children
2369
+ ]
2370
+ }
2371
+ );
2372
+ }
2373
+ );
2374
+ FormHeader.displayName = "FormHeader";
2375
+ var FormSectionLevelContext = React12.createContext(3);
2376
+ var FormSection = React12.forwardRef(
2377
+ ({ className, title, level, children, ...props }, ref) => {
2378
+ const contextLevel = React12.useContext(FormSectionLevelContext);
2379
+ const Heading = (level ?? contextLevel) === 2 ? "h2" : "h3";
2380
+ return /* @__PURE__ */ jsxs(
2381
+ "div",
2382
+ {
2383
+ ref,
2384
+ className: cn(
2385
+ // 섹션 사이 간격 48px 를 구분선 위아래 24px 씩으로 나눈다 (2026-10-13: 앞 섹션의 설명 글줄이 선에 붙어 있었다)
2386
+ // 필드 사이 16(한 묶음 안) — 섹션 사이 48(pt-24+pb-24)과 구분되는 단계. 2026-10-17 8차 D2
2387
+ "flex flex-col gap-[16px] w-full pt-[24px]",
2388
+ // 부모 컨테이너 안에서 자기가 첫 자식이면 (= FormHeader 같은 형제가 앞에 없으면)
2389
+ // 16px 의 상단 여백만 둔다 (컨테이너 상단 과공백 방지). FormHeader 가 앞에 있으면 :first-child 가 아니므로 pt-[24px] + 선.
2390
+ "first:pt-[16px]",
2391
+ // 마지막 섹션 아래에는 여백이 없다 (푸터 버튼 줄이 자기 간격을 가진다)
2392
+ "[&:not(:last-child)]:pb-[24px]",
2393
+ // 섹션 사이에 연한 가로 구분선 (2026-10-12 블라인드 평가: 구획이 없으면 "제목뿐" 으로 읽혔다). 첫 섹션 위에는 없다
2394
+ "[&:not(:first-child)]:border-t [&:not(:first-child)]:border-sys-divider-subtle",
2395
+ className
2396
+ ),
2397
+ ...props,
2398
+ children: [
2399
+ title && /* @__PURE__ */ jsx(Heading, { className: "text-h4 text-sys-text-main w-full", children: title }),
2400
+ children
2401
+ ]
2402
+ }
2403
+ );
2404
+ }
2405
+ );
2406
+ FormSection.displayName = "FormSection";
2407
+ var formFooterVariants = cva("flex flex-col justify-end overflow-clip pt-[48px] w-full", {
2408
+ variants: {
2409
+ align: {
2410
+ start: "items-start",
2411
+ end: "items-end",
2412
+ center: "items-center",
2413
+ stretch: "items-stretch"
2414
+ }
2415
+ },
2416
+ defaultVariants: {
2417
+ align: "end"
2418
+ }
2419
+ });
2420
+ var FormFooter = React12.forwardRef(
2421
+ ({ className, align, children, ...props }, ref) => {
2422
+ return /* @__PURE__ */ jsx("div", { ref, className: cn(formFooterVariants({ align }), className), ...props, children });
2423
+ }
2424
+ );
2425
+ FormFooter.displayName = "FormFooter";
2426
+ function isValidIconComponent(componentName) {
2427
+ return componentName in lucide.icons;
2428
+ }
2429
+ var isForwardRef = (v) => typeof v === "object" && v !== null && v.$$typeof === /* @__PURE__ */ Symbol.for("react.forward_ref");
2430
+ var ALIASES = Object.fromEntries(
2431
+ Object.entries(lucide).filter(
2432
+ ([name, v]) => name !== "Icon" && !(name in lucide.icons) && isForwardRef(v)
2433
+ )
2434
+ );
2435
+ var kebabToPascal = (str) => str.split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join("");
2436
+ function LucideIcon({ iconComponentName, size = 16, ...props }) {
2437
+ if (!iconComponentName) return null;
2438
+ const componentName = kebabToPascal(iconComponentName);
2439
+ const Icon = isValidIconComponent(componentName) ? lucide.icons[componentName] : ALIASES[componentName];
2440
+ if (!Icon) return null;
2441
+ return /* @__PURE__ */ jsx(Icon, { size, ...props });
2442
+ }
2443
+ var EmptyBoxIllustration = React12.forwardRef(
2444
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxs(
2445
+ "svg",
2446
+ {
2447
+ ref,
2448
+ width: "110",
2449
+ height: "81",
2450
+ viewBox: "0 0 110 81",
2451
+ fill: "none",
2452
+ "aria-hidden": "true",
2453
+ focusable: "false",
2454
+ className: cn("shrink-0 text-sys-text-subtler", className),
2455
+ ...props,
2456
+ children: [
2457
+ /* @__PURE__ */ jsx(
2458
+ "path",
2459
+ {
2460
+ d: "M1.55091 22.2887C0.694367 20.8214 1.37735 19.6318 3.0764 19.6318H39.8091C41.5081 19.6318 43.5799 20.8214 44.4364 22.2887L55 40.3852H12.1145L1.55091 22.2887Z",
2461
+ className: "fill-primary10"
2462
+ }
2463
+ ),
2464
+ /* @__PURE__ */ jsx(
2465
+ "path",
2466
+ {
2467
+ d: "M39.4248 7.0527C29.698 8.46843 22.5682 14.7206 23.4998 21.0174C24.1651 25.5135 28.761 28.815 34.8759 29.8212C38.8785 35.0171 44.6939 37.349 42.0205 34.1458C40.8408 32.7322 40.7157 31.3203 41.1314 30.0456C41.6829 29.9991 42.2394 29.9376 42.7994 29.8561C52.5264 28.4404 59.6562 22.1873 58.7243 15.8905C57.7923 9.59377 49.1517 5.63697 39.4248 7.0527Z",
2468
+ className: "fill-current"
2469
+ }
2470
+ ),
2471
+ /* @__PURE__ */ jsx(
2472
+ "ellipse",
2473
+ {
2474
+ cx: "1.60448",
2475
+ cy: "1.58788",
2476
+ rx: "1.60448",
2477
+ ry: "1.58788",
2478
+ transform: "matrix(-0.989573 0.144031 0.14639 0.989227 49.8203 15.77)",
2479
+ className: "fill-sys-background"
2480
+ }
2481
+ ),
2482
+ /* @__PURE__ */ jsx(
2483
+ "ellipse",
2484
+ {
2485
+ cx: "1.60448",
2486
+ cy: "1.58788",
2487
+ rx: "1.60448",
2488
+ ry: "1.58788",
2489
+ transform: "matrix(-0.989573 0.144031 0.14639 0.989227 42.8682 16.769)",
2490
+ className: "fill-sys-background"
2491
+ }
2492
+ ),
2493
+ /* @__PURE__ */ jsx(
2494
+ "ellipse",
2495
+ {
2496
+ cx: "1.60448",
2497
+ cy: "1.58788",
2498
+ rx: "1.60448",
2499
+ ry: "1.58788",
2500
+ transform: "matrix(-0.989573 0.144031 0.14639 0.989227 35.916 17.7686)",
2501
+ className: "fill-sys-background"
2502
+ }
2503
+ ),
2504
+ /* @__PURE__ */ jsx(
2505
+ "path",
2506
+ {
2507
+ d: "M12.1143 40.2407H54.9997V80.5002H18.2671C14.869 80.5002 12.1143 77.7455 12.1143 74.3474V40.2407Z",
2508
+ className: "fill-sys-background"
2509
+ }
2510
+ ),
2511
+ /* @__PURE__ */ jsx(
2512
+ "path",
2513
+ {
2514
+ d: "M12.1143 40.2407H54.9997V80.5002H18.2671C14.869 80.5002 12.1143 77.7455 12.1143 74.3474V40.2407Z",
2515
+ className: "fill-primary20 opacity-16"
2516
+ }
2517
+ ),
2518
+ /* @__PURE__ */ jsx(
2519
+ "path",
2520
+ {
2521
+ d: "M108.449 22.2882C109.306 20.8209 108.623 19.6313 106.924 19.6313H70.1909C68.4919 19.6313 66.4201 20.8209 65.5636 22.2882L55 40.3847H97.8855L108.449 22.2882Z",
2522
+ className: "fill-primary20"
2523
+ }
2524
+ ),
2525
+ /* @__PURE__ */ jsx(
2526
+ "path",
2527
+ {
2528
+ d: "M55 40.2407H97.8855V74.3474C97.8855 77.7455 95.1308 80.5002 91.7327 80.5002H55V40.2407Z",
2529
+ className: "fill-primary20 opacity-50"
2530
+ }
2531
+ )
2532
+ ]
2533
+ }
2534
+ )
2535
+ );
2536
+ EmptyBoxIllustration.displayName = "EmptyBoxIllustration";
2537
+ var TabsContext = React12.createContext({
2538
+ variant: "box",
2539
+ size: "medium"
2540
+ });
2541
+ function Tabs({
2542
+ className,
2543
+ variant = "box",
2544
+ size = "medium",
2545
+ ...props
2546
+ }) {
2547
+ return /* @__PURE__ */ jsx(TabsContext.Provider, { value: { variant, size }, children: /* @__PURE__ */ jsx(TabsPrimitive.Root, { "data-slot": "tabs", className: cn("flex flex-col", className), ...props }) });
2548
+ }
2549
+ var tabListVariants = cva("text-sys-text-subtle inline-flex w-fit items-center justify-center", {
2550
+ variants: {
2551
+ variant: {
2552
+ underline: "border-b-[1px] border-sys-divider-subtler w-full justify-start",
2553
+ box: "bg-secondary-o20 p-[4px] rounded-medium"
2554
+ },
2555
+ size: {
2556
+ medium: "text-base-medium",
2557
+ large: "text-large-medium"
2558
+ }
2559
+ },
2560
+ defaultVariants: {
2561
+ variant: "box",
2562
+ size: "medium"
2563
+ }
2564
+ });
2565
+ function TabsList({
2566
+ className,
2567
+ variant: variantProp,
2568
+ size: sizeProp,
2569
+ ...props
2570
+ }) {
2571
+ const context = React12.useContext(TabsContext);
2572
+ const variant = variantProp ?? context.variant;
2573
+ const size = sizeProp ?? context.size;
2574
+ const value = React12.useMemo(() => ({ variant, size }), [variant, size]);
2575
+ return /* @__PURE__ */ jsx(TabsContext.Provider, { value, children: /* @__PURE__ */ jsx(
2576
+ TabsPrimitive.List,
2577
+ {
2578
+ "data-slot": "tabs-list",
2579
+ className: cn(tabListVariants({ variant, size }), className),
2580
+ ...props
2581
+ }
2582
+ ) });
2583
+ }
2584
+ var tabTriggerVariants = cva("", {
2585
+ variants: {
2586
+ variant: {
2587
+ underline: 'flex-none relative data-[state=active]:font-semibold data-[state=active]:text-primary40 data-[state=active]:after:content-[""] data-[state=active]:after:absolute data-[state=active]:after:bottom-[-1px] data-[state=active]:after:h-[2px] data-[state=active]:after:bg-primary30',
2588
+ box: "text-small-bold data-[state=active]:bg-sys-background data-[state=active]:text-sys-text-main px-[16px] py-[6px]"
2589
+ },
2590
+ size: {
2591
+ medium: "",
2592
+ large: ""
2593
+ }
2594
+ },
2595
+ compoundVariants: [
2596
+ {
2597
+ variant: "underline",
2598
+ size: "medium",
2599
+ class: "px-[12px] py-[6px] data-[state=active]:after:left-[10px] data-[state=active]:after:right-[10px]"
2600
+ },
2601
+ {
2602
+ variant: "underline",
2603
+ size: "large",
2604
+ class: "px-[16px] py-[10px] data-[state=active]:after:left-[12px] data-[state=active]:after:right-[12px]"
2605
+ }
2606
+ ],
2607
+ defaultVariants: {
2608
+ variant: "box",
2609
+ size: "medium"
2610
+ }
2611
+ });
2612
+ function TabsTrigger({ className, ...props }) {
2613
+ const { variant, size } = React12.useContext(TabsContext);
2614
+ return /* @__PURE__ */ jsx(
2615
+ TabsPrimitive.Trigger,
2616
+ {
2617
+ "data-slot": "tabs-trigger",
2618
+ className: cn(
2619
+ "inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center rounded-xsmall whitespace-nowrap transition-[color,box-shadow]",
2620
+ "focus-visible:outline-sys-focus-ring-main focus-visible:outline-[2px]",
2621
+ "disabled:pointer-events-none disabled:opacity-50",
2622
+ tabTriggerVariants({ variant, size }),
2623
+ className
2624
+ ),
2625
+ ...props
2626
+ }
2627
+ );
2628
+ }
2629
+ function TabsContent({ className, ...props }) {
2630
+ return /* @__PURE__ */ jsx(
2631
+ TabsPrimitive.Content,
2632
+ {
2633
+ "data-slot": "tabs-content",
2634
+ className: cn("flex-1 outline-none", className),
2635
+ ...props
2636
+ }
2637
+ );
2638
+ }
2639
+ var PageHeaderContext = createContext(void 0);
2640
+ function PageHeaderProvider({ children }) {
2641
+ const [pageHeader, setPageHeaderState] = useState({});
2642
+ const setPageHeader = useCallback((state) => {
2643
+ setPageHeaderState((prev) => typeof state === "function" ? state(prev) : state);
2644
+ }, []);
2645
+ const resetPageHeader = useCallback(() => {
2646
+ setPageHeaderState({});
2647
+ }, []);
2648
+ const value = useMemo(
2649
+ () => ({ pageHeader, setPageHeader, resetPageHeader }),
2650
+ [pageHeader, resetPageHeader, setPageHeader]
2651
+ );
2652
+ return /* @__PURE__ */ jsx(PageHeaderContext.Provider, { value, children });
2653
+ }
2654
+ function usePageHeader() {
2655
+ const context = useContext(PageHeaderContext);
2656
+ if (context === void 0) {
2657
+ throw new Error("usePageHeader must be used within a PageHeaderProvider");
2658
+ }
2659
+ return context;
2660
+ }
2661
+ function PageHeaderTabs({ tabs, activeTab, onTabChange }) {
2662
+ const value = useMemo(() => {
2663
+ const selected = tabs.find((tab) => {
2664
+ const values = [tab.value, ...tab.matchValues ?? []];
2665
+ return values.includes(activeTab ?? "");
2666
+ });
2667
+ return selected?.value ?? tabs[0]?.value;
2668
+ }, [activeTab, tabs]);
2669
+ if (tabs.length === 0) return null;
2670
+ return /* @__PURE__ */ jsx(
2671
+ Tabs,
2672
+ {
2673
+ value,
2674
+ onValueChange: (nextValue) => {
2675
+ const nextTab = tabs.find((tab) => tab.value === nextValue);
2676
+ if (!nextTab) return;
2677
+ onTabChange?.(nextValue, nextTab);
2678
+ },
2679
+ variant: "underline",
2680
+ size: "large",
2681
+ className: "-mb-px flex-1 min-w-[360px] overflow-x-auto overflow-y-hidden",
2682
+ children: /* @__PURE__ */ jsx(TabsList, { className: "ml-0", children: tabs.map((tab) => /* @__PURE__ */ jsxs(
2683
+ TabsTrigger,
2684
+ {
2685
+ value: tab.value,
2686
+ disabled: tab.disabled,
2687
+ "aria-controls": void 0,
2688
+ className: cn("gap-[4px]", "disabled:text-sys-text-disabled disabled:opacity-100"),
2689
+ children: [
2690
+ /* @__PURE__ */ jsx("span", { children: tab.label }),
2691
+ tab.badge ? /* @__PURE__ */ jsx(Badge, { variant: "primary", children: tab.badge }) : null
2692
+ ]
2693
+ },
2694
+ tab.value
2695
+ )) })
2696
+ }
2697
+ );
2698
+ }
2699
+ function PageHeader({
2700
+ breadcrumb,
2701
+ title,
2702
+ fallbackTitle,
2703
+ description,
2704
+ status,
2705
+ meta,
2706
+ actions,
2707
+ titleRight,
2708
+ bottomLeft,
2709
+ bottomRight,
2710
+ tabs = [],
2711
+ activeTab,
2712
+ onTabChange,
2713
+ compact = false,
2714
+ contentMaxWidth
2715
+ }) {
2716
+ const hasTabs = tabs.length > 0;
2717
+ const contentStyle = contentMaxWidth ? { maxWidth: contentMaxWidth } : void 0;
2718
+ const hasTabsRow = hasTabs;
2719
+ const hasTitleControls = Boolean(titleRight) || Boolean(actions);
2720
+ const hasControlsRow = Boolean(bottomLeft) || Boolean(bottomRight);
2721
+ const hasBottomDivider = Boolean(bottomLeft) && Boolean(bottomRight);
2722
+ const displayTitle = title || fallbackTitle || "";
2723
+ return /* @__PURE__ */ jsx(TooltipProvider, { children: compact ? /* @__PURE__ */ jsx("header", { className: "@container w-full shrink-0 border-b border-sys-divider-subtler bg-sys-background bg-[image:var(--color-page-header-bg)] px-[24px] pt-[16px] pb-[24px]", children: /* @__PURE__ */ jsxs(
2724
+ "div",
2725
+ {
2726
+ className: "mx-auto flex w-full items-center justify-between gap-[12px]",
2727
+ style: contentStyle,
2728
+ children: [
2729
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-[12px]", children: [
2730
+ /* @__PURE__ */ jsx("h1", { className: "whitespace-pre overflow-hidden text-ellipsis text-h3 text-sys-text-main", children: displayTitle }),
2731
+ status ? /* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center", children: status }) : null
2732
+ ] }),
2733
+ titleRight || actions ? /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-[8px]", children: [
2734
+ titleRight,
2735
+ actions
2736
+ ] }) : null
2737
+ ]
2738
+ }
2739
+ ) }) : (
2740
+ // 바탕은 시안 그라데이션(토큰 --color-page-header-bg, 배경 이미지), 경계는 아래 1px 구분선 하나 — 2026-10-30 사용자 결정으로 그라데이션 복원(구분선 유지)
2741
+ /* @__PURE__ */ jsx(
2742
+ "header",
2743
+ {
2744
+ className: cn(
2745
+ // 양옆 24: 띠(배경)는 화면 끝까지인데 내용·표가 64 안쪽이라 심판이 "header band is wider than the table" — 2026-10-18 10차 ①
2746
+ // 띠 끝 선은 탭이 있어도 header 가 전체 폭으로 그린다(탭 줄에만 그리면 양끝에서 선이 끊겨 "ends abruptly behind the tabs")
2747
+ "@container w-full shrink-0 bg-sys-background bg-[image:var(--color-page-header-bg)] px-[24px] pt-[24px]",
2748
+ "border-b border-sys-divider-subtler"
2749
+ ),
2750
+ children: /* @__PURE__ */ jsxs("div", { className: "mx-auto flex w-full flex-col items-start gap-[16px]", style: contentStyle, children: [
2751
+ breadcrumb ? /* @__PURE__ */ jsx("div", { className: "w-full", children: breadcrumb }) : null,
2752
+ /* @__PURE__ */ jsxs("div", { className: "flex w-full flex-col items-start", children: [
2753
+ /* @__PURE__ */ jsxs("div", { className: "flex w-full flex-col items-start gap-[8px] pb-[24px]", children: [
2754
+ /* @__PURE__ */ jsxs("div", { className: "flex w-full flex-wrap items-center gap-x-[12px] gap-y-[8px]", children: [
2755
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-[240px] flex-1 items-center gap-[12px]", children: [
2756
+ /* @__PURE__ */ jsx("h1", { className: "whitespace-pre-wrap text-h3 text-sys-text-main", children: displayTitle }),
2757
+ status ? /* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center", children: status }) : null
2758
+ ] }),
2759
+ hasTitleControls ? /* @__PURE__ */ jsxs("div", { className: "ml-auto flex shrink-0 items-center gap-[8px]", children: [
2760
+ titleRight,
2761
+ actions
2762
+ ] }) : null
2763
+ ] }),
2764
+ meta ? /* @__PURE__ */ jsx("div", { className: "w-full", children: meta }) : null,
2765
+ description ? /* @__PURE__ */ jsx("div", { className: "flex w-full items-start pb-[8px] pt-[4px]", children: /* @__PURE__ */ jsx("p", { className: "line-clamp-2 break-keep whitespace-pre-wrap text-base-regular text-sys-text-subtle wrap-break-word", children: description }) }) : null
2766
+ ] }),
2767
+ hasControlsRow ? /* @__PURE__ */ jsxs("div", { className: "flex w-full flex-wrap items-start gap-[12px] pb-[24px]", children: [
2768
+ bottomLeft ? /* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center gap-[8px]", children: bottomLeft }) : null,
2769
+ hasBottomDivider ? /* @__PURE__ */ jsx(
2770
+ Separator,
2771
+ {
2772
+ "aria-hidden": true,
2773
+ orientation: "vertical",
2774
+ className: "h-[24px] self-start mt-[6px]"
2775
+ }
2776
+ ) : null,
2777
+ bottomRight ? /* @__PURE__ */ jsx("div", { className: "flex flex-auto items-center justify-end gap-[12px]", children: bottomRight }) : null
2778
+ ] }) : null,
2779
+ hasTabsRow ? /* @__PURE__ */ jsx("div", { className: "flex w-full items-end justify-between gap-[12px] min-h-[52px]", children: /* @__PURE__ */ jsx(PageHeaderTabs, { tabs, activeTab, onTabChange }) }) : null
2780
+ ] })
2781
+ ] })
2782
+ }
2783
+ )
2784
+ ) });
2785
+ }
2786
+ function Pagination({
2787
+ total,
2788
+ rowsPerPage,
2789
+ page,
2790
+ onChange,
2791
+ count = 5,
2792
+ disabled = false,
2793
+ showLabel = false,
2794
+ ...rest
2795
+ }) {
2796
+ const countOfAllPages = total > 0 && rowsPerPage > 0 ? Math.ceil(total / rowsPerPage) : 0;
2797
+ const [pageStartIdx, setPageStartIdx] = React12.useState(1);
2798
+ const [pageEndIdx, setPageEndIdx] = React12.useState(count);
2799
+ const handleGoToFirst = React12.useCallback(() => {
2800
+ setPageStartIdx(1);
2801
+ setPageEndIdx(count);
2802
+ onChange(1);
2803
+ }, [onChange, count]);
2804
+ const handleGoToPrev = React12.useCallback(() => {
2805
+ if (page === 1) {
2806
+ return;
2807
+ }
2808
+ if (page === pageStartIdx) {
2809
+ setPageStartIdx((prev) => prev - 1);
2810
+ setPageEndIdx((prev) => prev - 1);
2811
+ }
2812
+ onChange(page - 1);
2813
+ }, [onChange, page, pageStartIdx]);
2814
+ const handleGoToNext = React12.useCallback(() => {
2815
+ if (page === countOfAllPages) {
2816
+ return;
2817
+ }
2818
+ if (page === pageEndIdx) {
2819
+ setPageStartIdx((prev) => prev + 1);
2820
+ setPageEndIdx((prev) => prev + 1);
2821
+ }
2822
+ onChange(page + 1);
2823
+ }, [countOfAllPages, onChange, page, pageEndIdx]);
2824
+ const handleGoToEnd = React12.useCallback(() => {
2825
+ setPageStartIdx(countOfAllPages - (count - 1));
2826
+ setPageEndIdx(countOfAllPages);
2827
+ onChange(countOfAllPages);
2828
+ }, [countOfAllPages, onChange, count]);
2829
+ React12.useEffect(() => {
2830
+ if (page < pageStartIdx || page > pageEndIdx) {
2831
+ const currentBlock = Math.ceil(page / count);
2832
+ const newStart = (currentBlock - 1) * count + 1;
2833
+ setPageStartIdx(newStart);
2834
+ setPageEndIdx(newStart + count - 1);
2835
+ }
2836
+ }, [count, page, pageStartIdx, pageEndIdx]);
2837
+ const label = React12.useMemo(() => {
2838
+ const n = total.toLocaleString();
2839
+ const start = total === 0 ? 0 : (page - 1) * rowsPerPage + 1;
2840
+ const end = total === 0 ? 0 : Math.min(page * rowsPerPage, total);
2841
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
2842
+ "\uC804\uCCB4 ",
2843
+ /* @__PURE__ */ jsx("span", { className: "text-large-medium text-sys-text-main tabular-nums", children: n }),
2844
+ "\uAC1C \uC911",
2845
+ " ",
2846
+ start,
2847
+ " - ",
2848
+ end,
2849
+ "\uBC88\uC9F8"
2850
+ ] });
2851
+ }, [total, page, rowsPerPage]);
2852
+ return /* @__PURE__ */ jsxs(PaginationWrapper, { className: "relative justify-center", ...rest, children: [
2853
+ showLabel && /* @__PURE__ */ jsx("span", { className: "absolute left-0 text-base-regular text-sys-text-subtle", children: label }),
2854
+ /* @__PURE__ */ jsxs(PaginationContent, { children: [
2855
+ /* @__PURE__ */ jsx(PaginationItem, { children: /* @__PURE__ */ jsx(
2856
+ PaginationFirst,
2857
+ {
2858
+ href: "#",
2859
+ onClick: handleGoToFirst,
2860
+ disabled: page === 1 || total === 0 || disabled
2861
+ }
2862
+ ) }),
2863
+ /* @__PURE__ */ jsx(PaginationItem, { children: /* @__PURE__ */ jsx(
2864
+ PaginationPrevious,
2865
+ {
2866
+ href: "#",
2867
+ onClick: handleGoToPrev,
2868
+ disabled: page === 1 || total === 0 || disabled
2869
+ }
2870
+ ) }),
2871
+ Array(countOfAllPages).fill("").map((_, idx) => {
2872
+ if (idx >= pageStartIdx - 1 && idx <= pageEndIdx - 1) {
2873
+ return /* @__PURE__ */ jsx(PaginationItem, { children: /* @__PURE__ */ jsx(
2874
+ PaginationLink,
2875
+ {
2876
+ href: "#",
2877
+ isActive: page === idx + 1,
2878
+ disabled,
2879
+ onClick: () => {
2880
+ onChange(idx + 1);
2881
+ },
2882
+ children: idx + 1
2883
+ }
2884
+ ) }, idx + 1);
2885
+ }
2886
+ }),
2887
+ /* @__PURE__ */ jsx(PaginationItem, { children: /* @__PURE__ */ jsx(
2888
+ PaginationNext,
2889
+ {
2890
+ href: "#",
2891
+ onClick: handleGoToNext,
2892
+ disabled: page === countOfAllPages || total === 0 || disabled
2893
+ }
2894
+ ) }),
2895
+ /* @__PURE__ */ jsx(PaginationItem, { children: /* @__PURE__ */ jsx(
2896
+ PaginationLast,
2897
+ {
2898
+ href: "#",
2899
+ onClick: handleGoToEnd,
2900
+ disabled: page === countOfAllPages || total === 0 || disabled
2901
+ }
2902
+ ) })
2903
+ ] })
2904
+ ] });
2905
+ }
2906
+ function PaginationWrapper({ className, ...props }) {
2907
+ return /* @__PURE__ */ jsx(
2908
+ "nav",
2909
+ {
2910
+ role: "navigation",
2911
+ "aria-label": "pagination",
2912
+ "data-slot": "pagination",
2913
+ className: cn("mx-auto flex w-full items-center justify-center", className),
2914
+ style: { paddingTop: "16px" },
2915
+ ...props
2916
+ }
2917
+ );
2918
+ }
2919
+ function PaginationContent({ className, ...props }) {
2920
+ return /* @__PURE__ */ jsx(
2921
+ "ul",
2922
+ {
2923
+ "data-slot": "pagination-content",
2924
+ className: cn("flex flex-row items-center gap-[4px]", className),
2925
+ ...props
2926
+ }
2927
+ );
2928
+ }
2929
+ function PaginationItem({ className, ...props }) {
2930
+ return /* @__PURE__ */ jsx("li", { "data-slot": "pagination-item", className: cn("flex", className), ...props });
2931
+ }
2932
+ var paginationLinkVariants = cva(
2933
+ "inline-flex min-w-[28px] h-[28px] p-[2px] flex-col justify-center items-center gap-[4px] text-base-semibold shrink-0 cursor-pointer transition-colors",
2934
+ {
2935
+ variants: {
2936
+ variant: {
2937
+ true: "text-primary50 bg-primary10 rounded-xsmall",
2938
+ false: "text-sys-text-subtle hover:bg-secondary-o10 active:bg-secondary-o20 hover:rounded-xsmall active:rounded-xsmall"
2939
+ },
2940
+ disabled: {
2941
+ true: "text-sys-text-disabled pointer-events-none cursor-auto",
2942
+ false: ""
2943
+ }
2944
+ },
2945
+ defaultVariants: {
2946
+ variant: false,
2947
+ disabled: false
2948
+ }
2949
+ }
2950
+ );
2951
+ function PaginationLink({
2952
+ className,
2953
+ isActive,
2954
+ disabled,
2955
+ children,
2956
+ onClick,
2957
+ href,
2958
+ ...props
2959
+ }) {
2960
+ const wrappedChildren = React12.Children.map(children, (child) => {
2961
+ if (typeof child === "string" || typeof child === "number") {
2962
+ return /* @__PURE__ */ jsx("span", { className: "inline-flex items-center justify-center", children: child });
2963
+ }
2964
+ return child;
2965
+ });
2966
+ const handleClick = React12.useCallback(
2967
+ (e) => {
2968
+ e.preventDefault();
2969
+ onClick?.(e);
2970
+ },
2971
+ [onClick]
2972
+ );
2973
+ const buttonLike = !href ? {
2974
+ role: "button",
2975
+ tabIndex: disabled ? -1 : 0,
2976
+ "aria-disabled": disabled || void 0,
2977
+ onKeyDown: (e) => {
2978
+ if (e.key === "Enter" || e.key === " ") {
2979
+ e.preventDefault();
2980
+ onClick?.(e);
2981
+ }
2982
+ }
2983
+ } : {};
2984
+ return /* @__PURE__ */ jsx(
2985
+ "a",
2986
+ {
2987
+ href,
2988
+ "aria-current": isActive ? "page" : void 0,
2989
+ "data-slot": "pagination-link",
2990
+ "data-active": isActive,
2991
+ className: cn(paginationLinkVariants({ variant: isActive, disabled }), className),
2992
+ ...buttonLike,
2993
+ ...props,
2994
+ onClick: handleClick,
2995
+ children: wrappedChildren
2996
+ }
2997
+ );
2998
+ }
2999
+ function PaginationFirst({ className, ...props }) {
3000
+ return /* @__PURE__ */ jsx(PaginationLink, { "aria-label": "\uCCAB \uD398\uC774\uC9C0", className: cn(className), ...props, children: /* @__PURE__ */ jsx(ChevronsLeft, {}) });
3001
+ }
3002
+ function PaginationPrevious({ className, ...props }) {
3003
+ return /* @__PURE__ */ jsx(PaginationLink, { "aria-label": "\uC774\uC804", className: cn(className), ...props, children: /* @__PURE__ */ jsx(ChevronLeft, {}) });
3004
+ }
3005
+ function PaginationLast({ className, ...props }) {
3006
+ return /* @__PURE__ */ jsx(PaginationLink, { "aria-label": "\uB9C8\uC9C0\uB9C9 \uD398\uC774\uC9C0", className: cn(className), ...props, children: /* @__PURE__ */ jsx(ChevronsRight, {}) });
3007
+ }
3008
+ function PaginationNext({ className, ...props }) {
3009
+ return /* @__PURE__ */ jsx(PaginationLink, { "aria-label": "\uB2E4\uC74C", className: cn(className), ...props, children: /* @__PURE__ */ jsx(ChevronRight, {}) });
3010
+ }
3011
+ var getPaginationRange = (total, page, limit) => {
3012
+ if (total === 0) return { start: 0, end: 0 };
3013
+ const start = (page - 1) * limit + 1;
3014
+ const end = Math.min(page * limit, total);
3015
+ return { start, end };
3016
+ };
3017
+ function Panel({
3018
+ title,
3019
+ description,
3020
+ level = 2,
3021
+ titleRight,
3022
+ note,
3023
+ footer,
3024
+ padding = "medium",
3025
+ className,
3026
+ children,
3027
+ ...props
3028
+ }) {
3029
+ const id = React12.useId();
3030
+ const hasTitle = title != null;
3031
+ const Heading = level === 3 ? "h3" : "h2";
3032
+ const Root9 = hasTitle ? "section" : "div";
3033
+ return /* @__PURE__ */ jsxs(
3034
+ Root9,
3035
+ {
3036
+ "aria-labelledby": hasTitle ? id : void 0,
3037
+ "data-slot": "panel",
3038
+ className: cn(
3039
+ "flex min-w-0 flex-col rounded-medium border border-sys-divider-subtle bg-sys-background",
3040
+ padding === "large" ? "gap-[16px] p-[24px]" : "gap-[12px] p-[16px]",
3041
+ className
3042
+ ),
3043
+ ...props,
3044
+ children: [
3045
+ hasTitle || titleRight ? /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-[8px]", children: [
3046
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-col gap-[4px]", children: [
3047
+ hasTitle ? /* @__PURE__ */ jsx(Heading, { id, className: "text-h5 text-sys-text-main", children: title }) : null,
3048
+ description != null ? /* @__PURE__ */ jsx("p", { className: "break-keep text-small-regular text-sys-text-subtle wrap-break-word", children: description }) : null
3049
+ ] }),
3050
+ hasTitle && titleRight != null ? (
3051
+ // 제목 첫 줄(text-h5 16px × 1.5 = 24px) 높이 안에서 세로 가운데 — 32px 버튼이 윗변에 붙어 글자가 제목보다 4~7px 아래로 처졌다
3052
+ // (2026-10-30 홀드아웃 17 세트 2, Opus "'전체 보기' links sit slightly below their card titles"). 더 큰 요소는 위아래로 고르게 넘친다
3053
+ /* @__PURE__ */ jsx("div", { className: "flex h-[24px] shrink-0 items-center", children: titleRight })
3054
+ ) : titleRight
3055
+ ] }) : null,
3056
+ children,
3057
+ note != null || footer != null ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-[8px]", children: [
3058
+ note != null ? /* @__PURE__ */ jsx("p", { className: "break-keep text-small-regular text-sys-text-subtle wrap-break-word", children: note }) : null,
3059
+ footer != null ? /* @__PURE__ */ jsx("div", { className: "flex justify-end gap-[8px]", children: footer }) : null
3060
+ ] }) : null
3061
+ ]
3062
+ }
3063
+ );
3064
+ }
3065
+ var Table = React12.forwardRef(
3066
+ ({ className, ...props }, ref) => (
3067
+ // 둥근 테두리 상자(AgGridTable 과 같은 8px·같은 선). overflow-auto 라 내용이 라운드로 잘린다 (2026-10-17 이슈 47 4차)
3068
+ /* @__PURE__ */ jsx("div", { className: "w-full overflow-auto rounded-medium border border-sys-divider-subtle", children: /* @__PURE__ */ jsx(
3069
+ "table",
3070
+ {
3071
+ ref,
3072
+ className: cn("w-full table-fixed border-collapse border-spacing-0 border-0", className),
3073
+ ...props
3074
+ }
3075
+ ) })
3076
+ )
3077
+ );
3078
+ var tableHeaderVariant = cva(
3079
+ // 헤더: 아주 연한 바탕(sys-table-header-background = o10) + 아래 1px 선(행 선과 같은 토큰). 양끝 라운드는 바깥 상자가 맡는다.
3080
+ // 선은 th 에 — border-separate(ParameterTable)에서도 그려지도록 (2026-10-17 이슈 47 4차)
3081
+ "[&_tr]:border-none [&_tr:hover]:bg-transparent [&_tr:active]:bg-transparent [&_th]:bg-sys-table-header-background [&_th]:border-b [&_th]:border-sys-divider-subtle [&_th]:text-sys-text-subtle [&_th]:text-h6",
3082
+ {
3083
+ variants: {
3084
+ spacing: {
3085
+ compact: "[&_th]:px-[12px] [&_th]:py-[2px]",
3086
+ normal: "[&_th]:px-[12px] [&_th]:py-[8px]"
3087
+ }
3088
+ },
3089
+ defaultVariants: {
3090
+ spacing: "normal"
3091
+ }
3092
+ }
3093
+ );
3094
+ var TableHeader = React12.forwardRef(
3095
+ ({ className, spacing, ...props }, ref) => /* @__PURE__ */ jsx("thead", { ref, className: cn(tableHeaderVariant({ spacing }), className), ...props })
3096
+ );
3097
+ var tableBodyVariant = cva(null, {
3098
+ variants: {
3099
+ spacing: {
3100
+ normal: "[&_td]:h-[50px]",
3101
+ compact: "[&_td]:h-[36px]"
3102
+ }
3103
+ },
3104
+ defaultVariants: {
3105
+ spacing: "normal"
3106
+ }
3107
+ });
3108
+ var TableBody = React12.forwardRef(
3109
+ ({ className, spacing, ...props }, ref) => /* @__PURE__ */ jsx("tbody", { ref, className: cn(tableBodyVariant({ spacing }), className), ...props })
3110
+ );
3111
+ var TablePagination = React12.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3112
+ "div",
3113
+ {
3114
+ ref,
3115
+ className: cn("mt-[38px] flex items-center justify-center", className),
3116
+ ...props
3117
+ }
3118
+ ));
3119
+ var TableRow = React12.forwardRef(
3120
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3121
+ "tr",
3122
+ {
3123
+ ref,
3124
+ className: cn(
3125
+ // 행 선은 헤더·바깥 테두리와 같은 토큰, 마지막 행은 바깥 테두리와 겹치지 않게 선 없음
3126
+ "border-b border-sys-divider-subtle border-solid last:border-b-0 hover:bg-sys-table-hover active:bg-sys-table-press data-[state=selected]:bg-sys-table-select",
3127
+ className
3128
+ ),
3129
+ ...props
3130
+ }
3131
+ )
3132
+ );
3133
+ var NUMBER_COLUMN_CLASS = "w-[140px] whitespace-nowrap";
3134
+ var tableHeadVariant = cva(null, {
3135
+ variants: {
3136
+ align: {
3137
+ left: "text-left",
3138
+ center: "text-center",
3139
+ right: `text-right ${NUMBER_COLUMN_CLASS}`
3140
+ }
3141
+ },
3142
+ defaultVariants: {
3143
+ align: "left"
3144
+ }
3145
+ });
3146
+ var TableHead = React12.forwardRef(
3147
+ ({ className, align, ...props }, ref) => /* @__PURE__ */ jsx(
3148
+ "th",
3149
+ {
3150
+ ref,
3151
+ className: cn(tableHeadVariant({ align: alignFromClassName(align, className) }), className),
3152
+ ...props
3153
+ }
3154
+ )
3155
+ );
3156
+ var tableCellMasterVariant = cva("align-middle px-[12px]", {
3157
+ variants: {
3158
+ align: {
3159
+ left: "",
3160
+ center: "[&>_.c-wrap-main]:justify-center",
3161
+ // 머리글 없는 표는 첫 행이 열 폭을 정하므로 셀에도 숫자 열 폭을 준다
3162
+ right: `[&>_.c-wrap-main]:justify-end ${NUMBER_COLUMN_CLASS}`
3163
+ }
3164
+ },
3165
+ defaultVariants: {
3166
+ align: "left"
3167
+ }
3168
+ });
3169
+ function alignFromClassName(align, className) {
3170
+ if (align) return align;
3171
+ if (/(^|\s)text-right(\s|$)/.test(className ?? "")) return "right";
3172
+ if (/(^|\s)text-center(\s|$)/.test(className ?? "")) return "center";
3173
+ return void 0;
3174
+ }
3175
+ var TableCell = React12.forwardRef(
3176
+ ({ className, children, desc, customElement, align, ...props }, ref) => {
3177
+ return /* @__PURE__ */ jsx(
3178
+ "td",
3179
+ {
3180
+ ref,
3181
+ className: cn(
3182
+ tableCellMasterVariant({ align: alignFromClassName(align, className) }),
3183
+ className
3184
+ ),
3185
+ ...props,
3186
+ children: /* @__PURE__ */ jsxs("div", { className: "c-wrap-main flex gap-[12px] items-center w-full h-full text-base-regular text-sys-text-main", children: [
3187
+ customElement && customElement,
3188
+ React12.isValidElement(children) ? desc ? (
3189
+ // 엘리먼트 자식(Badge 등)도 desc 를 아래에 함께 보여준다
3190
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
3191
+ children,
3192
+ /* @__PURE__ */ jsx("div", { className: "c-text-overflow text-small-regular text-sys-text-subtler", children: desc })
3193
+ ] })
3194
+ ) : /* @__PURE__ */ jsx(Fragment, { children }) : /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
3195
+ /* @__PURE__ */ jsx("div", { className: "c-text-overflow text-base-regular text-sys-text-main", children }),
3196
+ desc && /* @__PURE__ */ jsx("div", { className: "c-text-overflow text-small-regular text-sys-text-subtler", children: desc })
3197
+ ] })
3198
+ ] })
3199
+ }
3200
+ );
3201
+ }
3202
+ );
3203
+ function SortIcon({ direction = "asc" }) {
3204
+ const activeColor = "var(--color-secondary60)";
3205
+ const inactiveColor = "var(--color-secondary30)";
3206
+ return /* @__PURE__ */ jsx("svg", { width: "22", height: "24", viewBox: "0 0 22 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: direction ? /* @__PURE__ */ jsxs(Fragment, { children: [
3207
+ /* @__PURE__ */ jsx("path", { d: "M11 5L6 10H16L11 5Z", fill: direction === "asc" ? activeColor : inactiveColor }),
3208
+ /* @__PURE__ */ jsx(
3209
+ "path",
3210
+ {
3211
+ d: "M11 19L16 14L6 14L11 19Z",
3212
+ fill: direction === "asc" ? inactiveColor : activeColor
3213
+ }
3214
+ )
3215
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
3216
+ /* @__PURE__ */ jsx("path", { d: "M11 5L6 10H16L11 5Z", fill: inactiveColor }),
3217
+ /* @__PURE__ */ jsx("path", { d: "M11 19L16 14L6 14L11 19Z", fill: inactiveColor })
3218
+ ] }) });
3219
+ }
3220
+ Table.displayName = "Table";
3221
+ TableHeader.displayName = "TableHeader";
3222
+ TableBody.displayName = "TableBody";
3223
+ TablePagination.displayName = "TablePagination";
3224
+ TableRow.displayName = "TableRow";
3225
+ TableHead.displayName = "TableHead";
3226
+ TableCell.displayName = "TableCell";
3227
+ function Skeleton({ className, ...props }) {
3228
+ return /* @__PURE__ */ jsx("div", { className: cn("animate-pulse rounded-md bg-secondary20", className), ...props });
3229
+ }
3230
+ function seededWidth(row, col, min, max) {
3231
+ const hash = (row * 31 + col * 17 + 7) * 2654435761 >>> 0;
3232
+ return min + hash % (max - min + 1);
3233
+ }
3234
+ function buildColumns(columnDefs, selectionColumnWidth) {
3235
+ const cols = [];
3236
+ if (selectionColumnWidth != null) {
3237
+ cols.push({ width: selectionColumnWidth });
3238
+ }
3239
+ for (const def of columnDefs) {
3240
+ cols.push({
3241
+ width: def.width,
3242
+ flex: def.flex,
3243
+ minWidth: def.minWidth
3244
+ });
3245
+ }
3246
+ return cols;
3247
+ }
3248
+ function getColStyle(col) {
3249
+ if (col.width != null) {
3250
+ return { width: col.width, flexShrink: 0 };
3251
+ }
3252
+ if (col.flex != null) {
3253
+ return { flex: col.flex, minWidth: col.minWidth };
3254
+ }
3255
+ return { flex: 1 };
3256
+ }
3257
+ function TableSkeleton({
3258
+ columnDefs = [],
3259
+ rowLength = 3,
3260
+ rowHeight = 50,
3261
+ headerHeight = 40,
3262
+ selectionColumnWidth
3263
+ }) {
3264
+ const displayRowLength = rowLength && rowLength > 0 ? rowLength : 5;
3265
+ const columns = buildColumns(columnDefs, selectionColumnWidth);
3266
+ return /* @__PURE__ */ jsxs(Stack, { direction: "column", className: "w-full", children: [
3267
+ /* @__PURE__ */ jsx(
3268
+ "div",
3269
+ {
3270
+ className: "flex items-center bg-sys-table-header-background border-b border-sys-divider-subtler rounded-[6px]",
3271
+ style: { height: headerHeight + 1, paddingLeft: 10, paddingRight: 10 },
3272
+ children: columns.map((col, colIndex) => /* @__PURE__ */ jsx("div", { className: "flex items-center px-[6px]", style: getColStyle(col), children: /* @__PURE__ */ jsx(
3273
+ Skeleton,
3274
+ {
3275
+ className: "h-[12px] rounded-[3px] !bg-grayscale-s20",
3276
+ style: { width: `${seededWidth(0, colIndex, 40, 70)}%` }
3277
+ }
3278
+ ) }, colIndex))
3279
+ }
3280
+ ),
3281
+ Array.from({ length: displayRowLength }).map((_, rowIndex) => /* @__PURE__ */ jsx(
3282
+ "div",
3283
+ {
3284
+ className: cn(
3285
+ "flex items-center",
3286
+ rowIndex < displayRowLength - 1 && "border-b border-sys-divider-subtler"
3287
+ ),
3288
+ style: { height: rowHeight, paddingLeft: 10, paddingRight: 10 },
3289
+ children: columns.map((col, colIndex) => /* @__PURE__ */ jsx("div", { className: "flex items-center px-[6px]", style: getColStyle(col), children: /* @__PURE__ */ jsx(
3290
+ Skeleton,
3291
+ {
3292
+ className: "h-[14px] rounded-[3px]",
3293
+ style: { width: `${seededWidth(rowIndex + 1, colIndex, 40, 80)}%` }
3294
+ }
3295
+ ) }, colIndex))
3296
+ },
3297
+ rowIndex
3298
+ ))
3299
+ ] });
3300
+ }
3301
+ var AgGridContext = createContext({
3302
+ containerHeight: 0,
3303
+ isEmpty: false,
3304
+ tableProps: {},
3305
+ ref: null
3306
+ });
3307
+ function AgGridContextProvider({
3308
+ children,
3309
+ value
3310
+ }) {
3311
+ return /* @__PURE__ */ jsx(AgGridContext.Provider, { value, children });
3312
+ }
3313
+
3314
+ // src/components/agGridTable/localeText.ts
3315
+ var AG_GRID_LOCALE_KR = {
3316
+ // Set Filter
3317
+ selectAll: "(\uC804\uCCB4 \uC120\uD0DD)",
3318
+ selectAllSearchResults: "(\uAC80\uC0C9 \uACB0\uACFC \uBAA8\uB450 \uC120\uD0DD)",
3319
+ addCurrentSelectionToFilter: "\uD604\uC7AC \uC120\uD0DD\uC744 \uD544\uD130\uC5D0 \uCD94\uAC00",
3320
+ searchOoo: "\uAC80\uC0C9...",
3321
+ blanks: "(\uBE48\uCE78)",
3322
+ noMatches: "\uC77C\uCE58\uD558\uB294 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4",
3323
+ // Number Filter & Text Filter
3324
+ filterOoo: "\uD544\uD130...",
3325
+ equals: "\uAC19\uC74C",
3326
+ notEqual: "\uAC19\uC9C0 \uC54A\uC74C",
3327
+ blank: "\uBE48\uCE78",
3328
+ notBlank: "\uBE44\uC5B4 \uC788\uC9C0 \uC54A\uC74C",
3329
+ empty: "\uC120\uD0DD\uD558\uC138\uC694",
3330
+ // Number Filter
3331
+ lessThan: "\uBCF4\uB2E4 \uC791\uC74C",
3332
+ greaterThan: "\uBCF4\uB2E4 \uD07C",
3333
+ lessThanOrEqual: "\uC774\uD558",
3334
+ greaterThanOrEqual: "\uC774\uC0C1",
3335
+ inRange: "\uC0AC\uC774",
3336
+ inRangeStart: "\uBD80\uD130",
3337
+ inRangeEnd: "\uAE4C\uC9C0",
3338
+ // Text Filter
3339
+ contains: "\uD3EC\uD568",
3340
+ notContains: "\uD3EC\uD568\uD558\uC9C0 \uC54A\uC74C",
3341
+ startsWith: "\uC2DC\uC791",
3342
+ endsWith: "\uB05D",
3343
+ // Date Filter
3344
+ dateFormatOoo: "yyyy-mm-dd",
3345
+ before: "\uC774\uC804",
3346
+ after: "\uC774\uD6C4",
3347
+ // Filter Conditions
3348
+ andCondition: "AND",
3349
+ orCondition: "OR",
3350
+ // Filter Buttons
3351
+ applyFilter: "\uC801\uC6A9",
3352
+ resetFilter: "\uC7AC\uC124\uC815",
3353
+ clearFilter: "\uC9C0\uC6B0\uAE30",
3354
+ cancelFilter: "\uCDE8\uC18C",
3355
+ // Filter Titles
3356
+ textFilter: "\uD14D\uC2A4\uD2B8 \uD544\uD130",
3357
+ numberFilter: "\uC22B\uC790 \uD544\uD130",
3358
+ dateFilter: "\uB0A0\uC9DC \uD544\uD130",
3359
+ setFilter: "\uC138\uD2B8 \uD544\uD130",
3360
+ // Group Column Filter
3361
+ groupFilterSelect: "\uD544\uB4DC\uB97C \uC120\uD0DD\uD558\uC138\uC694:",
3362
+ // Advanced Filter
3363
+ advancedFilterContains: "\uD3EC\uD568",
3364
+ advancedFilterNotContains: "\uD3EC\uD568\uD558\uC9C0 \uC54A\uC74C",
3365
+ advancedFilterTextEquals: "\uAC19\uC74C",
3366
+ advancedFilterTextNotEqual: "\uAC19\uC9C0 \uC54A\uC74C",
3367
+ advancedFilterStartsWith: "\uC2DC\uC791\uC774",
3368
+ advancedFilterEndsWith: "\uB05D\uC774",
3369
+ advancedFilterBlank: "\uBE44\uC5B4 \uC788\uC74C",
3370
+ advancedFilterNotBlank: "\uBE44\uC5B4 \uC788\uC9C0 \uC54A\uC74C",
3371
+ advancedFilterEquals: "=",
3372
+ advancedFilterNotEqual: "!=",
3373
+ advancedFilterGreaterThan: ">",
3374
+ advancedFilterGreaterThanOrEqual: ">=",
3375
+ advancedFilterLessThan: "<",
3376
+ advancedFilterLessThanOrEqual: "<=",
3377
+ advancedFilterTrue: "\uCC38\uC784",
3378
+ advancedFilterFalse: "\uAC70\uC9D3\uC784",
3379
+ advancedFilterAnd: "AND",
3380
+ advancedFilterOr: "OR",
3381
+ advancedFilterApply: "\uC801\uC6A9",
3382
+ advancedFilterBuilder: "\uC0DD\uC131\uAE30",
3383
+ advancedFilterValidationMissingColumn: "\uC5F4\uC774 \uB204\uB77D\uB418\uC5C8\uC2B5\uB2C8\uB2E4",
3384
+ advancedFilterValidationMissingOption: "\uC635\uC158\uC774 \uB204\uB77D\uB418\uC5C8\uC2B5\uB2C8\uB2E4",
3385
+ advancedFilterValidationMissingValue: "\uAC12\uC774 \uB204\uB77D\uB418\uC5C8\uC2B5\uB2C8\uB2E4",
3386
+ advancedFilterValidationInvalidColumn: "\uC5F4\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
3387
+ advancedFilterValidationInvalidOption: "\uC635\uC158\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
3388
+ advancedFilterValidationMissingQuote: "\uAC12\uC5D0 \uB05D\uB098\uB294 \uC778\uC6A9\uBD80\uD638\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4",
3389
+ advancedFilterValidationNotANumber: "\uAC12\uC774 \uC22B\uC790\uAC00 \uC544\uB2D9\uB2C8\uB2E4",
3390
+ advancedFilterValidationInvalidDate: "\uAC12\uC774 \uC720\uD6A8\uD55C \uB0A0\uC9DC\uAC00 \uC544\uB2D9\uB2C8\uB2E4",
3391
+ advancedFilterValidationMissingCondition: "\uC870\uAC74\uC774 \uB204\uB77D\uB418\uC5C8\uC2B5\uB2C8\uB2E4",
3392
+ advancedFilterValidationJoinOperatorMismatch: "\uC870\uAC74 \uB0B4\uC758 \uC5F0\uACB0 \uC5F0\uC0B0\uC790\uB294 \uB3D9\uC77C\uD574\uC57C \uD569\uB2C8\uB2E4",
3393
+ advancedFilterValidationInvalidJoinOperator: "\uC5F0\uACB0 \uC5F0\uC0B0\uC790\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
3394
+ advancedFilterValidationMissingEndBracket: "\uB05D \uAD04\uD638\uAC00 \uB204\uB77D\uB418\uC5C8\uC2B5\uB2C8\uB2E4",
3395
+ advancedFilterValidationExtraEndBracket: "\uC885\uACB0 \uAD04\uD638\uAC00 \uB108\uBB34 \uB9CE\uC2B5\uB2C8\uB2E4",
3396
+ advancedFilterValidationMessage: "\uC2DD\uC5D0 \uC624\uB958\uAC00 \uC788\uC2B5\uB2C8\uB2E4. ${variable} - ${variable}.",
3397
+ advancedFilterValidationMessageAtEnd: "\uC2DD\uC5D0 \uC624\uB958\uAC00 \uC788\uC2B5\uB2C8\uB2E4. ${variable} \uC2DD\uC758 \uB05D\uC5D0 \uC788\uC2B5\uB2C8\uB2E4.",
3398
+ advancedFilterBuilderTitle: "\uACE0\uAE09 \uD544\uD130",
3399
+ advancedFilterBuilderApply: "\uC801\uC6A9",
3400
+ advancedFilterBuilderCancel: "\uCDE8\uC18C",
3401
+ advancedFilterBuilderAddButtonTooltip: "\uD544\uD130 \uB610\uB294 \uADF8\uB8F9 \uCD94\uAC00",
3402
+ advancedFilterBuilderRemoveButtonTooltip: "\uC81C\uAC70",
3403
+ advancedFilterBuilderMoveUpButtonTooltip: "\uC704\uB85C \uC774\uB3D9",
3404
+ advancedFilterBuilderMoveDownButtonTooltip: "\uC544\uB798\uB85C \uC774\uB3D9",
3405
+ advancedFilterBuilderAddJoin: "\uADF8\uB8F9 \uCD94\uAC00",
3406
+ advancedFilterBuilderAddCondition: "\uD544\uD130 \uCD94\uAC00",
3407
+ advancedFilterBuilderSelectColumn: "\uC5F4 \uC120\uD0DD",
3408
+ advancedFilterBuilderSelectOption: "\uC635\uC158 \uC120\uD0DD",
3409
+ advancedFilterBuilderEnterValue: "\uAC12\uC744 \uC785\uB825\uD558\uC138\uC694...",
3410
+ advancedFilterBuilderValidationAlreadyApplied: "\uD604\uC7AC \uD544\uD130\uAC00 \uC774\uBBF8 \uC801\uC6A9\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",
3411
+ advancedFilterBuilderValidationIncomplete: "\uBAA8\uB4E0 \uC870\uAC74\uC774 \uC644\uB8CC\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.",
3412
+ advancedFilterBuilderValidationSelectColumn: "\uC5F4\uC744 \uC120\uD0DD\uD574\uC57C \uD569\uB2C8\uB2E4.",
3413
+ advancedFilterBuilderValidationSelectOption: "\uC635\uC158\uC744 \uC120\uD0DD\uD574\uC57C \uD569\uB2C8\uB2E4.",
3414
+ advancedFilterBuilderValidationEnterValue: "\uAC12\uC744 \uC785\uB825\uD574\uC57C \uD569\uB2C8\uB2E4.",
3415
+ // Side Bar
3416
+ columns: "\uC5F4",
3417
+ filters: "\uD544\uD130",
3418
+ // columns tool panel
3419
+ pivotMode: "\uD53C\uBC97 \uBAA8\uB4DC",
3420
+ groups: "\uD589 \uADF8\uB8F9",
3421
+ rowGroupColumnsEmptyMessage: "\uC5EC\uAE30\uB85C \uB4DC\uB798\uADF8\uD558\uC5EC \uD589 \uADF8\uB8F9 \uC124\uC815",
3422
+ values: "\uAC12",
3423
+ valueColumnsEmptyMessage: "\uC5EC\uAE30\uB85C \uB4DC\uB798\uADF8\uD558\uC5EC \uC9D1\uACC4",
3424
+ pivots: "\uC5F4 \uB808\uC774\uBE14",
3425
+ pivotColumnsEmptyMessage: "\uC5EC\uAE30\uB85C \uB4DC\uB798\uADF8\uD558\uC5EC \uC5F4 \uB808\uC774\uBE14 \uC124\uC815",
3426
+ // Header of the Default Group Column
3427
+ group: "\uADF8\uB8F9",
3428
+ // Row Drag
3429
+ rowDragRow: "\uD589",
3430
+ rowDragRows: "\uD589\uB4E4",
3431
+ // Other
3432
+ loadingOoo: "\uB85C\uB529 \uC911...",
3433
+ loadingError: "\uC624\uB958",
3434
+ noRowsToShow: "\uD45C\uC2DC\uD560 \uD589\uC774 \uC5C6\uC2B5\uB2C8\uB2E4",
3435
+ enabled: "\uC0AC\uC6A9 \uC911",
3436
+ // Menu
3437
+ pinColumn: "\uC5F4 \uACE0\uC815",
3438
+ pinLeft: "\uC67C\uCABD\uC5D0 \uACE0\uC815",
3439
+ pinRight: "\uC624\uB978\uCABD\uC5D0 \uACE0\uC815",
3440
+ noPin: "\uACE0\uC815 \uC5C6\uC74C",
3441
+ valueAggregation: "\uAC12 \uC9D1\uACC4",
3442
+ noAggregation: "\uC5C6\uC74C",
3443
+ autosizeThisColumn: "\uC774 \uC5F4 \uC790\uB3D9 \uD06C\uAE30 \uC870\uC815",
3444
+ autosizeAllColumns: "\uBAA8\uB4E0 \uC5F4 \uC790\uB3D9 \uD06C\uAE30 \uC870\uC815",
3445
+ groupBy: "\uADF8\uB8F9\uD654 \uAE30\uC900",
3446
+ ungroupBy: "\uADF8\uB8F9 \uD574\uC81C \uAE30\uC900",
3447
+ ungroupAll: "\uBAA8\uB4E0 \uADF8\uB8F9 \uD574\uC81C",
3448
+ addToValues: "${variable} \uAC12\uC744 \uCD94\uAC00",
3449
+ removeFromValues: "${variable} \uAC12\uC744 \uC81C\uAC70",
3450
+ addToLabels: "${variable} \uB808\uC774\uBE14\uC5D0 \uCD94\uAC00",
3451
+ removeFromLabels: "${variable} \uB808\uC774\uBE14\uC5D0\uC11C \uC81C\uAC70",
3452
+ resetColumns: "\uC5F4 \uC7AC\uC124\uC815",
3453
+ expandAll: "\uBAA8\uB4E0 \uD589 \uADF8\uB8F9 \uD655\uC7A5",
3454
+ collapseAll: "\uBAA8\uB4E0 \uD589 \uADF8\uB8F9 \uB2EB\uAE30",
3455
+ copy: "\uBCF5\uC0AC",
3456
+ ctrlC: "Ctrl+C",
3457
+ ctrlX: "Ctrl+X",
3458
+ copyWithHeaders: "\uBA38\uB9AC\uAE00\uACFC \uD568\uAED8 \uBCF5\uC0AC",
3459
+ copyWithGroupHeaders: "\uADF8\uB8F9 \uBA38\uB9AC\uAE00\uACFC \uD568\uAED8 \uBCF5\uC0AC",
3460
+ cut: "\uC798\uB77C\uB0B4\uAE30",
3461
+ paste: "\uBD99\uC5EC\uB123\uAE30",
3462
+ ctrlV: "Ctrl+V",
3463
+ export: "\uB0B4\uBCF4\uB0B4\uAE30",
3464
+ csvExport: "CSV \uB0B4\uBCF4\uB0B4\uAE30",
3465
+ excelExport: "Excel \uB0B4\uBCF4\uB0B4\uAE30",
3466
+ columnFilter: "\uC5F4 \uD544\uD130",
3467
+ columnChooser: "\uC5F4 \uC120\uD0DD",
3468
+ chooseColumns: "\uC5F4 \uC120\uD0DD",
3469
+ sortAscending: "\uC624\uB984\uCC28\uC21C \uC815\uB82C",
3470
+ sortDescending: "\uB0B4\uB9BC\uCC28\uC21C \uC815\uB82C",
3471
+ sortUnSort: "\uC815\uB82C \uD574\uC81C",
3472
+ // Enterprise Menu Aggregation and Status Bar
3473
+ sum: "\uD569\uACC4",
3474
+ first: "\uCCAB \uBC88\uC9F8",
3475
+ last: "\uB9C8\uC9C0\uB9C9",
3476
+ min: "\uCD5C\uC18C",
3477
+ max: "\uCD5C\uB300",
3478
+ none: "\uC5C6\uC74C",
3479
+ count: "\uAC1C\uC218",
3480
+ avg: "\uD3C9\uADE0",
3481
+ filteredRows: "\uD544\uD130\uB41C \uD589",
3482
+ selectedRows: "\uC120\uD0DD\uB41C \uD589",
3483
+ totalRows: "\uCD1D \uD589 \uC218",
3484
+ totalAndFilteredRows: "\uD589",
3485
+ more: "\uB354 \uBCF4\uAE30",
3486
+ to: "\uC5D0\uC11C",
3487
+ of: "\uC758",
3488
+ page: "\uD398\uC774\uC9C0",
3489
+ pageLastRowUnknown: "?",
3490
+ nextPage: "\uB2E4\uC74C \uD398\uC774\uC9C0",
3491
+ lastPage: "\uB9C8\uC9C0\uB9C9 \uD398\uC774\uC9C0",
3492
+ firstPage: "\uCCAB \uD398\uC774\uC9C0",
3493
+ previousPage: "\uC774\uC804 \uD398\uC774\uC9C0",
3494
+ pageSizeSelectorLabel: "\uD398\uC774\uC9C0 \uD06C\uAE30:",
3495
+ footerTotal: "\uCD1D\uACC4",
3496
+ statusBarLastRowUnknown: "?",
3497
+ // Pivoting
3498
+ pivotColumnGroupTotals: "\uCD1D\uD569\uACC4",
3499
+ // Enterprise Menu (Charts)
3500
+ pivotChartAndPivotMode: "\uD53C\uBC97 \uCC28\uD2B8 & \uD53C\uBC97 \uBAA8\uB4DC",
3501
+ pivotChart: "\uD53C\uBC97 \uCC28\uD2B8",
3502
+ chartRange: "\uCC28\uD2B8 \uBC94\uC704",
3503
+ columnChart: "\uCEEC\uB7FC",
3504
+ groupedColumn: "\uADF8\uB8F9\uD654",
3505
+ stackedColumn: "\uC2A4\uD0DD",
3506
+ normalizedColumn: "100% \uC2A4\uD0DD",
3507
+ barChart: "\uB9C9\uB300",
3508
+ groupedBar: "\uADF8\uB8F9\uD654",
3509
+ stackedBar: "\uC2A4\uD0DD",
3510
+ normalizedBar: "100% \uC2A4\uD0DD",
3511
+ pieChart: "\uD30C\uC774",
3512
+ pie: "\uD30C\uC774",
3513
+ donut: "\uB3C4\uB11B",
3514
+ lineChart: "\u2018\uAEBE\uC740\uC120\uD615\u2019",
3515
+ stackedLine: "\u2018\uB204\uC801\u2019",
3516
+ normalizedLine: "\u2018100% \uB204\uC801\u2019",
3517
+ xyChart: "X Y (\uC0B0\uC810\uB3C4)",
3518
+ scatter: "\uC0B0\uC810\uB3C4",
3519
+ bubble: "\uBC84\uBE14",
3520
+ areaChart: "\uC601\uC5ED",
3521
+ area: "\uC601\uC5ED",
3522
+ stackedArea: "\uC2A4\uD0DD \uC601\uC5ED",
3523
+ normalizedArea: "100% \uC2A4\uD0DD \uC601\uC5ED",
3524
+ histogramChart: "\uD788\uC2A4\uD1A0\uADF8\uB7A8",
3525
+ polarChart: "\uD3F4\uB77C",
3526
+ radarLine: "\uB808\uC774\uB354 \uB77C\uC778",
3527
+ radarArea: "\uB808\uC774\uB354 \uC601\uC5ED",
3528
+ nightingale: "\uB098\uC774\uD305\uAC8C\uC77C",
3529
+ radialColumn: "\uBC29\uC0AC\uD615 \uCEEC\uB7FC",
3530
+ radialBar: "\uBC29\uC0AC\uD615 \uB9C9\uB300",
3531
+ statisticalChart: "\uD1B5\uACC4",
3532
+ boxPlot: "\uC0C1\uC790 \uADF8\uB9BC",
3533
+ rangeBar: "\uBC94\uC704 \uB9C9\uB300",
3534
+ rangeArea: "\uBC94\uC704 \uC601\uC5ED",
3535
+ hierarchicalChart: "\uACC4\uCE35\uC801",
3536
+ treemap: "\uD2B8\uB9AC\uB9F5",
3537
+ sunburst: "\uC120\uBC84\uC2A4\uD2B8",
3538
+ specializedChart: "\uD2B9\uC218",
3539
+ waterfall: "\uD3ED\uD3EC",
3540
+ heatmap: "\uD788\uD2B8\uB9F5",
3541
+ combinationChart: "\uBCF5\uD569",
3542
+ columnLineCombo: "\uCEEC\uB7FC & \uB77C\uC778",
3543
+ AreaColumnCombo: "\uC601\uC5ED & \uCEEC\uB7FC",
3544
+ // Charts
3545
+ pivotChartTitle: "\uD53C\uBC97 \uCC28\uD2B8",
3546
+ rangeChartTitle: "\uBC94\uC704 \uCC28\uD2B8",
3547
+ settings: "\uCC28\uD2B8",
3548
+ data: "\uC124\uC815",
3549
+ format: "\uB9DE\uCDA4 \uC124\uC815",
3550
+ categories: "\uCE74\uD14C\uACE0\uB9AC",
3551
+ defaultCategory: "(\uC5C6\uC74C)",
3552
+ series: "\uC2DC\uB9AC\uC988",
3553
+ switchCategorySeries: "\uCE74\uD14C\uACE0\uB9AC / \uC2DC\uB9AC\uC988 \uC804\uD658",
3554
+ categoryValues: "\uCE74\uD14C\uACE0\uB9AC \uAC12",
3555
+ seriesLabels: "\uC2DC\uB9AC\uC988 \uB77C\uBCA8",
3556
+ aggregate: "\uD569\uC0B0",
3557
+ xyValues: "X Y \uAC12\uB4E4",
3558
+ paired: "\uC30D \uBAA8\uB4DC",
3559
+ axis: "\uCD95",
3560
+ xAxis: "\uC218\uD3C9 \uCD95",
3561
+ yAxis: "\uC218\uC9C1 \uCD95",
3562
+ polarAxis: "\uD3F4\uB77C \uCD95",
3563
+ radiusAxis: "\uBC18\uACBD \uCD95",
3564
+ navigator: "\uB124\uBE44\uAC8C\uC774\uD130",
3565
+ zoom: "\uC90C",
3566
+ animation: "\uC560\uB2C8\uBA54\uC774\uC158",
3567
+ crosshair: "\uD06C\uB85C\uC2A4\uD5E4\uC5B4",
3568
+ color: "\uC0C9\uC0C1",
3569
+ thickness: "\uB450\uAED8",
3570
+ preferredLength: "\uC120\uD638 \uAE38\uC774",
3571
+ xType: "X \uC720\uD615",
3572
+ axisType: "\uCD95 \uC720\uD615",
3573
+ automatic: "\uC790\uB3D9",
3574
+ category: "\uCE74\uD14C\uACE0\uB9AC",
3575
+ number: "\uC22B\uC790",
3576
+ time: "\uC2DC\uAC04",
3577
+ timeFormat: "\uC2DC\uAC04 \uD615\uC2DD",
3578
+ autoRotate: "\uC790\uB3D9 \uD68C\uC804",
3579
+ labelRotation: "\uD68C\uC804",
3580
+ circle: "\uC6D0",
3581
+ polygon: "\uB2E4\uAC01\uD615",
3582
+ square: "\uC0AC\uAC01\uD615",
3583
+ cross: "\uC2ED\uC790",
3584
+ diamond: "\uB2E4\uC774\uC544\uBAAC\uB4DC",
3585
+ plus: "\uD50C\uB7EC\uC2A4",
3586
+ triangle: "\uC0BC\uAC01\uD615",
3587
+ heart: "\uD558\uD2B8",
3588
+ orientation: "\uBC29\uD5A5",
3589
+ fixed: "\uACE0\uC815",
3590
+ parallel: "\uBCD1\uB82C",
3591
+ perpendicular: "\uC218\uC9C1",
3592
+ radiusAxisPosition: "\uC704\uCE58",
3593
+ ticks: "\uD2F1",
3594
+ gridLines: "\uACA9\uC790 \uB77C\uC778",
3595
+ width: "\uB108\uBE44",
3596
+ height: "\uB192\uC774",
3597
+ length: "\uAE38\uC774",
3598
+ padding: "\uD328\uB529",
3599
+ spacing: "\uAC04\uACA9",
3600
+ chartStyle: "\uCC28\uD2B8 \uC2A4\uD0C0\uC77C",
3601
+ title: "\uC81C\uBAA9",
3602
+ chartTitles: "\uC81C\uBAA9\uB4E4",
3603
+ chartTitle: "\uCC28\uD2B8 \uC81C\uBAA9",
3604
+ chartSubtitle: "\uBD80\uC81C\uBAA9",
3605
+ horizontalAxisTitle: "\uC218\uD3C9 \uCD95 \uC81C\uBAA9",
3606
+ verticalAxisTitle: "\uC218\uC9C1 \uCD95 \uC81C\uBAA9",
3607
+ polarAxisTitle: "\uD3F4\uB77C \uCD95 \uC81C\uBAA9",
3608
+ titlePlaceholder: "\uCC28\uD2B8 \uC81C\uBAA9",
3609
+ background: "\uBC30\uACBD",
3610
+ font: "\uAE00\uAF34",
3611
+ weight: "\uAD75\uAE30",
3612
+ top: "\uC704",
3613
+ right: "\uC624\uB978\uCABD",
3614
+ bottom: "\uC544\uB798",
3615
+ left: "\uC67C\uCABD",
3616
+ labels: "\uB77C\uBCA8",
3617
+ calloutLabels: "\uCF5C\uC544\uC6C3 \uB77C\uBCA8",
3618
+ sectorLabels: "\uC139\uD130 \uB77C\uBCA8",
3619
+ positionRatio: "\uC704\uCE58 \uBE44\uC728",
3620
+ size: "\uD06C\uAE30",
3621
+ shape: "\uD615\uD0DC",
3622
+ minSize: "\uCD5C\uC18C \uD06C\uAE30",
3623
+ maxSize: "\uCD5C\uB300 \uD06C\uAE30",
3624
+ legend: "\uBC94\uB840",
3625
+ position: "\uC704\uCE58",
3626
+ markerSize: "\uB9C8\uCEE4 \uD06C\uAE30",
3627
+ markerStroke: "\uB9C8\uCEE4 \uC2A4\uD2B8\uB85C\uD06C",
3628
+ markerPadding: "\uB9C8\uCEE4 \uD328\uB529",
3629
+ itemSpacing: "\uC544\uC774\uD15C \uAC04\uACA9",
3630
+ itemPaddingX: "\uC544\uC774\uD15C \uD328\uB529 X",
3631
+ itemPaddingY: "\uC544\uC774\uD15C \uD328\uB529 Y",
3632
+ layoutHorizontalSpacing: "\uC218\uD3C9 \uAC04\uACA9",
3633
+ layoutVerticalSpacing: "\uC218\uC9C1 \uAC04\uACA9",
3634
+ strokeWidth: "\uC2A4\uD2B8\uB85C\uD06C \uB450\uAED8",
3635
+ offset: "\uC624\uD504\uC14B",
3636
+ offsets: "\uC624\uD504\uC14B\uB4E4",
3637
+ tooltips: "\uD234\uD301",
3638
+ callout: "\uCF5C\uC544\uC6C3",
3639
+ markers: "\uB9C8\uCEE4",
3640
+ shadow: "\uADF8\uB9BC\uC790",
3641
+ blur: "\uBE14\uB7EC",
3642
+ xOffset: "X \uC624\uD504\uC14B",
3643
+ yOffset: "Y \uC624\uD504\uC14B",
3644
+ lineWidth: "\uB77C\uC778 \uB108\uBE44",
3645
+ lineDash: "\uB77C\uC778 \uB300\uC2DC",
3646
+ lineDashOffset: "\uB300\uC2DC \uC624\uD504\uC14B",
3647
+ scrollingZoom: "\uC2A4\uD06C\uB864",
3648
+ scrollingStep: "\uC2A4\uD06C\uB864 \uC2A4\uD15D",
3649
+ selectingZoom: "\uC120\uD0DD",
3650
+ durationMillis: "\uC9C0\uC18D \uC2DC\uAC04 (ms)",
3651
+ crosshairLabel: "\uB77C\uBCA8",
3652
+ crosshairSnap: "\uB178\uB4DC\uC5D0 \uC2A4\uB0C5",
3653
+ normal: "\uBCF4\uD1B5",
3654
+ bold: "\uAD75\uAC8C",
3655
+ italic: "\uAE30\uC6B8\uC784\uAF34",
3656
+ boldItalic: "\uAD75\uAC8C \uAE30\uC6B8\uC784\uAF34",
3657
+ predefined: "\uC0AC\uC804 \uC815\uC758\uB41C",
3658
+ fillOpacity: "\uCC44\uC6B0\uAE30 \uBD88\uD22C\uBA85\uB3C4",
3659
+ strokeColor: "\uB77C\uC778 \uC0C9\uC0C1",
3660
+ strokeOpacity: "\uB77C\uC778 \uBD88\uD22C\uBA85\uB3C4",
3661
+ miniChart: "\uBBF8\uB2C8 \uCC28\uD2B8",
3662
+ histogramBinCount: "\uBE48 \uC218",
3663
+ connectorLine: "\uC5F0\uACB0 \uB77C\uC778",
3664
+ seriesItems: "\uC2DC\uB9AC\uC988 \uD56D\uBAA9",
3665
+ seriesItemType: "\uD56D\uBAA9 \uC720\uD615",
3666
+ seriesItemPositive: "\uC591\uC218",
3667
+ seriesItemNegative: "\uC74C\uC218",
3668
+ seriesItemLabels: "\uD56D\uBAA9 \uB77C\uBCA8",
3669
+ columnGroup: "\uC5F4",
3670
+ barGroup: "\uB9C9\uB300",
3671
+ pieGroup: "\uD30C\uC774",
3672
+ lineGroup: "\uB77C\uC778",
3673
+ scatterGroup: "X Y (\uC0B0\uC810\uB3C4)",
3674
+ areaGroup: "\uBA74\uC801",
3675
+ polarGroup: "\uD3F4\uB77C",
3676
+ statisticalGroup: "\uD1B5\uACC4",
3677
+ hierarchicalGroup: "\uACC4\uCE35",
3678
+ specializedGroup: "\uC804\uBB38",
3679
+ combinationGroup: "\uACB0\uD569",
3680
+ groupedColumnTooltip: "\uADF8\uB8F9\uD654",
3681
+ stackedColumnTooltip: "\uC2A4\uD0DD",
3682
+ normalizedColumnTooltip: "100% \uC2A4\uD0DD",
3683
+ groupedBarTooltip: "\uADF8\uB8F9\uD654",
3684
+ stackedBarTooltip: "\uC2A4\uD0DD",
3685
+ normalizedBarTooltip: "100% \uC2A4\uD0DD",
3686
+ pieTooltip: "\uD30C\uC774",
3687
+ donutTooltip: "\uB3C4\uB11B",
3688
+ lineTooltip: "\uB77C\uC778",
3689
+ stackedLineTooltip: "\uC2A4\uD0DD",
3690
+ normalizedLineTooltip: "100% \uC2A4\uD0DD",
3691
+ groupedAreaTooltip: "\uBA74\uC801",
3692
+ stackedAreaTooltip: "\uC2A4\uD0DD",
3693
+ normalizedAreaTooltip: "100% \uC2A4\uD0DD",
3694
+ scatterTooltip: "\uC0B0\uC810\uB3C4",
3695
+ bubbleTooltip: "\uBC84\uBE14",
3696
+ histogramTooltip: "\uD788\uC2A4\uD1A0\uADF8\uB7A8",
3697
+ radialColumnTooltip: "\uBC18\uACBD \uC5F4",
3698
+ radialBarTooltip: "\uBC18\uACBD \uB9C9\uB300",
3699
+ radarLineTooltip: "\uB808\uC774\uB354 \uB77C\uC778",
3700
+ radarAreaTooltip: "\uB808\uC774\uB354 \uBA74\uC801",
3701
+ nightingaleTooltip: "\uB098\uC774\uD305\uAC8C\uC77C",
3702
+ rangeBarTooltip: "\uBC94\uC704 \uB9C9\uB300",
3703
+ rangeAreaTooltip: "\uBC94\uC704 \uBA74\uC801",
3704
+ boxPlotTooltip: "\uBC15\uC2A4 \uD50C\uB86F",
3705
+ treemapTooltip: "\uD2B8\uB9AC\uB9F5",
3706
+ sunburstTooltip: "\uC120\uBC84\uC2A4\uD2B8",
3707
+ waterfallTooltip: "\uD3ED\uD3EC",
3708
+ heatmapTooltip: "\uD788\uD2B8\uB9F5",
3709
+ columnLineComboTooltip: "\uC5F4 & \uB77C\uC778",
3710
+ areaColumnComboTooltip: "\uBA74\uC801 & \uC5F4",
3711
+ customComboTooltip: "\uC0AC\uC6A9\uC790 \uC815\uC758 \uACB0\uD569",
3712
+ innerRadius: "\uB0B4\uBD80 \uBC18\uACBD",
3713
+ startAngle: "\uC2DC\uC791 \uAC01\uB3C4",
3714
+ endAngle: "\uB05D \uAC01\uB3C4",
3715
+ reverseDirection: "\uBC18\uB300 \uBC29\uD5A5",
3716
+ groupPadding: "\uADF8\uB8F9 \uD328\uB529",
3717
+ seriesPadding: "\uC2DC\uB9AC\uC988 \uD328\uB529",
3718
+ tile: "\uD0C0\uC77C",
3719
+ whisker: "\uC218\uC5FC",
3720
+ cap: "\uBAA8\uC790",
3721
+ capLengthRatio: "\uAE38\uC774 \uBE44\uC728",
3722
+ labelPlacement: "\uB77C\uBCA8 \uBC30\uCE58",
3723
+ inside: "\uB0B4\uBD80",
3724
+ outside: "\uC678\uBD80",
3725
+ noDataToChart: "\uCC28\uD2B8\uD654 \uD560 \uC218 \uC788\uB294 \uB370\uC774\uD130\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
3726
+ pivotChartRequiresPivotMode: "\uD53C\uBC97 \uCC28\uD2B8\uB294 \uD53C\uBC97 \uBAA8\uB4DC\uAC00 \uD65C\uC131\uD654 \uB418\uC5B4\uC57C \uD569\uB2C8\uB2E4.",
3727
+ chartSettingsToolbarTooltip: "\uBA54\uB274",
3728
+ chartLinkToolbarTooltip: "\uADF8\uB9AC\uB4DC\uC5D0 \uB9C1\uD06C\uB428",
3729
+ chartUnlinkToolbarTooltip: "\uADF8\uB9AC\uB4DC\uC5D0\uC11C \uB9C1\uD06C \uD574\uC81C\uB428",
3730
+ chartDownloadToolbarTooltip: "\uCC28\uD2B8 \uB2E4\uC6B4\uB85C\uB4DC",
3731
+ chartMenuToolbarTooltip: "\uBA54\uB274",
3732
+ chartEdit: "\uCC28\uD2B8 \uD3B8\uC9D1",
3733
+ chartAdvancedSettings: "\uACE0\uAE09 \uC124\uC815",
3734
+ chartLink: "\uADF8\uB9AC\uB4DC\uC5D0 \uB9C1\uD06C",
3735
+ chartUnlink: "\uADF8\uB9AC\uB4DC\uC5D0\uC11C \uB9C1\uD06C \uD574\uC81C",
3736
+ chartDownload: "\uCC28\uD2B8 \uB2E4\uC6B4\uB85C\uB4DC",
3737
+ histogramFrequency: "\uBE48\uB3C4",
3738
+ seriesChartType: "\uC2DC\uB9AC\uC988 \uCC28\uD2B8 \uC720\uD615",
3739
+ seriesType: "\uC2DC\uB9AC\uC988 \uC720\uD615",
3740
+ secondaryAxis: "\uBCF4\uC870 \uCD95",
3741
+ seriesAdd: "\uC2DC\uB9AC\uC988 \uCD94\uAC00",
3742
+ categoryAdd: "\uCE74\uD14C\uACE0\uB9AC \uCD94\uAC00",
3743
+ bar: "\uB9C9\uB300",
3744
+ column: "\uC5F4",
3745
+ histogram: "\uD788\uC2A4\uD1A0\uADF8\uB7A8",
3746
+ advancedSettings: "\uACE0\uAE09 \uC124\uC815",
3747
+ direction: "\uBC29\uD5A5",
3748
+ horizontal: "\uC218\uD3C9",
3749
+ vertical: "\uC218\uC9C1",
3750
+ seriesGroupType: "\uADF8\uB8F9 \uC720\uD615",
3751
+ groupedSeriesGroupType: "\uADF8\uB8F9\uD654",
3752
+ stackedSeriesGroupType: "\uC2A4\uD0DD",
3753
+ normalizedSeriesGroupType: "100% \uC2A4\uD0DD",
3754
+ legendEnabled: "\uD65C\uC131\uD654\uB428",
3755
+ invalidColor: "\uC0C9\uC0C1 \uAC12\uC774 \uC720\uD6A8\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4",
3756
+ groupedColumnFull: "\uADF8\uB8F9\uD654\uB41C \uC5F4",
3757
+ stackedColumnFull: "\uC2A4\uD0DD\uB41C \uC5F4",
3758
+ normalizedColumnFull: "100% \uC2A4\uD0DD\uB41C \uC5F4",
3759
+ groupedBarFull: "\uADF8\uB8F9\uD654\uB41C \uB9C9\uB300",
3760
+ stackedBarFull: "\uC2A4\uD0DD\uB41C \uB9C9\uB300",
3761
+ normalizedBarFull: "100% \uC2A4\uD0DD\uB41C \uB9C9\uB300",
3762
+ stackedAreaFull: "\uC2A4\uD0DD\uB41C \uBA74\uC801",
3763
+ normalizedAreaFull: "100% \uC2A4\uD0DD\uB41C \uBA74\uC801",
3764
+ customCombo: "\uC0AC\uC6A9\uC790 \uC815\uC758 \uACB0\uD569",
3765
+ funnel: "\uAE54\uB54C\uAE30",
3766
+ coneFunnel: "\uC6D0\uBFD4 \uAE54\uB54C\uAE30",
3767
+ pyramid: "\uD53C\uB77C\uBBF8\uB4DC",
3768
+ funnelGroup: "\uAE54\uB54C\uAE30",
3769
+ funnelTooltip: "\uAE54\uB54C\uAE30",
3770
+ coneFunnelTooltip: "\uC6D0\uBFD4 \uAE54\uB54C\uAE30",
3771
+ pyramidTooltip: "\uD53C\uB77C\uBBF8\uB4DC",
3772
+ dropOff: "\uC774\uD0C8",
3773
+ stageLabels: "\uB2E8\uACC4 \uB808\uC774\uBE14",
3774
+ reverse: "\uC5ED\uBC29\uD5A5",
3775
+ // ARIA
3776
+ ariaAdvancedFilterBuilderItem: "${variable}. \uB808\uBCA8 ${variable}. \uD3B8\uC9D1\uD558\uB824\uBA74 ENTER\uB97C \uB204\uB974\uC138\uC694",
3777
+ ariaAdvancedFilterBuilderItemValidation: "${variable}. \uB808\uBCA8 ${variable}. ${variable} \uD3B8\uC9D1\uD558\uB824\uBA74 ENTER\uB97C \uB204\uB974\uC138\uC694",
3778
+ ariaAdvancedFilterBuilderList: "\uACE0\uAE09 \uD544\uD130 \uBE4C\uB354 \uBAA9\uB85D",
3779
+ ariaAdvancedFilterBuilderFilterItem: "\uD544\uD130 \uC870\uAC74",
3780
+ ariaAdvancedFilterBuilderGroupItem: "\uD544\uD130 \uADF8\uB8F9",
3781
+ ariaAdvancedFilterBuilderColumn: "\uC5F4",
3782
+ ariaAdvancedFilterBuilderOption: "\uC635\uC158",
3783
+ ariaAdvancedFilterBuilderValueP: "\uAC12",
3784
+ ariaAdvancedFilterBuilderJoinOperator: "\uC870\uD569 \uC5F0\uC0B0\uC790",
3785
+ ariaAdvancedFilterInput: "\uACE0\uAE09 \uD544\uD130 \uC785\uB825",
3786
+ ariaChecked: "\uC120\uD0DD\uB428",
3787
+ ariaColumn: "\uC5F4",
3788
+ ariaColumnGroup: "\uC5F4 \uADF8\uB8F9",
3789
+ ariaColumnFiltered: "\uC5F4 \uD544\uD130\uB9C1\uB428",
3790
+ ariaColumnSelectAll: "\uBAA8\uB4E0 \uC5F4 \uAC00\uC2DC\uC131 \uC804\uD658",
3791
+ ariaDateFilterInput: "\uB0A0\uC9DC \uD544\uD130 \uC785\uB825",
3792
+ ariaDefaultListName: "\uBAA9\uB85D",
3793
+ ariaFilterColumnsInput: "\uC5F4 \uD544\uD130 \uC785\uB825",
3794
+ ariaFilterFromValue: "\uAC12\uC5D0\uC11C \uD544\uD130",
3795
+ ariaFilterInput: "\uD544\uD130 \uC785\uB825",
3796
+ ariaFilterList: "\uD544\uD130 \uBAA9\uB85D",
3797
+ ariaFilterToValue: "\uAC12\uAE4C\uC9C0 \uD544\uD130",
3798
+ ariaFilterValue: "\uD544\uD130 \uAC12",
3799
+ ariaFilterMenuOpen: "\uD544\uD130 \uBA54\uB274 \uC5F4\uAE30",
3800
+ ariaFilteringOperator: "\uD544\uD130\uB9C1 \uC5F0\uC0B0\uC790",
3801
+ ariaHidden: "\uC228\uAE40",
3802
+ ariaIndeterminate: "\uBD88\uD655\uC815",
3803
+ ariaInputEditor: "\uC785\uB825 \uC5D0\uB514\uD130",
3804
+ ariaMenuColumn: "\uC5F4 \uBA54\uB274\uB97C \uC5F4\uB824\uBA74 ALT \uC544\uB798\uB97C \uB204\uB974\uC138\uC694",
3805
+ ariaFilterColumn: "\uD544\uD130\uB97C \uC5F4\uB824\uBA74 CTRL ENTER\uB97C \uB204\uB974\uC138\uC694",
3806
+ ariaRowDeselect: "\uC774 \uD589\uC744 \uC120\uD0DD \uD574\uC81C\uD558\uB824\uBA74 SPACE\uB97C \uB204\uB974\uC138\uC694",
3807
+ ariaHeaderSelection: "\uD5E4\uB354 \uC120\uD0DD\uC774 \uC788\uB294 \uC5F4",
3808
+ ariaSelectAllCells: "\uC2A4\uD398\uC774\uC2A4\uBC14\uB97C \uB20C\uB7EC \uBAA8\uB4E0 \uC140 \uC120\uD0DD",
3809
+ ariaRowSelectAll: "\uBAA8\uB4E0 \uD589 \uC120\uD0DD \uC804\uD658\uC744 \uC704\uD574 SPACE\uB97C \uB204\uB974\uC138\uC694",
3810
+ ariaRowToggleSelection: "\uD589 \uC120\uD0DD\uC744 \uC804\uD658\uD558\uB824\uBA74 SPACE\uB97C \uB204\uB974\uC138\uC694",
3811
+ ariaRowSelect: "\uC774 \uD589\uC744 \uC120\uD0DD\uD558\uB824\uBA74 SPACE\uB97C \uB204\uB974\uC138\uC694",
3812
+ ariaRowSelectionDisabled: "\uC774 \uD589\uC758 \uD589 \uC120\uD0DD\uC774 \uBE44\uD65C\uC131\uD654\uB418\uC5C8\uC2B5\uB2C8\uB2E4",
3813
+ ariaSearch: "\uAC80\uC0C9",
3814
+ ariaSortableColumn: "\uC815\uB82C\uD558\uB824\uBA74 ENTER\uB97C \uB204\uB974\uC138\uC694",
3815
+ ariaToggleVisibility: "\uAC00\uC2DC\uC131\uC744 \uC804\uD658\uD558\uB824\uBA74 SPACE\uB97C \uB204\uB974\uC138\uC694",
3816
+ ariaToggleCellValue: "\uC140 \uAC12\uC744 \uC804\uD658\uD558\uB824\uBA74 SPACE\uB97C \uB204\uB974\uC138\uC694",
3817
+ ariaUnchecked: "\uC120\uD0DD \uD574\uC81C\uB428",
3818
+ ariaVisible: "\uBCF4\uC774\uB294",
3819
+ ariaSearchFilterValues: "\uD544\uD130 \uAC12 \uAC80\uC0C9",
3820
+ ariaPageSizeSelectorLabel: "\uD398\uC774\uC9C0 \uD06C\uAE30",
3821
+ ariaChartMenuClose: "\uCC28\uD2B8 \uD3B8\uC9D1 \uBA54\uB274 \uB2EB\uAE30",
3822
+ ariaChartSelected: "\uC120\uD0DD\uB428",
3823
+ ariaSkeletonCellLoadingFailed: "\uD589 \uB85C\uB4DC \uC2E4\uD328",
3824
+ ariaSkeletonCellLoading: "\uD589 \uB370\uC774\uD130 \uB85C\uB4DC \uC911",
3825
+ // ARIA Labels for Drop Zones
3826
+ ariaRowGroupDropZonePanelLabel: "\uD589 \uADF8\uB8F9",
3827
+ ariaValuesDropZonePanelLabel: "\uAC12",
3828
+ ariaPivotDropZonePanelLabel: "\uC5F4 \uB808\uC774\uBE14",
3829
+ ariaDropZoneColumnComponentDescription: "\uC81C\uAC70\uD558\uB824\uBA74 DELETE\uB97C \uB204\uB974\uC138\uC694",
3830
+ ariaDropZoneColumnValueItemDescription: "\uC9D1\uACC4 \uC720\uD615\uC744 \uBCC0\uACBD\uD558\uB824\uBA74 ENTER\uB97C \uB204\uB974\uC138\uC694",
3831
+ ariaDropZoneColumnGroupItemDescription: "\uC815\uB82C\uD558\uB824\uBA74 ENTER\uB97C \uB204\uB974\uC138\uC694",
3832
+ // used for aggregate drop zone, format: {aggregation}{ariaDropZoneColumnComponentAggFuncSeparator}{column name}
3833
+ ariaDropZoneColumnComponentAggFuncSeparator: " \uC758 ",
3834
+ ariaDropZoneColumnComponentSortAscending: "\uC624\uB984\uCC28\uC21C",
3835
+ ariaDropZoneColumnComponentSortDescending: "\uB0B4\uB9BC\uCC28\uC21C",
3836
+ ariaLabelDialog: "\uB300\uD654\uC0C1\uC790",
3837
+ ariaLabelColumnMenu: "\uCEEC\uB7FC \uBA54\uB274",
3838
+ ariaLabelColumnFilter: "\uCEEC\uB7FC \uD544\uD130",
3839
+ ariaLabelCellEditor: "\uC140 \uD3B8\uC9D1\uAE30",
3840
+ ariaLabelSelectField: "\uD544\uB4DC \uC120\uD0DD",
3841
+ ariaLabelLoadingContextMenu: "\uB85C\uB4DC \uC911\uC778 \uCEE8\uD14D\uC2A4\uD2B8 \uBA54\uB274",
3842
+ // aria labels for rich select
3843
+ ariaLabelRichSelectField: "\uB9AC\uCE58 \uC120\uD0DD \uD544\uB4DC",
3844
+ ariaLabelRichSelectToggleSelection: "\uC120\uD0DD\uC744 \uD1A0\uAE00\uD558\uB824\uBA74 SPACE\uB97C \uB204\uB974\uC138\uC694",
3845
+ ariaLabelRichSelectDeselectAllItems: "\uBAA8\uB4E0 \uD56D\uBAA9 \uC120\uD0DD \uD574\uC81C\uB97C \uC704\uD574 DELETE\uB97C \uB204\uB974\uC138\uC694",
3846
+ ariaLabelRichSelectDeleteSelection: "\uD56D\uBAA9 \uC120\uD0DD \uD574\uC81C\uB97C \uC704\uD574 DELETE\uB97C \uB204\uB974\uC138\uC694",
3847
+ ariaLabelTooltip: "\uD234\uD301",
3848
+ ariaLabelContextMenu: "\uCEE8\uD14D\uC2A4\uD2B8 \uBA54\uB274",
3849
+ ariaLabelSubMenu: "\uD558\uC704 \uBA54\uB274",
3850
+ ariaLabelAggregationFunction: "\uC9D1\uACC4 \uD568\uC218",
3851
+ ariaLabelAdvancedFilterAutocomplete: "\uACE0\uAE09 \uD544\uD130 \uC790\uB3D9 \uC644\uC131",
3852
+ ariaLabelAdvancedFilterBuilderAddField: "\uACE0\uAE09 \uD544\uD130 \uBE4C\uB354 \uD544\uB4DC \uCD94\uAC00",
3853
+ ariaLabelAdvancedFilterBuilderColumnSelectField: "\uACE0\uAE09 \uD544\uD130 \uBE4C\uB354 \uCE7C\uB7FC \uC120\uD0DD \uD544\uB4DC",
3854
+ ariaLabelAdvancedFilterBuilderOptionSelectField: "\uACE0\uAE09 \uD544\uD130 \uBE4C\uB354 \uC635\uC158 \uC120\uD0DD \uD544\uB4DC",
3855
+ ariaLabelAdvancedFilterBuilderJoinSelectField: "\uACE0\uAE09 \uD544\uD130 \uBE4C\uB354 \uC870\uC778 \uC5F0\uC0B0\uC790 \uC120\uD0DD \uD544\uB4DC",
3856
+ // ARIA Labels for the Side Bar
3857
+ ariaColumnPanelList: "\uC5F4 \uBAA9\uB85D",
3858
+ ariaFilterPanelList: "\uD544\uD130 \uBAA9\uB85D",
3859
+ // Number Format (Status Bar, Pagination Panel)
3860
+ thousandSeparator: ",",
3861
+ decimalSeparator: ".",
3862
+ // Data types
3863
+ true: "True",
3864
+ false: "False",
3865
+ invalidDate: "\uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 \uB0A0\uC9DC",
3866
+ invalidNumber: "\uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 \uC22B\uC790",
3867
+ january: "1\uC6D4",
3868
+ february: "2\uC6D4",
3869
+ march: "3\uC6D4",
3870
+ april: "4\uC6D4",
3871
+ may: "5\uC6D4",
3872
+ june: "6\uC6D4",
3873
+ july: "7\uC6D4",
3874
+ august: "8\uC6D4",
3875
+ september: "9\uC6D4",
3876
+ october: "10\uC6D4",
3877
+ november: "11\uC6D4",
3878
+ december: "12\uC6D4",
3879
+ // Time formats
3880
+ timeFormatSlashesDDMMYYYY: "DD/MM/YYYY",
3881
+ timeFormatSlashesMMDDYYYY: "MM/DD/YYYY",
3882
+ timeFormatSlashesDDMMYY: "DD/MM/YY",
3883
+ timeFormatSlashesMMDDYY: "MM/DD/YY",
3884
+ timeFormatDotsDDMYY: "DD.MM.YY",
3885
+ timeFormatDotsMDDYY: "M.DD.YY",
3886
+ timeFormatDashesYYYYMMDD: "YYYY-MM-DD",
3887
+ timeFormatSpacesDDMMMMYYYY: "DD MMMM YYYY",
3888
+ timeFormatHHMMSS: "HH:MM:SS",
3889
+ timeFormatHHMMSSAmPm: "HH:MM:SS \uC624\uC804/\uC624\uD6C4"
3890
+ };
3891
+
3892
+ // src/components/agGridTable/helpers.ts/getSortedColumnState.ts
3893
+ function getSortedColumnState(event, defaultSort) {
3894
+ const columnStateCol = event.api.getColumnState().find((s) => s.sort != null);
3895
+ if (!columnStateCol) return { value: defaultSort || "" };
3896
+ return {
3897
+ ...columnStateCol,
3898
+ value: columnStateCol?.sort === "asc" ? `-${columnStateCol.colId}` : columnStateCol?.colId
3899
+ };
3900
+ }
3901
+ ModuleRegistry.registerModules([AllCommunityModule, ClientSideRowModelModule]);
3902
+ var init = {
3903
+ containerStyle: {
3904
+ height: 300
3905
+ },
3906
+ rowHeight: 50,
3907
+ headerHeight: 40
3908
+ };
3909
+ var defaultAgGridTheme = themeQuartz.withParams({
3910
+ fontFamily: "var(--font-sans)",
3911
+ headerFontFamily: "var(--font-sans)",
3912
+ cellFontFamily: "var(--font-sans)",
3913
+ headerFontSize: "var(--text-h6)",
3914
+ headerFontWeight: "var(--text-h6--font-weight)",
3915
+ backgroundColor: "var(--color-sys-background)",
3916
+ foregroundColor: "var(--color-sys-foreground)",
3917
+ headerBackgroundColor: "var(--color-sys-table-header-background)",
3918
+ headerTextColor: "var(--color-sys-table-header-text)",
3919
+ borderColor: "var(--color-sys-table-row-border)",
3920
+ rowHoverColor: "var(--color-sys-table-hover)",
3921
+ selectedRowBackgroundColor: "var(--color-sys-table-select)",
3922
+ rowBorder: "solid 1px var(--color-sys-table-row-border)",
3923
+ columnBorder: false,
3924
+ headerColumnBorder: false,
3925
+ spacing: 8
3926
+ });
3927
+ function sanitizeAgGridClassName(className, theme) {
3928
+ if (!className || theme === "legacy") return className;
3929
+ return className.split(/\s+/).filter((token) => token && !token.startsWith("ag-theme-")).join(" ");
3930
+ }
3931
+ var AgGridTable = forwardRef(function AgGridTable2({ containerStyle, noRowsOverlayComponentContainerStyle, ...tableProps }, ref) {
3932
+ const isEmpty = useMemo(() => {
3933
+ return tableProps.rowData?.length === 0;
3934
+ }, [tableProps.rowData]);
3935
+ const containerHeight = useMemo(() => {
3936
+ try {
3937
+ if (tableProps.noRowsOverlayComponent && isEmpty) {
3938
+ return noRowsOverlayComponentContainerStyle?.height || init.containerStyle.height;
3939
+ } else if (tableProps.domLayout === "autoHeight") {
3940
+ return "auto";
3941
+ } else {
3942
+ return containerStyle?.height || init.containerStyle.height;
3943
+ }
3944
+ } catch {
3945
+ return init.containerStyle.height;
3946
+ }
3947
+ }, [containerStyle, isEmpty, noRowsOverlayComponentContainerStyle, tableProps]);
3948
+ const contextValue = useMemo(
3949
+ () => ({
3950
+ containerHeight,
3951
+ containerStyle,
3952
+ isEmpty,
3953
+ tableProps,
3954
+ ref
3955
+ }),
3956
+ [containerHeight, containerStyle, isEmpty, tableProps, ref]
3957
+ );
3958
+ if (tableProps.loading) {
3959
+ return /* @__PURE__ */ jsx(
3960
+ TableSkeleton,
3961
+ {
3962
+ columnDefs: tableProps.columnDefs,
3963
+ rowLength: tableProps.rowData?.length,
3964
+ rowHeight: tableProps.rowHeight ?? init.rowHeight,
3965
+ headerHeight: tableProps.headerHeight ?? init.headerHeight,
3966
+ selectionColumnWidth: tableProps.rowSelection ? tableProps.selectionColumnDef?.width ?? 42 : void 0
3967
+ }
3968
+ );
3969
+ }
3970
+ return /* @__PURE__ */ jsx(AgGridContextProvider, { value: contextValue, children: /* @__PURE__ */ jsx(AgGridContainer, { children: /* @__PURE__ */ jsx(AgGridContent, {}) }) });
3971
+ });
3972
+ function AgGridContent() {
3973
+ const { isEmpty, tableProps, ref } = useContext(AgGridContext);
3974
+ const className = sanitizeAgGridClassName(tableProps.className, tableProps.theme);
3975
+ const theme = tableProps.theme ?? defaultAgGridTheme;
3976
+ const {
3977
+ defaultColDef: userDefaultColDef,
3978
+ columnTypes: userColumnTypes,
3979
+ onCellKeyDown,
3980
+ onRowClicked,
3981
+ ...restTableProps
3982
+ } = tableProps;
3983
+ const handleCellKeyDown = (e) => {
3984
+ onCellKeyDown?.(e);
3985
+ const keyEvent = e.event;
3986
+ if (!onRowClicked || keyEvent?.key !== "Enter") return;
3987
+ const target = keyEvent.target;
3988
+ if (!target?.matches(".ag-cell, .ag-full-width-row")) return;
3989
+ onRowClicked({ ...e, type: "rowClicked" });
3990
+ };
3991
+ const mergedDefaultColDef = {
3992
+ ...userDefaultColDef,
3993
+ cellStyle: {
3994
+ display: "flex",
3995
+ alignItems: "center",
3996
+ ...userDefaultColDef?.cellStyle
3997
+ }
3998
+ };
3999
+ const mergedColumnTypes = useMemo(
4000
+ () => ({
4001
+ primary: { cellClass: "ag-cell-primary" },
4002
+ number: { headerClass: "ag-right-aligned-header", cellClass: "ag-right-aligned-cell" },
4003
+ ...userColumnTypes
4004
+ }),
4005
+ [userColumnTypes]
4006
+ );
4007
+ const columnDefs = useMemo(
4008
+ () => withTypeClasses(
4009
+ withHeaderMinWidth(
4010
+ withSortIconOffset(
4011
+ withExplicitSortIcons(withNumberColumnWidth(withFlexFill(restTableProps.columnDefs)))
4012
+ )
4013
+ ),
4014
+ mergedColumnTypes
4015
+ ),
4016
+ [restTableProps.columnDefs, mergedColumnTypes]
4017
+ );
4018
+ if (tableProps.noRowsOverlayComponent && isEmpty) {
4019
+ return /* @__PURE__ */ jsx(
4020
+ AgGridReact,
4021
+ {
4022
+ headerHeight: init.headerHeight,
4023
+ defaultColDef: mergedDefaultColDef,
4024
+ columnTypes: mergedColumnTypes,
4025
+ ref,
4026
+ ...restTableProps,
4027
+ columnDefs,
4028
+ onRowClicked,
4029
+ onCellKeyDown: handleCellKeyDown,
4030
+ theme,
4031
+ className,
4032
+ domLayout: "normal"
4033
+ }
4034
+ );
4035
+ }
4036
+ return /* @__PURE__ */ jsx(
4037
+ AgGridReact,
4038
+ {
4039
+ headerHeight: init.headerHeight,
4040
+ rowHeight: init.rowHeight,
4041
+ defaultColDef: mergedDefaultColDef,
4042
+ columnTypes: mergedColumnTypes,
4043
+ ref,
4044
+ animateRows: false,
4045
+ localeText: AG_GRID_LOCALE_KR,
4046
+ ...restTableProps,
4047
+ columnDefs,
4048
+ onRowClicked,
4049
+ onCellKeyDown: handleCellKeyDown,
4050
+ theme,
4051
+ className,
4052
+ rowClass: `${onRowClicked ? "ag-row-clickable" : ""} ${tableProps.rowClass || ""}`,
4053
+ selectionColumnDef: {
4054
+ ...tableProps.selectionColumnDef,
4055
+ headerComponent: tableProps.selectionColumnDef?.headerComponent ?? HeaderCheckboxRenderer,
4056
+ cellRenderer: tableProps.selectionColumnDef?.cellRenderer ?? RowCheckboxRenderer,
4057
+ cellClass: cn(
4058
+ "[&_.ag-selection-checkbox]:!hidden",
4059
+ tableProps.selectionColumnDef?.cellClass,
4060
+ "!flex items-center"
4061
+ ),
4062
+ headerClass: cn("[&_.ag-checkbox]:!hidden", tableProps.selectionColumnDef?.headerClass)
4063
+ }
4064
+ }
4065
+ );
4066
+ }
4067
+ function AgGridContainer({ children }) {
4068
+ const { containerHeight, containerStyle, isEmpty } = useContext(AgGridContext);
4069
+ return /* @__PURE__ */ jsx(
4070
+ "div",
4071
+ {
4072
+ className: cn(
4073
+ "ag-grid-container",
4074
+ "w-full h-[100px]",
4075
+ !isEmpty ? "ag-grid-container-auto-height-nonEmpty" : ""
4076
+ ),
4077
+ "data-is-empty": isEmpty ? "true" : "false",
4078
+ style: {
4079
+ width: "100%",
4080
+ "--ag-font-family": "var(--font-sans)",
4081
+ height: containerHeight,
4082
+ ...containerStyle
4083
+ },
4084
+ children
4085
+ }
4086
+ );
4087
+ }
4088
+ function HeaderCheckboxRenderer(props) {
4089
+ const [selectedCount, setSelectedCount] = useState(props.api.getSelectedRows().length);
4090
+ const totalCount = props.api.getDisplayedRowCount();
4091
+ useEffect(() => {
4092
+ const handler = () => setSelectedCount(props.api.getSelectedRows().length);
4093
+ props.api.addEventListener("selectionChanged", handler);
4094
+ return () => props.api.removeEventListener("selectionChanged", handler);
4095
+ }, [props.api]);
4096
+ const indeterminate = totalCount > 0 && selectedCount > 0 && selectedCount < totalCount;
4097
+ const handleChange = (newChecked) => {
4098
+ if (indeterminate) {
4099
+ props.api.selectAll("filtered");
4100
+ return;
4101
+ }
4102
+ if (newChecked) {
4103
+ props.api.selectAll();
4104
+ } else {
4105
+ props.api.deselectAll();
4106
+ }
4107
+ };
4108
+ return /* @__PURE__ */ jsx(
4109
+ Checkbox,
4110
+ {
4111
+ checked: selectedCount > 0,
4112
+ onCheckedChange: handleChange,
4113
+ indeterminate,
4114
+ "aria-label": "\uC804\uCCB4 \uD589 \uC120\uD0DD"
4115
+ }
4116
+ );
4117
+ }
4118
+ function RowCheckboxRenderer(params) {
4119
+ const [checked, setChecked] = useState(!!params.node.isSelected());
4120
+ useEffect(() => {
4121
+ const handler = () => setChecked(!!params.node.isSelected());
4122
+ params.api.addEventListener("selectionChanged", handler);
4123
+ return () => params.api.removeEventListener("selectionChanged", handler);
4124
+ }, [params.api, params.node]);
4125
+ return /* @__PURE__ */ jsx(
4126
+ Checkbox,
4127
+ {
4128
+ checked,
4129
+ onCheckedChange: (v) => params.node.setSelected(!!v),
4130
+ "aria-label": `${(params.node.rowIndex ?? 0) + 1}\uD589 \uC120\uD0DD`
4131
+ }
4132
+ );
4133
+ }
4134
+ function withExplicitSortIcons(defs) {
4135
+ if (!Array.isArray(defs)) return defs;
4136
+ return defs.map((d) => {
4137
+ if (d && typeof d === "object" && Array.isArray(d.children))
4138
+ return { ...d, children: withExplicitSortIcons(d.children) };
4139
+ if (d && typeof d === "object" && d.sortable === true && d.unSortIcon === void 0)
4140
+ return { ...d, unSortIcon: true };
4141
+ return d;
4142
+ });
4143
+ }
4144
+ var SORT_ICON_OFFSET_CLASS = "ag-cell-sort-offset";
4145
+ function withSortIconOffset(defs) {
4146
+ if (!Array.isArray(defs)) return defs;
4147
+ return defs.map((d) => {
4148
+ if (!d || typeof d !== "object") return d;
4149
+ if (Array.isArray(d.children)) return { ...d, children: withSortIconOffset(d.children) };
4150
+ if (!columnTypesOf(d).includes("number") || d.sortable !== true || d.unSortIcon !== true)
4151
+ return d;
4152
+ const cellClass = d.cellClass == null ? SORT_ICON_OFFSET_CLASS : mergeTypeClass(d.cellClass, [SORT_ICON_OFFSET_CLASS]);
4153
+ return cellClass === d.cellClass ? d : { ...d, cellClass };
4154
+ });
4155
+ }
4156
+ function estimateHeaderTextWidth(label) {
4157
+ let w = 0;
4158
+ for (const ch of label)
4159
+ w += /[\u1100-\u11FF\u3000-\u303F\u3130-\u318F\u4E00-\u9FFF\uAC00-\uD7AF\uFF00-\uFFEF]/.test(ch) ? 14 : 8;
4160
+ return w;
4161
+ }
4162
+ var HEADER_CELL_PADDING = 32;
4163
+ var HEADER_SORT_ICON = 24;
4164
+ var splitClasses = (v) => (Array.isArray(v) ? v : v.split(/\s+/)).filter(Boolean);
4165
+ function mergeTypeClass(own, fromTypes) {
4166
+ if (fromTypes.length === 0 || typeof own === "function") return own;
4167
+ if (own == null) return own;
4168
+ const list = splitClasses(own);
4169
+ const merged = [...list, ...fromTypes.filter((c) => !list.includes(c))];
4170
+ if (merged.length === list.length) return own;
4171
+ return Array.isArray(own) ? merged : merged.join(" ");
4172
+ }
4173
+ var isFlex = (d) => typeof d.flex === "number" && d.flex > 0;
4174
+ function withFlexFill(defs) {
4175
+ if (!Array.isArray(defs)) return defs;
4176
+ const visibleFlex = [];
4177
+ const collect = (list) => {
4178
+ for (const d of list) {
4179
+ if (!d || typeof d !== "object") continue;
4180
+ if (Array.isArray(d.children)) collect(d.children);
4181
+ else if (!d.hide && isFlex(d)) visibleFlex.push(d);
4182
+ }
4183
+ };
4184
+ collect(defs);
4185
+ if (visibleFlex.length === 0 || visibleFlex.some((d) => d.maxWidth == null)) return defs;
4186
+ const strip = (list) => list.map((d) => {
4187
+ if (!d || typeof d !== "object") return d;
4188
+ const c = d;
4189
+ if (Array.isArray(c.children)) return { ...c, children: strip(c.children) };
4190
+ if (c.hide || !isFlex(c)) return d;
4191
+ const rest = { ...c };
4192
+ delete rest.maxWidth;
4193
+ return rest;
4194
+ });
4195
+ return strip(defs);
4196
+ }
4197
+ var columnTypesOf = (d) => Array.isArray(d.type) ? d.type : typeof d.type === "string" ? [d.type] : [];
4198
+ var NUMBER_COLUMN_WIDTH = 140;
4199
+ function withNumberColumnWidth(defs) {
4200
+ if (!Array.isArray(defs)) return defs;
4201
+ return defs.map((d) => {
4202
+ if (!d || typeof d !== "object") return d;
4203
+ if (Array.isArray(d.children)) return { ...d, children: withNumberColumnWidth(d.children) };
4204
+ if (!columnTypesOf(d).includes("number")) return d;
4205
+ if (d.width != null || d.flex != null || d.minWidth != null || d.maxWidth != null) return d;
4206
+ return { ...d, width: NUMBER_COLUMN_WIDTH };
4207
+ });
4208
+ }
4209
+ function withTypeClasses(defs, columnTypes) {
4210
+ if (!Array.isArray(defs)) return defs;
4211
+ return defs.map((d) => {
4212
+ if (!d || typeof d !== "object") return d;
4213
+ if (Array.isArray(d.children))
4214
+ return { ...d, children: withTypeClasses(d.children, columnTypes) };
4215
+ const types = columnTypesOf(d);
4216
+ if (types.length === 0) return d;
4217
+ const collect = (key) => types.flatMap((t) => {
4218
+ const v = columnTypes[t]?.[key];
4219
+ return typeof v === "string" || Array.isArray(v) ? splitClasses(v) : [];
4220
+ });
4221
+ const cellClass = mergeTypeClass(d.cellClass, collect("cellClass"));
4222
+ const headerClass = mergeTypeClass(d.headerClass, collect("headerClass"));
4223
+ if (cellClass === d.cellClass && headerClass === d.headerClass) return d;
4224
+ return {
4225
+ ...d,
4226
+ ...cellClass !== d.cellClass ? { cellClass } : {},
4227
+ ...headerClass !== d.headerClass ? { headerClass } : {}
4228
+ };
4229
+ });
4230
+ }
4231
+ function withHeaderMinWidth(defs) {
4232
+ if (!Array.isArray(defs)) return defs;
4233
+ return defs.map((d) => {
4234
+ if (!d || typeof d !== "object") return d;
4235
+ if (Array.isArray(d.children)) return { ...d, children: withHeaderMinWidth(d.children) };
4236
+ if (typeof d.headerName !== "string" || d.headerName === "" || d.flex != null || d.wrapHeaderText)
4237
+ return d;
4238
+ let need = estimateHeaderTextWidth(d.headerName) + HEADER_CELL_PADDING + (d.sortable ? HEADER_SORT_ICON : 0);
4239
+ if (typeof d.maxWidth === "number") need = Math.min(need, d.maxWidth);
4240
+ const minWidth = Math.max(typeof d.minWidth === "number" ? d.minWidth : 0, need);
4241
+ const raiseWidth = typeof d.width === "number" && d.width < minWidth;
4242
+ if (minWidth === d.minWidth && !raiseWidth) return d;
4243
+ return { ...d, minWidth, ...raiseWidth ? { width: minWidth } : {} };
4244
+ });
4245
+ }
4246
+ function getByPath(data, path) {
4247
+ return path.split(".").reduce((o, k) => o == null ? void 0 : o[k], data);
4248
+ }
4249
+ function TwoLineCellRenderer(params) {
4250
+ const primary = params.valueFormatted ?? params.value;
4251
+ const secondary = params.secondaryField ? getByPath(params.data, params.secondaryField) : void 0;
4252
+ const hasSecondary = secondary !== void 0 && secondary !== null && secondary !== "";
4253
+ return /* @__PURE__ */ jsxs("div", { className: "flex w-full min-w-0 flex-col", children: [
4254
+ /* @__PURE__ */ jsx("span", { "data-slot": "cell-primary", className: "block truncate leading-[20px]", children: primary }),
4255
+ hasSecondary ? (
4256
+ // 보조 줄은 subtle(#4d5365): 12px 회색이 subtler 면 "small gray text" 로 읽힌다(13차 라벨 색과 같은 결정). 굵기는 주 열(semibold)을 따라가지 않게 regular
4257
+ /* @__PURE__ */ jsx(
4258
+ "span",
4259
+ {
4260
+ "data-slot": "cell-secondary",
4261
+ className: cn(
4262
+ "mt-[2px] block truncate text-small-regular text-sys-text-subtle",
4263
+ params.secondaryClassName
4264
+ ),
4265
+ children: String(secondary)
4266
+ }
4267
+ )
4268
+ ) : null
4269
+ ] });
4270
+ }
4271
+
4272
+ export { AG_GRID_LOCALE_KR, AgGridContext, AgGridTable, Alert, AlertActions, AlertDescription, AlertTitle, BADGE_OUTLINE_ACCENT, Badge, Button, Card, CardContent, CardDescription, CardFooter, CardHeader, CardThumbnail, CardTitle, Checkbox, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Drawer, DrawerBody, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuPortal, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyBoxIllustration, Form, FormControl, FormDescription, FormField, FormFooter, FormHeader, FormItem, FormLabel, FormMessage, FormSection, FormSectionLevelContext, FormValidMessage, HeaderCheckboxRenderer, IconButton, LucideIcon, NUMBER_COLUMN_CLASS, NUMBER_COLUMN_WIDTH, PageHeader, PageHeaderProvider, Pagination, PaginationContent, PaginationFirst, PaginationItem, PaginationLast, PaginationLink, PaginationNext, PaginationPrevious, PaginationWrapper, Panel, RowCheckboxRenderer, SORT_ICON_OFFSET_CLASS, Separator, Skeleton, SortIcon, Spinner, Stack, Table, TableBody, TableCell, TableHead, TableHeader, TablePagination, TableRow, TableSkeleton, Tabs, TabsContent, TabsList, TabsTrigger, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TwoLineCellRenderer, alignFromClassName, badgeVariants, buttonVariants, cn, estimateHeaderTextWidth, getPaginationRange, getSortedColumnState, sanitizeUserText, useFormControlContext, useFormField, usePageHeader, useRestoreFocusToOpener, withExplicitSortIcons, withFlexFill, withHeaderMinWidth, withNumberColumnWidth, withSortIconOffset, withTypeClasses };
4273
+ //# sourceMappingURL=chunk-IPF3K4BS.js.map
4274
+ //# sourceMappingURL=chunk-IPF3K4BS.js.map