@hivcd-printshop/design-system 1.1.1 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -22,19 +22,50 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
22
22
  var index_exports = {};
23
23
  __export(index_exports, {
24
24
  BackButton: () => BackButton,
25
+ BasicFormField: () => BasicFormField,
25
26
  CTA: () => CTA,
26
27
  CategorySegment: () => CategorySegment,
27
28
  CategorySegmentedControl: () => CategorySegmentedControl,
29
+ Column: () => Column,
30
+ ColumnContentContainer: () => ColumnContentContainer,
31
+ ColumnDescription: () => ColumnDescription,
32
+ ColumnDescriptionList: () => ColumnDescriptionList,
33
+ ColumnLabel: () => ColumnLabel,
34
+ ColumnSubTitle: () => ColumnSubTitle,
35
+ ColumnText: () => ColumnText,
36
+ ColumnTextStyle: () => ColumnTextStyle,
37
+ Dropdown: () => Dropdown,
38
+ FormCheckBox: () => FormCheckBox,
39
+ FormColor: () => FormColor,
40
+ FormFile: () => FormFile,
41
+ FormNumber: () => FormNumber,
42
+ FormPassword: () => FormPassword,
43
+ FormSelectBox: () => FormSelectBox,
44
+ FormTel: () => FormTel,
45
+ FormText: () => FormText,
46
+ FormTextArea: () => FormTextArea,
47
+ IconCheck: () => IconCheck,
48
+ IconChevronDownXS: () => IconChevronDownXS,
49
+ IconCompass: () => IconCompass,
50
+ IconInfo: () => IconInfo,
51
+ List: () => List,
52
+ Modal: () => Modal,
53
+ ModalText: () => ModalText,
54
+ ModalTextStyle: () => ModalTextStyle,
55
+ MultiColumn: () => MultiColumn,
28
56
  NoticeBadge: () => NoticeBadge,
29
57
  NoticeBar: () => NoticeBar,
30
58
  SearchBar: () => SearchBar,
59
+ SelectBoxOption: () => SelectBoxOption,
31
60
  SideRadioAccordion: () => SideRadioAccordion,
32
61
  TNB: () => TNB,
33
62
  Tag: () => Tag,
63
+ TextButton: () => TextButton,
34
64
  Timetable: () => Timetable,
35
65
  TitleInput: () => TitleInput,
36
66
  Toast: () => Toast,
37
- WeekNavigation: () => WeekNavigation
67
+ WeekNavigation: () => WeekNavigation,
68
+ getInputStyles: () => getInputStyles
38
69
  });
39
70
  module.exports = __toCommonJS(index_exports);
40
71
 
@@ -92,6 +123,20 @@ var IconChevronDownXS = ({
92
123
  }
93
124
  );
94
125
  };
126
+ var IconCheck = ({ className, stroke }) => {
127
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
128
+ "svg",
129
+ {
130
+ className,
131
+ width: "13",
132
+ height: "13",
133
+ viewBox: "0 0 13 13",
134
+ fill: "none",
135
+ xmlns: "http://www.w3.org/2000/svg",
136
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M2.05566 7.0555L4.83344 9.8333L10.9446 3.72217", stroke: stroke || "#121212" })
137
+ }
138
+ );
139
+ };
95
140
  var IconSearch = ({ className, stroke }) => {
96
141
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
97
142
  "svg",
@@ -126,6 +171,32 @@ var IconSearch = ({ className, stroke }) => {
126
171
  }
127
172
  );
128
173
  };
174
+ var IconInfo = ({ className, stroke }) => {
175
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
176
+ "svg",
177
+ {
178
+ className,
179
+ width: "16",
180
+ height: "16",
181
+ viewBox: "0 0 16 16",
182
+ fill: "none",
183
+ xmlns: "http://www.w3.org/2000/svg",
184
+ children: [
185
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "8", cy: "8", r: "6.25", stroke: stroke || "#8b94a1", strokeWidth: "1.5" }),
186
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
187
+ "path",
188
+ {
189
+ d: "M8 7.25V11.25",
190
+ stroke: stroke || "#8b94a1",
191
+ strokeWidth: "1.5",
192
+ strokeLinecap: "round"
193
+ }
194
+ ),
195
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "8", cy: "5", r: "0.9", fill: stroke || "#8b94a1" })
196
+ ]
197
+ }
198
+ );
199
+ };
129
200
  var IconGoBack = ({ className, stroke }) => {
130
201
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
131
202
  "svg",
@@ -151,6 +222,28 @@ var IconGoBack = ({ className, stroke }) => {
151
222
  }
152
223
  );
153
224
  };
225
+ var IconCompass = ({ className, fill }) => {
226
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
227
+ "svg",
228
+ {
229
+ className,
230
+ width: "16",
231
+ height: "16",
232
+ viewBox: "0 0 16 16",
233
+ fill: "none",
234
+ xmlns: "http://www.w3.org/2000/svg",
235
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
236
+ "path",
237
+ {
238
+ fillRule: "evenodd",
239
+ clipRule: "evenodd",
240
+ d: "M12.5731 7.37945C12.2964 5.32806 10.668 3.70356 8.6166 3.42688V0H7.37945V3.42688C5.32806 3.70356 3.70356 5.32806 3.42688 7.37945H0V8.62055H3.42688C3.70356 10.6719 5.32806 12.2964 7.37945 12.5731V16H8.6166V12.5731C10.668 12.2964 12.2964 10.6719 12.5731 8.62055H16V7.37945H12.5731ZM7.37945 11.3241C6.01186 11.0672 4.93281 9.98814 4.67589 8.62055H7.37945V11.3241ZM7.4664 5.51383C7.41897 5.81423 7.39131 6.14229 7.37945 6.50988V7.37945H4.67589C4.89328 6.22925 5.68775 5.28458 6.75099 4.86166C6.9921 4.73122 7.07905 4.67589 7.19763 4.41502L7.67984 4.57312C7.58498 4.90119 7.51779 5.21344 7.4664 5.51383ZM9.24506 11.1383C9.00395 11.2727 8.917 11.3241 8.79842 11.5889L8.31621 11.4269C8.41107 11.1028 8.47826 10.7905 8.52965 10.4901C8.57312 10.2134 8.60474 9.91304 8.6166 9.58103V8.62055H11.3202C11.1067 9.77075 10.3083 10.7154 9.24506 11.1383ZM8.6166 7.37945V4.67984C9.98419 4.93281 11.0672 6.01186 11.3202 7.37945H8.6166Z",
241
+ fill: fill || "#121212"
242
+ }
243
+ )
244
+ }
245
+ );
246
+ };
154
247
 
155
248
  // src/components/BackButton/BackButton.tsx
156
249
  var import_jsx_runtime2 = require("react/jsx-runtime");
@@ -212,15 +305,720 @@ var CTA = ({
212
305
  );
213
306
  };
214
307
 
215
- // src/components/createPost/CategorySegment.tsx
308
+ // src/components/Column/MultiColumn.tsx
216
309
  var import_jsx_runtime4 = require("react/jsx-runtime");
310
+ var MultiColumnMain = ({ children, className }) => {
311
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: cn("flex flex-col w-full h-full", className), children });
312
+ };
313
+ var Columns = ({ children, className }) => {
314
+ return (
315
+ // flex 래퍼를 사용하고 하위 Column들이 flex-1을 가지게 하거나,
316
+ // grid를 사용하여 열을 나눌 수 있어. 여기서는 flex를 활용한 균등 분할 예시야.
317
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: cn("flex w-full h-full divide-x divide-gray02", className), children })
318
+ );
319
+ };
320
+ var CTAs = ({ children, className }) => {
321
+ if (!children) return null;
322
+ return (
323
+ // CTA 버튼들을 중앙에 배치하는 예시 (우측 정렬이 필요하면 justify-end 사용)
324
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: cn("flex flex-col w-full h-fit", className), children })
325
+ );
326
+ };
327
+ var MultiColumn = Object.assign(MultiColumnMain, {
328
+ Columns,
329
+ CTAs
330
+ });
331
+
332
+ // src/components/Column/Column.tsx
333
+ var import_jsx_runtime5 = require("react/jsx-runtime");
334
+ var Column = ({ className, children, header }) => {
335
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: cn("flex flex-col gap-5", "h-full w-full px-5 py-3", className), children: [
336
+ header && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h1", { className: cn("text-body1-medium text-primary"), children: header }),
337
+ children
338
+ ] });
339
+ };
340
+
341
+ // src/components/Column/ColumnContentContainer.tsx
342
+ var import_jsx_runtime6 = require("react/jsx-runtime");
343
+ var ColumnContentContainer = ({ className, children }) => {
344
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: cn("flex flex-col gap-1.5 w-full h-fit", className), children });
345
+ };
346
+
347
+ // src/components/Column/ColumnLabel.tsx
348
+ var import_jsx_runtime7 = require("react/jsx-runtime");
349
+ var ColumnLabel = ({ className, children, subLabel, htmlFor }) => {
350
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("label", { htmlFor, className: cn("flex gap-1.5 items-end", className), children: [
351
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: cn("text-body2-regular text-tertiary"), children }),
352
+ subLabel && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: cn("text-caption-book text-quaternary"), children: subLabel })
353
+ ] });
354
+ };
355
+
356
+ // src/components/Column/ColumnText.tsx
357
+ var import_jsx_runtime8 = require("react/jsx-runtime");
358
+ var ColumnTextStyle = "text-body3-book text-strong";
359
+ var ModalTextStyle = "text-body1-regular text-primary";
360
+ var ColumnText = ({ className, alert = false, children, onClick }) => {
361
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: cn(ColumnTextStyle, alert && "text-danger", className), onClick, children: children ? children : "-" });
362
+ };
363
+
364
+ // src/components/Column/ColumnSubTitle.tsx
365
+ var import_jsx_runtime9 = require("react/jsx-runtime");
366
+ var ColumnSubTitle = ({
367
+ className,
368
+ children,
369
+ action,
370
+ as: Tag2 = "h2"
371
+ }) => {
372
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(Tag2, { className: cn("flex items-center justify-between gap-1.5", "w-full", className), children: [
373
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: cn("text-body1-medium text-primary"), children }),
374
+ action && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "flex shrink-0 items-center", children: action })
375
+ ] });
376
+ };
377
+
378
+ // src/components/Column/ColumnDescription.tsx
379
+ var import_jsx_runtime10 = require("react/jsx-runtime");
380
+ var ColumnDescription = ({
381
+ className,
382
+ children,
383
+ bullet = true
384
+ }) => {
385
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: cn("flex items-start gap-3", className), children: [
386
+ bullet && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "flex shrink-0 items-center py-1", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(IconCompass, { className: "size-4" }) }),
387
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "min-w-0 flex-1 whitespace-pre-line text-body3-book text-primary", children })
388
+ ] });
389
+ };
390
+ var ColumnDescriptionList = ({ className, children }) => {
391
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: cn("flex flex-col gap-4", className), children });
392
+ };
393
+
394
+ // src/components/Form/BasicFormField.tsx
395
+ var import_jsx_runtime11 = require("react/jsx-runtime");
396
+ var BasicFormField = ({
397
+ children,
398
+ isDanger,
399
+ dangerText,
400
+ className
401
+ }) => {
402
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: cn("flex flex-col gap-1.5", className), children: [
403
+ children,
404
+ isDanger && dangerText && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "text-caption-book text-danger", children: dangerText })
405
+ ] });
406
+ };
407
+ var getInputStyles = (isDanger, additionalClass) => {
408
+ return cn(
409
+ // 디자인 스펙: 높이 41px, 좌우 12px / 상하 10px 패딩
410
+ "w-full h-[41px] px-3 py-2.5",
411
+ "box-border border border-gray02 focus:outline-none focus:border-black",
412
+ "bg-white transition-colors",
413
+ ColumnTextStyle,
414
+ "text-primary placeholder:text-quaternary",
415
+ isDanger && "border-danger",
416
+ // 경고 시 빨간 테두리 (#E42939)
417
+ additionalClass
418
+ // 각 인풋별 추가 스타일 (예: textarea의 h-30)
419
+ );
420
+ };
421
+
422
+ // src/components/Form/FormText.tsx
423
+ var import_jsx_runtime12 = require("react/jsx-runtime");
424
+ var FormText = ({ className, isDanger, dangerText, ...props }) => {
425
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(BasicFormField, { isDanger, dangerText, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("input", { type: "text", className: getInputStyles(isDanger, className), ...props }) });
426
+ };
427
+
428
+ // src/components/Form/FormTextArea.tsx
429
+ var import_jsx_runtime13 = require("react/jsx-runtime");
430
+ var FormTextArea = ({ className, isDanger, dangerText, ...props }) => {
431
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(BasicFormField, { isDanger, dangerText, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
432
+ "textarea",
433
+ {
434
+ className: getInputStyles(isDanger, "resize-none h-30 px-4 py-2.5 " + (className || "")),
435
+ ...props
436
+ }
437
+ ) });
438
+ };
439
+
440
+ // src/components/Form/FormNumber.tsx
441
+ var import_jsx_runtime14 = require("react/jsx-runtime");
442
+ var FormNumber = ({ className, isDanger, dangerText, ...props }) => {
443
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(BasicFormField, { isDanger, dangerText, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("input", { type: "number", className: getInputStyles(isDanger, className), ...props }) });
444
+ };
445
+
446
+ // src/components/Form/FormPassword.tsx
447
+ var import_jsx_runtime15 = require("react/jsx-runtime");
448
+ var FormPassword = ({ className, isDanger, dangerText, ...props }) => {
449
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(BasicFormField, { isDanger, dangerText, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("input", { type: "password", className: getInputStyles(isDanger, className), ...props }) });
450
+ };
451
+
452
+ // src/components/Form/FormTel.tsx
453
+ var import_jsx_runtime16 = require("react/jsx-runtime");
454
+ var FormTel = ({ className, isDanger, dangerText, onChange, ...props }) => {
455
+ const handlePhoneChange = (e) => {
456
+ const rawValue = e.target.value.replace(/[^0-9]/g, "");
457
+ let formattedValue = "";
458
+ if (rawValue.length < 4) formattedValue = rawValue;
459
+ else if (rawValue.length < 8) formattedValue = `${rawValue.slice(0, 3)}-${rawValue.slice(3)}`;
460
+ else
461
+ formattedValue = `${rawValue.slice(0, 3)}-${rawValue.slice(3, 7)}-${rawValue.slice(7, 11)}`;
462
+ e.target.value = formattedValue;
463
+ if (onChange) onChange(e);
464
+ };
465
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(BasicFormField, { isDanger, dangerText, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
466
+ "input",
467
+ {
468
+ type: "tel",
469
+ className: getInputStyles(isDanger, className),
470
+ onChange: handlePhoneChange,
471
+ maxLength: 13,
472
+ ...props
473
+ }
474
+ ) });
475
+ };
476
+
477
+ // src/components/Form/FormColor.tsx
478
+ var import_react = require("react");
479
+ var import_jsx_runtime17 = require("react/jsx-runtime");
480
+ var FormColor = ({
481
+ className,
482
+ isDanger,
483
+ dangerText,
484
+ value,
485
+ defaultValue = "#000000",
486
+ onChange,
487
+ ...props
488
+ }) => {
489
+ const [internalColor, setInternalColor] = (0, import_react.useState)(
490
+ value || defaultValue || "#000000"
491
+ );
492
+ const color = value !== void 0 ? value : internalColor;
493
+ const handleColorChange = (e) => {
494
+ setInternalColor(e.target.value);
495
+ onChange?.(e);
496
+ };
497
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(BasicFormField, { isDanger, dangerText, children: /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
498
+ "label",
499
+ {
500
+ className: getInputStyles(
501
+ isDanger,
502
+ // 💡 focus-within을 통해 내부 <input>이 포커스될 때 부모(label)의 테두리와 배경 변경!
503
+ "flex items-center gap-2 relative focus-within:border-black focus-within:hover:bg-white" + (className || "")
504
+ ),
505
+ children: [
506
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "w-6 h-6 shrink-0 overflow-hidden", style: { backgroundColor: color }, children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
507
+ "input",
508
+ {
509
+ type: "color",
510
+ value: color,
511
+ onChange: handleColorChange,
512
+ className: "absolute inset-0 w-full h-full opacity-0",
513
+ ...props
514
+ }
515
+ ) }),
516
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "text-primary text-body3-regular uppercase flex-1 select-none", children: color })
517
+ ]
518
+ }
519
+ ) });
520
+ };
521
+
522
+ // src/components/Form/FormFile.tsx
523
+ var import_react2 = require("react");
524
+ var import_jsx_runtime18 = require("react/jsx-runtime");
525
+ var FormFile = ({
526
+ className,
527
+ isDanger,
528
+ dangerText,
529
+ fileUrl,
530
+ filename,
531
+ onChange,
532
+ ...props
533
+ }) => {
534
+ const [selectedFile, setSelectedFile] = (0, import_react2.useState)(null);
535
+ const handleFileChange = (e) => {
536
+ const originalFile = e.target.files?.[0];
537
+ if (!originalFile) {
538
+ setSelectedFile(null);
539
+ onChange?.(e);
540
+ return;
541
+ }
542
+ let finalFile = originalFile;
543
+ if (filename) {
544
+ const lastDotIndex = originalFile.name.lastIndexOf(".");
545
+ const extension = lastDotIndex !== -1 ? originalFile.name.slice(lastDotIndex) : "";
546
+ const newFileName = filename.endsWith(extension) ? filename : `${filename}${extension}`;
547
+ finalFile = new File([originalFile], newFileName, {
548
+ type: originalFile.type,
549
+ lastModified: originalFile.lastModified
550
+ });
551
+ try {
552
+ const dataTransfer = new DataTransfer();
553
+ dataTransfer.items.add(finalFile);
554
+ e.target.files = dataTransfer.files;
555
+ } catch (err) {
556
+ console.warn("DataTransfer\uB97C \uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 \uBE0C\uB77C\uC6B0\uC800\uC785\uB2C8\uB2E4.", err);
557
+ }
558
+ }
559
+ setSelectedFile(finalFile);
560
+ onChange?.(e);
561
+ };
562
+ const handleDownload = (e) => {
563
+ e.preventDefault();
564
+ e.stopPropagation();
565
+ if (selectedFile) {
566
+ const url = URL.createObjectURL(selectedFile);
567
+ const a = document.createElement("a");
568
+ a.href = url;
569
+ a.download = selectedFile.name;
570
+ document.body.appendChild(a);
571
+ a.click();
572
+ document.body.removeChild(a);
573
+ URL.revokeObjectURL(url);
574
+ } else if (fileUrl) {
575
+ const a = document.createElement("a");
576
+ a.href = fileUrl;
577
+ a.download = fileUrl.split("/").pop() || "download";
578
+ a.target = "_blank";
579
+ document.body.appendChild(a);
580
+ a.click();
581
+ document.body.removeChild(a);
582
+ }
583
+ };
584
+ const displayFileName = selectedFile?.name || (fileUrl ? fileUrl.split("/").pop() : null);
585
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(BasicFormField, { isDanger, dangerText, children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
586
+ "div",
587
+ {
588
+ className: getInputStyles(
589
+ isDanger,
590
+ // 디자인 스펙: 파일 전 상태는 우측 정렬("파일 첨부"만), 파일 후 상태는 좌우 배치
591
+ cn(
592
+ "flex items-center gap-2",
593
+ displayFileName ? "justify-between" : "justify-end",
594
+ className
595
+ )
596
+ ),
597
+ children: [
598
+ displayFileName && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
599
+ "span",
600
+ {
601
+ onClick: handleDownload,
602
+ className: "text-body3-book text-primary truncate max-w-[200px] cursor-pointer",
603
+ title: `${displayFileName} \uB2E4\uC6B4\uB85C\uB4DC`,
604
+ children: displayFileName
605
+ }
606
+ ),
607
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("label", { className: "shrink-0 px-1 -mx-1 cursor-pointer", children: [
608
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "text-primary text-caption-regular underline", children: displayFileName ? "\uB2E4\uC2DC \uCCA8\uBD80" : "\uD30C\uC77C \uCCA8\uBD80" }),
609
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("input", { type: "file", className: "hidden", onChange: handleFileChange, ...props })
610
+ ] })
611
+ ]
612
+ }
613
+ ) });
614
+ };
615
+
616
+ // src/components/Form/FormCheckBox.tsx
617
+ var import_jsx_runtime19 = require("react/jsx-runtime");
618
+ var FormCheckBox = ({
619
+ isChecked,
620
+ setIsChecked,
621
+ children,
622
+ className,
623
+ textStyle,
624
+ ...props
625
+ }) => {
626
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
627
+ "label",
628
+ {
629
+ className: cn(
630
+ "group w-fit h-fit",
631
+ "flex items-center gap-1",
632
+ "cursor-pointer select-none",
633
+ // 💡 1. 텍스트 드래그 방지 추가
634
+ className
635
+ ),
636
+ children: [
637
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
638
+ "input",
639
+ {
640
+ type: "checkbox",
641
+ checked: isChecked,
642
+ onChange: (e) => setIsChecked(e.target.checked),
643
+ className: "sr-only peer",
644
+ ...props
645
+ }
646
+ ),
647
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
648
+ "div",
649
+ {
650
+ className: cn(
651
+ "flex items-center justify-center w-5 h-5 shrink-0 rounded transition-colors",
652
+ "group-hover:bg-gray00 group-active:bg-gray01"
653
+ ),
654
+ children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
655
+ "div",
656
+ {
657
+ className: cn(
658
+ "w-[15px] h-[15px]",
659
+ "box-border border border-black",
660
+ "flex items-center justify-center transition-colors duration-200",
661
+ // 💡 3. 키보드 Tab 이동 시 접근성 향상 (포커스 링 표시)
662
+ "peer-focus-visible:ring-2 peer-focus-visible:ring-black peer-focus-visible:ring-offset-1"
663
+ ),
664
+ children: isChecked && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(IconCheck, {})
665
+ }
666
+ )
667
+ }
668
+ ),
669
+ children && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: cn("text-body3-book text-primary", textStyle), children })
670
+ ]
671
+ }
672
+ );
673
+ };
674
+
675
+ // src/components/Form/FormSelectBox.tsx
676
+ var import_react3 = require("react");
677
+
678
+ // src/components/Form/SelectBoxOption.tsx
679
+ var import_jsx_runtime20 = require("react/jsx-runtime");
680
+ var SelectBoxOption = ({
681
+ label,
682
+ onClick,
683
+ // selectedLabel,
684
+ className
685
+ }) => {
686
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
687
+ "li",
688
+ {
689
+ onClick,
690
+ className: cn(
691
+ "w-full p-3 shrink-0",
692
+ // 디자인 스펙: 12px 패딩
693
+ "flex items-center justify-start",
694
+ // "box-border border-b border-gray02",
695
+ "text-body3-book text-primary",
696
+ "bg-white hover:bg-gray00 active:bg-gray01",
697
+ // isSelected
698
+ // ? "bg-black text-white"
699
+ // : "",
700
+ className
701
+ ),
702
+ children: label
703
+ }
704
+ );
705
+ };
706
+
707
+ // src/components/Form/FormSelectBox.tsx
708
+ var import_jsx_runtime21 = require("react/jsx-runtime");
709
+ var FormSelectBox = ({
710
+ options,
711
+ value,
712
+ onChange,
713
+ placeholder = "\uC120\uD0DD\uD574\uC8FC\uC138\uC694",
714
+ isDanger,
715
+ dangerText,
716
+ className
717
+ }) => {
718
+ const [isOpen, setIsOpen] = (0, import_react3.useState)(false);
719
+ const containerRef = (0, import_react3.useRef)(null);
720
+ (0, import_react3.useEffect)(() => {
721
+ const handleClickOutside = (event) => {
722
+ if (containerRef.current && !containerRef.current.contains(event.target)) {
723
+ setIsOpen(false);
724
+ }
725
+ };
726
+ document.addEventListener("mousedown", handleClickOutside);
727
+ return () => {
728
+ document.removeEventListener("mousedown", handleClickOutside);
729
+ };
730
+ }, []);
731
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(BasicFormField, { isDanger, dangerText, children: /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { ref: containerRef, className: "relative w-full", children: [
732
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
733
+ "div",
734
+ {
735
+ tabIndex: 0,
736
+ className: getInputStyles(
737
+ isDanger,
738
+ cn(
739
+ "flex items-center justify-between cursor-pointer select-none",
740
+ isOpen && "border-gray08",
741
+ // 열려있을 때 테두리 #3A414C 고정 (디자인 스펙)
742
+ className
743
+ )
744
+ ),
745
+ onClick: (e) => {
746
+ if (isOpen) {
747
+ e.currentTarget.blur();
748
+ }
749
+ setIsOpen((prev) => !prev);
750
+ },
751
+ children: [
752
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: value ? "text-primary" : "text-quaternary", children: value || placeholder }),
753
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
754
+ IconChevronDownXS,
755
+ {
756
+ className: cn("text-gray06 transition-transform", isOpen && "rotate-180"),
757
+ stroke: "currentColor"
758
+ }
759
+ )
760
+ ]
761
+ }
762
+ ),
763
+ isOpen && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
764
+ "ul",
765
+ {
766
+ className: cn(
767
+ "absolute top-full left-0 right-0 z-10",
768
+ // 💡 Input 바로 아래에 띄움
769
+ "box-border border border-gray02 bg-white flex flex-col",
770
+ "max-h-50 overflow-y-auto"
771
+ // 항목이 너무 많으면 스크롤 생성 (디자인 스펙: 그림자 없음)
772
+ ),
773
+ children: options.map((option) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
774
+ SelectBoxOption,
775
+ {
776
+ label: option,
777
+ onClick: () => {
778
+ onChange(option);
779
+ setIsOpen(false);
780
+ }
781
+ },
782
+ option
783
+ ))
784
+ }
785
+ )
786
+ ] }) });
787
+ };
788
+
789
+ // src/components/TextButton/TextButton.tsx
790
+ var import_jsx_runtime22 = require("react/jsx-runtime");
791
+ var TextButton = ({
792
+ children,
793
+ icon,
794
+ iconPosition = "left",
795
+ alert = false,
796
+ underline = true,
797
+ className,
798
+ ...props
799
+ }) => {
800
+ const content = /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_jsx_runtime22.Fragment, { children: [
801
+ icon && iconPosition === "left" && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: "flex shrink-0 items-center", children: icon }),
802
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: cn(underline && "underline underline-offset-2"), children }),
803
+ icon && iconPosition === "right" && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: "flex shrink-0 items-center", children: icon })
804
+ ] });
805
+ const classes = cn(
806
+ "inline-flex w-fit items-center gap-1 px-1 -mx-1",
807
+ "text-caption-book",
808
+ alert ? "text-danger" : "text-secondary",
809
+ "hover:bg-gray00 active:bg-gray01 transition-colors",
810
+ alert ? "hover:text-danger" : "hover:text-primary",
811
+ "cursor-pointer select-none",
812
+ "disabled:cursor-default disabled:text-quaternary disabled:hover:bg-transparent",
813
+ "aria-disabled:cursor-default aria-disabled:text-quaternary aria-disabled:hover:bg-transparent",
814
+ className
815
+ );
816
+ if (props.href !== void 0) {
817
+ const { href, ...rest } = props;
818
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("a", { href, className: classes, ...rest, children: content });
819
+ }
820
+ const buttonProps = props;
821
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("button", { type: "button", className: classes, ...buttonProps, children: content });
822
+ };
823
+
824
+ // src/components/Dropdown/Dropdown.tsx
825
+ var import_react4 = require("react");
826
+ var import_jsx_runtime23 = require("react/jsx-runtime");
827
+ var Dropdown = ({ selectedLabel, setSelectedLabel, labels, className }) => {
828
+ const [isOpen, setIsOpen] = (0, import_react4.useState)(false);
829
+ const containerRef = (0, import_react4.useRef)(null);
830
+ (0, import_react4.useEffect)(() => {
831
+ const handleClickOutside = (event) => {
832
+ if (containerRef.current && !containerRef.current.contains(event.target)) {
833
+ setIsOpen(false);
834
+ }
835
+ };
836
+ document.addEventListener("mousedown", handleClickOutside);
837
+ return () => {
838
+ document.removeEventListener("mousedown", handleClickOutside);
839
+ };
840
+ }, []);
841
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { ref: containerRef, className: "relative", children: [
842
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
843
+ "div",
844
+ {
845
+ className: cn(
846
+ "w-fit h-fit px-2 py-1",
847
+ "flex items-center justify-center gap-1.5",
848
+ "text-body3-book text-strong",
849
+ "bg-white hover:bg-gray00 active:bg-gray01",
850
+ "cursor-pointer",
851
+ className
852
+ ),
853
+ onClick: () => setIsOpen((prev) => !prev),
854
+ children: [
855
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { children: selectedLabel }),
856
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
857
+ IconChevronDownXS,
858
+ {
859
+ className: cn("text-gray06 transition-transform", isOpen && "rotate-180"),
860
+ stroke: "currentColor"
861
+ }
862
+ )
863
+ ]
864
+ }
865
+ ),
866
+ isOpen && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: cn("absolute top-full right-0 z-10", "box-border border border-gray02"), children: labels.map((label) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
867
+ SelectBoxOption,
868
+ {
869
+ label,
870
+ onClick: () => {
871
+ setSelectedLabel(label);
872
+ setIsOpen(false);
873
+ },
874
+ className: "w-44 h-11 justify-center"
875
+ },
876
+ label
877
+ )) })
878
+ ] });
879
+ };
880
+
881
+ // src/components/ListView/List.tsx
882
+ var import_jsx_runtime24 = require("react/jsx-runtime");
883
+ function List({
884
+ className,
885
+ label1,
886
+ label2,
887
+ label2OnClick,
888
+ label3,
889
+ disabled = false,
890
+ selected = false,
891
+ onClick,
892
+ children,
893
+ ...props
894
+ }) {
895
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
896
+ "li",
897
+ {
898
+ className: cn(
899
+ "w-full min-w-fit h-13 pl-4 pr-6",
900
+ "grid grid-cols-[4fr_1fr_1fr] items-center gap-4",
901
+ "bg-white hover:bg-gray00 hover:has-[.has-clickable:hover]:bg-white active:bg-gray01",
902
+ "text-primary select-none [&_*]:cursor-pointer cursor-pointer",
903
+ disabled && "opacity-40 [&_*]:cursor-pointer cursor-pointer",
904
+ selected && "bg-black text-white hover:bg-black active:bg-black hover:has-[.has-clickable:hover]:bg-black",
905
+ className
906
+ ),
907
+ ...props,
908
+ onClick,
909
+ children: [
910
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("section", { className: cn("flex items-center gap-4"), children: [
911
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("label", { className: cn("text-body2-regular"), children: label1 ? label1 : "-" }),
912
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: cn("flex items-center gap-2"), children })
913
+ ] }),
914
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
915
+ "label",
916
+ {
917
+ className: cn(
918
+ "text-body3-book truncate p-1 w-fit",
919
+ label2OnClick && "underline has-clickable",
920
+ label2OnClick && !selected && "hover:bg-gray00"
921
+ ),
922
+ onClick: label2OnClick,
923
+ children: label2 ? label2 : "-"
924
+ }
925
+ ),
926
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("label", { className: cn("text-body3-regular text-right"), children: label3 ? label3 : "-" })
927
+ ]
928
+ }
929
+ );
930
+ }
931
+
932
+ // src/components/Modal/Modal.tsx
933
+ var import_jsx_runtime25 = require("react/jsx-runtime");
934
+ var ModalBase = ({ isVisible, header, children, className }) => {
935
+ if (!isVisible) return null;
936
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: cn("fixed inset-0 z-50 pointer-events-auto"), children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
937
+ "div",
938
+ {
939
+ className: cn("fixed inset-0 z-1001 flex items-center justify-center pointer-events-auto"),
940
+ children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
941
+ "main",
942
+ {
943
+ className: cn(
944
+ "w-110 pt-8 h-fit",
945
+ "flex flex-col items-center",
946
+ "border border-gray02",
947
+ "bg-white shadow-[0 0 30px 0 rgba(0, 0, 0, 0.08);]",
948
+ className
949
+ ),
950
+ children: [
951
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("h1", { className: cn("text-strong font-[500] text-[24px] leading-[32px]"), children: header }),
952
+ children
953
+ ]
954
+ }
955
+ )
956
+ }
957
+ ) });
958
+ };
959
+ var Contents = ({ children, className }) => {
960
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
961
+ "div",
962
+ {
963
+ className: cn(
964
+ "flex flex-col items-center gap-8",
965
+ "w-full h-fit",
966
+ "px-14 pt-8 pb-9",
967
+ className
968
+ ),
969
+ children
970
+ }
971
+ );
972
+ };
973
+ var CTAs2 = ({ children, className, row = false }) => {
974
+ if (!children) return null;
975
+ return (
976
+ // CTA 버튼들을 중앙에 배치하는 예시 (우측 정렬이 필요하면 justify-end 사용)
977
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
978
+ "div",
979
+ {
980
+ className: cn(
981
+ "flex flex-col w-full h-fit",
982
+ row && "flex-row divide-x divide-gray02",
983
+ className
984
+ ),
985
+ children
986
+ }
987
+ )
988
+ );
989
+ };
990
+ var Modal = Object.assign(ModalBase, {
991
+ Contents,
992
+ CTAs: CTAs2
993
+ });
994
+
995
+ // src/components/Modal/ModalText.tsx
996
+ var import_jsx_runtime26 = require("react/jsx-runtime");
997
+ var ModalText = ({ children, className }) => {
998
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
999
+ "div",
1000
+ {
1001
+ className: cn(
1002
+ "flex flex-col items-center",
1003
+ "mt-[-20px] mb-[-4px]",
1004
+ ModalTextStyle,
1005
+ "text-tertiary text-center",
1006
+ className
1007
+ ),
1008
+ children
1009
+ }
1010
+ );
1011
+ };
1012
+
1013
+ // src/components/createPost/CategorySegment.tsx
1014
+ var import_jsx_runtime27 = require("react/jsx-runtime");
217
1015
  var CategorySegment = ({
218
1016
  selected = false,
219
1017
  label,
220
1018
  className,
221
1019
  onClick
222
1020
  }) => {
223
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1021
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
224
1022
  "div",
225
1023
  {
226
1024
  className: cn(
@@ -240,7 +1038,7 @@ var CategorySegment = ({
240
1038
  };
241
1039
 
242
1040
  // src/components/createPost/CategorySegmentedControl.tsx
243
- var import_jsx_runtime5 = require("react/jsx-runtime");
1041
+ var import_jsx_runtime28 = require("react/jsx-runtime");
244
1042
  var categorySegments = {
245
1043
  info: ["\uACF5\uC6A9 \uBB3C\uD488", "\uC77C\uBC18 \uAE30\uC790\uC7AC", "\uD2B9\uC218 \uAE30\uC790\uC7AC"],
246
1044
  archive: ["\uD504\uB9B0\uD2B8\uC2E4", "\uD64D\uC775\uC2DC\uB514"],
@@ -254,8 +1052,8 @@ var CategorySegmentedControl = ({
254
1052
  className
255
1053
  }) => {
256
1054
  const segments = categorySegments[variable];
257
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: cn("w-full h-fit flex items-center justify-start", className), children: [
258
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1055
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: cn("w-full h-fit flex items-center justify-start", className), children: [
1056
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
259
1057
  "div",
260
1058
  {
261
1059
  className: cn(
@@ -268,7 +1066,7 @@ var CategorySegmentedControl = ({
268
1066
  children: variable === "infoTag" ? "\uD0DC\uADF8 \uC120\uD0DD" : "\uCE74\uD14C\uACE0\uB9AC \uC120\uD0DD"
269
1067
  }
270
1068
  ),
271
- segments.map((label) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1069
+ segments.map((label) => /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
272
1070
  CategorySegment,
273
1071
  {
274
1072
  label,
@@ -281,9 +1079,9 @@ var CategorySegmentedControl = ({
281
1079
  };
282
1080
 
283
1081
  // src/components/createPost/TitleInput.tsx
284
- var import_jsx_runtime6 = require("react/jsx-runtime");
1082
+ var import_jsx_runtime29 = require("react/jsx-runtime");
285
1083
  var TitleInput = ({ title, onChange, className }) => {
286
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1084
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
287
1085
  "input",
288
1086
  {
289
1087
  type: "text",
@@ -303,9 +1101,9 @@ var TitleInput = ({ title, onChange, className }) => {
303
1101
  };
304
1102
 
305
1103
  // src/components/notice/NoticeBadge.tsx
306
- var import_jsx_runtime7 = require("react/jsx-runtime");
1104
+ var import_jsx_runtime30 = require("react/jsx-runtime");
307
1105
  var NoticeBadge = ({ variable, className, onClick }) => {
308
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1106
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
309
1107
  "button",
310
1108
  {
311
1109
  type: "button",
@@ -326,7 +1124,7 @@ var NoticeBadge = ({ variable, className, onClick }) => {
326
1124
  };
327
1125
 
328
1126
  // src/components/notice/NoticeBar.tsx
329
- var import_jsx_runtime8 = require("react/jsx-runtime");
1127
+ var import_jsx_runtime31 = require("react/jsx-runtime");
330
1128
  var NoticeBar = ({
331
1129
  variable = "default",
332
1130
  badgeVariable,
@@ -335,7 +1133,7 @@ var NoticeBar = ({
335
1133
  className,
336
1134
  onClick
337
1135
  }) => {
338
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
1136
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
339
1137
  "div",
340
1138
  {
341
1139
  className: cn(
@@ -347,20 +1145,20 @@ var NoticeBar = ({
347
1145
  ),
348
1146
  onClick,
349
1147
  children: [
350
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("section", { className: "flex items-center gap-3", children: [
351
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(NoticeBadge, { variable: badgeVariable }),
352
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("h1", { className: "text-head1-medium text-strong", children: title })
1148
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("section", { className: "flex items-center gap-3", children: [
1149
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(NoticeBadge, { variable: badgeVariable }),
1150
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("h1", { className: "text-head1-medium text-strong", children: title })
353
1151
  ] }),
354
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { className: "text-body3-book text-tertiary", children: date })
1152
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("p", { className: "text-body3-book text-tertiary", children: date })
355
1153
  ]
356
1154
  }
357
1155
  );
358
1156
  };
359
1157
 
360
1158
  // src/components/SearchBar/SearchBar.tsx
361
- var import_jsx_runtime9 = require("react/jsx-runtime");
1159
+ var import_jsx_runtime32 = require("react/jsx-runtime");
362
1160
  var SearchBar = ({ value, onChange, className }) => {
363
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
1161
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
364
1162
  "label",
365
1163
  {
366
1164
  className: cn(
@@ -371,8 +1169,8 @@ var SearchBar = ({ value, onChange, className }) => {
371
1169
  className
372
1170
  ),
373
1171
  children: [
374
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(IconSearch, {}),
375
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1172
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(IconSearch, {}),
1173
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
376
1174
  "input",
377
1175
  {
378
1176
  type: "text",
@@ -391,15 +1189,15 @@ var SearchBar = ({ value, onChange, className }) => {
391
1189
  };
392
1190
 
393
1191
  // src/components/SideRadioAccordion/SideRadioAccordion.tsx
394
- var import_react2 = require("react");
1192
+ var import_react6 = require("react");
395
1193
 
396
1194
  // src/lib/useControllableState.ts
397
- var import_react = require("react");
1195
+ var import_react5 = require("react");
398
1196
  function useControllableState(controlled, defaultValue) {
399
1197
  const isControlled = controlled !== void 0;
400
- const [uncontrolled, setUncontrolled] = (0, import_react.useState)(defaultValue);
1198
+ const [uncontrolled, setUncontrolled] = (0, import_react5.useState)(defaultValue);
401
1199
  const value = isControlled ? controlled : uncontrolled;
402
- const setValue = (0, import_react.useCallback)(
1200
+ const setValue = (0, import_react5.useCallback)(
403
1201
  (next) => {
404
1202
  if (!isControlled) setUncontrolled(next);
405
1203
  },
@@ -421,7 +1219,7 @@ var RadioSelected_default = "./RadioSelected-DOLVV7ZM.svg";
421
1219
  var RadioUnselected_default = "./RadioUnselected-QN74EU46.svg";
422
1220
 
423
1221
  // src/components/SideRadioAccordion/SideRadioAccordion.tsx
424
- var import_jsx_runtime10 = require("react/jsx-runtime");
1222
+ var import_jsx_runtime33 = require("react/jsx-runtime");
425
1223
  var printColorBgClass = {
426
1224
  Plotter: "bg-print-plotter",
427
1225
  Printer: "bg-print-printer",
@@ -432,7 +1230,7 @@ var printColorBgClass = {
432
1230
  "Laser Cutting": "bg-print-laser-cutting"
433
1231
  };
434
1232
  var itemKey = (item) => item.value ?? item.title;
435
- var SideRadioAccordion = (0, import_react2.forwardRef)(
1233
+ var SideRadioAccordion = (0, import_react6.forwardRef)(
436
1234
  function SideRadioAccordion2({
437
1235
  step,
438
1236
  title,
@@ -465,8 +1263,8 @@ var SideRadioAccordion = (0, import_react2.forwardRef)(
465
1263
  setIsOpen(next);
466
1264
  onOpenChange?.(next);
467
1265
  };
468
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { ref, className: cn("w-full", className), children: [
469
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1266
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { ref, className: cn("w-full border-r border-gray02 bg-white", className), children: [
1267
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
470
1268
  Stepper,
471
1269
  {
472
1270
  step,
@@ -477,8 +1275,8 @@ var SideRadioAccordion = (0, import_react2.forwardRef)(
477
1275
  className: cn(stickyHeader && "sticky top-0 z-10")
478
1276
  }
479
1277
  ),
480
- expanded && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "flex flex-col", children: [
481
- radioToggleList.map((item) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1278
+ expanded && /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex flex-col divide-y divide-gray02", children: [
1279
+ radioToggleList.map((item) => /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
482
1280
  RadioToggleItem,
483
1281
  {
484
1282
  ...item,
@@ -487,29 +1285,22 @@ var SideRadioAccordion = (0, import_react2.forwardRef)(
487
1285
  },
488
1286
  itemKey(item)
489
1287
  )),
490
- quantityLimitLabel && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
491
- TextButton,
492
- {
493
- label: quantityLimitLabel,
494
- onClick: onClickQuantityLimit,
495
- className: "mt-2"
496
- }
497
- )
1288
+ quantityLimitLabel && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "px-5 py-4", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TextButton2, { label: quantityLimitLabel, onClick: onClickQuantityLimit }) })
498
1289
  ] })
499
1290
  ] });
500
1291
  }
501
1292
  );
502
1293
  var Stepper = ({ step, title, isOpen, collapsible, onClick, className }) => {
503
- const label = /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("span", { children: [
1294
+ const label = /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("span", { children: [
504
1295
  step,
505
1296
  " | ",
506
1297
  title
507
1298
  ] });
508
- const base = "w-full flex items-center justify-between px-3 py-2.5 text-body1-medium text-strong text-left bg-white";
1299
+ const base = "w-full flex items-center justify-between px-5 py-2.5 text-head3-medium text-primary text-left bg-white border-b border-gray02";
509
1300
  if (!collapsible) {
510
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: cn(base, className), children: label });
1301
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: cn(base, className), children: label });
511
1302
  }
512
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
1303
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
513
1304
  "button",
514
1305
  {
515
1306
  type: "button",
@@ -517,7 +1308,7 @@ var Stepper = ({ step, title, isOpen, collapsible, onClick, className }) => {
517
1308
  className: cn(base, "cursor-pointer hover:bg-gray00 active:bg-gray01", className),
518
1309
  children: [
519
1310
  label,
520
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1311
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
521
1312
  "img",
522
1313
  {
523
1314
  src: ChevronDown_default,
@@ -543,30 +1334,30 @@ var RadioToggleItem = ({
543
1334
  }) => {
544
1335
  const rowBg = !open ? "bg-white hover:bg-gray00" : color ? void 0 : printColor ? printColorBgClass[printColor] : "bg-gray00";
545
1336
  const style = open && color ? { backgroundColor: color } : void 0;
546
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "w-full", children: [
547
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
1337
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "w-full", children: [
1338
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
548
1339
  "button",
549
1340
  {
550
1341
  type: "button",
551
1342
  onClick: onSelect,
552
1343
  style,
553
1344
  className: cn(
554
- "w-full flex items-center gap-1.5 px-3 py-2.5",
555
- "text-body2-regular text-primary text-left cursor-pointer",
1345
+ "w-full flex items-center gap-1.5 p-3",
1346
+ "text-body1-regular text-secondary text-left cursor-pointer",
556
1347
  rowBg,
557
1348
  className
558
1349
  ),
559
1350
  children: [
560
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Radio, { selected: open }),
561
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: title })
1351
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Radio, { selected: open }),
1352
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { children: title })
562
1353
  ]
563
1354
  }
564
1355
  ),
565
- open && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "flex flex-col gap-2 px-3 py-3 bg-white", children: [
566
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "text-caption-regular text-secondary", children: content }),
567
- badges && badges.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "flex gap-1", children: badges.map((badge) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Badge, { label: badge }, badge)) }),
568
- labelTextButton && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
569
- TextButton,
1356
+ open && /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex flex-col gap-2 px-3 py-3 bg-white", children: [
1357
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("p", { className: "text-caption-regular text-secondary", children: content }),
1358
+ badges && badges.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "flex gap-1", children: badges.map((badge) => /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Badge, { label: badge }, badge)) }),
1359
+ labelTextButton && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
1360
+ TextButton2,
570
1361
  {
571
1362
  label: labelTextButton,
572
1363
  onClick: onClickTextButton,
@@ -578,17 +1369,17 @@ var RadioToggleItem = ({
578
1369
  ] });
579
1370
  };
580
1371
  var Radio = ({ selected = false, className }) => {
581
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1372
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
582
1373
  "img",
583
1374
  {
584
1375
  src: selected ? RadioSelected_default : RadioUnselected_default,
585
1376
  alt: "",
586
- className: cn("w-4 h-4", className)
1377
+ className: cn("w-6 h-6", className)
587
1378
  }
588
1379
  );
589
1380
  };
590
- var TextButton = ({ label, onClick, showIcon = false, className }) => {
591
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
1381
+ var TextButton2 = ({ label, onClick, showIcon = false, className }) => {
1382
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
592
1383
  "button",
593
1384
  {
594
1385
  type: "button",
@@ -601,14 +1392,14 @@ var TextButton = ({ label, onClick, showIcon = false, className }) => {
601
1392
  className
602
1393
  ),
603
1394
  children: [
604
- showIcon && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("img", { src: Exclamation_default, alt: "" }),
1395
+ showIcon && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("img", { src: Exclamation_default, alt: "" }),
605
1396
  label
606
1397
  ]
607
1398
  }
608
1399
  );
609
1400
  };
610
1401
  var Badge = ({ label, className }) => {
611
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1402
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
612
1403
  "div",
613
1404
  {
614
1405
  className: cn(
@@ -622,7 +1413,7 @@ var Badge = ({ label, className }) => {
622
1413
  };
623
1414
 
624
1415
  // src/components/Tag/Tag.tsx
625
- var import_jsx_runtime11 = require("react/jsx-runtime");
1416
+ var import_jsx_runtime34 = require("react/jsx-runtime");
626
1417
  var Tag = ({
627
1418
  className,
628
1419
  children,
@@ -632,7 +1423,7 @@ var Tag = ({
632
1423
  onClick,
633
1424
  ...props
634
1425
  }) => {
635
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1426
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
636
1427
  "button",
637
1428
  {
638
1429
  className: cn(
@@ -651,16 +1442,16 @@ var Tag = ({
651
1442
  disabled,
652
1443
  style: bgColor ? { backgroundColor: bgColor, border: "none" } : void 0,
653
1444
  ...props,
654
- children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { children })
1445
+ children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { children })
655
1446
  }
656
1447
  );
657
1448
  };
658
1449
 
659
1450
  // src/components/Timetable/Timetable.tsx
660
- var import_react4 = require("react");
1451
+ var import_react8 = require("react");
661
1452
 
662
1453
  // src/components/Timetable/WeekNavigation.tsx
663
- var import_react3 = require("react");
1454
+ var import_react7 = require("react");
664
1455
 
665
1456
  // src/components/Timetable/dateUtils.ts
666
1457
  var KOREAN_WEEKDAYS = ["\uC77C", "\uC6D4", "\uD654", "\uC218", "\uBAA9", "\uAE08", "\uD1A0"];
@@ -693,64 +1484,73 @@ var formatWeekRange = (weekStart) => {
693
1484
  };
694
1485
 
695
1486
  // src/components/Timetable/WeekNavigation.tsx
696
- var import_jsx_runtime12 = require("react/jsx-runtime");
1487
+ var import_jsx_runtime35 = require("react/jsx-runtime");
697
1488
  var weekLabel = {
698
1489
  thisWeek: "\uC774\uBC88 \uC8FC",
699
1490
  nextWeek: "\uB2E4\uC74C \uC8FC",
700
1491
  twoWeeksLater: "\uB2E4\uB2E4\uC74C \uC8FC"
701
1492
  };
702
- var WeekNavigation = (0, import_react3.forwardRef)(
1493
+ var WeekNavigation = (0, import_react7.forwardRef)(
703
1494
  function WeekNavigation2({ date, week, label, canPrev, canNext, onPrevWeek, onNextWeek, className }, ref) {
704
1495
  const showPrev = canPrev ?? (week ? week !== "thisWeek" : true);
705
1496
  const showNext = canNext ?? (week ? week !== "twoWeeksLater" : true);
706
1497
  const text = label ?? (week ? `${weekLabel[week]} (${formatWeekRange(date)})` : formatWeekRange(date));
707
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
1498
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(
708
1499
  "div",
709
1500
  {
710
1501
  ref,
711
1502
  className: cn(
712
- "flex items-center justify-between",
713
- "w-full h-11 px-3",
714
- "bg-white border border-gray02",
715
- "text-body2-regular text-primary",
1503
+ "flex items-stretch justify-between",
1504
+ "w-full h-12",
1505
+ "bg-white border-b border-gray02",
1506
+ "text-body1-medium text-secondary",
716
1507
  className
717
1508
  ),
718
1509
  children: [
719
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(ArrowButton, { direction: "left", visible: showPrev, onClick: onPrevWeek }),
720
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { children: text }),
721
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(ArrowButton, { direction: "right", visible: showNext, onClick: onNextWeek })
1510
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(ArrowButton, { direction: "left", visible: showPrev, onClick: onPrevWeek }),
1511
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: "flex flex-1 items-center justify-center text-center", children: text }),
1512
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(ArrowButton, { direction: "right", visible: showNext, onClick: onNextWeek })
722
1513
  ]
723
1514
  }
724
1515
  );
725
1516
  }
726
1517
  );
727
1518
  var ArrowButton = ({ direction, visible, onClick }) => {
1519
+ const divider = /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { "aria-hidden": true, className: "w-px self-stretch bg-gray02" });
728
1520
  if (!visible) {
729
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "w-6 h-6" });
1521
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: "flex items-stretch", children: [
1522
+ direction === "right" && divider,
1523
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: "w-[42px]" }),
1524
+ direction === "left" && divider
1525
+ ] });
730
1526
  }
731
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
732
- "button",
733
- {
734
- type: "button",
735
- onClick,
736
- className: cn(
737
- "flex items-center justify-center w-6 h-6",
738
- "text-gray06 cursor-pointer",
739
- "hover:bg-gray00 active:bg-gray01"
740
- ),
741
- children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
742
- IconChevronDownXS,
743
- {
744
- className: direction === "left" ? "rotate-90" : "-rotate-90",
745
- stroke: "currentColor"
746
- }
747
- )
748
- }
749
- );
1527
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: "flex items-stretch", children: [
1528
+ direction === "right" && divider,
1529
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
1530
+ "button",
1531
+ {
1532
+ type: "button",
1533
+ onClick,
1534
+ className: cn(
1535
+ "flex w-[42px] items-center justify-center",
1536
+ "text-gray06 cursor-pointer transition-colors",
1537
+ "hover:bg-gray00 active:bg-gray01"
1538
+ ),
1539
+ children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
1540
+ IconChevronDownXS,
1541
+ {
1542
+ className: direction === "left" ? "rotate-90" : "-rotate-90",
1543
+ stroke: "currentColor"
1544
+ }
1545
+ )
1546
+ }
1547
+ ),
1548
+ direction === "left" && divider
1549
+ ] });
750
1550
  };
751
1551
 
752
1552
  // src/components/Timetable/Timetable.tsx
753
- var import_jsx_runtime13 = require("react/jsx-runtime");
1553
+ var import_jsx_runtime36 = require("react/jsx-runtime");
754
1554
  var printColorHoverClass = {
755
1555
  Plotter: "hover:bg-print-plotter",
756
1556
  Printer: "hover:bg-print-printer",
@@ -760,7 +1560,7 @@ var printColorHoverClass = {
760
1560
  "Seet Cutting": "hover:bg-print-seet-cutting",
761
1561
  "Laser Cutting": "hover:bg-print-laser-cutting"
762
1562
  };
763
- var Timetable = (0, import_react4.forwardRef)(function Timetable2({
1563
+ var Timetable = (0, import_react8.forwardRef)(function Timetable2({
764
1564
  weekStart,
765
1565
  week,
766
1566
  days,
@@ -773,8 +1573,8 @@ var Timetable = (0, import_react4.forwardRef)(function Timetable2({
773
1573
  canNextWeek,
774
1574
  className
775
1575
  }, ref) {
776
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { ref, className: cn(fluid && "w-full", className), children: [
777
- !hideWeekNavigation && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1576
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { ref, className: cn(fluid && "w-full", className), children: [
1577
+ !hideWeekNavigation && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
778
1578
  WeekNavigation,
779
1579
  {
780
1580
  date: weekStart,
@@ -785,7 +1585,7 @@ var Timetable = (0, import_react4.forwardRef)(function Timetable2({
785
1585
  onNextWeek
786
1586
  }
787
1587
  ),
788
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: cn("flex", fluid && "w-full"), children: days.map((day) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1588
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { className: cn("flex", fluid && "w-full"), children: days.map((day) => /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
789
1589
  DailyTimetable,
790
1590
  {
791
1591
  date: day.date,
@@ -798,9 +1598,9 @@ var Timetable = (0, import_react4.forwardRef)(function Timetable2({
798
1598
  ] });
799
1599
  });
800
1600
  var DailyTimetable = ({ date, slots, fluid, onSelectTime, className }) => {
801
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: cn("flex flex-col", fluid ? "flex-1 min-w-0" : "w-18", className), children: [
802
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "h-13 flex items-center justify-center text-body3-medium text-secondary", children: formatDayLabel(date) }),
803
- slots.map((slot) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1601
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: cn("flex flex-col", fluid ? "flex-1 min-w-0" : "w-18", className), children: [
1602
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { className: "h-12 flex items-center justify-center border-b border-gray02 text-body1-regular text-secondary", children: formatDayLabel(date) }),
1603
+ slots.map((slot) => /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
804
1604
  TimeItem,
805
1605
  {
806
1606
  state: slot.state,
@@ -826,17 +1626,17 @@ var TimeItem = ({
826
1626
  }) => {
827
1627
  const clickable = (state === "default" || state === "selected") && !!onClick;
828
1628
  const style = state === "default" && color ? { "--tt-hover": color } : void 0;
829
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1629
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
830
1630
  "div",
831
1631
  {
832
1632
  onClick: clickable ? onClick : void 0,
833
1633
  style,
834
1634
  className: cn(
835
- "h-18 flex items-center justify-center",
1635
+ "h-18 flex items-center justify-center border-b border-gray02",
836
1636
  fluid ? "w-full" : "w-18",
837
1637
  "text-body1-medium text-center bg-white text-primary",
838
1638
  state === "none" && "bg-gray00 text-transparent",
839
- state === "selected" && "bg-black text-gray02 hover:cursor-pointer",
1639
+ state === "selected" && "bg-black text-white hover:cursor-pointer",
840
1640
  state === "disabled" && "bg-gray00 text-gray03",
841
1641
  state === "default" && [
842
1642
  "hover:cursor-pointer",
@@ -850,13 +1650,13 @@ var TimeItem = ({
850
1650
  };
851
1651
 
852
1652
  // src/components/TNB/TNB.tsx
853
- var import_react5 = require("react");
854
- var import_jsx_runtime14 = require("react/jsx-runtime");
1653
+ var import_react9 = require("react");
1654
+ var import_jsx_runtime37 = require("react/jsx-runtime");
855
1655
  function useControllableState2(controlled, defaultValue) {
856
1656
  const isControlled = controlled !== void 0;
857
- const [uncontrolled, setUncontrolled] = (0, import_react5.useState)(defaultValue);
1657
+ const [uncontrolled, setUncontrolled] = (0, import_react9.useState)(defaultValue);
858
1658
  const value = isControlled ? controlled : uncontrolled;
859
- const setValue = (0, import_react5.useCallback)(
1659
+ const setValue = (0, import_react9.useCallback)(
860
1660
  (next) => {
861
1661
  if (!isControlled) setUncontrolled(next);
862
1662
  },
@@ -864,7 +1664,7 @@ function useControllableState2(controlled, defaultValue) {
864
1664
  );
865
1665
  return [value, setValue, isControlled];
866
1666
  }
867
- var TNB = (0, import_react5.forwardRef)(function TNB2({
1667
+ var TNB = (0, import_react9.forwardRef)(function TNB2({
868
1668
  logo,
869
1669
  upperPartItemList,
870
1670
  upperPartIconList,
@@ -903,8 +1703,8 @@ var TNB = (0, import_react5.forwardRef)(function TNB2({
903
1703
  setLowerValue(label);
904
1704
  onSelectedLowerChange?.(label);
905
1705
  };
906
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("nav", { ref, "aria-label": ariaLabel, className: cn("w-full bg-white", className), children: [
907
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1706
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("nav", { ref, "aria-label": ariaLabel, className: cn("w-full bg-white", className), children: [
1707
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
908
1708
  UpperPart,
909
1709
  {
910
1710
  logo,
@@ -915,7 +1715,7 @@ var TNB = (0, import_react5.forwardRef)(function TNB2({
915
1715
  linkComponent
916
1716
  }
917
1717
  ),
918
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1718
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
919
1719
  LowerPart,
920
1720
  {
921
1721
  lowerPartItemList: currentLowerItemList,
@@ -926,11 +1726,11 @@ var TNB = (0, import_react5.forwardRef)(function TNB2({
926
1726
  )
927
1727
  ] });
928
1728
  });
929
- var NavClickable = (0, import_react5.forwardRef)(function NavClickable2({ href, onClick, linkComponent: Link, current, disabled, className, children }, ref) {
1729
+ var NavClickable = (0, import_react9.forwardRef)(function NavClickable2({ href, onClick, linkComponent: Link, current, disabled, className, children }, ref) {
930
1730
  const ariaCurrent = current ? "page" : void 0;
931
1731
  if (href && !disabled) {
932
1732
  if (Link) {
933
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1733
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
934
1734
  Link,
935
1735
  {
936
1736
  href,
@@ -942,7 +1742,7 @@ var NavClickable = (0, import_react5.forwardRef)(function NavClickable2({ href,
942
1742
  }
943
1743
  );
944
1744
  }
945
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1745
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
946
1746
  "a",
947
1747
  {
948
1748
  href,
@@ -954,7 +1754,7 @@ var NavClickable = (0, import_react5.forwardRef)(function NavClickable2({ href,
954
1754
  }
955
1755
  );
956
1756
  }
957
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1757
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
958
1758
  "button",
959
1759
  {
960
1760
  type: "button",
@@ -976,33 +1776,50 @@ var UpperPart = ({
976
1776
  linkComponent,
977
1777
  className
978
1778
  }) => {
979
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: cn("w-full h-13 px-4 flex items-center justify-between", className), children: [
980
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex items-center gap-6", children: [
981
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(NavIconButton, { ...logo, linkComponent }),
982
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "flex items-center gap-4", children: upperPartItemList.map((item) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
983
- UpperPartTab,
984
- {
985
- label: item.label,
986
- href: item.href,
987
- selected: item.label === selected,
988
- linkComponent,
989
- onClick: () => {
990
- item.onClick?.();
991
- onSelectItem(item.label);
992
- }
993
- },
994
- item.id ?? item.label
995
- )) })
996
- ] }),
997
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "flex items-center gap-2", children: upperPartIconList.map((icon, index) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
998
- NavIconButton,
999
- {
1000
- ...icon,
1001
- linkComponent
1002
- },
1003
- icon.id ?? icon.src ?? icon.label ?? index
1004
- )) })
1005
- ] });
1779
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(
1780
+ "div",
1781
+ {
1782
+ className: cn(
1783
+ "w-full min-h-13 flex items-stretch justify-between border-b border-gray02",
1784
+ className
1785
+ ),
1786
+ children: [
1787
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-stretch", children: [
1788
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "flex w-14 shrink-0 items-center justify-center px-3", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(NavIconButton, { ...logo, linkComponent }) }),
1789
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-stretch", children: [
1790
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { "aria-hidden": true, className: "w-px self-stretch bg-gray02" }),
1791
+ upperPartItemList.map((item) => /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_react9.Fragment, { children: [
1792
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
1793
+ UpperPartTab,
1794
+ {
1795
+ label: item.label,
1796
+ href: item.href,
1797
+ selected: item.label === selected,
1798
+ linkComponent,
1799
+ onClick: () => {
1800
+ item.onClick?.();
1801
+ onSelectItem(item.label);
1802
+ }
1803
+ }
1804
+ ),
1805
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { "aria-hidden": true, className: "w-px self-stretch bg-gray02" })
1806
+ ] }, item.id ?? item.label))
1807
+ ] })
1808
+ ] }),
1809
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "flex items-stretch", children: [
1810
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { "aria-hidden": true, className: "w-px self-stretch bg-gray02" }),
1811
+ upperPartIconList.map((icon, index) => /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
1812
+ NavIconButton,
1813
+ {
1814
+ ...icon,
1815
+ linkComponent
1816
+ },
1817
+ icon.id ?? icon.src ?? icon.label ?? index
1818
+ ))
1819
+ ] })
1820
+ ]
1821
+ }
1822
+ );
1006
1823
  };
1007
1824
  var UpperPartTab = ({
1008
1825
  label,
@@ -1012,7 +1829,7 @@ var UpperPartTab = ({
1012
1829
  linkComponent,
1013
1830
  className
1014
1831
  }) => {
1015
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1832
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(
1016
1833
  NavClickable,
1017
1834
  {
1018
1835
  href,
@@ -1020,19 +1837,22 @@ var UpperPartTab = ({
1020
1837
  linkComponent,
1021
1838
  current: selected,
1022
1839
  className: cn(
1023
- "inline-flex px-1 py-1.5 text-body2-regular cursor-pointer no-underline",
1024
- selected ? "text-strong font-medium underline underline-offset-4" : "text-quaternary hover:text-secondary",
1840
+ "inline-flex min-h-13 flex-col items-center gap-2 pt-2.5 cursor-pointer no-underline",
1841
+ "transition-colors hover:bg-gray00 active:bg-gray01",
1025
1842
  className
1026
1843
  ),
1027
- children: label
1844
+ children: [
1845
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: cn("px-5 text-head1-medium", selected ? "text-strong" : "text-quaternary"), children: label }),
1846
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: cn("h-0.5 w-full", selected ? "bg-black" : "bg-transparent") })
1847
+ ]
1028
1848
  }
1029
1849
  );
1030
1850
  };
1031
- var NavIconButton = (0, import_react5.forwardRef)(
1851
+ var NavIconButton = (0, import_react9.forwardRef)(
1032
1852
  function NavIconButton2({ src, icon, alt, label, href, onClick, selected, badge, className, linkComponent }, forwardedRef) {
1033
1853
  const interactive = Boolean(onClick || href);
1034
1854
  const showBadge = badge !== void 0 && badge !== null && badge !== false;
1035
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
1855
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(
1036
1856
  NavClickable,
1037
1857
  {
1038
1858
  ref: forwardedRef,
@@ -1042,15 +1862,15 @@ var NavIconButton = (0, import_react5.forwardRef)(
1042
1862
  current: selected,
1043
1863
  disabled: !interactive,
1044
1864
  className: cn(
1045
- "relative inline-flex h-8 min-w-8 items-center justify-center gap-1.5 rounded-full px-1.5",
1865
+ "relative inline-flex h-13 min-w-13 items-center justify-center gap-1.5 px-3 transition-colors",
1046
1866
  interactive && "cursor-pointer",
1047
1867
  selected ? "bg-black text-white" : "bg-transparent hover:bg-gray00 active:bg-gray01",
1048
1868
  className
1049
1869
  ),
1050
1870
  children: [
1051
- icon ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "inline-flex h-5 w-5 items-center justify-center", children: icon }) : src ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("img", { src, alt: alt ?? label ?? "", className: "h-5 w-5" }) : null,
1052
- label ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: cn("text-body2-regular", selected ? "text-white" : "text-secondary"), children: label }) : null,
1053
- showBadge ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1871
+ icon ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "inline-flex h-6 w-6 items-center justify-center", children: icon }) : src ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("img", { src, alt: alt ?? label ?? "", className: "h-6 w-6" }) : null,
1872
+ label ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: cn("text-body2-regular", selected ? "text-white" : "text-secondary"), children: label }) : null,
1873
+ showBadge ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
1054
1874
  "span",
1055
1875
  {
1056
1876
  "aria-hidden": badge === true,
@@ -1076,24 +1896,29 @@ var LowerPart = ({
1076
1896
  if (lowerPartItemList.length === 0) {
1077
1897
  return null;
1078
1898
  }
1079
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1899
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(
1080
1900
  "div",
1081
1901
  {
1082
- className: cn("w-full h-9 px-4 flex items-center gap-4 border-t border-gray02", className),
1083
- children: lowerPartItemList.map((item) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1084
- LowerPartItemButton,
1085
- {
1086
- label: item.label,
1087
- href: item.href,
1088
- selected: item.label === selected,
1089
- linkComponent,
1090
- onClick: () => {
1091
- item.onClick?.();
1092
- onSelectItem(item.label);
1093
- }
1094
- },
1095
- item.id ?? item.label
1096
- ))
1902
+ className: cn("w-full h-[42px] pl-14 flex items-stretch border-b border-gray02", className),
1903
+ children: [
1904
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { "aria-hidden": true, className: "w-px self-stretch bg-gray02" }),
1905
+ lowerPartItemList.map((item) => /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_react9.Fragment, { children: [
1906
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
1907
+ LowerPartItemButton,
1908
+ {
1909
+ label: item.label,
1910
+ href: item.href,
1911
+ selected: item.label === selected,
1912
+ linkComponent,
1913
+ onClick: () => {
1914
+ item.onClick?.();
1915
+ onSelectItem(item.label);
1916
+ }
1917
+ }
1918
+ ),
1919
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { "aria-hidden": true, className: "w-px self-stretch bg-gray02" })
1920
+ ] }, item.id ?? item.label))
1921
+ ]
1097
1922
  }
1098
1923
  );
1099
1924
  };
@@ -1105,7 +1930,7 @@ var LowerPartItemButton = ({
1105
1930
  linkComponent,
1106
1931
  className
1107
1932
  }) => {
1108
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1933
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
1109
1934
  NavClickable,
1110
1935
  {
1111
1936
  href,
@@ -1113,9 +1938,9 @@ var LowerPartItemButton = ({
1113
1938
  linkComponent,
1114
1939
  current: selected,
1115
1940
  className: cn(
1116
- "inline-flex px-1.5 py-1 text-caption-regular cursor-pointer no-underline",
1117
- "hover:bg-gray00 active:bg-gray01",
1118
- selected ? "text-strong font-medium" : "text-quaternary",
1941
+ "inline-flex h-full items-center justify-center px-5 text-head3-medium cursor-pointer no-underline",
1942
+ "transition-colors hover:bg-gray00 active:bg-gray01",
1943
+ selected ? "text-strong" : "text-quaternary",
1119
1944
  className
1120
1945
  ),
1121
1946
  children: label
@@ -1124,14 +1949,14 @@ var LowerPartItemButton = ({
1124
1949
  };
1125
1950
 
1126
1951
  // src/components/Toast/Toast.tsx
1127
- var import_react6 = require("react");
1128
- var import_jsx_runtime15 = require("react/jsx-runtime");
1952
+ var import_react10 = require("react");
1953
+ var import_jsx_runtime38 = require("react/jsx-runtime");
1129
1954
  var EXIT_MS = 300;
1130
- var Toast = (0, import_react6.forwardRef)(function Toast2({ message, open, duration = 3e3, onClose, position = "none", className }, ref) {
1955
+ var Toast = (0, import_react10.forwardRef)(function Toast2({ message, open, duration = 3e3, onClose, position = "none", className }, ref) {
1131
1956
  const controlled = open !== void 0;
1132
- const [mounted, setMounted] = (0, import_react6.useState)(!controlled || open);
1133
- const [visible, setVisible] = (0, import_react6.useState)(!controlled || open);
1134
- (0, import_react6.useEffect)(() => {
1957
+ const [mounted, setMounted] = (0, import_react10.useState)(!controlled || open);
1958
+ const [visible, setVisible] = (0, import_react10.useState)(!controlled || open);
1959
+ (0, import_react10.useEffect)(() => {
1135
1960
  if (!controlled) return;
1136
1961
  if (open) {
1137
1962
  setMounted(true);
@@ -1142,13 +1967,13 @@ var Toast = (0, import_react6.forwardRef)(function Toast2({ message, open, durat
1142
1967
  const timer = setTimeout(() => setMounted(false), EXIT_MS);
1143
1968
  return () => clearTimeout(timer);
1144
1969
  }, [controlled, open]);
1145
- (0, import_react6.useEffect)(() => {
1970
+ (0, import_react10.useEffect)(() => {
1146
1971
  if (!controlled || !open || !duration) return;
1147
1972
  const timer = setTimeout(() => onClose?.(), duration);
1148
1973
  return () => clearTimeout(timer);
1149
1974
  }, [controlled, open, duration, onClose]);
1150
1975
  if (!mounted) return null;
1151
- const banner = /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1976
+ const banner = /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
1152
1977
  "div",
1153
1978
  {
1154
1979
  ref,
@@ -1156,7 +1981,7 @@ var Toast = (0, import_react6.forwardRef)(function Toast2({ message, open, durat
1156
1981
  "aria-live": "polite",
1157
1982
  className: cn(
1158
1983
  "w-full h-fit py-2.5 bg-gray06",
1159
- "font-pretendard text-white text-center font-semibold text-[17px]",
1984
+ "font-pretendard text-white text-center font-semibold text-[17px] leading-[1.6]",
1160
1985
  "shadow-[0_2px_15px_rgba(0,0,0,0.18)]",
1161
1986
  controlled && "transition-opacity duration-300",
1162
1987
  controlled && (visible ? "opacity-100" : "opacity-0"),
@@ -1166,7 +1991,7 @@ var Toast = (0, import_react6.forwardRef)(function Toast2({ message, open, durat
1166
1991
  }
1167
1992
  );
1168
1993
  if (position === "none") return banner;
1169
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1994
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
1170
1995
  "div",
1171
1996
  {
1172
1997
  className: cn(
@@ -1180,18 +2005,49 @@ var Toast = (0, import_react6.forwardRef)(function Toast2({ message, open, durat
1180
2005
  // Annotate the CommonJS export names for ESM import in node:
1181
2006
  0 && (module.exports = {
1182
2007
  BackButton,
2008
+ BasicFormField,
1183
2009
  CTA,
1184
2010
  CategorySegment,
1185
2011
  CategorySegmentedControl,
2012
+ Column,
2013
+ ColumnContentContainer,
2014
+ ColumnDescription,
2015
+ ColumnDescriptionList,
2016
+ ColumnLabel,
2017
+ ColumnSubTitle,
2018
+ ColumnText,
2019
+ ColumnTextStyle,
2020
+ Dropdown,
2021
+ FormCheckBox,
2022
+ FormColor,
2023
+ FormFile,
2024
+ FormNumber,
2025
+ FormPassword,
2026
+ FormSelectBox,
2027
+ FormTel,
2028
+ FormText,
2029
+ FormTextArea,
2030
+ IconCheck,
2031
+ IconChevronDownXS,
2032
+ IconCompass,
2033
+ IconInfo,
2034
+ List,
2035
+ Modal,
2036
+ ModalText,
2037
+ ModalTextStyle,
2038
+ MultiColumn,
1186
2039
  NoticeBadge,
1187
2040
  NoticeBar,
1188
2041
  SearchBar,
2042
+ SelectBoxOption,
1189
2043
  SideRadioAccordion,
1190
2044
  TNB,
1191
2045
  Tag,
2046
+ TextButton,
1192
2047
  Timetable,
1193
2048
  TitleInput,
1194
2049
  Toast,
1195
- WeekNavigation
2050
+ WeekNavigation,
2051
+ getInputStyles
1196
2052
  });
1197
2053
  //# sourceMappingURL=index.js.map