@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.d.mts +253 -11
- package/dist/index.d.ts +253 -11
- package/dist/index.js +1043 -187
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1000 -174
- package/dist/index.mjs.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +1 -1
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/
|
|
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,
|
|
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
|
|
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,
|
|
258
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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
|
|
1082
|
+
var import_jsx_runtime29 = require("react/jsx-runtime");
|
|
285
1083
|
var TitleInput = ({ title, onChange, className }) => {
|
|
286
|
-
return /* @__PURE__ */ (0,
|
|
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
|
|
1104
|
+
var import_jsx_runtime30 = require("react/jsx-runtime");
|
|
307
1105
|
var NoticeBadge = ({ variable, className, onClick }) => {
|
|
308
|
-
return /* @__PURE__ */ (0,
|
|
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
|
|
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,
|
|
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,
|
|
351
|
-
/* @__PURE__ */ (0,
|
|
352
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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
|
|
1159
|
+
var import_jsx_runtime32 = require("react/jsx-runtime");
|
|
362
1160
|
var SearchBar = ({ value, onChange, className }) => {
|
|
363
|
-
return /* @__PURE__ */ (0,
|
|
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,
|
|
375
|
-
/* @__PURE__ */ (0,
|
|
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
|
|
1192
|
+
var import_react6 = require("react");
|
|
395
1193
|
|
|
396
1194
|
// src/lib/useControllableState.ts
|
|
397
|
-
var
|
|
1195
|
+
var import_react5 = require("react");
|
|
398
1196
|
function useControllableState(controlled, defaultValue) {
|
|
399
1197
|
const isControlled = controlled !== void 0;
|
|
400
|
-
const [uncontrolled, setUncontrolled] = (0,
|
|
1198
|
+
const [uncontrolled, setUncontrolled] = (0, import_react5.useState)(defaultValue);
|
|
401
1199
|
const value = isControlled ? controlled : uncontrolled;
|
|
402
|
-
const setValue = (0,
|
|
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
|
|
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,
|
|
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,
|
|
469
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
481
|
-
radioToggleList.map((item) => /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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-
|
|
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,
|
|
1301
|
+
return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: cn(base, className), children: label });
|
|
511
1302
|
}
|
|
512
|
-
return /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
547
|
-
/* @__PURE__ */ (0,
|
|
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
|
|
555
|
-
"text-
|
|
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,
|
|
561
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
566
|
-
/* @__PURE__ */ (0,
|
|
567
|
-
badges && badges.length > 0 && /* @__PURE__ */ (0,
|
|
568
|
-
labelTextButton && /* @__PURE__ */ (0,
|
|
569
|
-
|
|
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,
|
|
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-
|
|
1377
|
+
className: cn("w-6 h-6", className)
|
|
587
1378
|
}
|
|
588
1379
|
);
|
|
589
1380
|
};
|
|
590
|
-
var
|
|
591
|
-
return /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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
|
|
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,
|
|
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,
|
|
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
|
|
1451
|
+
var import_react8 = require("react");
|
|
661
1452
|
|
|
662
1453
|
// src/components/Timetable/WeekNavigation.tsx
|
|
663
|
-
var
|
|
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
|
|
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,
|
|
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,
|
|
1498
|
+
return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(
|
|
708
1499
|
"div",
|
|
709
1500
|
{
|
|
710
1501
|
ref,
|
|
711
1502
|
className: cn(
|
|
712
|
-
"flex items-
|
|
713
|
-
"w-full h-
|
|
714
|
-
"bg-white border border-gray02",
|
|
715
|
-
"text-
|
|
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,
|
|
720
|
-
/* @__PURE__ */ (0,
|
|
721
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
732
|
-
"
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
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
|
|
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,
|
|
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,
|
|
777
|
-
!hideWeekNavigation && /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
802
|
-
/* @__PURE__ */ (0,
|
|
803
|
-
slots.map((slot) => /* @__PURE__ */ (0,
|
|
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,
|
|
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-
|
|
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
|
|
854
|
-
var
|
|
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,
|
|
1657
|
+
const [uncontrolled, setUncontrolled] = (0, import_react9.useState)(defaultValue);
|
|
858
1658
|
const value = isControlled ? controlled : uncontrolled;
|
|
859
|
-
const setValue = (0,
|
|
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,
|
|
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,
|
|
907
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
linkComponent,
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
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,
|
|
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
|
|
1024
|
-
|
|
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:
|
|
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,
|
|
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,
|
|
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-
|
|
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,
|
|
1052
|
-
label ? /* @__PURE__ */ (0,
|
|
1053
|
-
showBadge ? /* @__PURE__ */ (0,
|
|
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,
|
|
1899
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(
|
|
1080
1900
|
"div",
|
|
1081
1901
|
{
|
|
1082
|
-
className: cn("w-full h-
|
|
1083
|
-
children:
|
|
1084
|
-
|
|
1085
|
-
{
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
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,
|
|
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-
|
|
1117
|
-
"hover:bg-gray00 active:bg-gray01",
|
|
1118
|
-
selected ? "text-strong
|
|
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
|
|
1128
|
-
var
|
|
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,
|
|
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,
|
|
1133
|
-
const [visible, setVisible] = (0,
|
|
1134
|
-
(0,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|