@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.mjs
CHANGED
|
@@ -54,6 +54,20 @@ var IconChevronDownXS = ({
|
|
|
54
54
|
}
|
|
55
55
|
);
|
|
56
56
|
};
|
|
57
|
+
var IconCheck = ({ className, stroke }) => {
|
|
58
|
+
return /* @__PURE__ */ jsx(
|
|
59
|
+
"svg",
|
|
60
|
+
{
|
|
61
|
+
className,
|
|
62
|
+
width: "13",
|
|
63
|
+
height: "13",
|
|
64
|
+
viewBox: "0 0 13 13",
|
|
65
|
+
fill: "none",
|
|
66
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
67
|
+
children: /* @__PURE__ */ jsx("path", { d: "M2.05566 7.0555L4.83344 9.8333L10.9446 3.72217", stroke: stroke || "#121212" })
|
|
68
|
+
}
|
|
69
|
+
);
|
|
70
|
+
};
|
|
57
71
|
var IconSearch = ({ className, stroke }) => {
|
|
58
72
|
return /* @__PURE__ */ jsxs(
|
|
59
73
|
"svg",
|
|
@@ -88,6 +102,32 @@ var IconSearch = ({ className, stroke }) => {
|
|
|
88
102
|
}
|
|
89
103
|
);
|
|
90
104
|
};
|
|
105
|
+
var IconInfo = ({ className, stroke }) => {
|
|
106
|
+
return /* @__PURE__ */ jsxs(
|
|
107
|
+
"svg",
|
|
108
|
+
{
|
|
109
|
+
className,
|
|
110
|
+
width: "16",
|
|
111
|
+
height: "16",
|
|
112
|
+
viewBox: "0 0 16 16",
|
|
113
|
+
fill: "none",
|
|
114
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
115
|
+
children: [
|
|
116
|
+
/* @__PURE__ */ jsx("circle", { cx: "8", cy: "8", r: "6.25", stroke: stroke || "#8b94a1", strokeWidth: "1.5" }),
|
|
117
|
+
/* @__PURE__ */ jsx(
|
|
118
|
+
"path",
|
|
119
|
+
{
|
|
120
|
+
d: "M8 7.25V11.25",
|
|
121
|
+
stroke: stroke || "#8b94a1",
|
|
122
|
+
strokeWidth: "1.5",
|
|
123
|
+
strokeLinecap: "round"
|
|
124
|
+
}
|
|
125
|
+
),
|
|
126
|
+
/* @__PURE__ */ jsx("circle", { cx: "8", cy: "5", r: "0.9", fill: stroke || "#8b94a1" })
|
|
127
|
+
]
|
|
128
|
+
}
|
|
129
|
+
);
|
|
130
|
+
};
|
|
91
131
|
var IconGoBack = ({ className, stroke }) => {
|
|
92
132
|
return /* @__PURE__ */ jsxs(
|
|
93
133
|
"svg",
|
|
@@ -113,6 +153,28 @@ var IconGoBack = ({ className, stroke }) => {
|
|
|
113
153
|
}
|
|
114
154
|
);
|
|
115
155
|
};
|
|
156
|
+
var IconCompass = ({ className, fill }) => {
|
|
157
|
+
return /* @__PURE__ */ jsx(
|
|
158
|
+
"svg",
|
|
159
|
+
{
|
|
160
|
+
className,
|
|
161
|
+
width: "16",
|
|
162
|
+
height: "16",
|
|
163
|
+
viewBox: "0 0 16 16",
|
|
164
|
+
fill: "none",
|
|
165
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
166
|
+
children: /* @__PURE__ */ jsx(
|
|
167
|
+
"path",
|
|
168
|
+
{
|
|
169
|
+
fillRule: "evenodd",
|
|
170
|
+
clipRule: "evenodd",
|
|
171
|
+
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",
|
|
172
|
+
fill: fill || "#121212"
|
|
173
|
+
}
|
|
174
|
+
)
|
|
175
|
+
}
|
|
176
|
+
);
|
|
177
|
+
};
|
|
116
178
|
|
|
117
179
|
// src/components/BackButton/BackButton.tsx
|
|
118
180
|
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
@@ -174,15 +236,720 @@ var CTA = ({
|
|
|
174
236
|
);
|
|
175
237
|
};
|
|
176
238
|
|
|
177
|
-
// src/components/
|
|
239
|
+
// src/components/Column/MultiColumn.tsx
|
|
178
240
|
import { jsx as jsx4 } from "react/jsx-runtime";
|
|
241
|
+
var MultiColumnMain = ({ children, className }) => {
|
|
242
|
+
return /* @__PURE__ */ jsx4("div", { className: cn("flex flex-col w-full h-full", className), children });
|
|
243
|
+
};
|
|
244
|
+
var Columns = ({ children, className }) => {
|
|
245
|
+
return (
|
|
246
|
+
// flex 래퍼를 사용하고 하위 Column들이 flex-1을 가지게 하거나,
|
|
247
|
+
// grid를 사용하여 열을 나눌 수 있어. 여기서는 flex를 활용한 균등 분할 예시야.
|
|
248
|
+
/* @__PURE__ */ jsx4("div", { className: cn("flex w-full h-full divide-x divide-gray02", className), children })
|
|
249
|
+
);
|
|
250
|
+
};
|
|
251
|
+
var CTAs = ({ children, className }) => {
|
|
252
|
+
if (!children) return null;
|
|
253
|
+
return (
|
|
254
|
+
// CTA 버튼들을 중앙에 배치하는 예시 (우측 정렬이 필요하면 justify-end 사용)
|
|
255
|
+
/* @__PURE__ */ jsx4("div", { className: cn("flex flex-col w-full h-fit", className), children })
|
|
256
|
+
);
|
|
257
|
+
};
|
|
258
|
+
var MultiColumn = Object.assign(MultiColumnMain, {
|
|
259
|
+
Columns,
|
|
260
|
+
CTAs
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
// src/components/Column/Column.tsx
|
|
264
|
+
import { jsx as jsx5, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
265
|
+
var Column = ({ className, children, header }) => {
|
|
266
|
+
return /* @__PURE__ */ jsxs2("div", { className: cn("flex flex-col gap-5", "h-full w-full px-5 py-3", className), children: [
|
|
267
|
+
header && /* @__PURE__ */ jsx5("h1", { className: cn("text-body1-medium text-primary"), children: header }),
|
|
268
|
+
children
|
|
269
|
+
] });
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
// src/components/Column/ColumnContentContainer.tsx
|
|
273
|
+
import { jsx as jsx6 } from "react/jsx-runtime";
|
|
274
|
+
var ColumnContentContainer = ({ className, children }) => {
|
|
275
|
+
return /* @__PURE__ */ jsx6("div", { className: cn("flex flex-col gap-1.5 w-full h-fit", className), children });
|
|
276
|
+
};
|
|
277
|
+
|
|
278
|
+
// src/components/Column/ColumnLabel.tsx
|
|
279
|
+
import { jsx as jsx7, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
280
|
+
var ColumnLabel = ({ className, children, subLabel, htmlFor }) => {
|
|
281
|
+
return /* @__PURE__ */ jsxs3("label", { htmlFor, className: cn("flex gap-1.5 items-end", className), children: [
|
|
282
|
+
/* @__PURE__ */ jsx7("span", { className: cn("text-body2-regular text-tertiary"), children }),
|
|
283
|
+
subLabel && /* @__PURE__ */ jsx7("span", { className: cn("text-caption-book text-quaternary"), children: subLabel })
|
|
284
|
+
] });
|
|
285
|
+
};
|
|
286
|
+
|
|
287
|
+
// src/components/Column/ColumnText.tsx
|
|
288
|
+
import { jsx as jsx8 } from "react/jsx-runtime";
|
|
289
|
+
var ColumnTextStyle = "text-body3-book text-strong";
|
|
290
|
+
var ModalTextStyle = "text-body1-regular text-primary";
|
|
291
|
+
var ColumnText = ({ className, alert = false, children, onClick }) => {
|
|
292
|
+
return /* @__PURE__ */ jsx8("div", { className: cn(ColumnTextStyle, alert && "text-danger", className), onClick, children: children ? children : "-" });
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
// src/components/Column/ColumnSubTitle.tsx
|
|
296
|
+
import { jsx as jsx9, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
297
|
+
var ColumnSubTitle = ({
|
|
298
|
+
className,
|
|
299
|
+
children,
|
|
300
|
+
action,
|
|
301
|
+
as: Tag2 = "h2"
|
|
302
|
+
}) => {
|
|
303
|
+
return /* @__PURE__ */ jsxs4(Tag2, { className: cn("flex items-center justify-between gap-1.5", "w-full", className), children: [
|
|
304
|
+
/* @__PURE__ */ jsx9("span", { className: cn("text-body1-medium text-primary"), children }),
|
|
305
|
+
action && /* @__PURE__ */ jsx9("span", { className: "flex shrink-0 items-center", children: action })
|
|
306
|
+
] });
|
|
307
|
+
};
|
|
308
|
+
|
|
309
|
+
// src/components/Column/ColumnDescription.tsx
|
|
310
|
+
import { jsx as jsx10, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
311
|
+
var ColumnDescription = ({
|
|
312
|
+
className,
|
|
313
|
+
children,
|
|
314
|
+
bullet = true
|
|
315
|
+
}) => {
|
|
316
|
+
return /* @__PURE__ */ jsxs5("div", { className: cn("flex items-start gap-3", className), children: [
|
|
317
|
+
bullet && /* @__PURE__ */ jsx10("span", { className: "flex shrink-0 items-center py-1", children: /* @__PURE__ */ jsx10(IconCompass, { className: "size-4" }) }),
|
|
318
|
+
/* @__PURE__ */ jsx10("div", { className: "min-w-0 flex-1 whitespace-pre-line text-body3-book text-primary", children })
|
|
319
|
+
] });
|
|
320
|
+
};
|
|
321
|
+
var ColumnDescriptionList = ({ className, children }) => {
|
|
322
|
+
return /* @__PURE__ */ jsx10("div", { className: cn("flex flex-col gap-4", className), children });
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
// src/components/Form/BasicFormField.tsx
|
|
326
|
+
import { jsx as jsx11, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
327
|
+
var BasicFormField = ({
|
|
328
|
+
children,
|
|
329
|
+
isDanger,
|
|
330
|
+
dangerText,
|
|
331
|
+
className
|
|
332
|
+
}) => {
|
|
333
|
+
return /* @__PURE__ */ jsxs6("div", { className: cn("flex flex-col gap-1.5", className), children: [
|
|
334
|
+
children,
|
|
335
|
+
isDanger && dangerText && /* @__PURE__ */ jsx11("span", { className: "text-caption-book text-danger", children: dangerText })
|
|
336
|
+
] });
|
|
337
|
+
};
|
|
338
|
+
var getInputStyles = (isDanger, additionalClass) => {
|
|
339
|
+
return cn(
|
|
340
|
+
// 디자인 스펙: 높이 41px, 좌우 12px / 상하 10px 패딩
|
|
341
|
+
"w-full h-[41px] px-3 py-2.5",
|
|
342
|
+
"box-border border border-gray02 focus:outline-none focus:border-black",
|
|
343
|
+
"bg-white transition-colors",
|
|
344
|
+
ColumnTextStyle,
|
|
345
|
+
"text-primary placeholder:text-quaternary",
|
|
346
|
+
isDanger && "border-danger",
|
|
347
|
+
// 경고 시 빨간 테두리 (#E42939)
|
|
348
|
+
additionalClass
|
|
349
|
+
// 각 인풋별 추가 스타일 (예: textarea의 h-30)
|
|
350
|
+
);
|
|
351
|
+
};
|
|
352
|
+
|
|
353
|
+
// src/components/Form/FormText.tsx
|
|
354
|
+
import { jsx as jsx12 } from "react/jsx-runtime";
|
|
355
|
+
var FormText = ({ className, isDanger, dangerText, ...props }) => {
|
|
356
|
+
return /* @__PURE__ */ jsx12(BasicFormField, { isDanger, dangerText, children: /* @__PURE__ */ jsx12("input", { type: "text", className: getInputStyles(isDanger, className), ...props }) });
|
|
357
|
+
};
|
|
358
|
+
|
|
359
|
+
// src/components/Form/FormTextArea.tsx
|
|
360
|
+
import { jsx as jsx13 } from "react/jsx-runtime";
|
|
361
|
+
var FormTextArea = ({ className, isDanger, dangerText, ...props }) => {
|
|
362
|
+
return /* @__PURE__ */ jsx13(BasicFormField, { isDanger, dangerText, children: /* @__PURE__ */ jsx13(
|
|
363
|
+
"textarea",
|
|
364
|
+
{
|
|
365
|
+
className: getInputStyles(isDanger, "resize-none h-30 px-4 py-2.5 " + (className || "")),
|
|
366
|
+
...props
|
|
367
|
+
}
|
|
368
|
+
) });
|
|
369
|
+
};
|
|
370
|
+
|
|
371
|
+
// src/components/Form/FormNumber.tsx
|
|
372
|
+
import { jsx as jsx14 } from "react/jsx-runtime";
|
|
373
|
+
var FormNumber = ({ className, isDanger, dangerText, ...props }) => {
|
|
374
|
+
return /* @__PURE__ */ jsx14(BasicFormField, { isDanger, dangerText, children: /* @__PURE__ */ jsx14("input", { type: "number", className: getInputStyles(isDanger, className), ...props }) });
|
|
375
|
+
};
|
|
376
|
+
|
|
377
|
+
// src/components/Form/FormPassword.tsx
|
|
378
|
+
import { jsx as jsx15 } from "react/jsx-runtime";
|
|
379
|
+
var FormPassword = ({ className, isDanger, dangerText, ...props }) => {
|
|
380
|
+
return /* @__PURE__ */ jsx15(BasicFormField, { isDanger, dangerText, children: /* @__PURE__ */ jsx15("input", { type: "password", className: getInputStyles(isDanger, className), ...props }) });
|
|
381
|
+
};
|
|
382
|
+
|
|
383
|
+
// src/components/Form/FormTel.tsx
|
|
384
|
+
import { jsx as jsx16 } from "react/jsx-runtime";
|
|
385
|
+
var FormTel = ({ className, isDanger, dangerText, onChange, ...props }) => {
|
|
386
|
+
const handlePhoneChange = (e) => {
|
|
387
|
+
const rawValue = e.target.value.replace(/[^0-9]/g, "");
|
|
388
|
+
let formattedValue = "";
|
|
389
|
+
if (rawValue.length < 4) formattedValue = rawValue;
|
|
390
|
+
else if (rawValue.length < 8) formattedValue = `${rawValue.slice(0, 3)}-${rawValue.slice(3)}`;
|
|
391
|
+
else
|
|
392
|
+
formattedValue = `${rawValue.slice(0, 3)}-${rawValue.slice(3, 7)}-${rawValue.slice(7, 11)}`;
|
|
393
|
+
e.target.value = formattedValue;
|
|
394
|
+
if (onChange) onChange(e);
|
|
395
|
+
};
|
|
396
|
+
return /* @__PURE__ */ jsx16(BasicFormField, { isDanger, dangerText, children: /* @__PURE__ */ jsx16(
|
|
397
|
+
"input",
|
|
398
|
+
{
|
|
399
|
+
type: "tel",
|
|
400
|
+
className: getInputStyles(isDanger, className),
|
|
401
|
+
onChange: handlePhoneChange,
|
|
402
|
+
maxLength: 13,
|
|
403
|
+
...props
|
|
404
|
+
}
|
|
405
|
+
) });
|
|
406
|
+
};
|
|
407
|
+
|
|
408
|
+
// src/components/Form/FormColor.tsx
|
|
409
|
+
import { useState } from "react";
|
|
410
|
+
import { jsx as jsx17, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
411
|
+
var FormColor = ({
|
|
412
|
+
className,
|
|
413
|
+
isDanger,
|
|
414
|
+
dangerText,
|
|
415
|
+
value,
|
|
416
|
+
defaultValue = "#000000",
|
|
417
|
+
onChange,
|
|
418
|
+
...props
|
|
419
|
+
}) => {
|
|
420
|
+
const [internalColor, setInternalColor] = useState(
|
|
421
|
+
value || defaultValue || "#000000"
|
|
422
|
+
);
|
|
423
|
+
const color = value !== void 0 ? value : internalColor;
|
|
424
|
+
const handleColorChange = (e) => {
|
|
425
|
+
setInternalColor(e.target.value);
|
|
426
|
+
onChange?.(e);
|
|
427
|
+
};
|
|
428
|
+
return /* @__PURE__ */ jsx17(BasicFormField, { isDanger, dangerText, children: /* @__PURE__ */ jsxs7(
|
|
429
|
+
"label",
|
|
430
|
+
{
|
|
431
|
+
className: getInputStyles(
|
|
432
|
+
isDanger,
|
|
433
|
+
// 💡 focus-within을 통해 내부 <input>이 포커스될 때 부모(label)의 테두리와 배경 변경!
|
|
434
|
+
"flex items-center gap-2 relative focus-within:border-black focus-within:hover:bg-white" + (className || "")
|
|
435
|
+
),
|
|
436
|
+
children: [
|
|
437
|
+
/* @__PURE__ */ jsx17("div", { className: "w-6 h-6 shrink-0 overflow-hidden", style: { backgroundColor: color }, children: /* @__PURE__ */ jsx17(
|
|
438
|
+
"input",
|
|
439
|
+
{
|
|
440
|
+
type: "color",
|
|
441
|
+
value: color,
|
|
442
|
+
onChange: handleColorChange,
|
|
443
|
+
className: "absolute inset-0 w-full h-full opacity-0",
|
|
444
|
+
...props
|
|
445
|
+
}
|
|
446
|
+
) }),
|
|
447
|
+
/* @__PURE__ */ jsx17("span", { className: "text-primary text-body3-regular uppercase flex-1 select-none", children: color })
|
|
448
|
+
]
|
|
449
|
+
}
|
|
450
|
+
) });
|
|
451
|
+
};
|
|
452
|
+
|
|
453
|
+
// src/components/Form/FormFile.tsx
|
|
454
|
+
import { useState as useState2 } from "react";
|
|
455
|
+
import { jsx as jsx18, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
456
|
+
var FormFile = ({
|
|
457
|
+
className,
|
|
458
|
+
isDanger,
|
|
459
|
+
dangerText,
|
|
460
|
+
fileUrl,
|
|
461
|
+
filename,
|
|
462
|
+
onChange,
|
|
463
|
+
...props
|
|
464
|
+
}) => {
|
|
465
|
+
const [selectedFile, setSelectedFile] = useState2(null);
|
|
466
|
+
const handleFileChange = (e) => {
|
|
467
|
+
const originalFile = e.target.files?.[0];
|
|
468
|
+
if (!originalFile) {
|
|
469
|
+
setSelectedFile(null);
|
|
470
|
+
onChange?.(e);
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
let finalFile = originalFile;
|
|
474
|
+
if (filename) {
|
|
475
|
+
const lastDotIndex = originalFile.name.lastIndexOf(".");
|
|
476
|
+
const extension = lastDotIndex !== -1 ? originalFile.name.slice(lastDotIndex) : "";
|
|
477
|
+
const newFileName = filename.endsWith(extension) ? filename : `${filename}${extension}`;
|
|
478
|
+
finalFile = new File([originalFile], newFileName, {
|
|
479
|
+
type: originalFile.type,
|
|
480
|
+
lastModified: originalFile.lastModified
|
|
481
|
+
});
|
|
482
|
+
try {
|
|
483
|
+
const dataTransfer = new DataTransfer();
|
|
484
|
+
dataTransfer.items.add(finalFile);
|
|
485
|
+
e.target.files = dataTransfer.files;
|
|
486
|
+
} catch (err) {
|
|
487
|
+
console.warn("DataTransfer\uB97C \uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 \uBE0C\uB77C\uC6B0\uC800\uC785\uB2C8\uB2E4.", err);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
setSelectedFile(finalFile);
|
|
491
|
+
onChange?.(e);
|
|
492
|
+
};
|
|
493
|
+
const handleDownload = (e) => {
|
|
494
|
+
e.preventDefault();
|
|
495
|
+
e.stopPropagation();
|
|
496
|
+
if (selectedFile) {
|
|
497
|
+
const url = URL.createObjectURL(selectedFile);
|
|
498
|
+
const a = document.createElement("a");
|
|
499
|
+
a.href = url;
|
|
500
|
+
a.download = selectedFile.name;
|
|
501
|
+
document.body.appendChild(a);
|
|
502
|
+
a.click();
|
|
503
|
+
document.body.removeChild(a);
|
|
504
|
+
URL.revokeObjectURL(url);
|
|
505
|
+
} else if (fileUrl) {
|
|
506
|
+
const a = document.createElement("a");
|
|
507
|
+
a.href = fileUrl;
|
|
508
|
+
a.download = fileUrl.split("/").pop() || "download";
|
|
509
|
+
a.target = "_blank";
|
|
510
|
+
document.body.appendChild(a);
|
|
511
|
+
a.click();
|
|
512
|
+
document.body.removeChild(a);
|
|
513
|
+
}
|
|
514
|
+
};
|
|
515
|
+
const displayFileName = selectedFile?.name || (fileUrl ? fileUrl.split("/").pop() : null);
|
|
516
|
+
return /* @__PURE__ */ jsx18(BasicFormField, { isDanger, dangerText, children: /* @__PURE__ */ jsxs8(
|
|
517
|
+
"div",
|
|
518
|
+
{
|
|
519
|
+
className: getInputStyles(
|
|
520
|
+
isDanger,
|
|
521
|
+
// 디자인 스펙: 파일 전 상태는 우측 정렬("파일 첨부"만), 파일 후 상태는 좌우 배치
|
|
522
|
+
cn(
|
|
523
|
+
"flex items-center gap-2",
|
|
524
|
+
displayFileName ? "justify-between" : "justify-end",
|
|
525
|
+
className
|
|
526
|
+
)
|
|
527
|
+
),
|
|
528
|
+
children: [
|
|
529
|
+
displayFileName && /* @__PURE__ */ jsx18(
|
|
530
|
+
"span",
|
|
531
|
+
{
|
|
532
|
+
onClick: handleDownload,
|
|
533
|
+
className: "text-body3-book text-primary truncate max-w-[200px] cursor-pointer",
|
|
534
|
+
title: `${displayFileName} \uB2E4\uC6B4\uB85C\uB4DC`,
|
|
535
|
+
children: displayFileName
|
|
536
|
+
}
|
|
537
|
+
),
|
|
538
|
+
/* @__PURE__ */ jsxs8("label", { className: "shrink-0 px-1 -mx-1 cursor-pointer", children: [
|
|
539
|
+
/* @__PURE__ */ jsx18("div", { className: "text-primary text-caption-regular underline", children: displayFileName ? "\uB2E4\uC2DC \uCCA8\uBD80" : "\uD30C\uC77C \uCCA8\uBD80" }),
|
|
540
|
+
/* @__PURE__ */ jsx18("input", { type: "file", className: "hidden", onChange: handleFileChange, ...props })
|
|
541
|
+
] })
|
|
542
|
+
]
|
|
543
|
+
}
|
|
544
|
+
) });
|
|
545
|
+
};
|
|
546
|
+
|
|
547
|
+
// src/components/Form/FormCheckBox.tsx
|
|
548
|
+
import { jsx as jsx19, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
549
|
+
var FormCheckBox = ({
|
|
550
|
+
isChecked,
|
|
551
|
+
setIsChecked,
|
|
552
|
+
children,
|
|
553
|
+
className,
|
|
554
|
+
textStyle,
|
|
555
|
+
...props
|
|
556
|
+
}) => {
|
|
557
|
+
return /* @__PURE__ */ jsxs9(
|
|
558
|
+
"label",
|
|
559
|
+
{
|
|
560
|
+
className: cn(
|
|
561
|
+
"group w-fit h-fit",
|
|
562
|
+
"flex items-center gap-1",
|
|
563
|
+
"cursor-pointer select-none",
|
|
564
|
+
// 💡 1. 텍스트 드래그 방지 추가
|
|
565
|
+
className
|
|
566
|
+
),
|
|
567
|
+
children: [
|
|
568
|
+
/* @__PURE__ */ jsx19(
|
|
569
|
+
"input",
|
|
570
|
+
{
|
|
571
|
+
type: "checkbox",
|
|
572
|
+
checked: isChecked,
|
|
573
|
+
onChange: (e) => setIsChecked(e.target.checked),
|
|
574
|
+
className: "sr-only peer",
|
|
575
|
+
...props
|
|
576
|
+
}
|
|
577
|
+
),
|
|
578
|
+
/* @__PURE__ */ jsx19(
|
|
579
|
+
"div",
|
|
580
|
+
{
|
|
581
|
+
className: cn(
|
|
582
|
+
"flex items-center justify-center w-5 h-5 shrink-0 rounded transition-colors",
|
|
583
|
+
"group-hover:bg-gray00 group-active:bg-gray01"
|
|
584
|
+
),
|
|
585
|
+
children: /* @__PURE__ */ jsx19(
|
|
586
|
+
"div",
|
|
587
|
+
{
|
|
588
|
+
className: cn(
|
|
589
|
+
"w-[15px] h-[15px]",
|
|
590
|
+
"box-border border border-black",
|
|
591
|
+
"flex items-center justify-center transition-colors duration-200",
|
|
592
|
+
// 💡 3. 키보드 Tab 이동 시 접근성 향상 (포커스 링 표시)
|
|
593
|
+
"peer-focus-visible:ring-2 peer-focus-visible:ring-black peer-focus-visible:ring-offset-1"
|
|
594
|
+
),
|
|
595
|
+
children: isChecked && /* @__PURE__ */ jsx19(IconCheck, {})
|
|
596
|
+
}
|
|
597
|
+
)
|
|
598
|
+
}
|
|
599
|
+
),
|
|
600
|
+
children && /* @__PURE__ */ jsx19("span", { className: cn("text-body3-book text-primary", textStyle), children })
|
|
601
|
+
]
|
|
602
|
+
}
|
|
603
|
+
);
|
|
604
|
+
};
|
|
605
|
+
|
|
606
|
+
// src/components/Form/FormSelectBox.tsx
|
|
607
|
+
import { useEffect, useRef, useState as useState3 } from "react";
|
|
608
|
+
|
|
609
|
+
// src/components/Form/SelectBoxOption.tsx
|
|
610
|
+
import { jsx as jsx20 } from "react/jsx-runtime";
|
|
611
|
+
var SelectBoxOption = ({
|
|
612
|
+
label,
|
|
613
|
+
onClick,
|
|
614
|
+
// selectedLabel,
|
|
615
|
+
className
|
|
616
|
+
}) => {
|
|
617
|
+
return /* @__PURE__ */ jsx20(
|
|
618
|
+
"li",
|
|
619
|
+
{
|
|
620
|
+
onClick,
|
|
621
|
+
className: cn(
|
|
622
|
+
"w-full p-3 shrink-0",
|
|
623
|
+
// 디자인 스펙: 12px 패딩
|
|
624
|
+
"flex items-center justify-start",
|
|
625
|
+
// "box-border border-b border-gray02",
|
|
626
|
+
"text-body3-book text-primary",
|
|
627
|
+
"bg-white hover:bg-gray00 active:bg-gray01",
|
|
628
|
+
// isSelected
|
|
629
|
+
// ? "bg-black text-white"
|
|
630
|
+
// : "",
|
|
631
|
+
className
|
|
632
|
+
),
|
|
633
|
+
children: label
|
|
634
|
+
}
|
|
635
|
+
);
|
|
636
|
+
};
|
|
637
|
+
|
|
638
|
+
// src/components/Form/FormSelectBox.tsx
|
|
639
|
+
import { jsx as jsx21, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
640
|
+
var FormSelectBox = ({
|
|
641
|
+
options,
|
|
642
|
+
value,
|
|
643
|
+
onChange,
|
|
644
|
+
placeholder = "\uC120\uD0DD\uD574\uC8FC\uC138\uC694",
|
|
645
|
+
isDanger,
|
|
646
|
+
dangerText,
|
|
647
|
+
className
|
|
648
|
+
}) => {
|
|
649
|
+
const [isOpen, setIsOpen] = useState3(false);
|
|
650
|
+
const containerRef = useRef(null);
|
|
651
|
+
useEffect(() => {
|
|
652
|
+
const handleClickOutside = (event) => {
|
|
653
|
+
if (containerRef.current && !containerRef.current.contains(event.target)) {
|
|
654
|
+
setIsOpen(false);
|
|
655
|
+
}
|
|
656
|
+
};
|
|
657
|
+
document.addEventListener("mousedown", handleClickOutside);
|
|
658
|
+
return () => {
|
|
659
|
+
document.removeEventListener("mousedown", handleClickOutside);
|
|
660
|
+
};
|
|
661
|
+
}, []);
|
|
662
|
+
return /* @__PURE__ */ jsx21(BasicFormField, { isDanger, dangerText, children: /* @__PURE__ */ jsxs10("div", { ref: containerRef, className: "relative w-full", children: [
|
|
663
|
+
/* @__PURE__ */ jsxs10(
|
|
664
|
+
"div",
|
|
665
|
+
{
|
|
666
|
+
tabIndex: 0,
|
|
667
|
+
className: getInputStyles(
|
|
668
|
+
isDanger,
|
|
669
|
+
cn(
|
|
670
|
+
"flex items-center justify-between cursor-pointer select-none",
|
|
671
|
+
isOpen && "border-gray08",
|
|
672
|
+
// 열려있을 때 테두리 #3A414C 고정 (디자인 스펙)
|
|
673
|
+
className
|
|
674
|
+
)
|
|
675
|
+
),
|
|
676
|
+
onClick: (e) => {
|
|
677
|
+
if (isOpen) {
|
|
678
|
+
e.currentTarget.blur();
|
|
679
|
+
}
|
|
680
|
+
setIsOpen((prev) => !prev);
|
|
681
|
+
},
|
|
682
|
+
children: [
|
|
683
|
+
/* @__PURE__ */ jsx21("span", { className: value ? "text-primary" : "text-quaternary", children: value || placeholder }),
|
|
684
|
+
/* @__PURE__ */ jsx21(
|
|
685
|
+
IconChevronDownXS,
|
|
686
|
+
{
|
|
687
|
+
className: cn("text-gray06 transition-transform", isOpen && "rotate-180"),
|
|
688
|
+
stroke: "currentColor"
|
|
689
|
+
}
|
|
690
|
+
)
|
|
691
|
+
]
|
|
692
|
+
}
|
|
693
|
+
),
|
|
694
|
+
isOpen && /* @__PURE__ */ jsx21(
|
|
695
|
+
"ul",
|
|
696
|
+
{
|
|
697
|
+
className: cn(
|
|
698
|
+
"absolute top-full left-0 right-0 z-10",
|
|
699
|
+
// 💡 Input 바로 아래에 띄움
|
|
700
|
+
"box-border border border-gray02 bg-white flex flex-col",
|
|
701
|
+
"max-h-50 overflow-y-auto"
|
|
702
|
+
// 항목이 너무 많으면 스크롤 생성 (디자인 스펙: 그림자 없음)
|
|
703
|
+
),
|
|
704
|
+
children: options.map((option) => /* @__PURE__ */ jsx21(
|
|
705
|
+
SelectBoxOption,
|
|
706
|
+
{
|
|
707
|
+
label: option,
|
|
708
|
+
onClick: () => {
|
|
709
|
+
onChange(option);
|
|
710
|
+
setIsOpen(false);
|
|
711
|
+
}
|
|
712
|
+
},
|
|
713
|
+
option
|
|
714
|
+
))
|
|
715
|
+
}
|
|
716
|
+
)
|
|
717
|
+
] }) });
|
|
718
|
+
};
|
|
719
|
+
|
|
720
|
+
// src/components/TextButton/TextButton.tsx
|
|
721
|
+
import { Fragment, jsx as jsx22, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
722
|
+
var TextButton = ({
|
|
723
|
+
children,
|
|
724
|
+
icon,
|
|
725
|
+
iconPosition = "left",
|
|
726
|
+
alert = false,
|
|
727
|
+
underline = true,
|
|
728
|
+
className,
|
|
729
|
+
...props
|
|
730
|
+
}) => {
|
|
731
|
+
const content = /* @__PURE__ */ jsxs11(Fragment, { children: [
|
|
732
|
+
icon && iconPosition === "left" && /* @__PURE__ */ jsx22("span", { className: "flex shrink-0 items-center", children: icon }),
|
|
733
|
+
/* @__PURE__ */ jsx22("span", { className: cn(underline && "underline underline-offset-2"), children }),
|
|
734
|
+
icon && iconPosition === "right" && /* @__PURE__ */ jsx22("span", { className: "flex shrink-0 items-center", children: icon })
|
|
735
|
+
] });
|
|
736
|
+
const classes = cn(
|
|
737
|
+
"inline-flex w-fit items-center gap-1 px-1 -mx-1",
|
|
738
|
+
"text-caption-book",
|
|
739
|
+
alert ? "text-danger" : "text-secondary",
|
|
740
|
+
"hover:bg-gray00 active:bg-gray01 transition-colors",
|
|
741
|
+
alert ? "hover:text-danger" : "hover:text-primary",
|
|
742
|
+
"cursor-pointer select-none",
|
|
743
|
+
"disabled:cursor-default disabled:text-quaternary disabled:hover:bg-transparent",
|
|
744
|
+
"aria-disabled:cursor-default aria-disabled:text-quaternary aria-disabled:hover:bg-transparent",
|
|
745
|
+
className
|
|
746
|
+
);
|
|
747
|
+
if (props.href !== void 0) {
|
|
748
|
+
const { href, ...rest } = props;
|
|
749
|
+
return /* @__PURE__ */ jsx22("a", { href, className: classes, ...rest, children: content });
|
|
750
|
+
}
|
|
751
|
+
const buttonProps = props;
|
|
752
|
+
return /* @__PURE__ */ jsx22("button", { type: "button", className: classes, ...buttonProps, children: content });
|
|
753
|
+
};
|
|
754
|
+
|
|
755
|
+
// src/components/Dropdown/Dropdown.tsx
|
|
756
|
+
import { useEffect as useEffect2, useRef as useRef2, useState as useState4 } from "react";
|
|
757
|
+
import { jsx as jsx23, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
758
|
+
var Dropdown = ({ selectedLabel, setSelectedLabel, labels, className }) => {
|
|
759
|
+
const [isOpen, setIsOpen] = useState4(false);
|
|
760
|
+
const containerRef = useRef2(null);
|
|
761
|
+
useEffect2(() => {
|
|
762
|
+
const handleClickOutside = (event) => {
|
|
763
|
+
if (containerRef.current && !containerRef.current.contains(event.target)) {
|
|
764
|
+
setIsOpen(false);
|
|
765
|
+
}
|
|
766
|
+
};
|
|
767
|
+
document.addEventListener("mousedown", handleClickOutside);
|
|
768
|
+
return () => {
|
|
769
|
+
document.removeEventListener("mousedown", handleClickOutside);
|
|
770
|
+
};
|
|
771
|
+
}, []);
|
|
772
|
+
return /* @__PURE__ */ jsxs12("div", { ref: containerRef, className: "relative", children: [
|
|
773
|
+
/* @__PURE__ */ jsxs12(
|
|
774
|
+
"div",
|
|
775
|
+
{
|
|
776
|
+
className: cn(
|
|
777
|
+
"w-fit h-fit px-2 py-1",
|
|
778
|
+
"flex items-center justify-center gap-1.5",
|
|
779
|
+
"text-body3-book text-strong",
|
|
780
|
+
"bg-white hover:bg-gray00 active:bg-gray01",
|
|
781
|
+
"cursor-pointer",
|
|
782
|
+
className
|
|
783
|
+
),
|
|
784
|
+
onClick: () => setIsOpen((prev) => !prev),
|
|
785
|
+
children: [
|
|
786
|
+
/* @__PURE__ */ jsx23("p", { children: selectedLabel }),
|
|
787
|
+
/* @__PURE__ */ jsx23(
|
|
788
|
+
IconChevronDownXS,
|
|
789
|
+
{
|
|
790
|
+
className: cn("text-gray06 transition-transform", isOpen && "rotate-180"),
|
|
791
|
+
stroke: "currentColor"
|
|
792
|
+
}
|
|
793
|
+
)
|
|
794
|
+
]
|
|
795
|
+
}
|
|
796
|
+
),
|
|
797
|
+
isOpen && /* @__PURE__ */ jsx23("div", { className: cn("absolute top-full right-0 z-10", "box-border border border-gray02"), children: labels.map((label) => /* @__PURE__ */ jsx23(
|
|
798
|
+
SelectBoxOption,
|
|
799
|
+
{
|
|
800
|
+
label,
|
|
801
|
+
onClick: () => {
|
|
802
|
+
setSelectedLabel(label);
|
|
803
|
+
setIsOpen(false);
|
|
804
|
+
},
|
|
805
|
+
className: "w-44 h-11 justify-center"
|
|
806
|
+
},
|
|
807
|
+
label
|
|
808
|
+
)) })
|
|
809
|
+
] });
|
|
810
|
+
};
|
|
811
|
+
|
|
812
|
+
// src/components/ListView/List.tsx
|
|
813
|
+
import { jsx as jsx24, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
814
|
+
function List({
|
|
815
|
+
className,
|
|
816
|
+
label1,
|
|
817
|
+
label2,
|
|
818
|
+
label2OnClick,
|
|
819
|
+
label3,
|
|
820
|
+
disabled = false,
|
|
821
|
+
selected = false,
|
|
822
|
+
onClick,
|
|
823
|
+
children,
|
|
824
|
+
...props
|
|
825
|
+
}) {
|
|
826
|
+
return /* @__PURE__ */ jsxs13(
|
|
827
|
+
"li",
|
|
828
|
+
{
|
|
829
|
+
className: cn(
|
|
830
|
+
"w-full min-w-fit h-13 pl-4 pr-6",
|
|
831
|
+
"grid grid-cols-[4fr_1fr_1fr] items-center gap-4",
|
|
832
|
+
"bg-white hover:bg-gray00 hover:has-[.has-clickable:hover]:bg-white active:bg-gray01",
|
|
833
|
+
"text-primary select-none [&_*]:cursor-pointer cursor-pointer",
|
|
834
|
+
disabled && "opacity-40 [&_*]:cursor-pointer cursor-pointer",
|
|
835
|
+
selected && "bg-black text-white hover:bg-black active:bg-black hover:has-[.has-clickable:hover]:bg-black",
|
|
836
|
+
className
|
|
837
|
+
),
|
|
838
|
+
...props,
|
|
839
|
+
onClick,
|
|
840
|
+
children: [
|
|
841
|
+
/* @__PURE__ */ jsxs13("section", { className: cn("flex items-center gap-4"), children: [
|
|
842
|
+
/* @__PURE__ */ jsx24("label", { className: cn("text-body2-regular"), children: label1 ? label1 : "-" }),
|
|
843
|
+
/* @__PURE__ */ jsx24("div", { className: cn("flex items-center gap-2"), children })
|
|
844
|
+
] }),
|
|
845
|
+
/* @__PURE__ */ jsx24(
|
|
846
|
+
"label",
|
|
847
|
+
{
|
|
848
|
+
className: cn(
|
|
849
|
+
"text-body3-book truncate p-1 w-fit",
|
|
850
|
+
label2OnClick && "underline has-clickable",
|
|
851
|
+
label2OnClick && !selected && "hover:bg-gray00"
|
|
852
|
+
),
|
|
853
|
+
onClick: label2OnClick,
|
|
854
|
+
children: label2 ? label2 : "-"
|
|
855
|
+
}
|
|
856
|
+
),
|
|
857
|
+
/* @__PURE__ */ jsx24("label", { className: cn("text-body3-regular text-right"), children: label3 ? label3 : "-" })
|
|
858
|
+
]
|
|
859
|
+
}
|
|
860
|
+
);
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
// src/components/Modal/Modal.tsx
|
|
864
|
+
import { jsx as jsx25, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
865
|
+
var ModalBase = ({ isVisible, header, children, className }) => {
|
|
866
|
+
if (!isVisible) return null;
|
|
867
|
+
return /* @__PURE__ */ jsx25("div", { className: cn("fixed inset-0 z-50 pointer-events-auto"), children: /* @__PURE__ */ jsx25(
|
|
868
|
+
"div",
|
|
869
|
+
{
|
|
870
|
+
className: cn("fixed inset-0 z-1001 flex items-center justify-center pointer-events-auto"),
|
|
871
|
+
children: /* @__PURE__ */ jsxs14(
|
|
872
|
+
"main",
|
|
873
|
+
{
|
|
874
|
+
className: cn(
|
|
875
|
+
"w-110 pt-8 h-fit",
|
|
876
|
+
"flex flex-col items-center",
|
|
877
|
+
"border border-gray02",
|
|
878
|
+
"bg-white shadow-[0 0 30px 0 rgba(0, 0, 0, 0.08);]",
|
|
879
|
+
className
|
|
880
|
+
),
|
|
881
|
+
children: [
|
|
882
|
+
/* @__PURE__ */ jsx25("h1", { className: cn("text-strong font-[500] text-[24px] leading-[32px]"), children: header }),
|
|
883
|
+
children
|
|
884
|
+
]
|
|
885
|
+
}
|
|
886
|
+
)
|
|
887
|
+
}
|
|
888
|
+
) });
|
|
889
|
+
};
|
|
890
|
+
var Contents = ({ children, className }) => {
|
|
891
|
+
return /* @__PURE__ */ jsx25(
|
|
892
|
+
"div",
|
|
893
|
+
{
|
|
894
|
+
className: cn(
|
|
895
|
+
"flex flex-col items-center gap-8",
|
|
896
|
+
"w-full h-fit",
|
|
897
|
+
"px-14 pt-8 pb-9",
|
|
898
|
+
className
|
|
899
|
+
),
|
|
900
|
+
children
|
|
901
|
+
}
|
|
902
|
+
);
|
|
903
|
+
};
|
|
904
|
+
var CTAs2 = ({ children, className, row = false }) => {
|
|
905
|
+
if (!children) return null;
|
|
906
|
+
return (
|
|
907
|
+
// CTA 버튼들을 중앙에 배치하는 예시 (우측 정렬이 필요하면 justify-end 사용)
|
|
908
|
+
/* @__PURE__ */ jsx25(
|
|
909
|
+
"div",
|
|
910
|
+
{
|
|
911
|
+
className: cn(
|
|
912
|
+
"flex flex-col w-full h-fit",
|
|
913
|
+
row && "flex-row divide-x divide-gray02",
|
|
914
|
+
className
|
|
915
|
+
),
|
|
916
|
+
children
|
|
917
|
+
}
|
|
918
|
+
)
|
|
919
|
+
);
|
|
920
|
+
};
|
|
921
|
+
var Modal = Object.assign(ModalBase, {
|
|
922
|
+
Contents,
|
|
923
|
+
CTAs: CTAs2
|
|
924
|
+
});
|
|
925
|
+
|
|
926
|
+
// src/components/Modal/ModalText.tsx
|
|
927
|
+
import { jsx as jsx26 } from "react/jsx-runtime";
|
|
928
|
+
var ModalText = ({ children, className }) => {
|
|
929
|
+
return /* @__PURE__ */ jsx26(
|
|
930
|
+
"div",
|
|
931
|
+
{
|
|
932
|
+
className: cn(
|
|
933
|
+
"flex flex-col items-center",
|
|
934
|
+
"mt-[-20px] mb-[-4px]",
|
|
935
|
+
ModalTextStyle,
|
|
936
|
+
"text-tertiary text-center",
|
|
937
|
+
className
|
|
938
|
+
),
|
|
939
|
+
children
|
|
940
|
+
}
|
|
941
|
+
);
|
|
942
|
+
};
|
|
943
|
+
|
|
944
|
+
// src/components/createPost/CategorySegment.tsx
|
|
945
|
+
import { jsx as jsx27 } from "react/jsx-runtime";
|
|
179
946
|
var CategorySegment = ({
|
|
180
947
|
selected = false,
|
|
181
948
|
label,
|
|
182
949
|
className,
|
|
183
950
|
onClick
|
|
184
951
|
}) => {
|
|
185
|
-
return /* @__PURE__ */
|
|
952
|
+
return /* @__PURE__ */ jsx27(
|
|
186
953
|
"div",
|
|
187
954
|
{
|
|
188
955
|
className: cn(
|
|
@@ -202,7 +969,7 @@ var CategorySegment = ({
|
|
|
202
969
|
};
|
|
203
970
|
|
|
204
971
|
// src/components/createPost/CategorySegmentedControl.tsx
|
|
205
|
-
import { jsx as
|
|
972
|
+
import { jsx as jsx28, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
206
973
|
var categorySegments = {
|
|
207
974
|
info: ["\uACF5\uC6A9 \uBB3C\uD488", "\uC77C\uBC18 \uAE30\uC790\uC7AC", "\uD2B9\uC218 \uAE30\uC790\uC7AC"],
|
|
208
975
|
archive: ["\uD504\uB9B0\uD2B8\uC2E4", "\uD64D\uC775\uC2DC\uB514"],
|
|
@@ -216,8 +983,8 @@ var CategorySegmentedControl = ({
|
|
|
216
983
|
className
|
|
217
984
|
}) => {
|
|
218
985
|
const segments = categorySegments[variable];
|
|
219
|
-
return /* @__PURE__ */
|
|
220
|
-
/* @__PURE__ */
|
|
986
|
+
return /* @__PURE__ */ jsxs15("div", { className: cn("w-full h-fit flex items-center justify-start", className), children: [
|
|
987
|
+
/* @__PURE__ */ jsx28(
|
|
221
988
|
"div",
|
|
222
989
|
{
|
|
223
990
|
className: cn(
|
|
@@ -230,7 +997,7 @@ var CategorySegmentedControl = ({
|
|
|
230
997
|
children: variable === "infoTag" ? "\uD0DC\uADF8 \uC120\uD0DD" : "\uCE74\uD14C\uACE0\uB9AC \uC120\uD0DD"
|
|
231
998
|
}
|
|
232
999
|
),
|
|
233
|
-
segments.map((label) => /* @__PURE__ */
|
|
1000
|
+
segments.map((label) => /* @__PURE__ */ jsx28(
|
|
234
1001
|
CategorySegment,
|
|
235
1002
|
{
|
|
236
1003
|
label,
|
|
@@ -243,9 +1010,9 @@ var CategorySegmentedControl = ({
|
|
|
243
1010
|
};
|
|
244
1011
|
|
|
245
1012
|
// src/components/createPost/TitleInput.tsx
|
|
246
|
-
import { jsx as
|
|
1013
|
+
import { jsx as jsx29 } from "react/jsx-runtime";
|
|
247
1014
|
var TitleInput = ({ title, onChange, className }) => {
|
|
248
|
-
return /* @__PURE__ */
|
|
1015
|
+
return /* @__PURE__ */ jsx29(
|
|
249
1016
|
"input",
|
|
250
1017
|
{
|
|
251
1018
|
type: "text",
|
|
@@ -265,9 +1032,9 @@ var TitleInput = ({ title, onChange, className }) => {
|
|
|
265
1032
|
};
|
|
266
1033
|
|
|
267
1034
|
// src/components/notice/NoticeBadge.tsx
|
|
268
|
-
import { jsx as
|
|
1035
|
+
import { jsx as jsx30 } from "react/jsx-runtime";
|
|
269
1036
|
var NoticeBadge = ({ variable, className, onClick }) => {
|
|
270
|
-
return /* @__PURE__ */
|
|
1037
|
+
return /* @__PURE__ */ jsx30(
|
|
271
1038
|
"button",
|
|
272
1039
|
{
|
|
273
1040
|
type: "button",
|
|
@@ -288,7 +1055,7 @@ var NoticeBadge = ({ variable, className, onClick }) => {
|
|
|
288
1055
|
};
|
|
289
1056
|
|
|
290
1057
|
// src/components/notice/NoticeBar.tsx
|
|
291
|
-
import { jsx as
|
|
1058
|
+
import { jsx as jsx31, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
292
1059
|
var NoticeBar = ({
|
|
293
1060
|
variable = "default",
|
|
294
1061
|
badgeVariable,
|
|
@@ -297,7 +1064,7 @@ var NoticeBar = ({
|
|
|
297
1064
|
className,
|
|
298
1065
|
onClick
|
|
299
1066
|
}) => {
|
|
300
|
-
return /* @__PURE__ */
|
|
1067
|
+
return /* @__PURE__ */ jsxs16(
|
|
301
1068
|
"div",
|
|
302
1069
|
{
|
|
303
1070
|
className: cn(
|
|
@@ -309,20 +1076,20 @@ var NoticeBar = ({
|
|
|
309
1076
|
),
|
|
310
1077
|
onClick,
|
|
311
1078
|
children: [
|
|
312
|
-
/* @__PURE__ */
|
|
313
|
-
/* @__PURE__ */
|
|
314
|
-
/* @__PURE__ */
|
|
1079
|
+
/* @__PURE__ */ jsxs16("section", { className: "flex items-center gap-3", children: [
|
|
1080
|
+
/* @__PURE__ */ jsx31(NoticeBadge, { variable: badgeVariable }),
|
|
1081
|
+
/* @__PURE__ */ jsx31("h1", { className: "text-head1-medium text-strong", children: title })
|
|
315
1082
|
] }),
|
|
316
|
-
/* @__PURE__ */
|
|
1083
|
+
/* @__PURE__ */ jsx31("p", { className: "text-body3-book text-tertiary", children: date })
|
|
317
1084
|
]
|
|
318
1085
|
}
|
|
319
1086
|
);
|
|
320
1087
|
};
|
|
321
1088
|
|
|
322
1089
|
// src/components/SearchBar/SearchBar.tsx
|
|
323
|
-
import { jsx as
|
|
1090
|
+
import { jsx as jsx32, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
324
1091
|
var SearchBar = ({ value, onChange, className }) => {
|
|
325
|
-
return /* @__PURE__ */
|
|
1092
|
+
return /* @__PURE__ */ jsxs17(
|
|
326
1093
|
"label",
|
|
327
1094
|
{
|
|
328
1095
|
className: cn(
|
|
@@ -333,8 +1100,8 @@ var SearchBar = ({ value, onChange, className }) => {
|
|
|
333
1100
|
className
|
|
334
1101
|
),
|
|
335
1102
|
children: [
|
|
336
|
-
/* @__PURE__ */
|
|
337
|
-
/* @__PURE__ */
|
|
1103
|
+
/* @__PURE__ */ jsx32(IconSearch, {}),
|
|
1104
|
+
/* @__PURE__ */ jsx32(
|
|
338
1105
|
"input",
|
|
339
1106
|
{
|
|
340
1107
|
type: "text",
|
|
@@ -356,10 +1123,10 @@ var SearchBar = ({ value, onChange, className }) => {
|
|
|
356
1123
|
import { forwardRef } from "react";
|
|
357
1124
|
|
|
358
1125
|
// src/lib/useControllableState.ts
|
|
359
|
-
import { useCallback, useState } from "react";
|
|
1126
|
+
import { useCallback, useState as useState5 } from "react";
|
|
360
1127
|
function useControllableState(controlled, defaultValue) {
|
|
361
1128
|
const isControlled = controlled !== void 0;
|
|
362
|
-
const [uncontrolled, setUncontrolled] =
|
|
1129
|
+
const [uncontrolled, setUncontrolled] = useState5(defaultValue);
|
|
363
1130
|
const value = isControlled ? controlled : uncontrolled;
|
|
364
1131
|
const setValue = useCallback(
|
|
365
1132
|
(next) => {
|
|
@@ -383,7 +1150,7 @@ var RadioSelected_default = "./RadioSelected-DOLVV7ZM.svg";
|
|
|
383
1150
|
var RadioUnselected_default = "./RadioUnselected-QN74EU46.svg";
|
|
384
1151
|
|
|
385
1152
|
// src/components/SideRadioAccordion/SideRadioAccordion.tsx
|
|
386
|
-
import { jsx as
|
|
1153
|
+
import { jsx as jsx33, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
387
1154
|
var printColorBgClass = {
|
|
388
1155
|
Plotter: "bg-print-plotter",
|
|
389
1156
|
Printer: "bg-print-printer",
|
|
@@ -427,8 +1194,8 @@ var SideRadioAccordion = forwardRef(
|
|
|
427
1194
|
setIsOpen(next);
|
|
428
1195
|
onOpenChange?.(next);
|
|
429
1196
|
};
|
|
430
|
-
return /* @__PURE__ */
|
|
431
|
-
/* @__PURE__ */
|
|
1197
|
+
return /* @__PURE__ */ jsxs18("div", { ref, className: cn("w-full border-r border-gray02 bg-white", className), children: [
|
|
1198
|
+
/* @__PURE__ */ jsx33(
|
|
432
1199
|
Stepper,
|
|
433
1200
|
{
|
|
434
1201
|
step,
|
|
@@ -439,8 +1206,8 @@ var SideRadioAccordion = forwardRef(
|
|
|
439
1206
|
className: cn(stickyHeader && "sticky top-0 z-10")
|
|
440
1207
|
}
|
|
441
1208
|
),
|
|
442
|
-
expanded && /* @__PURE__ */
|
|
443
|
-
radioToggleList.map((item) => /* @__PURE__ */
|
|
1209
|
+
expanded && /* @__PURE__ */ jsxs18("div", { className: "flex flex-col divide-y divide-gray02", children: [
|
|
1210
|
+
radioToggleList.map((item) => /* @__PURE__ */ jsx33(
|
|
444
1211
|
RadioToggleItem,
|
|
445
1212
|
{
|
|
446
1213
|
...item,
|
|
@@ -449,29 +1216,22 @@ var SideRadioAccordion = forwardRef(
|
|
|
449
1216
|
},
|
|
450
1217
|
itemKey(item)
|
|
451
1218
|
)),
|
|
452
|
-
quantityLimitLabel && /* @__PURE__ */
|
|
453
|
-
TextButton,
|
|
454
|
-
{
|
|
455
|
-
label: quantityLimitLabel,
|
|
456
|
-
onClick: onClickQuantityLimit,
|
|
457
|
-
className: "mt-2"
|
|
458
|
-
}
|
|
459
|
-
)
|
|
1219
|
+
quantityLimitLabel && /* @__PURE__ */ jsx33("div", { className: "px-5 py-4", children: /* @__PURE__ */ jsx33(TextButton2, { label: quantityLimitLabel, onClick: onClickQuantityLimit }) })
|
|
460
1220
|
] })
|
|
461
1221
|
] });
|
|
462
1222
|
}
|
|
463
1223
|
);
|
|
464
1224
|
var Stepper = ({ step, title, isOpen, collapsible, onClick, className }) => {
|
|
465
|
-
const label = /* @__PURE__ */
|
|
1225
|
+
const label = /* @__PURE__ */ jsxs18("span", { children: [
|
|
466
1226
|
step,
|
|
467
1227
|
" | ",
|
|
468
1228
|
title
|
|
469
1229
|
] });
|
|
470
|
-
const base = "w-full flex items-center justify-between px-
|
|
1230
|
+
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";
|
|
471
1231
|
if (!collapsible) {
|
|
472
|
-
return /* @__PURE__ */
|
|
1232
|
+
return /* @__PURE__ */ jsx33("div", { className: cn(base, className), children: label });
|
|
473
1233
|
}
|
|
474
|
-
return /* @__PURE__ */
|
|
1234
|
+
return /* @__PURE__ */ jsxs18(
|
|
475
1235
|
"button",
|
|
476
1236
|
{
|
|
477
1237
|
type: "button",
|
|
@@ -479,7 +1239,7 @@ var Stepper = ({ step, title, isOpen, collapsible, onClick, className }) => {
|
|
|
479
1239
|
className: cn(base, "cursor-pointer hover:bg-gray00 active:bg-gray01", className),
|
|
480
1240
|
children: [
|
|
481
1241
|
label,
|
|
482
|
-
/* @__PURE__ */
|
|
1242
|
+
/* @__PURE__ */ jsx33(
|
|
483
1243
|
"img",
|
|
484
1244
|
{
|
|
485
1245
|
src: ChevronDown_default,
|
|
@@ -505,30 +1265,30 @@ var RadioToggleItem = ({
|
|
|
505
1265
|
}) => {
|
|
506
1266
|
const rowBg = !open ? "bg-white hover:bg-gray00" : color ? void 0 : printColor ? printColorBgClass[printColor] : "bg-gray00";
|
|
507
1267
|
const style = open && color ? { backgroundColor: color } : void 0;
|
|
508
|
-
return /* @__PURE__ */
|
|
509
|
-
/* @__PURE__ */
|
|
1268
|
+
return /* @__PURE__ */ jsxs18("div", { className: "w-full", children: [
|
|
1269
|
+
/* @__PURE__ */ jsxs18(
|
|
510
1270
|
"button",
|
|
511
1271
|
{
|
|
512
1272
|
type: "button",
|
|
513
1273
|
onClick: onSelect,
|
|
514
1274
|
style,
|
|
515
1275
|
className: cn(
|
|
516
|
-
"w-full flex items-center gap-1.5
|
|
517
|
-
"text-
|
|
1276
|
+
"w-full flex items-center gap-1.5 p-3",
|
|
1277
|
+
"text-body1-regular text-secondary text-left cursor-pointer",
|
|
518
1278
|
rowBg,
|
|
519
1279
|
className
|
|
520
1280
|
),
|
|
521
1281
|
children: [
|
|
522
|
-
/* @__PURE__ */
|
|
523
|
-
/* @__PURE__ */
|
|
1282
|
+
/* @__PURE__ */ jsx33(Radio, { selected: open }),
|
|
1283
|
+
/* @__PURE__ */ jsx33("span", { children: title })
|
|
524
1284
|
]
|
|
525
1285
|
}
|
|
526
1286
|
),
|
|
527
|
-
open && /* @__PURE__ */
|
|
528
|
-
/* @__PURE__ */
|
|
529
|
-
badges && badges.length > 0 && /* @__PURE__ */
|
|
530
|
-
labelTextButton && /* @__PURE__ */
|
|
531
|
-
|
|
1287
|
+
open && /* @__PURE__ */ jsxs18("div", { className: "flex flex-col gap-2 px-3 py-3 bg-white", children: [
|
|
1288
|
+
/* @__PURE__ */ jsx33("p", { className: "text-caption-regular text-secondary", children: content }),
|
|
1289
|
+
badges && badges.length > 0 && /* @__PURE__ */ jsx33("div", { className: "flex gap-1", children: badges.map((badge) => /* @__PURE__ */ jsx33(Badge, { label: badge }, badge)) }),
|
|
1290
|
+
labelTextButton && /* @__PURE__ */ jsx33(
|
|
1291
|
+
TextButton2,
|
|
532
1292
|
{
|
|
533
1293
|
label: labelTextButton,
|
|
534
1294
|
onClick: onClickTextButton,
|
|
@@ -540,17 +1300,17 @@ var RadioToggleItem = ({
|
|
|
540
1300
|
] });
|
|
541
1301
|
};
|
|
542
1302
|
var Radio = ({ selected = false, className }) => {
|
|
543
|
-
return /* @__PURE__ */
|
|
1303
|
+
return /* @__PURE__ */ jsx33(
|
|
544
1304
|
"img",
|
|
545
1305
|
{
|
|
546
1306
|
src: selected ? RadioSelected_default : RadioUnselected_default,
|
|
547
1307
|
alt: "",
|
|
548
|
-
className: cn("w-
|
|
1308
|
+
className: cn("w-6 h-6", className)
|
|
549
1309
|
}
|
|
550
1310
|
);
|
|
551
1311
|
};
|
|
552
|
-
var
|
|
553
|
-
return /* @__PURE__ */
|
|
1312
|
+
var TextButton2 = ({ label, onClick, showIcon = false, className }) => {
|
|
1313
|
+
return /* @__PURE__ */ jsxs18(
|
|
554
1314
|
"button",
|
|
555
1315
|
{
|
|
556
1316
|
type: "button",
|
|
@@ -563,14 +1323,14 @@ var TextButton = ({ label, onClick, showIcon = false, className }) => {
|
|
|
563
1323
|
className
|
|
564
1324
|
),
|
|
565
1325
|
children: [
|
|
566
|
-
showIcon && /* @__PURE__ */
|
|
1326
|
+
showIcon && /* @__PURE__ */ jsx33("img", { src: Exclamation_default, alt: "" }),
|
|
567
1327
|
label
|
|
568
1328
|
]
|
|
569
1329
|
}
|
|
570
1330
|
);
|
|
571
1331
|
};
|
|
572
1332
|
var Badge = ({ label, className }) => {
|
|
573
|
-
return /* @__PURE__ */
|
|
1333
|
+
return /* @__PURE__ */ jsx33(
|
|
574
1334
|
"div",
|
|
575
1335
|
{
|
|
576
1336
|
className: cn(
|
|
@@ -584,7 +1344,7 @@ var Badge = ({ label, className }) => {
|
|
|
584
1344
|
};
|
|
585
1345
|
|
|
586
1346
|
// src/components/Tag/Tag.tsx
|
|
587
|
-
import { jsx as
|
|
1347
|
+
import { jsx as jsx34 } from "react/jsx-runtime";
|
|
588
1348
|
var Tag = ({
|
|
589
1349
|
className,
|
|
590
1350
|
children,
|
|
@@ -594,7 +1354,7 @@ var Tag = ({
|
|
|
594
1354
|
onClick,
|
|
595
1355
|
...props
|
|
596
1356
|
}) => {
|
|
597
|
-
return /* @__PURE__ */
|
|
1357
|
+
return /* @__PURE__ */ jsx34(
|
|
598
1358
|
"button",
|
|
599
1359
|
{
|
|
600
1360
|
className: cn(
|
|
@@ -613,7 +1373,7 @@ var Tag = ({
|
|
|
613
1373
|
disabled,
|
|
614
1374
|
style: bgColor ? { backgroundColor: bgColor, border: "none" } : void 0,
|
|
615
1375
|
...props,
|
|
616
|
-
children: /* @__PURE__ */
|
|
1376
|
+
children: /* @__PURE__ */ jsx34("span", { children })
|
|
617
1377
|
}
|
|
618
1378
|
);
|
|
619
1379
|
};
|
|
@@ -655,7 +1415,7 @@ var formatWeekRange = (weekStart) => {
|
|
|
655
1415
|
};
|
|
656
1416
|
|
|
657
1417
|
// src/components/Timetable/WeekNavigation.tsx
|
|
658
|
-
import { jsx as
|
|
1418
|
+
import { jsx as jsx35, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
659
1419
|
var weekLabel = {
|
|
660
1420
|
thisWeek: "\uC774\uBC88 \uC8FC",
|
|
661
1421
|
nextWeek: "\uB2E4\uC74C \uC8FC",
|
|
@@ -666,53 +1426,62 @@ var WeekNavigation = forwardRef2(
|
|
|
666
1426
|
const showPrev = canPrev ?? (week ? week !== "thisWeek" : true);
|
|
667
1427
|
const showNext = canNext ?? (week ? week !== "twoWeeksLater" : true);
|
|
668
1428
|
const text = label ?? (week ? `${weekLabel[week]} (${formatWeekRange(date)})` : formatWeekRange(date));
|
|
669
|
-
return /* @__PURE__ */
|
|
1429
|
+
return /* @__PURE__ */ jsxs19(
|
|
670
1430
|
"div",
|
|
671
1431
|
{
|
|
672
1432
|
ref,
|
|
673
1433
|
className: cn(
|
|
674
|
-
"flex items-
|
|
675
|
-
"w-full h-
|
|
676
|
-
"bg-white border border-gray02",
|
|
677
|
-
"text-
|
|
1434
|
+
"flex items-stretch justify-between",
|
|
1435
|
+
"w-full h-12",
|
|
1436
|
+
"bg-white border-b border-gray02",
|
|
1437
|
+
"text-body1-medium text-secondary",
|
|
678
1438
|
className
|
|
679
1439
|
),
|
|
680
1440
|
children: [
|
|
681
|
-
/* @__PURE__ */
|
|
682
|
-
/* @__PURE__ */
|
|
683
|
-
/* @__PURE__ */
|
|
1441
|
+
/* @__PURE__ */ jsx35(ArrowButton, { direction: "left", visible: showPrev, onClick: onPrevWeek }),
|
|
1442
|
+
/* @__PURE__ */ jsx35("span", { className: "flex flex-1 items-center justify-center text-center", children: text }),
|
|
1443
|
+
/* @__PURE__ */ jsx35(ArrowButton, { direction: "right", visible: showNext, onClick: onNextWeek })
|
|
684
1444
|
]
|
|
685
1445
|
}
|
|
686
1446
|
);
|
|
687
1447
|
}
|
|
688
1448
|
);
|
|
689
1449
|
var ArrowButton = ({ direction, visible, onClick }) => {
|
|
1450
|
+
const divider = /* @__PURE__ */ jsx35("span", { "aria-hidden": true, className: "w-px self-stretch bg-gray02" });
|
|
690
1451
|
if (!visible) {
|
|
691
|
-
return /* @__PURE__ */
|
|
1452
|
+
return /* @__PURE__ */ jsxs19("div", { className: "flex items-stretch", children: [
|
|
1453
|
+
direction === "right" && divider,
|
|
1454
|
+
/* @__PURE__ */ jsx35("span", { className: "w-[42px]" }),
|
|
1455
|
+
direction === "left" && divider
|
|
1456
|
+
] });
|
|
692
1457
|
}
|
|
693
|
-
return /* @__PURE__ */
|
|
694
|
-
"
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
1458
|
+
return /* @__PURE__ */ jsxs19("div", { className: "flex items-stretch", children: [
|
|
1459
|
+
direction === "right" && divider,
|
|
1460
|
+
/* @__PURE__ */ jsx35(
|
|
1461
|
+
"button",
|
|
1462
|
+
{
|
|
1463
|
+
type: "button",
|
|
1464
|
+
onClick,
|
|
1465
|
+
className: cn(
|
|
1466
|
+
"flex w-[42px] items-center justify-center",
|
|
1467
|
+
"text-gray06 cursor-pointer transition-colors",
|
|
1468
|
+
"hover:bg-gray00 active:bg-gray01"
|
|
1469
|
+
),
|
|
1470
|
+
children: /* @__PURE__ */ jsx35(
|
|
1471
|
+
IconChevronDownXS,
|
|
1472
|
+
{
|
|
1473
|
+
className: direction === "left" ? "rotate-90" : "-rotate-90",
|
|
1474
|
+
stroke: "currentColor"
|
|
1475
|
+
}
|
|
1476
|
+
)
|
|
1477
|
+
}
|
|
1478
|
+
),
|
|
1479
|
+
direction === "left" && divider
|
|
1480
|
+
] });
|
|
712
1481
|
};
|
|
713
1482
|
|
|
714
1483
|
// src/components/Timetable/Timetable.tsx
|
|
715
|
-
import { jsx as
|
|
1484
|
+
import { jsx as jsx36, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
716
1485
|
var printColorHoverClass = {
|
|
717
1486
|
Plotter: "hover:bg-print-plotter",
|
|
718
1487
|
Printer: "hover:bg-print-printer",
|
|
@@ -735,8 +1504,8 @@ var Timetable = forwardRef3(function Timetable2({
|
|
|
735
1504
|
canNextWeek,
|
|
736
1505
|
className
|
|
737
1506
|
}, ref) {
|
|
738
|
-
return /* @__PURE__ */
|
|
739
|
-
!hideWeekNavigation && /* @__PURE__ */
|
|
1507
|
+
return /* @__PURE__ */ jsxs20("div", { ref, className: cn(fluid && "w-full", className), children: [
|
|
1508
|
+
!hideWeekNavigation && /* @__PURE__ */ jsx36(
|
|
740
1509
|
WeekNavigation,
|
|
741
1510
|
{
|
|
742
1511
|
date: weekStart,
|
|
@@ -747,7 +1516,7 @@ var Timetable = forwardRef3(function Timetable2({
|
|
|
747
1516
|
onNextWeek
|
|
748
1517
|
}
|
|
749
1518
|
),
|
|
750
|
-
/* @__PURE__ */
|
|
1519
|
+
/* @__PURE__ */ jsx36("div", { className: cn("flex", fluid && "w-full"), children: days.map((day) => /* @__PURE__ */ jsx36(
|
|
751
1520
|
DailyTimetable,
|
|
752
1521
|
{
|
|
753
1522
|
date: day.date,
|
|
@@ -760,9 +1529,9 @@ var Timetable = forwardRef3(function Timetable2({
|
|
|
760
1529
|
] });
|
|
761
1530
|
});
|
|
762
1531
|
var DailyTimetable = ({ date, slots, fluid, onSelectTime, className }) => {
|
|
763
|
-
return /* @__PURE__ */
|
|
764
|
-
/* @__PURE__ */
|
|
765
|
-
slots.map((slot) => /* @__PURE__ */
|
|
1532
|
+
return /* @__PURE__ */ jsxs20("div", { className: cn("flex flex-col", fluid ? "flex-1 min-w-0" : "w-18", className), children: [
|
|
1533
|
+
/* @__PURE__ */ jsx36("div", { className: "h-12 flex items-center justify-center border-b border-gray02 text-body1-regular text-secondary", children: formatDayLabel(date) }),
|
|
1534
|
+
slots.map((slot) => /* @__PURE__ */ jsx36(
|
|
766
1535
|
TimeItem,
|
|
767
1536
|
{
|
|
768
1537
|
state: slot.state,
|
|
@@ -788,17 +1557,17 @@ var TimeItem = ({
|
|
|
788
1557
|
}) => {
|
|
789
1558
|
const clickable = (state === "default" || state === "selected") && !!onClick;
|
|
790
1559
|
const style = state === "default" && color ? { "--tt-hover": color } : void 0;
|
|
791
|
-
return /* @__PURE__ */
|
|
1560
|
+
return /* @__PURE__ */ jsx36(
|
|
792
1561
|
"div",
|
|
793
1562
|
{
|
|
794
1563
|
onClick: clickable ? onClick : void 0,
|
|
795
1564
|
style,
|
|
796
1565
|
className: cn(
|
|
797
|
-
"h-18 flex items-center justify-center",
|
|
1566
|
+
"h-18 flex items-center justify-center border-b border-gray02",
|
|
798
1567
|
fluid ? "w-full" : "w-18",
|
|
799
1568
|
"text-body1-medium text-center bg-white text-primary",
|
|
800
1569
|
state === "none" && "bg-gray00 text-transparent",
|
|
801
|
-
state === "selected" && "bg-black text-
|
|
1570
|
+
state === "selected" && "bg-black text-white hover:cursor-pointer",
|
|
802
1571
|
state === "disabled" && "bg-gray00 text-gray03",
|
|
803
1572
|
state === "default" && [
|
|
804
1573
|
"hover:cursor-pointer",
|
|
@@ -813,14 +1582,15 @@ var TimeItem = ({
|
|
|
813
1582
|
|
|
814
1583
|
// src/components/TNB/TNB.tsx
|
|
815
1584
|
import {
|
|
1585
|
+
Fragment as Fragment2,
|
|
816
1586
|
forwardRef as forwardRef4,
|
|
817
1587
|
useCallback as useCallback2,
|
|
818
|
-
useState as
|
|
1588
|
+
useState as useState6
|
|
819
1589
|
} from "react";
|
|
820
|
-
import { jsx as
|
|
1590
|
+
import { jsx as jsx37, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
821
1591
|
function useControllableState2(controlled, defaultValue) {
|
|
822
1592
|
const isControlled = controlled !== void 0;
|
|
823
|
-
const [uncontrolled, setUncontrolled] =
|
|
1593
|
+
const [uncontrolled, setUncontrolled] = useState6(defaultValue);
|
|
824
1594
|
const value = isControlled ? controlled : uncontrolled;
|
|
825
1595
|
const setValue = useCallback2(
|
|
826
1596
|
(next) => {
|
|
@@ -869,8 +1639,8 @@ var TNB = forwardRef4(function TNB2({
|
|
|
869
1639
|
setLowerValue(label);
|
|
870
1640
|
onSelectedLowerChange?.(label);
|
|
871
1641
|
};
|
|
872
|
-
return /* @__PURE__ */
|
|
873
|
-
/* @__PURE__ */
|
|
1642
|
+
return /* @__PURE__ */ jsxs21("nav", { ref, "aria-label": ariaLabel, className: cn("w-full bg-white", className), children: [
|
|
1643
|
+
/* @__PURE__ */ jsx37(
|
|
874
1644
|
UpperPart,
|
|
875
1645
|
{
|
|
876
1646
|
logo,
|
|
@@ -881,7 +1651,7 @@ var TNB = forwardRef4(function TNB2({
|
|
|
881
1651
|
linkComponent
|
|
882
1652
|
}
|
|
883
1653
|
),
|
|
884
|
-
/* @__PURE__ */
|
|
1654
|
+
/* @__PURE__ */ jsx37(
|
|
885
1655
|
LowerPart,
|
|
886
1656
|
{
|
|
887
1657
|
lowerPartItemList: currentLowerItemList,
|
|
@@ -896,7 +1666,7 @@ var NavClickable = forwardRef4(function NavClickable2({ href, onClick, linkCompo
|
|
|
896
1666
|
const ariaCurrent = current ? "page" : void 0;
|
|
897
1667
|
if (href && !disabled) {
|
|
898
1668
|
if (Link) {
|
|
899
|
-
return /* @__PURE__ */
|
|
1669
|
+
return /* @__PURE__ */ jsx37(
|
|
900
1670
|
Link,
|
|
901
1671
|
{
|
|
902
1672
|
href,
|
|
@@ -908,7 +1678,7 @@ var NavClickable = forwardRef4(function NavClickable2({ href, onClick, linkCompo
|
|
|
908
1678
|
}
|
|
909
1679
|
);
|
|
910
1680
|
}
|
|
911
|
-
return /* @__PURE__ */
|
|
1681
|
+
return /* @__PURE__ */ jsx37(
|
|
912
1682
|
"a",
|
|
913
1683
|
{
|
|
914
1684
|
href,
|
|
@@ -920,7 +1690,7 @@ var NavClickable = forwardRef4(function NavClickable2({ href, onClick, linkCompo
|
|
|
920
1690
|
}
|
|
921
1691
|
);
|
|
922
1692
|
}
|
|
923
|
-
return /* @__PURE__ */
|
|
1693
|
+
return /* @__PURE__ */ jsx37(
|
|
924
1694
|
"button",
|
|
925
1695
|
{
|
|
926
1696
|
type: "button",
|
|
@@ -942,33 +1712,50 @@ var UpperPart = ({
|
|
|
942
1712
|
linkComponent,
|
|
943
1713
|
className
|
|
944
1714
|
}) => {
|
|
945
|
-
return /* @__PURE__ */
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
linkComponent,
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
1715
|
+
return /* @__PURE__ */ jsxs21(
|
|
1716
|
+
"div",
|
|
1717
|
+
{
|
|
1718
|
+
className: cn(
|
|
1719
|
+
"w-full min-h-13 flex items-stretch justify-between border-b border-gray02",
|
|
1720
|
+
className
|
|
1721
|
+
),
|
|
1722
|
+
children: [
|
|
1723
|
+
/* @__PURE__ */ jsxs21("div", { className: "flex items-stretch", children: [
|
|
1724
|
+
/* @__PURE__ */ jsx37("div", { className: "flex w-14 shrink-0 items-center justify-center px-3", children: /* @__PURE__ */ jsx37(NavIconButton, { ...logo, linkComponent }) }),
|
|
1725
|
+
/* @__PURE__ */ jsxs21("div", { className: "flex items-stretch", children: [
|
|
1726
|
+
/* @__PURE__ */ jsx37("span", { "aria-hidden": true, className: "w-px self-stretch bg-gray02" }),
|
|
1727
|
+
upperPartItemList.map((item) => /* @__PURE__ */ jsxs21(Fragment2, { children: [
|
|
1728
|
+
/* @__PURE__ */ jsx37(
|
|
1729
|
+
UpperPartTab,
|
|
1730
|
+
{
|
|
1731
|
+
label: item.label,
|
|
1732
|
+
href: item.href,
|
|
1733
|
+
selected: item.label === selected,
|
|
1734
|
+
linkComponent,
|
|
1735
|
+
onClick: () => {
|
|
1736
|
+
item.onClick?.();
|
|
1737
|
+
onSelectItem(item.label);
|
|
1738
|
+
}
|
|
1739
|
+
}
|
|
1740
|
+
),
|
|
1741
|
+
/* @__PURE__ */ jsx37("span", { "aria-hidden": true, className: "w-px self-stretch bg-gray02" })
|
|
1742
|
+
] }, item.id ?? item.label))
|
|
1743
|
+
] })
|
|
1744
|
+
] }),
|
|
1745
|
+
/* @__PURE__ */ jsxs21("div", { className: "flex items-stretch", children: [
|
|
1746
|
+
/* @__PURE__ */ jsx37("span", { "aria-hidden": true, className: "w-px self-stretch bg-gray02" }),
|
|
1747
|
+
upperPartIconList.map((icon, index) => /* @__PURE__ */ jsx37(
|
|
1748
|
+
NavIconButton,
|
|
1749
|
+
{
|
|
1750
|
+
...icon,
|
|
1751
|
+
linkComponent
|
|
1752
|
+
},
|
|
1753
|
+
icon.id ?? icon.src ?? icon.label ?? index
|
|
1754
|
+
))
|
|
1755
|
+
] })
|
|
1756
|
+
]
|
|
1757
|
+
}
|
|
1758
|
+
);
|
|
972
1759
|
};
|
|
973
1760
|
var UpperPartTab = ({
|
|
974
1761
|
label,
|
|
@@ -978,7 +1765,7 @@ var UpperPartTab = ({
|
|
|
978
1765
|
linkComponent,
|
|
979
1766
|
className
|
|
980
1767
|
}) => {
|
|
981
|
-
return /* @__PURE__ */
|
|
1768
|
+
return /* @__PURE__ */ jsxs21(
|
|
982
1769
|
NavClickable,
|
|
983
1770
|
{
|
|
984
1771
|
href,
|
|
@@ -986,11 +1773,14 @@ var UpperPartTab = ({
|
|
|
986
1773
|
linkComponent,
|
|
987
1774
|
current: selected,
|
|
988
1775
|
className: cn(
|
|
989
|
-
"inline-flex
|
|
990
|
-
|
|
1776
|
+
"inline-flex min-h-13 flex-col items-center gap-2 pt-2.5 cursor-pointer no-underline",
|
|
1777
|
+
"transition-colors hover:bg-gray00 active:bg-gray01",
|
|
991
1778
|
className
|
|
992
1779
|
),
|
|
993
|
-
children:
|
|
1780
|
+
children: [
|
|
1781
|
+
/* @__PURE__ */ jsx37("span", { className: cn("px-5 text-head1-medium", selected ? "text-strong" : "text-quaternary"), children: label }),
|
|
1782
|
+
/* @__PURE__ */ jsx37("span", { className: cn("h-0.5 w-full", selected ? "bg-black" : "bg-transparent") })
|
|
1783
|
+
]
|
|
994
1784
|
}
|
|
995
1785
|
);
|
|
996
1786
|
};
|
|
@@ -998,7 +1788,7 @@ var NavIconButton = forwardRef4(
|
|
|
998
1788
|
function NavIconButton2({ src, icon, alt, label, href, onClick, selected, badge, className, linkComponent }, forwardedRef) {
|
|
999
1789
|
const interactive = Boolean(onClick || href);
|
|
1000
1790
|
const showBadge = badge !== void 0 && badge !== null && badge !== false;
|
|
1001
|
-
return /* @__PURE__ */
|
|
1791
|
+
return /* @__PURE__ */ jsxs21(
|
|
1002
1792
|
NavClickable,
|
|
1003
1793
|
{
|
|
1004
1794
|
ref: forwardedRef,
|
|
@@ -1008,15 +1798,15 @@ var NavIconButton = forwardRef4(
|
|
|
1008
1798
|
current: selected,
|
|
1009
1799
|
disabled: !interactive,
|
|
1010
1800
|
className: cn(
|
|
1011
|
-
"relative inline-flex h-
|
|
1801
|
+
"relative inline-flex h-13 min-w-13 items-center justify-center gap-1.5 px-3 transition-colors",
|
|
1012
1802
|
interactive && "cursor-pointer",
|
|
1013
1803
|
selected ? "bg-black text-white" : "bg-transparent hover:bg-gray00 active:bg-gray01",
|
|
1014
1804
|
className
|
|
1015
1805
|
),
|
|
1016
1806
|
children: [
|
|
1017
|
-
icon ? /* @__PURE__ */
|
|
1018
|
-
label ? /* @__PURE__ */
|
|
1019
|
-
showBadge ? /* @__PURE__ */
|
|
1807
|
+
icon ? /* @__PURE__ */ jsx37("span", { className: "inline-flex h-6 w-6 items-center justify-center", children: icon }) : src ? /* @__PURE__ */ jsx37("img", { src, alt: alt ?? label ?? "", className: "h-6 w-6" }) : null,
|
|
1808
|
+
label ? /* @__PURE__ */ jsx37("span", { className: cn("text-body2-regular", selected ? "text-white" : "text-secondary"), children: label }) : null,
|
|
1809
|
+
showBadge ? /* @__PURE__ */ jsx37(
|
|
1020
1810
|
"span",
|
|
1021
1811
|
{
|
|
1022
1812
|
"aria-hidden": badge === true,
|
|
@@ -1042,24 +1832,29 @@ var LowerPart = ({
|
|
|
1042
1832
|
if (lowerPartItemList.length === 0) {
|
|
1043
1833
|
return null;
|
|
1044
1834
|
}
|
|
1045
|
-
return /* @__PURE__ */
|
|
1835
|
+
return /* @__PURE__ */ jsxs21(
|
|
1046
1836
|
"div",
|
|
1047
1837
|
{
|
|
1048
|
-
className: cn("w-full h-
|
|
1049
|
-
children:
|
|
1050
|
-
|
|
1051
|
-
{
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1838
|
+
className: cn("w-full h-[42px] pl-14 flex items-stretch border-b border-gray02", className),
|
|
1839
|
+
children: [
|
|
1840
|
+
/* @__PURE__ */ jsx37("span", { "aria-hidden": true, className: "w-px self-stretch bg-gray02" }),
|
|
1841
|
+
lowerPartItemList.map((item) => /* @__PURE__ */ jsxs21(Fragment2, { children: [
|
|
1842
|
+
/* @__PURE__ */ jsx37(
|
|
1843
|
+
LowerPartItemButton,
|
|
1844
|
+
{
|
|
1845
|
+
label: item.label,
|
|
1846
|
+
href: item.href,
|
|
1847
|
+
selected: item.label === selected,
|
|
1848
|
+
linkComponent,
|
|
1849
|
+
onClick: () => {
|
|
1850
|
+
item.onClick?.();
|
|
1851
|
+
onSelectItem(item.label);
|
|
1852
|
+
}
|
|
1853
|
+
}
|
|
1854
|
+
),
|
|
1855
|
+
/* @__PURE__ */ jsx37("span", { "aria-hidden": true, className: "w-px self-stretch bg-gray02" })
|
|
1856
|
+
] }, item.id ?? item.label))
|
|
1857
|
+
]
|
|
1063
1858
|
}
|
|
1064
1859
|
);
|
|
1065
1860
|
};
|
|
@@ -1071,7 +1866,7 @@ var LowerPartItemButton = ({
|
|
|
1071
1866
|
linkComponent,
|
|
1072
1867
|
className
|
|
1073
1868
|
}) => {
|
|
1074
|
-
return /* @__PURE__ */
|
|
1869
|
+
return /* @__PURE__ */ jsx37(
|
|
1075
1870
|
NavClickable,
|
|
1076
1871
|
{
|
|
1077
1872
|
href,
|
|
@@ -1079,9 +1874,9 @@ var LowerPartItemButton = ({
|
|
|
1079
1874
|
linkComponent,
|
|
1080
1875
|
current: selected,
|
|
1081
1876
|
className: cn(
|
|
1082
|
-
"inline-flex px-
|
|
1083
|
-
"hover:bg-gray00 active:bg-gray01",
|
|
1084
|
-
selected ? "text-strong
|
|
1877
|
+
"inline-flex h-full items-center justify-center px-5 text-head3-medium cursor-pointer no-underline",
|
|
1878
|
+
"transition-colors hover:bg-gray00 active:bg-gray01",
|
|
1879
|
+
selected ? "text-strong" : "text-quaternary",
|
|
1085
1880
|
className
|
|
1086
1881
|
),
|
|
1087
1882
|
children: label
|
|
@@ -1090,14 +1885,14 @@ var LowerPartItemButton = ({
|
|
|
1090
1885
|
};
|
|
1091
1886
|
|
|
1092
1887
|
// src/components/Toast/Toast.tsx
|
|
1093
|
-
import { forwardRef as forwardRef5, useEffect, useState as
|
|
1094
|
-
import { jsx as
|
|
1888
|
+
import { forwardRef as forwardRef5, useEffect as useEffect3, useState as useState7 } from "react";
|
|
1889
|
+
import { jsx as jsx38 } from "react/jsx-runtime";
|
|
1095
1890
|
var EXIT_MS = 300;
|
|
1096
1891
|
var Toast = forwardRef5(function Toast2({ message, open, duration = 3e3, onClose, position = "none", className }, ref) {
|
|
1097
1892
|
const controlled = open !== void 0;
|
|
1098
|
-
const [mounted, setMounted] =
|
|
1099
|
-
const [visible, setVisible] =
|
|
1100
|
-
|
|
1893
|
+
const [mounted, setMounted] = useState7(!controlled || open);
|
|
1894
|
+
const [visible, setVisible] = useState7(!controlled || open);
|
|
1895
|
+
useEffect3(() => {
|
|
1101
1896
|
if (!controlled) return;
|
|
1102
1897
|
if (open) {
|
|
1103
1898
|
setMounted(true);
|
|
@@ -1108,13 +1903,13 @@ var Toast = forwardRef5(function Toast2({ message, open, duration = 3e3, onClose
|
|
|
1108
1903
|
const timer = setTimeout(() => setMounted(false), EXIT_MS);
|
|
1109
1904
|
return () => clearTimeout(timer);
|
|
1110
1905
|
}, [controlled, open]);
|
|
1111
|
-
|
|
1906
|
+
useEffect3(() => {
|
|
1112
1907
|
if (!controlled || !open || !duration) return;
|
|
1113
1908
|
const timer = setTimeout(() => onClose?.(), duration);
|
|
1114
1909
|
return () => clearTimeout(timer);
|
|
1115
1910
|
}, [controlled, open, duration, onClose]);
|
|
1116
1911
|
if (!mounted) return null;
|
|
1117
|
-
const banner = /* @__PURE__ */
|
|
1912
|
+
const banner = /* @__PURE__ */ jsx38(
|
|
1118
1913
|
"div",
|
|
1119
1914
|
{
|
|
1120
1915
|
ref,
|
|
@@ -1122,7 +1917,7 @@ var Toast = forwardRef5(function Toast2({ message, open, duration = 3e3, onClose
|
|
|
1122
1917
|
"aria-live": "polite",
|
|
1123
1918
|
className: cn(
|
|
1124
1919
|
"w-full h-fit py-2.5 bg-gray06",
|
|
1125
|
-
"font-pretendard text-white text-center font-semibold text-[17px]",
|
|
1920
|
+
"font-pretendard text-white text-center font-semibold text-[17px] leading-[1.6]",
|
|
1126
1921
|
"shadow-[0_2px_15px_rgba(0,0,0,0.18)]",
|
|
1127
1922
|
controlled && "transition-opacity duration-300",
|
|
1128
1923
|
controlled && (visible ? "opacity-100" : "opacity-0"),
|
|
@@ -1132,7 +1927,7 @@ var Toast = forwardRef5(function Toast2({ message, open, duration = 3e3, onClose
|
|
|
1132
1927
|
}
|
|
1133
1928
|
);
|
|
1134
1929
|
if (position === "none") return banner;
|
|
1135
|
-
return /* @__PURE__ */
|
|
1930
|
+
return /* @__PURE__ */ jsx38(
|
|
1136
1931
|
"div",
|
|
1137
1932
|
{
|
|
1138
1933
|
className: cn(
|
|
@@ -1145,18 +1940,49 @@ var Toast = forwardRef5(function Toast2({ message, open, duration = 3e3, onClose
|
|
|
1145
1940
|
});
|
|
1146
1941
|
export {
|
|
1147
1942
|
BackButton,
|
|
1943
|
+
BasicFormField,
|
|
1148
1944
|
CTA,
|
|
1149
1945
|
CategorySegment,
|
|
1150
1946
|
CategorySegmentedControl,
|
|
1947
|
+
Column,
|
|
1948
|
+
ColumnContentContainer,
|
|
1949
|
+
ColumnDescription,
|
|
1950
|
+
ColumnDescriptionList,
|
|
1951
|
+
ColumnLabel,
|
|
1952
|
+
ColumnSubTitle,
|
|
1953
|
+
ColumnText,
|
|
1954
|
+
ColumnTextStyle,
|
|
1955
|
+
Dropdown,
|
|
1956
|
+
FormCheckBox,
|
|
1957
|
+
FormColor,
|
|
1958
|
+
FormFile,
|
|
1959
|
+
FormNumber,
|
|
1960
|
+
FormPassword,
|
|
1961
|
+
FormSelectBox,
|
|
1962
|
+
FormTel,
|
|
1963
|
+
FormText,
|
|
1964
|
+
FormTextArea,
|
|
1965
|
+
IconCheck,
|
|
1966
|
+
IconChevronDownXS,
|
|
1967
|
+
IconCompass,
|
|
1968
|
+
IconInfo,
|
|
1969
|
+
List,
|
|
1970
|
+
Modal,
|
|
1971
|
+
ModalText,
|
|
1972
|
+
ModalTextStyle,
|
|
1973
|
+
MultiColumn,
|
|
1151
1974
|
NoticeBadge,
|
|
1152
1975
|
NoticeBar,
|
|
1153
1976
|
SearchBar,
|
|
1977
|
+
SelectBoxOption,
|
|
1154
1978
|
SideRadioAccordion,
|
|
1155
1979
|
TNB,
|
|
1156
1980
|
Tag,
|
|
1981
|
+
TextButton,
|
|
1157
1982
|
Timetable,
|
|
1158
1983
|
TitleInput,
|
|
1159
1984
|
Toast,
|
|
1160
|
-
WeekNavigation
|
|
1985
|
+
WeekNavigation,
|
|
1986
|
+
getInputStyles
|
|
1161
1987
|
};
|
|
1162
1988
|
//# sourceMappingURL=index.mjs.map
|