@hivcd-printshop/design-system 1.1.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -54,6 +54,20 @@ var IconChevronDownXS = ({
54
54
  }
55
55
  );
56
56
  };
57
+ var IconCheck = ({ className, stroke }) => {
58
+ return /* @__PURE__ */ jsx(
59
+ "svg",
60
+ {
61
+ className,
62
+ width: "13",
63
+ height: "13",
64
+ viewBox: "0 0 13 13",
65
+ fill: "none",
66
+ xmlns: "http://www.w3.org/2000/svg",
67
+ children: /* @__PURE__ */ jsx("path", { d: "M2.05566 7.0555L4.83344 9.8333L10.9446 3.72217", stroke: stroke || "#121212" })
68
+ }
69
+ );
70
+ };
57
71
  var IconSearch = ({ className, stroke }) => {
58
72
  return /* @__PURE__ */ jsxs(
59
73
  "svg",
@@ -88,6 +102,32 @@ var IconSearch = ({ className, stroke }) => {
88
102
  }
89
103
  );
90
104
  };
105
+ var IconInfo = ({ className, stroke }) => {
106
+ return /* @__PURE__ */ jsxs(
107
+ "svg",
108
+ {
109
+ className,
110
+ width: "16",
111
+ height: "16",
112
+ viewBox: "0 0 16 16",
113
+ fill: "none",
114
+ xmlns: "http://www.w3.org/2000/svg",
115
+ children: [
116
+ /* @__PURE__ */ jsx("circle", { cx: "8", cy: "8", r: "6.25", stroke: stroke || "#8b94a1", strokeWidth: "1.5" }),
117
+ /* @__PURE__ */ jsx(
118
+ "path",
119
+ {
120
+ d: "M8 7.25V11.25",
121
+ stroke: stroke || "#8b94a1",
122
+ strokeWidth: "1.5",
123
+ strokeLinecap: "round"
124
+ }
125
+ ),
126
+ /* @__PURE__ */ jsx("circle", { cx: "8", cy: "5", r: "0.9", fill: stroke || "#8b94a1" })
127
+ ]
128
+ }
129
+ );
130
+ };
91
131
  var IconGoBack = ({ className, stroke }) => {
92
132
  return /* @__PURE__ */ jsxs(
93
133
  "svg",
@@ -174,15 +214,696 @@ var CTA = ({
174
214
  );
175
215
  };
176
216
 
177
- // src/components/createPost/CategorySegment.tsx
217
+ // src/components/Column/MultiColumn.tsx
178
218
  import { jsx as jsx4 } from "react/jsx-runtime";
219
+ var MultiColumnMain = ({ children, className }) => {
220
+ return /* @__PURE__ */ jsx4("div", { className: cn("flex flex-col w-full h-full", className), children });
221
+ };
222
+ var Columns = ({ children, className }) => {
223
+ return (
224
+ // flex 래퍼를 사용하고 하위 Column들이 flex-1을 가지게 하거나,
225
+ // grid를 사용하여 열을 나눌 수 있어. 여기서는 flex를 활용한 균등 분할 예시야.
226
+ /* @__PURE__ */ jsx4("div", { className: cn("flex w-full h-full divide-x divide-gray02", className), children })
227
+ );
228
+ };
229
+ var CTAs = ({ children, className }) => {
230
+ if (!children) return null;
231
+ return (
232
+ // CTA 버튼들을 중앙에 배치하는 예시 (우측 정렬이 필요하면 justify-end 사용)
233
+ /* @__PURE__ */ jsx4("div", { className: cn("flex flex-col w-full h-fit", className), children })
234
+ );
235
+ };
236
+ var MultiColumn = Object.assign(MultiColumnMain, {
237
+ Columns,
238
+ CTAs
239
+ });
240
+
241
+ // src/components/Column/Column.tsx
242
+ import { jsx as jsx5, jsxs as jsxs2 } from "react/jsx-runtime";
243
+ var Column = ({ className, children, header }) => {
244
+ return /* @__PURE__ */ jsxs2("div", { className: cn("flex flex-col gap-5", "h-full w-full px-5 pt-3 pb-8", className), children: [
245
+ header && /* @__PURE__ */ jsx5("h1", { className: cn("text-head3-medium text-primary font-bold"), children: header }),
246
+ children
247
+ ] });
248
+ };
249
+
250
+ // src/components/Column/ColumnContentContainer.tsx
251
+ import { jsx as jsx6 } from "react/jsx-runtime";
252
+ var ColumnContentContainer = ({ className, children }) => {
253
+ return /* @__PURE__ */ jsx6("div", { className: cn("flex flex-col gap-1.5 w-full h-fit", className), children });
254
+ };
255
+
256
+ // src/components/Column/ColumnLabel.tsx
257
+ import { jsx as jsx7, jsxs as jsxs3 } from "react/jsx-runtime";
258
+ var ColumnLabel = ({ className, children, subLabel, htmlFor }) => {
259
+ return /* @__PURE__ */ jsxs3("label", { htmlFor, className: cn("flex gap-1.5 items-end", className), children: [
260
+ /* @__PURE__ */ jsx7("span", { className: cn("text-body2-regular text-tertiary"), children }),
261
+ subLabel && /* @__PURE__ */ jsx7("span", { className: cn("text-caption-book text-quaternary"), children: subLabel })
262
+ ] });
263
+ };
264
+
265
+ // src/components/Column/ColumnText.tsx
266
+ import { jsx as jsx8 } from "react/jsx-runtime";
267
+ var ColumnTextStyle = "text-body3-book text-strong";
268
+ var ModalTextStyle = "text-body1-regular text-primary";
269
+ var ColumnText = ({ className, alert = false, children, onClick }) => {
270
+ return /* @__PURE__ */ jsx8("div", { className: cn(ColumnTextStyle, alert && "text-danger", className), onClick, children: children ? children : "-" });
271
+ };
272
+
273
+ // src/components/Column/ColumnSubTitle.tsx
274
+ import { jsx as jsx9, jsxs as jsxs4 } from "react/jsx-runtime";
275
+ var ColumnSubTitle = ({
276
+ className,
277
+ children,
278
+ action,
279
+ as: Tag2 = "h2"
280
+ }) => {
281
+ return /* @__PURE__ */ jsxs4(Tag2, { className: cn("flex items-center justify-between gap-1.5", "w-full", className), children: [
282
+ /* @__PURE__ */ jsx9("span", { className: cn("text-head3-medium text-strong"), children }),
283
+ action && /* @__PURE__ */ jsx9("span", { className: "flex shrink-0 items-center", children: action })
284
+ ] });
285
+ };
286
+
287
+ // src/components/Form/BasicFormField.tsx
288
+ import { jsx as jsx10, jsxs as jsxs5 } from "react/jsx-runtime";
289
+ var BasicFormField = ({
290
+ children,
291
+ isDanger,
292
+ dangerText,
293
+ className
294
+ }) => {
295
+ return /* @__PURE__ */ jsxs5("div", { className: cn("flex flex-col gap-1.5", className), children: [
296
+ children,
297
+ isDanger && dangerText && /* @__PURE__ */ jsx10("span", { className: "text-caption-book text-danger", children: dangerText })
298
+ ] });
299
+ };
300
+ var getInputStyles = (isDanger, additionalClass) => {
301
+ return cn(
302
+ "w-full h-10 px-3",
303
+ "box-border border border-gray02 focus:outline-none focus:border-black",
304
+ "bg-white hover:bg-gray00 transition-colors focus:hover:bg-white",
305
+ ColumnTextStyle,
306
+ "text-primary placeholder:text-quaternary",
307
+ isDanger && "border-danger",
308
+ // 에러 시 빨간 테두리
309
+ additionalClass
310
+ // 각 인풋별 추가 스타일 (예: textarea의 h-30)
311
+ );
312
+ };
313
+
314
+ // src/components/Form/FormText.tsx
315
+ import { jsx as jsx11 } from "react/jsx-runtime";
316
+ var FormText = ({ className, isDanger, dangerText, ...props }) => {
317
+ return /* @__PURE__ */ jsx11(BasicFormField, { isDanger, dangerText, children: /* @__PURE__ */ jsx11("input", { type: "text", className: getInputStyles(isDanger, className), ...props }) });
318
+ };
319
+
320
+ // src/components/Form/FormTextArea.tsx
321
+ import { jsx as jsx12 } from "react/jsx-runtime";
322
+ var FormTextArea = ({ className, isDanger, dangerText, ...props }) => {
323
+ return /* @__PURE__ */ jsx12(BasicFormField, { isDanger, dangerText, children: /* @__PURE__ */ jsx12(
324
+ "textarea",
325
+ {
326
+ className: getInputStyles(isDanger, "resize-none h-30 py-2.5 " + (className || "")),
327
+ ...props
328
+ }
329
+ ) });
330
+ };
331
+
332
+ // src/components/Form/FormNumber.tsx
333
+ import { jsx as jsx13 } from "react/jsx-runtime";
334
+ var FormNumber = ({ className, isDanger, dangerText, ...props }) => {
335
+ return /* @__PURE__ */ jsx13(BasicFormField, { isDanger, dangerText, children: /* @__PURE__ */ jsx13("input", { type: "number", className: getInputStyles(isDanger, className), ...props }) });
336
+ };
337
+
338
+ // src/components/Form/FormPassword.tsx
339
+ import { jsx as jsx14 } from "react/jsx-runtime";
340
+ var FormPassword = ({ className, isDanger, dangerText, ...props }) => {
341
+ return /* @__PURE__ */ jsx14(BasicFormField, { isDanger, dangerText, children: /* @__PURE__ */ jsx14("input", { type: "password", className: getInputStyles(isDanger, className), ...props }) });
342
+ };
343
+
344
+ // src/components/Form/FormTel.tsx
345
+ import { jsx as jsx15 } from "react/jsx-runtime";
346
+ var FormTel = ({ className, isDanger, dangerText, onChange, ...props }) => {
347
+ const handlePhoneChange = (e) => {
348
+ const rawValue = e.target.value.replace(/[^0-9]/g, "");
349
+ let formattedValue = "";
350
+ if (rawValue.length < 4) formattedValue = rawValue;
351
+ else if (rawValue.length < 8) formattedValue = `${rawValue.slice(0, 3)}-${rawValue.slice(3)}`;
352
+ else
353
+ formattedValue = `${rawValue.slice(0, 3)}-${rawValue.slice(3, 7)}-${rawValue.slice(7, 11)}`;
354
+ e.target.value = formattedValue;
355
+ if (onChange) onChange(e);
356
+ };
357
+ return /* @__PURE__ */ jsx15(BasicFormField, { isDanger, dangerText, children: /* @__PURE__ */ jsx15(
358
+ "input",
359
+ {
360
+ type: "tel",
361
+ className: getInputStyles(isDanger, className),
362
+ onChange: handlePhoneChange,
363
+ maxLength: 13,
364
+ ...props
365
+ }
366
+ ) });
367
+ };
368
+
369
+ // src/components/Form/FormColor.tsx
370
+ import { useState } from "react";
371
+ import { jsx as jsx16, jsxs as jsxs6 } from "react/jsx-runtime";
372
+ var FormColor = ({
373
+ className,
374
+ isDanger,
375
+ dangerText,
376
+ value,
377
+ defaultValue = "#000000",
378
+ onChange,
379
+ ...props
380
+ }) => {
381
+ const [internalColor, setInternalColor] = useState(
382
+ value || defaultValue || "#000000"
383
+ );
384
+ const color = value !== void 0 ? value : internalColor;
385
+ const handleColorChange = (e) => {
386
+ setInternalColor(e.target.value);
387
+ onChange?.(e);
388
+ };
389
+ return /* @__PURE__ */ jsx16(BasicFormField, { isDanger, dangerText, children: /* @__PURE__ */ jsxs6(
390
+ "label",
391
+ {
392
+ className: getInputStyles(
393
+ isDanger,
394
+ // 💡 focus-within을 통해 내부 <input>이 포커스될 때 부모(label)의 테두리와 배경 변경!
395
+ "flex items-center gap-2 relative focus-within:border-black focus-within:hover:bg-white" + (className || "")
396
+ ),
397
+ children: [
398
+ /* @__PURE__ */ jsx16("div", { className: "w-6 h-6 shrink-0 overflow-hidden", style: { backgroundColor: color }, children: /* @__PURE__ */ jsx16(
399
+ "input",
400
+ {
401
+ type: "color",
402
+ value: color,
403
+ onChange: handleColorChange,
404
+ className: "absolute inset-0 w-full h-full opacity-0",
405
+ ...props
406
+ }
407
+ ) }),
408
+ /* @__PURE__ */ jsx16("span", { className: "text-primary text-body3-regular uppercase flex-1 select-none", children: color })
409
+ ]
410
+ }
411
+ ) });
412
+ };
413
+
414
+ // src/components/Form/FormFile.tsx
415
+ import { useState as useState2 } from "react";
416
+ import { jsx as jsx17, jsxs as jsxs7 } from "react/jsx-runtime";
417
+ var FormFile = ({
418
+ className,
419
+ isDanger,
420
+ dangerText,
421
+ placeholder = "\uD30C\uC77C\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694",
422
+ fileUrl,
423
+ filename,
424
+ onChange,
425
+ ...props
426
+ }) => {
427
+ const [selectedFile, setSelectedFile] = useState2(null);
428
+ const handleFileChange = (e) => {
429
+ const originalFile = e.target.files?.[0];
430
+ if (!originalFile) {
431
+ setSelectedFile(null);
432
+ onChange?.(e);
433
+ return;
434
+ }
435
+ let finalFile = originalFile;
436
+ if (filename) {
437
+ const lastDotIndex = originalFile.name.lastIndexOf(".");
438
+ const extension = lastDotIndex !== -1 ? originalFile.name.slice(lastDotIndex) : "";
439
+ const newFileName = filename.endsWith(extension) ? filename : `${filename}${extension}`;
440
+ finalFile = new File([originalFile], newFileName, {
441
+ type: originalFile.type,
442
+ lastModified: originalFile.lastModified
443
+ });
444
+ try {
445
+ const dataTransfer = new DataTransfer();
446
+ dataTransfer.items.add(finalFile);
447
+ e.target.files = dataTransfer.files;
448
+ } catch (err) {
449
+ console.warn("DataTransfer\uB97C \uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 \uBE0C\uB77C\uC6B0\uC800\uC785\uB2C8\uB2E4.", err);
450
+ }
451
+ }
452
+ setSelectedFile(finalFile);
453
+ onChange?.(e);
454
+ };
455
+ const handleDownload = (e) => {
456
+ e.preventDefault();
457
+ e.stopPropagation();
458
+ if (selectedFile) {
459
+ const url = URL.createObjectURL(selectedFile);
460
+ const a = document.createElement("a");
461
+ a.href = url;
462
+ a.download = selectedFile.name;
463
+ document.body.appendChild(a);
464
+ a.click();
465
+ document.body.removeChild(a);
466
+ URL.revokeObjectURL(url);
467
+ } else if (fileUrl) {
468
+ const a = document.createElement("a");
469
+ a.href = fileUrl;
470
+ a.download = fileUrl.split("/").pop() || "download";
471
+ a.target = "_blank";
472
+ document.body.appendChild(a);
473
+ a.click();
474
+ document.body.removeChild(a);
475
+ }
476
+ };
477
+ const displayFileName = selectedFile?.name || (fileUrl ? fileUrl.split("/").pop() : null);
478
+ return /* @__PURE__ */ jsx17(BasicFormField, { isDanger, dangerText, children: /* @__PURE__ */ jsxs7(
479
+ "div",
480
+ {
481
+ className: getInputStyles(
482
+ isDanger,
483
+ "active:bg-gray00 flex items-center gap-2 justify-between " + (className || "")
484
+ ),
485
+ children: [
486
+ /* @__PURE__ */ jsx17(
487
+ "div",
488
+ {
489
+ className: `truncate flex-1 max-w-50 w-full ${displayFileName ? "text-primary" : "text-quaternary"}`,
490
+ children: displayFileName ? /* @__PURE__ */ jsx17(
491
+ "span",
492
+ {
493
+ onClick: handleDownload,
494
+ className: "w-full underline text-primary cursor-pointer hover:text-black transition-colors",
495
+ title: `${displayFileName} \uB2E4\uC6B4\uB85C\uB4DC`,
496
+ children: displayFileName
497
+ }
498
+ ) : /* @__PURE__ */ jsx17("span", { className: "w-full", children: placeholder })
499
+ }
500
+ ),
501
+ /* @__PURE__ */ jsxs7("label", { className: "px-1 -mx-1 cursor-pointer", children: [
502
+ /* @__PURE__ */ jsx17("div", { className: "text-primary text-caption-regular underline", children: "\uD30C\uC77C \uCCA8\uBD80" }),
503
+ /* @__PURE__ */ jsx17("input", { type: "file", className: "hidden", onChange: handleFileChange, ...props })
504
+ ] })
505
+ ]
506
+ }
507
+ ) });
508
+ };
509
+
510
+ // src/components/Form/FormCheckBox.tsx
511
+ import { jsx as jsx18, jsxs as jsxs8 } from "react/jsx-runtime";
512
+ var FormCheckBox = ({
513
+ isChecked,
514
+ setIsChecked,
515
+ children,
516
+ className,
517
+ textStyle,
518
+ ...props
519
+ }) => {
520
+ return /* @__PURE__ */ jsxs8(
521
+ "label",
522
+ {
523
+ className: cn(
524
+ "w-fit h-fit pr-1",
525
+ "flex items-center gap-1",
526
+ "hover:bg-gray00 active:bg-gray01 transition-colors",
527
+ "cursor-pointer select-none",
528
+ // 💡 1. 텍스트 드래그 방지 추가
529
+ className
530
+ ),
531
+ children: [
532
+ /* @__PURE__ */ jsx18(
533
+ "input",
534
+ {
535
+ type: "checkbox",
536
+ checked: isChecked,
537
+ onChange: (e) => setIsChecked(e.target.checked),
538
+ className: "sr-only peer",
539
+ ...props
540
+ }
541
+ ),
542
+ /* @__PURE__ */ jsx18("div", { className: "flex items-center justify-center w-5 h-5 shrink-0", children: /* @__PURE__ */ jsx18(
543
+ "div",
544
+ {
545
+ className: cn(
546
+ "w-[15px] h-[15px]",
547
+ "box-border border",
548
+ "flex items-center justify-center transition-colors duration-200",
549
+ // 💡 3. 키보드 Tab 이동 시 접근성 향상 (포커스 링 표시)
550
+ "peer-focus-visible:ring-2 peer-focus-visible:ring-black peer-focus-visible:ring-offset-1"
551
+ ),
552
+ children: isChecked && /* @__PURE__ */ jsx18(IconCheck, {})
553
+ }
554
+ ) }),
555
+ children && /* @__PURE__ */ jsx18("span", { className: cn(ColumnTextStyle, textStyle), children })
556
+ ]
557
+ }
558
+ );
559
+ };
560
+
561
+ // src/components/Form/FormSelectBox.tsx
562
+ import { useEffect, useRef, useState as useState3 } from "react";
563
+
564
+ // src/components/Form/SelectBoxOption.tsx
565
+ import { jsx as jsx19 } from "react/jsx-runtime";
566
+ var SelectBoxOption = ({
567
+ label,
568
+ onClick,
569
+ // selectedLabel,
570
+ className
571
+ }) => {
572
+ return /* @__PURE__ */ jsx19(
573
+ "li",
574
+ {
575
+ onClick,
576
+ className: cn(
577
+ "w-full h-11 px-3 shrink-0",
578
+ "flex items-center justify-start",
579
+ // "box-border border-b border-gray02",
580
+ "text-body3-book text-primary",
581
+ "bg-white hover:bg-gray00 active:bg-gray01",
582
+ // isSelected
583
+ // ? "bg-black text-white"
584
+ // : "",
585
+ className
586
+ ),
587
+ children: label
588
+ }
589
+ );
590
+ };
591
+
592
+ // src/components/Form/FormSelectBox.tsx
593
+ import { jsx as jsx20, jsxs as jsxs9 } from "react/jsx-runtime";
594
+ var FormSelectBox = ({
595
+ options,
596
+ value,
597
+ onChange,
598
+ placeholder = "\uC120\uD0DD\uD574\uC8FC\uC138\uC694",
599
+ isDanger,
600
+ dangerText,
601
+ className
602
+ }) => {
603
+ const [isOpen, setIsOpen] = useState3(false);
604
+ const containerRef = useRef(null);
605
+ useEffect(() => {
606
+ const handleClickOutside = (event) => {
607
+ if (containerRef.current && !containerRef.current.contains(event.target)) {
608
+ setIsOpen(false);
609
+ }
610
+ };
611
+ document.addEventListener("mousedown", handleClickOutside);
612
+ return () => {
613
+ document.removeEventListener("mousedown", handleClickOutside);
614
+ };
615
+ }, []);
616
+ return /* @__PURE__ */ jsx20(BasicFormField, { isDanger, dangerText, children: /* @__PURE__ */ jsxs9("div", { ref: containerRef, className: "relative w-full", children: [
617
+ /* @__PURE__ */ jsxs9(
618
+ "div",
619
+ {
620
+ tabIndex: 0,
621
+ className: getInputStyles(
622
+ isDanger,
623
+ cn(
624
+ "flex items-center justify-between cursor-pointer select-none",
625
+ isOpen && "border-black",
626
+ // 💡 열려있을 때는 테두리를 검은색으로 고정 (포커스 효과)
627
+ className
628
+ )
629
+ ),
630
+ onClick: (e) => {
631
+ if (isOpen) {
632
+ e.currentTarget.blur();
633
+ }
634
+ setIsOpen((prev) => !prev);
635
+ },
636
+ children: [
637
+ /* @__PURE__ */ jsx20("span", { className: value ? "text-primary" : "text-quaternary", children: value || placeholder }),
638
+ /* @__PURE__ */ jsx20(
639
+ IconChevronDownXS,
640
+ {
641
+ className: cn("text-gray06 transition-transform", isOpen && "rotate-180"),
642
+ stroke: "currentColor"
643
+ }
644
+ )
645
+ ]
646
+ }
647
+ ),
648
+ isOpen && /* @__PURE__ */ jsx20(
649
+ "ul",
650
+ {
651
+ className: cn(
652
+ "absolute top-full left-0 right-0 z-10",
653
+ // 💡 Input 바로 아래에 띄움
654
+ "box-border border border-gray02 bg-white flex flex-col",
655
+ "max-h-50 overflow-y-auto shadow-sm"
656
+ // 💡 항목이 너무 많으면 스크롤 생성
657
+ ),
658
+ children: options.map((option) => /* @__PURE__ */ jsx20(
659
+ SelectBoxOption,
660
+ {
661
+ label: option,
662
+ onClick: () => {
663
+ onChange(option);
664
+ setIsOpen(false);
665
+ }
666
+ },
667
+ option
668
+ ))
669
+ }
670
+ )
671
+ ] }) });
672
+ };
673
+
674
+ // src/components/TextButton/TextButton.tsx
675
+ import { Fragment, jsx as jsx21, jsxs as jsxs10 } from "react/jsx-runtime";
676
+ var TextButton = ({
677
+ children,
678
+ icon,
679
+ iconPosition = "left",
680
+ alert = false,
681
+ underline = true,
682
+ className,
683
+ ...props
684
+ }) => {
685
+ const content = /* @__PURE__ */ jsxs10(Fragment, { children: [
686
+ icon && iconPosition === "left" && /* @__PURE__ */ jsx21("span", { className: "flex shrink-0 items-center", children: icon }),
687
+ /* @__PURE__ */ jsx21("span", { className: cn(underline && "underline underline-offset-2"), children }),
688
+ icon && iconPosition === "right" && /* @__PURE__ */ jsx21("span", { className: "flex shrink-0 items-center", children: icon })
689
+ ] });
690
+ const classes = cn(
691
+ "inline-flex w-fit items-center gap-1 px-1 -mx-1",
692
+ "text-caption-book",
693
+ alert ? "text-danger" : "text-tertiary",
694
+ "hover:bg-gray00 active:bg-gray01 transition-colors",
695
+ alert ? "hover:text-danger" : "hover:text-primary",
696
+ "cursor-pointer select-none",
697
+ "disabled:cursor-default disabled:text-quaternary disabled:hover:bg-transparent",
698
+ "aria-disabled:cursor-default aria-disabled:text-quaternary aria-disabled:hover:bg-transparent",
699
+ className
700
+ );
701
+ if (props.href !== void 0) {
702
+ const { href, ...rest } = props;
703
+ return /* @__PURE__ */ jsx21("a", { href, className: classes, ...rest, children: content });
704
+ }
705
+ const buttonProps = props;
706
+ return /* @__PURE__ */ jsx21("button", { type: "button", className: classes, ...buttonProps, children: content });
707
+ };
708
+
709
+ // src/components/Dropdown/Dropdown.tsx
710
+ import { useEffect as useEffect2, useRef as useRef2, useState as useState4 } from "react";
711
+ import { jsx as jsx22, jsxs as jsxs11 } from "react/jsx-runtime";
712
+ var Dropdown = ({ selectedLabel, setSelectedLabel, labels, className }) => {
713
+ const [isOpen, setIsOpen] = useState4(false);
714
+ const containerRef = useRef2(null);
715
+ useEffect2(() => {
716
+ const handleClickOutside = (event) => {
717
+ if (containerRef.current && !containerRef.current.contains(event.target)) {
718
+ setIsOpen(false);
719
+ }
720
+ };
721
+ document.addEventListener("mousedown", handleClickOutside);
722
+ return () => {
723
+ document.removeEventListener("mousedown", handleClickOutside);
724
+ };
725
+ }, []);
726
+ return /* @__PURE__ */ jsxs11("div", { ref: containerRef, className: "relative", children: [
727
+ /* @__PURE__ */ jsxs11(
728
+ "div",
729
+ {
730
+ className: cn(
731
+ "w-fit h-fit px-2 py-1",
732
+ "flex items-center justify-center gap-1.5",
733
+ "text-body3-book text-strong",
734
+ "bg-white hover:bg-gray00 active:bg-gray01",
735
+ "cursor-pointer",
736
+ className
737
+ ),
738
+ onClick: () => setIsOpen((prev) => !prev),
739
+ children: [
740
+ /* @__PURE__ */ jsx22("p", { children: selectedLabel }),
741
+ /* @__PURE__ */ jsx22(
742
+ IconChevronDownXS,
743
+ {
744
+ className: cn("text-gray06 transition-transform", isOpen && "rotate-180"),
745
+ stroke: "currentColor"
746
+ }
747
+ )
748
+ ]
749
+ }
750
+ ),
751
+ isOpen && /* @__PURE__ */ jsx22("div", { className: cn("absolute top-full right-0 z-10", "box-border border border-gray02"), children: labels.map((label) => /* @__PURE__ */ jsx22(
752
+ SelectBoxOption,
753
+ {
754
+ label,
755
+ onClick: () => {
756
+ setSelectedLabel(label);
757
+ setIsOpen(false);
758
+ },
759
+ className: "w-44 h-11 justify-center"
760
+ },
761
+ label
762
+ )) })
763
+ ] });
764
+ };
765
+
766
+ // src/components/ListView/List.tsx
767
+ import { jsx as jsx23, jsxs as jsxs12 } from "react/jsx-runtime";
768
+ function List({
769
+ className,
770
+ label1,
771
+ label2,
772
+ label2OnClick,
773
+ label3,
774
+ disabled = false,
775
+ selected = false,
776
+ onClick,
777
+ children,
778
+ ...props
779
+ }) {
780
+ return /* @__PURE__ */ jsxs12(
781
+ "li",
782
+ {
783
+ className: cn(
784
+ "w-full min-w-fit h-13 pl-4 pr-6",
785
+ "grid grid-cols-[4fr_1fr_1fr] items-center gap-4",
786
+ "bg-white hover:bg-gray00 hover:has-[.has-clickable:hover]:bg-white active:bg-gray01",
787
+ "text-primary select-none [&_*]:cursor-pointer cursor-pointer",
788
+ disabled && "opacity-40 [&_*]:cursor-pointer cursor-pointer",
789
+ selected && "bg-black text-white hover:bg-black active:bg-black hover:has-[.has-clickable:hover]:bg-black",
790
+ className
791
+ ),
792
+ ...props,
793
+ onClick,
794
+ children: [
795
+ /* @__PURE__ */ jsxs12("section", { className: cn("flex items-center gap-4"), children: [
796
+ /* @__PURE__ */ jsx23("label", { className: cn("text-body2-regular"), children: label1 ? label1 : "-" }),
797
+ /* @__PURE__ */ jsx23("div", { className: cn("flex items-center gap-2"), children })
798
+ ] }),
799
+ /* @__PURE__ */ jsx23(
800
+ "label",
801
+ {
802
+ className: cn(
803
+ "text-body3-book truncate p-1 w-fit",
804
+ label2OnClick && "underline has-clickable",
805
+ label2OnClick && !selected && "hover:bg-gray00"
806
+ ),
807
+ onClick: label2OnClick,
808
+ children: label2 ? label2 : "-"
809
+ }
810
+ ),
811
+ /* @__PURE__ */ jsx23("label", { className: cn("text-body3-regular text-right"), children: label3 ? label3 : "-" })
812
+ ]
813
+ }
814
+ );
815
+ }
816
+
817
+ // src/components/Modal/Modal.tsx
818
+ import { jsx as jsx24, jsxs as jsxs13 } from "react/jsx-runtime";
819
+ var ModalBase = ({ isVisible, header, children, className }) => {
820
+ if (!isVisible) return null;
821
+ return /* @__PURE__ */ jsx24("div", { className: cn("fixed inset-0 z-50 pointer-events-auto"), children: /* @__PURE__ */ jsx24(
822
+ "div",
823
+ {
824
+ className: cn("fixed inset-0 z-1001 flex items-center justify-center pointer-events-auto"),
825
+ children: /* @__PURE__ */ jsxs13(
826
+ "main",
827
+ {
828
+ className: cn(
829
+ "w-110 pt-8 h-fit",
830
+ "flex flex-col items-center",
831
+ "border border-gray02",
832
+ "bg-white shadow-[0 0 30px 0 rgba(0, 0, 0, 0.08);]",
833
+ className
834
+ ),
835
+ children: [
836
+ /* @__PURE__ */ jsx24("h1", { className: cn("text-strong font-[500] text-[24px] leading-[32px]"), children: header }),
837
+ children
838
+ ]
839
+ }
840
+ )
841
+ }
842
+ ) });
843
+ };
844
+ var Contents = ({ children, className }) => {
845
+ return /* @__PURE__ */ jsx24(
846
+ "div",
847
+ {
848
+ className: cn(
849
+ "flex flex-col items-center gap-8",
850
+ "w-full h-fit",
851
+ "px-14 pt-8 pb-9",
852
+ className
853
+ ),
854
+ children
855
+ }
856
+ );
857
+ };
858
+ var CTAs2 = ({ children, className, row = false }) => {
859
+ if (!children) return null;
860
+ return (
861
+ // CTA 버튼들을 중앙에 배치하는 예시 (우측 정렬이 필요하면 justify-end 사용)
862
+ /* @__PURE__ */ jsx24(
863
+ "div",
864
+ {
865
+ className: cn(
866
+ "flex flex-col w-full h-fit",
867
+ row && "flex-row divide-x divide-gray02",
868
+ className
869
+ ),
870
+ children
871
+ }
872
+ )
873
+ );
874
+ };
875
+ var Modal = Object.assign(ModalBase, {
876
+ Contents,
877
+ CTAs: CTAs2
878
+ });
879
+
880
+ // src/components/Modal/ModalText.tsx
881
+ import { jsx as jsx25 } from "react/jsx-runtime";
882
+ var ModalText = ({ children, className }) => {
883
+ return /* @__PURE__ */ jsx25(
884
+ "div",
885
+ {
886
+ className: cn(
887
+ "flex flex-col items-center",
888
+ "mt-[-20px] mb-[-4px]",
889
+ ModalTextStyle,
890
+ "text-tertiary text-center",
891
+ className
892
+ ),
893
+ children
894
+ }
895
+ );
896
+ };
897
+
898
+ // src/components/createPost/CategorySegment.tsx
899
+ import { jsx as jsx26 } from "react/jsx-runtime";
179
900
  var CategorySegment = ({
180
901
  selected = false,
181
902
  label,
182
903
  className,
183
904
  onClick
184
905
  }) => {
185
- return /* @__PURE__ */ jsx4(
906
+ return /* @__PURE__ */ jsx26(
186
907
  "div",
187
908
  {
188
909
  className: cn(
@@ -202,7 +923,7 @@ var CategorySegment = ({
202
923
  };
203
924
 
204
925
  // src/components/createPost/CategorySegmentedControl.tsx
205
- import { jsx as jsx5, jsxs as jsxs2 } from "react/jsx-runtime";
926
+ import { jsx as jsx27, jsxs as jsxs14 } from "react/jsx-runtime";
206
927
  var categorySegments = {
207
928
  info: ["\uACF5\uC6A9 \uBB3C\uD488", "\uC77C\uBC18 \uAE30\uC790\uC7AC", "\uD2B9\uC218 \uAE30\uC790\uC7AC"],
208
929
  archive: ["\uD504\uB9B0\uD2B8\uC2E4", "\uD64D\uC775\uC2DC\uB514"],
@@ -216,8 +937,8 @@ var CategorySegmentedControl = ({
216
937
  className
217
938
  }) => {
218
939
  const segments = categorySegments[variable];
219
- return /* @__PURE__ */ jsxs2("div", { className: cn("w-full h-fit flex items-center justify-start", className), children: [
220
- /* @__PURE__ */ jsx5(
940
+ return /* @__PURE__ */ jsxs14("div", { className: cn("w-full h-fit flex items-center justify-start", className), children: [
941
+ /* @__PURE__ */ jsx27(
221
942
  "div",
222
943
  {
223
944
  className: cn(
@@ -230,7 +951,7 @@ var CategorySegmentedControl = ({
230
951
  children: variable === "infoTag" ? "\uD0DC\uADF8 \uC120\uD0DD" : "\uCE74\uD14C\uACE0\uB9AC \uC120\uD0DD"
231
952
  }
232
953
  ),
233
- segments.map((label) => /* @__PURE__ */ jsx5(
954
+ segments.map((label) => /* @__PURE__ */ jsx27(
234
955
  CategorySegment,
235
956
  {
236
957
  label,
@@ -243,9 +964,9 @@ var CategorySegmentedControl = ({
243
964
  };
244
965
 
245
966
  // src/components/createPost/TitleInput.tsx
246
- import { jsx as jsx6 } from "react/jsx-runtime";
967
+ import { jsx as jsx28 } from "react/jsx-runtime";
247
968
  var TitleInput = ({ title, onChange, className }) => {
248
- return /* @__PURE__ */ jsx6(
969
+ return /* @__PURE__ */ jsx28(
249
970
  "input",
250
971
  {
251
972
  type: "text",
@@ -265,9 +986,9 @@ var TitleInput = ({ title, onChange, className }) => {
265
986
  };
266
987
 
267
988
  // src/components/notice/NoticeBadge.tsx
268
- import { jsx as jsx7 } from "react/jsx-runtime";
989
+ import { jsx as jsx29 } from "react/jsx-runtime";
269
990
  var NoticeBadge = ({ variable, className, onClick }) => {
270
- return /* @__PURE__ */ jsx7(
991
+ return /* @__PURE__ */ jsx29(
271
992
  "button",
272
993
  {
273
994
  type: "button",
@@ -288,7 +1009,7 @@ var NoticeBadge = ({ variable, className, onClick }) => {
288
1009
  };
289
1010
 
290
1011
  // src/components/notice/NoticeBar.tsx
291
- import { jsx as jsx8, jsxs as jsxs3 } from "react/jsx-runtime";
1012
+ import { jsx as jsx30, jsxs as jsxs15 } from "react/jsx-runtime";
292
1013
  var NoticeBar = ({
293
1014
  variable = "default",
294
1015
  badgeVariable,
@@ -297,7 +1018,7 @@ var NoticeBar = ({
297
1018
  className,
298
1019
  onClick
299
1020
  }) => {
300
- return /* @__PURE__ */ jsxs3(
1021
+ return /* @__PURE__ */ jsxs15(
301
1022
  "div",
302
1023
  {
303
1024
  className: cn(
@@ -309,20 +1030,20 @@ var NoticeBar = ({
309
1030
  ),
310
1031
  onClick,
311
1032
  children: [
312
- /* @__PURE__ */ jsxs3("section", { className: "flex items-center gap-3", children: [
313
- /* @__PURE__ */ jsx8(NoticeBadge, { variable: badgeVariable }),
314
- /* @__PURE__ */ jsx8("h1", { className: "text-head1-medium text-strong", children: title })
1033
+ /* @__PURE__ */ jsxs15("section", { className: "flex items-center gap-3", children: [
1034
+ /* @__PURE__ */ jsx30(NoticeBadge, { variable: badgeVariable }),
1035
+ /* @__PURE__ */ jsx30("h1", { className: "text-head1-medium text-strong", children: title })
315
1036
  ] }),
316
- /* @__PURE__ */ jsx8("p", { className: "text-body3-book text-tertiary", children: date })
1037
+ /* @__PURE__ */ jsx30("p", { className: "text-body3-book text-tertiary", children: date })
317
1038
  ]
318
1039
  }
319
1040
  );
320
1041
  };
321
1042
 
322
1043
  // src/components/SearchBar/SearchBar.tsx
323
- import { jsx as jsx9, jsxs as jsxs4 } from "react/jsx-runtime";
1044
+ import { jsx as jsx31, jsxs as jsxs16 } from "react/jsx-runtime";
324
1045
  var SearchBar = ({ value, onChange, className }) => {
325
- return /* @__PURE__ */ jsxs4(
1046
+ return /* @__PURE__ */ jsxs16(
326
1047
  "label",
327
1048
  {
328
1049
  className: cn(
@@ -333,8 +1054,8 @@ var SearchBar = ({ value, onChange, className }) => {
333
1054
  className
334
1055
  ),
335
1056
  children: [
336
- /* @__PURE__ */ jsx9(IconSearch, {}),
337
- /* @__PURE__ */ jsx9(
1057
+ /* @__PURE__ */ jsx31(IconSearch, {}),
1058
+ /* @__PURE__ */ jsx31(
338
1059
  "input",
339
1060
  {
340
1061
  type: "text",
@@ -356,10 +1077,10 @@ var SearchBar = ({ value, onChange, className }) => {
356
1077
  import { forwardRef } from "react";
357
1078
 
358
1079
  // src/lib/useControllableState.ts
359
- import { useCallback, useState } from "react";
1080
+ import { useCallback, useState as useState5 } from "react";
360
1081
  function useControllableState(controlled, defaultValue) {
361
1082
  const isControlled = controlled !== void 0;
362
- const [uncontrolled, setUncontrolled] = useState(defaultValue);
1083
+ const [uncontrolled, setUncontrolled] = useState5(defaultValue);
363
1084
  const value = isControlled ? controlled : uncontrolled;
364
1085
  const setValue = useCallback(
365
1086
  (next) => {
@@ -383,7 +1104,7 @@ var RadioSelected_default = "./RadioSelected-DOLVV7ZM.svg";
383
1104
  var RadioUnselected_default = "./RadioUnselected-QN74EU46.svg";
384
1105
 
385
1106
  // src/components/SideRadioAccordion/SideRadioAccordion.tsx
386
- import { jsx as jsx10, jsxs as jsxs5 } from "react/jsx-runtime";
1107
+ import { jsx as jsx32, jsxs as jsxs17 } from "react/jsx-runtime";
387
1108
  var printColorBgClass = {
388
1109
  Plotter: "bg-print-plotter",
389
1110
  Printer: "bg-print-printer",
@@ -427,8 +1148,8 @@ var SideRadioAccordion = forwardRef(
427
1148
  setIsOpen(next);
428
1149
  onOpenChange?.(next);
429
1150
  };
430
- return /* @__PURE__ */ jsxs5("div", { ref, className: cn("w-full", className), children: [
431
- /* @__PURE__ */ jsx10(
1151
+ return /* @__PURE__ */ jsxs17("div", { ref, className: cn("w-full", className), children: [
1152
+ /* @__PURE__ */ jsx32(
432
1153
  Stepper,
433
1154
  {
434
1155
  step,
@@ -439,8 +1160,8 @@ var SideRadioAccordion = forwardRef(
439
1160
  className: cn(stickyHeader && "sticky top-0 z-10")
440
1161
  }
441
1162
  ),
442
- expanded && /* @__PURE__ */ jsxs5("div", { className: "flex flex-col", children: [
443
- radioToggleList.map((item) => /* @__PURE__ */ jsx10(
1163
+ expanded && /* @__PURE__ */ jsxs17("div", { className: "flex flex-col", children: [
1164
+ radioToggleList.map((item) => /* @__PURE__ */ jsx32(
444
1165
  RadioToggleItem,
445
1166
  {
446
1167
  ...item,
@@ -449,8 +1170,8 @@ var SideRadioAccordion = forwardRef(
449
1170
  },
450
1171
  itemKey(item)
451
1172
  )),
452
- quantityLimitLabel && /* @__PURE__ */ jsx10(
453
- TextButton,
1173
+ quantityLimitLabel && /* @__PURE__ */ jsx32(
1174
+ TextButton2,
454
1175
  {
455
1176
  label: quantityLimitLabel,
456
1177
  onClick: onClickQuantityLimit,
@@ -462,16 +1183,16 @@ var SideRadioAccordion = forwardRef(
462
1183
  }
463
1184
  );
464
1185
  var Stepper = ({ step, title, isOpen, collapsible, onClick, className }) => {
465
- const label = /* @__PURE__ */ jsxs5("span", { children: [
1186
+ const label = /* @__PURE__ */ jsxs17("span", { children: [
466
1187
  step,
467
1188
  " | ",
468
1189
  title
469
1190
  ] });
470
1191
  const base = "w-full flex items-center justify-between px-3 py-2.5 text-body1-medium text-strong text-left bg-white";
471
1192
  if (!collapsible) {
472
- return /* @__PURE__ */ jsx10("div", { className: cn(base, className), children: label });
1193
+ return /* @__PURE__ */ jsx32("div", { className: cn(base, className), children: label });
473
1194
  }
474
- return /* @__PURE__ */ jsxs5(
1195
+ return /* @__PURE__ */ jsxs17(
475
1196
  "button",
476
1197
  {
477
1198
  type: "button",
@@ -479,7 +1200,7 @@ var Stepper = ({ step, title, isOpen, collapsible, onClick, className }) => {
479
1200
  className: cn(base, "cursor-pointer hover:bg-gray00 active:bg-gray01", className),
480
1201
  children: [
481
1202
  label,
482
- /* @__PURE__ */ jsx10(
1203
+ /* @__PURE__ */ jsx32(
483
1204
  "img",
484
1205
  {
485
1206
  src: ChevronDown_default,
@@ -505,8 +1226,8 @@ var RadioToggleItem = ({
505
1226
  }) => {
506
1227
  const rowBg = !open ? "bg-white hover:bg-gray00" : color ? void 0 : printColor ? printColorBgClass[printColor] : "bg-gray00";
507
1228
  const style = open && color ? { backgroundColor: color } : void 0;
508
- return /* @__PURE__ */ jsxs5("div", { className: "w-full", children: [
509
- /* @__PURE__ */ jsxs5(
1229
+ return /* @__PURE__ */ jsxs17("div", { className: "w-full", children: [
1230
+ /* @__PURE__ */ jsxs17(
510
1231
  "button",
511
1232
  {
512
1233
  type: "button",
@@ -519,16 +1240,16 @@ var RadioToggleItem = ({
519
1240
  className
520
1241
  ),
521
1242
  children: [
522
- /* @__PURE__ */ jsx10(Radio, { selected: open }),
523
- /* @__PURE__ */ jsx10("span", { children: title })
1243
+ /* @__PURE__ */ jsx32(Radio, { selected: open }),
1244
+ /* @__PURE__ */ jsx32("span", { children: title })
524
1245
  ]
525
1246
  }
526
1247
  ),
527
- open && /* @__PURE__ */ jsxs5("div", { className: "flex flex-col gap-2 px-3 py-3 bg-white", children: [
528
- /* @__PURE__ */ jsx10("p", { className: "text-caption-regular text-secondary", children: content }),
529
- badges && badges.length > 0 && /* @__PURE__ */ jsx10("div", { className: "flex gap-1", children: badges.map((badge) => /* @__PURE__ */ jsx10(Badge, { label: badge }, badge)) }),
530
- labelTextButton && /* @__PURE__ */ jsx10(
531
- TextButton,
1248
+ open && /* @__PURE__ */ jsxs17("div", { className: "flex flex-col gap-2 px-3 py-3 bg-white", children: [
1249
+ /* @__PURE__ */ jsx32("p", { className: "text-caption-regular text-secondary", children: content }),
1250
+ badges && badges.length > 0 && /* @__PURE__ */ jsx32("div", { className: "flex gap-1", children: badges.map((badge) => /* @__PURE__ */ jsx32(Badge, { label: badge }, badge)) }),
1251
+ labelTextButton && /* @__PURE__ */ jsx32(
1252
+ TextButton2,
532
1253
  {
533
1254
  label: labelTextButton,
534
1255
  onClick: onClickTextButton,
@@ -540,7 +1261,7 @@ var RadioToggleItem = ({
540
1261
  ] });
541
1262
  };
542
1263
  var Radio = ({ selected = false, className }) => {
543
- return /* @__PURE__ */ jsx10(
1264
+ return /* @__PURE__ */ jsx32(
544
1265
  "img",
545
1266
  {
546
1267
  src: selected ? RadioSelected_default : RadioUnselected_default,
@@ -549,8 +1270,8 @@ var Radio = ({ selected = false, className }) => {
549
1270
  }
550
1271
  );
551
1272
  };
552
- var TextButton = ({ label, onClick, showIcon = false, className }) => {
553
- return /* @__PURE__ */ jsxs5(
1273
+ var TextButton2 = ({ label, onClick, showIcon = false, className }) => {
1274
+ return /* @__PURE__ */ jsxs17(
554
1275
  "button",
555
1276
  {
556
1277
  type: "button",
@@ -563,14 +1284,14 @@ var TextButton = ({ label, onClick, showIcon = false, className }) => {
563
1284
  className
564
1285
  ),
565
1286
  children: [
566
- showIcon && /* @__PURE__ */ jsx10("img", { src: Exclamation_default, alt: "" }),
1287
+ showIcon && /* @__PURE__ */ jsx32("img", { src: Exclamation_default, alt: "" }),
567
1288
  label
568
1289
  ]
569
1290
  }
570
1291
  );
571
1292
  };
572
1293
  var Badge = ({ label, className }) => {
573
- return /* @__PURE__ */ jsx10(
1294
+ return /* @__PURE__ */ jsx32(
574
1295
  "div",
575
1296
  {
576
1297
  className: cn(
@@ -584,7 +1305,7 @@ var Badge = ({ label, className }) => {
584
1305
  };
585
1306
 
586
1307
  // src/components/Tag/Tag.tsx
587
- import { jsx as jsx11 } from "react/jsx-runtime";
1308
+ import { jsx as jsx33 } from "react/jsx-runtime";
588
1309
  var Tag = ({
589
1310
  className,
590
1311
  children,
@@ -594,7 +1315,7 @@ var Tag = ({
594
1315
  onClick,
595
1316
  ...props
596
1317
  }) => {
597
- return /* @__PURE__ */ jsx11(
1318
+ return /* @__PURE__ */ jsx33(
598
1319
  "button",
599
1320
  {
600
1321
  className: cn(
@@ -613,7 +1334,7 @@ var Tag = ({
613
1334
  disabled,
614
1335
  style: bgColor ? { backgroundColor: bgColor, border: "none" } : void 0,
615
1336
  ...props,
616
- children: /* @__PURE__ */ jsx11("span", { children })
1337
+ children: /* @__PURE__ */ jsx33("span", { children })
617
1338
  }
618
1339
  );
619
1340
  };
@@ -655,7 +1376,7 @@ var formatWeekRange = (weekStart) => {
655
1376
  };
656
1377
 
657
1378
  // src/components/Timetable/WeekNavigation.tsx
658
- import { jsx as jsx12, jsxs as jsxs6 } from "react/jsx-runtime";
1379
+ import { jsx as jsx34, jsxs as jsxs18 } from "react/jsx-runtime";
659
1380
  var weekLabel = {
660
1381
  thisWeek: "\uC774\uBC88 \uC8FC",
661
1382
  nextWeek: "\uB2E4\uC74C \uC8FC",
@@ -666,7 +1387,7 @@ var WeekNavigation = forwardRef2(
666
1387
  const showPrev = canPrev ?? (week ? week !== "thisWeek" : true);
667
1388
  const showNext = canNext ?? (week ? week !== "twoWeeksLater" : true);
668
1389
  const text = label ?? (week ? `${weekLabel[week]} (${formatWeekRange(date)})` : formatWeekRange(date));
669
- return /* @__PURE__ */ jsxs6(
1390
+ return /* @__PURE__ */ jsxs18(
670
1391
  "div",
671
1392
  {
672
1393
  ref,
@@ -678,9 +1399,9 @@ var WeekNavigation = forwardRef2(
678
1399
  className
679
1400
  ),
680
1401
  children: [
681
- /* @__PURE__ */ jsx12(ArrowButton, { direction: "left", visible: showPrev, onClick: onPrevWeek }),
682
- /* @__PURE__ */ jsx12("span", { children: text }),
683
- /* @__PURE__ */ jsx12(ArrowButton, { direction: "right", visible: showNext, onClick: onNextWeek })
1402
+ /* @__PURE__ */ jsx34(ArrowButton, { direction: "left", visible: showPrev, onClick: onPrevWeek }),
1403
+ /* @__PURE__ */ jsx34("span", { children: text }),
1404
+ /* @__PURE__ */ jsx34(ArrowButton, { direction: "right", visible: showNext, onClick: onNextWeek })
684
1405
  ]
685
1406
  }
686
1407
  );
@@ -688,9 +1409,9 @@ var WeekNavigation = forwardRef2(
688
1409
  );
689
1410
  var ArrowButton = ({ direction, visible, onClick }) => {
690
1411
  if (!visible) {
691
- return /* @__PURE__ */ jsx12("span", { className: "w-6 h-6" });
1412
+ return /* @__PURE__ */ jsx34("span", { className: "w-6 h-6" });
692
1413
  }
693
- return /* @__PURE__ */ jsx12(
1414
+ return /* @__PURE__ */ jsx34(
694
1415
  "button",
695
1416
  {
696
1417
  type: "button",
@@ -700,7 +1421,7 @@ var ArrowButton = ({ direction, visible, onClick }) => {
700
1421
  "text-gray06 cursor-pointer",
701
1422
  "hover:bg-gray00 active:bg-gray01"
702
1423
  ),
703
- children: /* @__PURE__ */ jsx12(
1424
+ children: /* @__PURE__ */ jsx34(
704
1425
  IconChevronDownXS,
705
1426
  {
706
1427
  className: direction === "left" ? "rotate-90" : "-rotate-90",
@@ -712,7 +1433,7 @@ var ArrowButton = ({ direction, visible, onClick }) => {
712
1433
  };
713
1434
 
714
1435
  // src/components/Timetable/Timetable.tsx
715
- import { jsx as jsx13, jsxs as jsxs7 } from "react/jsx-runtime";
1436
+ import { jsx as jsx35, jsxs as jsxs19 } from "react/jsx-runtime";
716
1437
  var printColorHoverClass = {
717
1438
  Plotter: "hover:bg-print-plotter",
718
1439
  Printer: "hover:bg-print-printer",
@@ -735,8 +1456,8 @@ var Timetable = forwardRef3(function Timetable2({
735
1456
  canNextWeek,
736
1457
  className
737
1458
  }, ref) {
738
- return /* @__PURE__ */ jsxs7("div", { ref, className: cn(fluid && "w-full", className), children: [
739
- !hideWeekNavigation && /* @__PURE__ */ jsx13(
1459
+ return /* @__PURE__ */ jsxs19("div", { ref, className: cn(fluid && "w-full", className), children: [
1460
+ !hideWeekNavigation && /* @__PURE__ */ jsx35(
740
1461
  WeekNavigation,
741
1462
  {
742
1463
  date: weekStart,
@@ -747,7 +1468,7 @@ var Timetable = forwardRef3(function Timetable2({
747
1468
  onNextWeek
748
1469
  }
749
1470
  ),
750
- /* @__PURE__ */ jsx13("div", { className: cn("flex", fluid && "w-full"), children: days.map((day) => /* @__PURE__ */ jsx13(
1471
+ /* @__PURE__ */ jsx35("div", { className: cn("flex", fluid && "w-full"), children: days.map((day) => /* @__PURE__ */ jsx35(
751
1472
  DailyTimetable,
752
1473
  {
753
1474
  date: day.date,
@@ -760,9 +1481,9 @@ var Timetable = forwardRef3(function Timetable2({
760
1481
  ] });
761
1482
  });
762
1483
  var DailyTimetable = ({ date, slots, fluid, onSelectTime, className }) => {
763
- return /* @__PURE__ */ jsxs7("div", { className: cn("flex flex-col", fluid ? "flex-1 min-w-0" : "w-18", className), children: [
764
- /* @__PURE__ */ jsx13("div", { className: "h-13 flex items-center justify-center text-body3-medium text-secondary", children: formatDayLabel(date) }),
765
- slots.map((slot) => /* @__PURE__ */ jsx13(
1484
+ return /* @__PURE__ */ jsxs19("div", { className: cn("flex flex-col", fluid ? "flex-1 min-w-0" : "w-18", className), children: [
1485
+ /* @__PURE__ */ jsx35("div", { className: "h-13 flex items-center justify-center text-body3-medium text-secondary", children: formatDayLabel(date) }),
1486
+ slots.map((slot) => /* @__PURE__ */ jsx35(
766
1487
  TimeItem,
767
1488
  {
768
1489
  state: slot.state,
@@ -788,7 +1509,7 @@ var TimeItem = ({
788
1509
  }) => {
789
1510
  const clickable = (state === "default" || state === "selected") && !!onClick;
790
1511
  const style = state === "default" && color ? { "--tt-hover": color } : void 0;
791
- return /* @__PURE__ */ jsx13(
1512
+ return /* @__PURE__ */ jsx35(
792
1513
  "div",
793
1514
  {
794
1515
  onClick: clickable ? onClick : void 0,
@@ -815,12 +1536,12 @@ var TimeItem = ({
815
1536
  import {
816
1537
  forwardRef as forwardRef4,
817
1538
  useCallback as useCallback2,
818
- useState as useState2
1539
+ useState as useState6
819
1540
  } from "react";
820
- import { jsx as jsx14, jsxs as jsxs8 } from "react/jsx-runtime";
1541
+ import { jsx as jsx36, jsxs as jsxs20 } from "react/jsx-runtime";
821
1542
  function useControllableState2(controlled, defaultValue) {
822
1543
  const isControlled = controlled !== void 0;
823
- const [uncontrolled, setUncontrolled] = useState2(defaultValue);
1544
+ const [uncontrolled, setUncontrolled] = useState6(defaultValue);
824
1545
  const value = isControlled ? controlled : uncontrolled;
825
1546
  const setValue = useCallback2(
826
1547
  (next) => {
@@ -869,8 +1590,8 @@ var TNB = forwardRef4(function TNB2({
869
1590
  setLowerValue(label);
870
1591
  onSelectedLowerChange?.(label);
871
1592
  };
872
- return /* @__PURE__ */ jsxs8("nav", { ref, "aria-label": ariaLabel, className: cn("w-full bg-white", className), children: [
873
- /* @__PURE__ */ jsx14(
1593
+ return /* @__PURE__ */ jsxs20("nav", { ref, "aria-label": ariaLabel, className: cn("w-full bg-white", className), children: [
1594
+ /* @__PURE__ */ jsx36(
874
1595
  UpperPart,
875
1596
  {
876
1597
  logo,
@@ -881,7 +1602,7 @@ var TNB = forwardRef4(function TNB2({
881
1602
  linkComponent
882
1603
  }
883
1604
  ),
884
- /* @__PURE__ */ jsx14(
1605
+ /* @__PURE__ */ jsx36(
885
1606
  LowerPart,
886
1607
  {
887
1608
  lowerPartItemList: currentLowerItemList,
@@ -896,7 +1617,7 @@ var NavClickable = forwardRef4(function NavClickable2({ href, onClick, linkCompo
896
1617
  const ariaCurrent = current ? "page" : void 0;
897
1618
  if (href && !disabled) {
898
1619
  if (Link) {
899
- return /* @__PURE__ */ jsx14(
1620
+ return /* @__PURE__ */ jsx36(
900
1621
  Link,
901
1622
  {
902
1623
  href,
@@ -908,7 +1629,7 @@ var NavClickable = forwardRef4(function NavClickable2({ href, onClick, linkCompo
908
1629
  }
909
1630
  );
910
1631
  }
911
- return /* @__PURE__ */ jsx14(
1632
+ return /* @__PURE__ */ jsx36(
912
1633
  "a",
913
1634
  {
914
1635
  href,
@@ -920,7 +1641,7 @@ var NavClickable = forwardRef4(function NavClickable2({ href, onClick, linkCompo
920
1641
  }
921
1642
  );
922
1643
  }
923
- return /* @__PURE__ */ jsx14(
1644
+ return /* @__PURE__ */ jsx36(
924
1645
  "button",
925
1646
  {
926
1647
  type: "button",
@@ -942,10 +1663,10 @@ var UpperPart = ({
942
1663
  linkComponent,
943
1664
  className
944
1665
  }) => {
945
- return /* @__PURE__ */ jsxs8("div", { className: cn("w-full h-13 px-4 flex items-center justify-between", className), children: [
946
- /* @__PURE__ */ jsxs8("div", { className: "flex items-center gap-6", children: [
947
- /* @__PURE__ */ jsx14(NavIconButton, { ...logo, linkComponent }),
948
- /* @__PURE__ */ jsx14("div", { className: "flex items-center gap-4", children: upperPartItemList.map((item) => /* @__PURE__ */ jsx14(
1666
+ return /* @__PURE__ */ jsxs20("div", { className: cn("w-full h-13 px-4 flex items-center justify-between", className), children: [
1667
+ /* @__PURE__ */ jsxs20("div", { className: "flex items-center gap-6", children: [
1668
+ /* @__PURE__ */ jsx36(NavIconButton, { ...logo, linkComponent }),
1669
+ /* @__PURE__ */ jsx36("div", { className: "flex items-center gap-4", children: upperPartItemList.map((item) => /* @__PURE__ */ jsx36(
949
1670
  UpperPartTab,
950
1671
  {
951
1672
  label: item.label,
@@ -960,7 +1681,7 @@ var UpperPart = ({
960
1681
  item.id ?? item.label
961
1682
  )) })
962
1683
  ] }),
963
- /* @__PURE__ */ jsx14("div", { className: "flex items-center gap-2", children: upperPartIconList.map((icon, index) => /* @__PURE__ */ jsx14(
1684
+ /* @__PURE__ */ jsx36("div", { className: "flex items-center gap-2", children: upperPartIconList.map((icon, index) => /* @__PURE__ */ jsx36(
964
1685
  NavIconButton,
965
1686
  {
966
1687
  ...icon,
@@ -978,7 +1699,7 @@ var UpperPartTab = ({
978
1699
  linkComponent,
979
1700
  className
980
1701
  }) => {
981
- return /* @__PURE__ */ jsx14(
1702
+ return /* @__PURE__ */ jsx36(
982
1703
  NavClickable,
983
1704
  {
984
1705
  href,
@@ -998,7 +1719,7 @@ var NavIconButton = forwardRef4(
998
1719
  function NavIconButton2({ src, icon, alt, label, href, onClick, selected, badge, className, linkComponent }, forwardedRef) {
999
1720
  const interactive = Boolean(onClick || href);
1000
1721
  const showBadge = badge !== void 0 && badge !== null && badge !== false;
1001
- return /* @__PURE__ */ jsxs8(
1722
+ return /* @__PURE__ */ jsxs20(
1002
1723
  NavClickable,
1003
1724
  {
1004
1725
  ref: forwardedRef,
@@ -1014,9 +1735,9 @@ var NavIconButton = forwardRef4(
1014
1735
  className
1015
1736
  ),
1016
1737
  children: [
1017
- icon ? /* @__PURE__ */ jsx14("span", { className: "inline-flex h-5 w-5 items-center justify-center", children: icon }) : src ? /* @__PURE__ */ jsx14("img", { src, alt: alt ?? label ?? "", className: "h-5 w-5" }) : null,
1018
- label ? /* @__PURE__ */ jsx14("span", { className: cn("text-body2-regular", selected ? "text-white" : "text-secondary"), children: label }) : null,
1019
- showBadge ? /* @__PURE__ */ jsx14(
1738
+ icon ? /* @__PURE__ */ jsx36("span", { className: "inline-flex h-5 w-5 items-center justify-center", children: icon }) : src ? /* @__PURE__ */ jsx36("img", { src, alt: alt ?? label ?? "", className: "h-5 w-5" }) : null,
1739
+ label ? /* @__PURE__ */ jsx36("span", { className: cn("text-body2-regular", selected ? "text-white" : "text-secondary"), children: label }) : null,
1740
+ showBadge ? /* @__PURE__ */ jsx36(
1020
1741
  "span",
1021
1742
  {
1022
1743
  "aria-hidden": badge === true,
@@ -1042,11 +1763,11 @@ var LowerPart = ({
1042
1763
  if (lowerPartItemList.length === 0) {
1043
1764
  return null;
1044
1765
  }
1045
- return /* @__PURE__ */ jsx14(
1766
+ return /* @__PURE__ */ jsx36(
1046
1767
  "div",
1047
1768
  {
1048
1769
  className: cn("w-full h-9 px-4 flex items-center gap-4 border-t border-gray02", className),
1049
- children: lowerPartItemList.map((item) => /* @__PURE__ */ jsx14(
1770
+ children: lowerPartItemList.map((item) => /* @__PURE__ */ jsx36(
1050
1771
  LowerPartItemButton,
1051
1772
  {
1052
1773
  label: item.label,
@@ -1071,7 +1792,7 @@ var LowerPartItemButton = ({
1071
1792
  linkComponent,
1072
1793
  className
1073
1794
  }) => {
1074
- return /* @__PURE__ */ jsx14(
1795
+ return /* @__PURE__ */ jsx36(
1075
1796
  NavClickable,
1076
1797
  {
1077
1798
  href,
@@ -1090,14 +1811,14 @@ var LowerPartItemButton = ({
1090
1811
  };
1091
1812
 
1092
1813
  // src/components/Toast/Toast.tsx
1093
- import { forwardRef as forwardRef5, useEffect, useState as useState3 } from "react";
1094
- import { jsx as jsx15 } from "react/jsx-runtime";
1814
+ import { forwardRef as forwardRef5, useEffect as useEffect3, useState as useState7 } from "react";
1815
+ import { jsx as jsx37 } from "react/jsx-runtime";
1095
1816
  var EXIT_MS = 300;
1096
1817
  var Toast = forwardRef5(function Toast2({ message, open, duration = 3e3, onClose, position = "none", className }, ref) {
1097
1818
  const controlled = open !== void 0;
1098
- const [mounted, setMounted] = useState3(!controlled || open);
1099
- const [visible, setVisible] = useState3(!controlled || open);
1100
- useEffect(() => {
1819
+ const [mounted, setMounted] = useState7(!controlled || open);
1820
+ const [visible, setVisible] = useState7(!controlled || open);
1821
+ useEffect3(() => {
1101
1822
  if (!controlled) return;
1102
1823
  if (open) {
1103
1824
  setMounted(true);
@@ -1108,13 +1829,13 @@ var Toast = forwardRef5(function Toast2({ message, open, duration = 3e3, onClose
1108
1829
  const timer = setTimeout(() => setMounted(false), EXIT_MS);
1109
1830
  return () => clearTimeout(timer);
1110
1831
  }, [controlled, open]);
1111
- useEffect(() => {
1832
+ useEffect3(() => {
1112
1833
  if (!controlled || !open || !duration) return;
1113
1834
  const timer = setTimeout(() => onClose?.(), duration);
1114
1835
  return () => clearTimeout(timer);
1115
1836
  }, [controlled, open, duration, onClose]);
1116
1837
  if (!mounted) return null;
1117
- const banner = /* @__PURE__ */ jsx15(
1838
+ const banner = /* @__PURE__ */ jsx37(
1118
1839
  "div",
1119
1840
  {
1120
1841
  ref,
@@ -1132,7 +1853,7 @@ var Toast = forwardRef5(function Toast2({ message, open, duration = 3e3, onClose
1132
1853
  }
1133
1854
  );
1134
1855
  if (position === "none") return banner;
1135
- return /* @__PURE__ */ jsx15(
1856
+ return /* @__PURE__ */ jsx37(
1136
1857
  "div",
1137
1858
  {
1138
1859
  className: cn(
@@ -1145,18 +1866,46 @@ var Toast = forwardRef5(function Toast2({ message, open, duration = 3e3, onClose
1145
1866
  });
1146
1867
  export {
1147
1868
  BackButton,
1869
+ BasicFormField,
1148
1870
  CTA,
1149
1871
  CategorySegment,
1150
1872
  CategorySegmentedControl,
1873
+ Column,
1874
+ ColumnContentContainer,
1875
+ ColumnLabel,
1876
+ ColumnSubTitle,
1877
+ ColumnText,
1878
+ ColumnTextStyle,
1879
+ Dropdown,
1880
+ FormCheckBox,
1881
+ FormColor,
1882
+ FormFile,
1883
+ FormNumber,
1884
+ FormPassword,
1885
+ FormSelectBox,
1886
+ FormTel,
1887
+ FormText,
1888
+ FormTextArea,
1889
+ IconCheck,
1890
+ IconChevronDownXS,
1891
+ IconInfo,
1892
+ List,
1893
+ Modal,
1894
+ ModalText,
1895
+ ModalTextStyle,
1896
+ MultiColumn,
1151
1897
  NoticeBadge,
1152
1898
  NoticeBar,
1153
1899
  SearchBar,
1900
+ SelectBoxOption,
1154
1901
  SideRadioAccordion,
1155
1902
  TNB,
1156
1903
  Tag,
1904
+ TextButton,
1157
1905
  Timetable,
1158
1906
  TitleInput,
1159
1907
  Toast,
1160
- WeekNavigation
1908
+ WeekNavigation,
1909
+ getInputStyles
1161
1910
  };
1162
1911
  //# sourceMappingURL=index.mjs.map