@hivcd-printshop/design-system 1.0.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -21,7 +21,20 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  // src/index.ts
22
22
  var index_exports = {};
23
23
  __export(index_exports, {
24
- CTA: () => CTA
24
+ BackButton: () => BackButton,
25
+ CTA: () => CTA,
26
+ CategorySegment: () => CategorySegment,
27
+ CategorySegmentedControl: () => CategorySegmentedControl,
28
+ NoticeBadge: () => NoticeBadge,
29
+ NoticeBar: () => NoticeBar,
30
+ SearchBar: () => SearchBar,
31
+ SideRadioAccordion: () => SideRadioAccordion,
32
+ TNB: () => TNB,
33
+ Tag: () => Tag,
34
+ Timetable: () => Timetable,
35
+ TitleInput: () => TitleInput,
36
+ Toast: () => Toast,
37
+ WeekNavigation: () => WeekNavigation
25
38
  });
26
39
  module.exports = __toCommonJS(index_exports);
27
40
 
@@ -52,41 +65,1133 @@ function cn(...inputs) {
52
65
  return twMerge((0, import_clsx.clsx)(inputs));
53
66
  }
54
67
 
55
- // src/components/CTA/CTA.tsx
68
+ // src/assets/svgs/Icons.tsx
56
69
  var import_jsx_runtime = require("react/jsx-runtime");
70
+ var IconChevronDownXS = ({
71
+ className,
72
+ stroke
73
+ }) => {
74
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
75
+ "svg",
76
+ {
77
+ className,
78
+ width: "20",
79
+ height: "20",
80
+ viewBox: "0 0 20 20",
81
+ fill: "none",
82
+ xmlns: "http://www.w3.org/2000/svg",
83
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
84
+ "path",
85
+ {
86
+ d: "M5 8.3335L10 13.3335L15 8.3335",
87
+ stroke: stroke || "#121212",
88
+ strokeWidth: "1.5",
89
+ strokeLinecap: "square"
90
+ }
91
+ )
92
+ }
93
+ );
94
+ };
95
+ var IconSearch = ({ className, stroke }) => {
96
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
97
+ "svg",
98
+ {
99
+ className,
100
+ width: "30",
101
+ height: "30",
102
+ viewBox: "0 0 30 30",
103
+ fill: "none",
104
+ xmlns: "http://www.w3.org/2000/svg",
105
+ children: [
106
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
107
+ "path",
108
+ {
109
+ d: "M20.1161 20.6888L24.1075 25.1791",
110
+ stroke: stroke || "black",
111
+ strokeWidth: "2",
112
+ strokeLinecap: "round"
113
+ }
114
+ ),
115
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
116
+ "path",
117
+ {
118
+ fillRule: "evenodd",
119
+ clipRule: "evenodd",
120
+ d: "M13.9289 23.0361C18.9587 23.0361 23.0361 18.9587 23.0361 13.9289C23.0361 8.89918 18.9587 4.82178 13.9289 4.82178C8.89918 4.82178 4.82178 8.89918 4.82178 13.9289C4.82178 18.9587 8.89918 23.0361 13.9289 23.0361Z",
121
+ stroke: stroke || "black",
122
+ strokeWidth: "2"
123
+ }
124
+ )
125
+ ]
126
+ }
127
+ );
128
+ };
129
+ var IconGoBack = ({ className, stroke }) => {
130
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
131
+ "svg",
132
+ {
133
+ className,
134
+ width: "32",
135
+ height: "32",
136
+ viewBox: "0 0 32 32",
137
+ fill: "none",
138
+ xmlns: "http://www.w3.org/2000/svg",
139
+ children: [
140
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
141
+ "path",
142
+ {
143
+ d: "M28 16.0001L4 16.0001",
144
+ stroke: stroke || "black",
145
+ strokeWidth: "2",
146
+ strokeLinecap: "round"
147
+ }
148
+ ),
149
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M12 8L4 16L12 24", stroke: stroke || "black", strokeWidth: "2", strokeLinecap: "round" })
150
+ ]
151
+ }
152
+ );
153
+ };
154
+
155
+ // src/components/BackButton/BackButton.tsx
156
+ var import_jsx_runtime2 = require("react/jsx-runtime");
157
+ var BackButton = ({ onClick, className }) => {
158
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
159
+ "button",
160
+ {
161
+ type: "button",
162
+ onClick,
163
+ className: cn(
164
+ "w-14 h-full py-3",
165
+ "flex flex-col items-center",
166
+ "box-border border-r border-gray02",
167
+ "bg-white hover:bg-gray00 active:bg-gray01",
168
+ "cursor-pointer",
169
+ className
170
+ ),
171
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(IconGoBack, {})
172
+ }
173
+ );
174
+ };
175
+
176
+ // src/components/CTA/CTA.tsx
177
+ var import_jsx_runtime3 = require("react/jsx-runtime");
57
178
  var CTA = ({
58
- primary = true,
179
+ primary = false,
180
+ alert = false,
181
+ disabled = false,
182
+ label,
183
+ onClick,
184
+ className,
185
+ forModal = false,
186
+ ...props
187
+ }) => {
188
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
189
+ "button",
190
+ {
191
+ type: "button",
192
+ disabled,
193
+ className: cn(
194
+ forModal ? "h-14.5" : "h-12",
195
+ "w-full max-w-360 px-4",
196
+ "flex items-center justify-center",
197
+ "border-t box-border border-gray02",
198
+ primary && "border-none",
199
+ "text-head3-medium text-strong",
200
+ primary && "text-white",
201
+ alert && "text-danger",
202
+ disabled && "text-quaternary",
203
+ "bg-white hover:bg-gray00 active:bg-gray01 disabled:bg-gray02",
204
+ primary && "bg-black hover:bg-gray08 active:bg-gray09 disabled:bg-gray01",
205
+ "cursor-pointer disabled:cursor-default",
206
+ className
207
+ ),
208
+ onClick,
209
+ ...props,
210
+ children: label
211
+ }
212
+ );
213
+ };
214
+
215
+ // src/components/createPost/CategorySegment.tsx
216
+ var import_jsx_runtime4 = require("react/jsx-runtime");
217
+ var CategorySegment = ({
218
+ selected = false,
219
+ label,
220
+ className,
221
+ onClick
222
+ }) => {
223
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
224
+ "div",
225
+ {
226
+ className: cn(
227
+ "w-fit h-8 px-3.5",
228
+ "flex items-center justify-center",
229
+ // 피그마랑 조금 다르게 적용하였음. 이게 더 효율적
230
+ "border-r border-gray02 cursor-pointer",
231
+ "text-body3-book text-strong",
232
+ selected ? "bg-black text-white" : "bg-white text-strong hover:bg-gray00 active:bg-gray01",
233
+ // default, hover, pressed 상태
234
+ className
235
+ ),
236
+ onClick,
237
+ children: label
238
+ }
239
+ );
240
+ };
241
+
242
+ // src/components/createPost/CategorySegmentedControl.tsx
243
+ var import_jsx_runtime5 = require("react/jsx-runtime");
244
+ var categorySegments = {
245
+ info: ["\uACF5\uC6A9 \uBB3C\uD488", "\uC77C\uBC18 \uAE30\uC790\uC7AC", "\uD2B9\uC218 \uAE30\uC790\uC7AC"],
246
+ archive: ["\uD504\uB9B0\uD2B8\uC2E4", "\uD64D\uC775\uC2DC\uB514"],
247
+ notice: ["\uC77C\uBC18 \uACF5\uC9C0", "\uAE34\uAE09 \uACF5\uC9C0"],
248
+ infoTag: ["\uAC00\uACF5", "\uC81C\uBCF8", "\uCD9C\uB825", "\uC2A4\uCE94", "\uAE30\uD0C0"]
249
+ };
250
+ var CategorySegmentedControl = ({
251
+ variable,
252
+ setSelectedCategory,
253
+ selectedCategory,
254
+ className
255
+ }) => {
256
+ const segments = categorySegments[variable];
257
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: cn("w-full h-fit flex items-center justify-start", className), children: [
258
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
259
+ "div",
260
+ {
261
+ className: cn(
262
+ "w-fit h-8 px-3.5",
263
+ "flex items-center justify-center",
264
+ // 피그마랑 조금 다르게 적용하였음. 이게 더 효율적
265
+ "border-r border-gray02",
266
+ "text-body3-medium text-strong"
267
+ ),
268
+ children: variable === "infoTag" ? "\uD0DC\uADF8 \uC120\uD0DD" : "\uCE74\uD14C\uACE0\uB9AC \uC120\uD0DD"
269
+ }
270
+ ),
271
+ segments.map((label) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
272
+ CategorySegment,
273
+ {
274
+ label,
275
+ selected: selectedCategory === label,
276
+ onClick: () => setSelectedCategory(label)
277
+ },
278
+ label
279
+ ))
280
+ ] });
281
+ };
282
+
283
+ // src/components/createPost/TitleInput.tsx
284
+ var import_jsx_runtime6 = require("react/jsx-runtime");
285
+ var TitleInput = ({ title, onChange, className }) => {
286
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
287
+ "input",
288
+ {
289
+ type: "text",
290
+ value: title,
291
+ onChange: (e) => onChange(e.target.value),
292
+ placeholder: "\uC81C\uBAA9\uC744 \uC785\uB825\uD558\uC138\uC694",
293
+ className: cn(
294
+ "w-full min-w-[200px] h-12 px-3",
295
+ // 피그마랑 매우 다름. focus되었을 때 테두리 중복 문제 등
296
+ "box-border border-b border-gray02 border-t border-t-white",
297
+ "focus:border-black focus:border focus:outline-none",
298
+ "text-head2-medium text-strong placeholder:text-gray03",
299
+ className
300
+ )
301
+ }
302
+ );
303
+ };
304
+
305
+ // src/components/notice/NoticeBadge.tsx
306
+ var import_jsx_runtime7 = require("react/jsx-runtime");
307
+ var NoticeBadge = ({ variable, className, onClick }) => {
308
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
309
+ "button",
310
+ {
311
+ type: "button",
312
+ className: cn(
313
+ // 너비 피그마에서는 fit으로 69px로 되어있는데, 69px로 하면 글자가 잘려서 72px로 잡음. 컨펌 필요
314
+ "w-18 h-8 box-border px-2 py-1 text-center text-body3-book cursor-pointer",
315
+ /** Urgent */
316
+ `${variable === "urgent" ? "bg-black text-white" : ""}`,
317
+ /** Common */
318
+ `${variable === "common" ? "border border-gray03 text-strong" : ""}`,
319
+ //이거 배경 없는 거 맞겠지...?
320
+ className
321
+ ),
322
+ onClick,
323
+ children: variable === "urgent" ? "\uAE34\uAE09 \uACF5\uC9C0" : "\uC77C\uBC18 \uACF5\uC9C0"
324
+ }
325
+ );
326
+ };
327
+
328
+ // src/components/notice/NoticeBar.tsx
329
+ var import_jsx_runtime8 = require("react/jsx-runtime");
330
+ var NoticeBar = ({
59
331
  variable = "default",
332
+ badgeVariable,
333
+ title,
334
+ date,
335
+ className,
336
+ onClick
337
+ }) => {
338
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
339
+ "div",
340
+ {
341
+ className: cn(
342
+ "w-full min-w-200 h-15 px-4 py-3.5 flex items-center justify-between box-border border-b border-gray02 cursor-pointer",
343
+ variable === "default" && "bg-white hover:bg-gray00 active:bg-gray01",
344
+ variable === "hover" && "bg-gray00",
345
+ variable === "pressed" && "bg-gray01",
346
+ className
347
+ ),
348
+ onClick,
349
+ children: [
350
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("section", { className: "flex items-center gap-3", children: [
351
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(NoticeBadge, { variable: badgeVariable }),
352
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("h1", { className: "text-head1-medium text-strong", children: title })
353
+ ] }),
354
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { className: "text-body3-book text-tertiary", children: date })
355
+ ]
356
+ }
357
+ );
358
+ };
359
+
360
+ // src/components/SearchBar/SearchBar.tsx
361
+ var import_jsx_runtime9 = require("react/jsx-runtime");
362
+ var SearchBar = ({ value, onChange, className }) => {
363
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
364
+ "label",
365
+ {
366
+ className: cn(
367
+ "w-full h-12 pl-4 pr-3",
368
+ "flex items-center gap-2",
369
+ "box-border border-b border-gray02 border-t border-t-white",
370
+ "focus-within:border-black focus-within:border focus-within:outline-none",
371
+ className
372
+ ),
373
+ children: [
374
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(IconSearch, {}),
375
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
376
+ "input",
377
+ {
378
+ type: "text",
379
+ placeholder: "\uAC80\uC0C9\uC5B4\uB97C \uC785\uB825\uD574\uC8FC\uC138\uC694",
380
+ value,
381
+ onChange: (e) => onChange?.(e.target.value),
382
+ className: cn(
383
+ "w-full focus:outline-none",
384
+ "text-body1-book text-strong placeholder:text-quaternary"
385
+ )
386
+ }
387
+ )
388
+ ]
389
+ }
390
+ );
391
+ };
392
+
393
+ // src/components/SideRadioAccordion/SideRadioAccordion.tsx
394
+ var import_react2 = require("react");
395
+
396
+ // src/lib/useControllableState.ts
397
+ var import_react = require("react");
398
+ function useControllableState(controlled, defaultValue) {
399
+ const isControlled = controlled !== void 0;
400
+ const [uncontrolled, setUncontrolled] = (0, import_react.useState)(defaultValue);
401
+ const value = isControlled ? controlled : uncontrolled;
402
+ const setValue = (0, import_react.useCallback)(
403
+ (next) => {
404
+ if (!isControlled) setUncontrolled(next);
405
+ },
406
+ [isControlled]
407
+ );
408
+ return [value, setValue, isControlled];
409
+ }
410
+
411
+ // src/components/SideRadioAccordion/Exclamation.svg
412
+ var Exclamation_default = "./Exclamation-IUYZYYC4.svg";
413
+
414
+ // src/components/SideRadioAccordion/ChevronDown.svg
415
+ var ChevronDown_default = "./ChevronDown-XSALXCW4.svg";
416
+
417
+ // src/components/SideRadioAccordion/RadioSelected.svg
418
+ var RadioSelected_default = "./RadioSelected-DOLVV7ZM.svg";
419
+
420
+ // src/components/SideRadioAccordion/RadioUnselected.svg
421
+ var RadioUnselected_default = "./RadioUnselected-QN74EU46.svg";
422
+
423
+ // src/components/SideRadioAccordion/SideRadioAccordion.tsx
424
+ var import_jsx_runtime10 = require("react/jsx-runtime");
425
+ var printColorBgClass = {
426
+ Plotter: "bg-print-plotter",
427
+ Printer: "bg-print-printer",
428
+ Riso: "bg-print-riso",
429
+ Fluorescent: "bg-print-fluorescent",
430
+ UV: "bg-print-uv",
431
+ "Seet Cutting": "bg-print-seet-cutting",
432
+ "Laser Cutting": "bg-print-laser-cutting"
433
+ };
434
+ var itemKey = (item) => item.value ?? item.title;
435
+ var SideRadioAccordion = (0, import_react2.forwardRef)(
436
+ function SideRadioAccordion2({
437
+ step,
438
+ title,
439
+ radioToggleList,
440
+ selected,
441
+ defaultSelected,
442
+ onSelect,
443
+ stickyHeader = false,
444
+ collapsible = true,
445
+ defaultOpen = true,
446
+ open,
447
+ onOpenChange,
448
+ quantityLimitLabel,
449
+ onClickQuantityLimit,
450
+ className
451
+ }, ref) {
452
+ const [selectedValue, setSelectedValue] = useControllableState(
453
+ selected,
454
+ defaultSelected ?? null
455
+ );
456
+ const [isOpen, setIsOpen] = useControllableState(open, defaultOpen);
457
+ const expanded = collapsible ? isOpen : true;
458
+ const handleSelect = (value) => {
459
+ setSelectedValue(value);
460
+ onSelect?.(value);
461
+ };
462
+ const toggleOpen = () => {
463
+ if (!collapsible) return;
464
+ const next = !isOpen;
465
+ setIsOpen(next);
466
+ onOpenChange?.(next);
467
+ };
468
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { ref, className: cn("w-full", className), children: [
469
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
470
+ Stepper,
471
+ {
472
+ step,
473
+ title,
474
+ isOpen: expanded,
475
+ collapsible,
476
+ onClick: toggleOpen,
477
+ className: cn(stickyHeader && "sticky top-0 z-10")
478
+ }
479
+ ),
480
+ expanded && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "flex flex-col", children: [
481
+ radioToggleList.map((item) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
482
+ RadioToggleItem,
483
+ {
484
+ ...item,
485
+ open: selectedValue === itemKey(item),
486
+ onSelect: () => handleSelect(itemKey(item))
487
+ },
488
+ itemKey(item)
489
+ )),
490
+ quantityLimitLabel && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
491
+ TextButton,
492
+ {
493
+ label: quantityLimitLabel,
494
+ onClick: onClickQuantityLimit,
495
+ className: "mt-2"
496
+ }
497
+ )
498
+ ] })
499
+ ] });
500
+ }
501
+ );
502
+ var Stepper = ({ step, title, isOpen, collapsible, onClick, className }) => {
503
+ const label = /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("span", { children: [
504
+ step,
505
+ " | ",
506
+ title
507
+ ] });
508
+ const base = "w-full flex items-center justify-between px-3 py-2.5 text-body1-medium text-strong text-left bg-white";
509
+ if (!collapsible) {
510
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: cn(base, className), children: label });
511
+ }
512
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
513
+ "button",
514
+ {
515
+ type: "button",
516
+ onClick,
517
+ className: cn(base, "cursor-pointer hover:bg-gray00 active:bg-gray01", className),
518
+ children: [
519
+ label,
520
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
521
+ "img",
522
+ {
523
+ src: ChevronDown_default,
524
+ alt: "",
525
+ className: cn("transition-transform", isOpen && "rotate-180")
526
+ }
527
+ )
528
+ ]
529
+ }
530
+ );
531
+ };
532
+ var RadioToggleItem = ({
533
+ title,
534
+ content,
535
+ badges,
536
+ printColor,
537
+ color,
538
+ className,
539
+ labelTextButton,
540
+ onClickTextButton,
541
+ open,
542
+ onSelect
543
+ }) => {
544
+ const rowBg = !open ? "bg-white hover:bg-gray00" : color ? void 0 : printColor ? printColorBgClass[printColor] : "bg-gray00";
545
+ const style = open && color ? { backgroundColor: color } : void 0;
546
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "w-full", children: [
547
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
548
+ "button",
549
+ {
550
+ type: "button",
551
+ onClick: onSelect,
552
+ style,
553
+ className: cn(
554
+ "w-full flex items-center gap-1.5 px-3 py-2.5",
555
+ "text-body2-regular text-primary text-left cursor-pointer",
556
+ rowBg,
557
+ className
558
+ ),
559
+ children: [
560
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Radio, { selected: open }),
561
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: title })
562
+ ]
563
+ }
564
+ ),
565
+ open && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "flex flex-col gap-2 px-3 py-3 bg-white", children: [
566
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "text-caption-regular text-secondary", children: content }),
567
+ badges && badges.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "flex gap-1", children: badges.map((badge) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Badge, { label: badge }, badge)) }),
568
+ labelTextButton && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
569
+ TextButton,
570
+ {
571
+ label: labelTextButton,
572
+ onClick: onClickTextButton,
573
+ showIcon: true,
574
+ className: "self-end"
575
+ }
576
+ )
577
+ ] })
578
+ ] });
579
+ };
580
+ var Radio = ({ selected = false, className }) => {
581
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
582
+ "img",
583
+ {
584
+ src: selected ? RadioSelected_default : RadioUnselected_default,
585
+ alt: "",
586
+ className: cn("w-4 h-4", className)
587
+ }
588
+ );
589
+ };
590
+ var TextButton = ({ label, onClick, showIcon = false, className }) => {
591
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
592
+ "button",
593
+ {
594
+ type: "button",
595
+ onClick,
596
+ disabled: !onClick,
597
+ className: cn(
598
+ "w-fit h-fit px-1.5 py-0.5 flex items-center gap-1",
599
+ "text-primary text-caption-regular underline",
600
+ onClick && "cursor-pointer hover:bg-gray00 active:bg-gray01",
601
+ className
602
+ ),
603
+ children: [
604
+ showIcon && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("img", { src: Exclamation_default, alt: "" }),
605
+ label
606
+ ]
607
+ }
608
+ );
609
+ };
610
+ var Badge = ({ label, className }) => {
611
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
612
+ "div",
613
+ {
614
+ className: cn(
615
+ "w-fit h-fit px-2 py-0.5 border border-gray02",
616
+ "text-tertiary text-caption-book",
617
+ className
618
+ ),
619
+ children: label
620
+ }
621
+ );
622
+ };
623
+
624
+ // src/components/Tag/Tag.tsx
625
+ var import_jsx_runtime11 = require("react/jsx-runtime");
626
+ var Tag = ({
627
+ className,
628
+ children,
629
+ selected = false,
630
+ disabled = false,
631
+ bgColor,
632
+ onClick,
633
+ ...props
634
+ }) => {
635
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
636
+ "button",
637
+ {
638
+ className: cn(
639
+ "tag",
640
+ "w-fit h-8 px-2.5",
641
+ "text-primary text-body2-regular transition-colors",
642
+ "box-border border border-gray02",
643
+ "bg-white",
644
+ // bgColor && `bg-[${bgColor}] border-none`,
645
+ onClick && "cursor-pointer hover:bg-gray00 active:bg-gray01 cursor-pointer has-clickable",
646
+ selected && "text-white bg-black border-black hover:bg-black active:bg-black",
647
+ "disabled:text-gray04 disabled:bg-gray02 disabled:border-gray02 disabled:cursor-not-allowed",
648
+ className
649
+ ),
650
+ onClick,
651
+ disabled,
652
+ style: bgColor ? { backgroundColor: bgColor, border: "none" } : void 0,
653
+ ...props,
654
+ children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { children })
655
+ }
656
+ );
657
+ };
658
+
659
+ // src/components/Timetable/Timetable.tsx
660
+ var import_react4 = require("react");
661
+
662
+ // src/components/Timetable/WeekNavigation.tsx
663
+ var import_react3 = require("react");
664
+
665
+ // src/components/Timetable/dateUtils.ts
666
+ var KOREAN_WEEKDAYS = ["\uC77C", "\uC6D4", "\uD654", "\uC218", "\uBAA9", "\uAE08", "\uD1A0"];
667
+ var parseISODate = (date) => {
668
+ const [year, month, day] = date.split("-").map(Number);
669
+ return new Date(year, month - 1, day);
670
+ };
671
+ var toISODate = (d) => {
672
+ const year = d.getFullYear();
673
+ const month = String(d.getMonth() + 1).padStart(2, "0");
674
+ const day = String(d.getDate()).padStart(2, "0");
675
+ return `${year}-${month}-${day}`;
676
+ };
677
+ var addDays = (date, amount) => {
678
+ const d = parseISODate(date);
679
+ d.setDate(d.getDate() + amount);
680
+ return toISODate(d);
681
+ };
682
+ var formatDayLabel = (date) => {
683
+ const d = parseISODate(date);
684
+ return `${d.getMonth() + 1}\uC6D4 ${d.getDate()}\uC77C(${KOREAN_WEEKDAYS[d.getDay()]})`;
685
+ };
686
+ var formatMMDD = (date) => {
687
+ const d = parseISODate(date);
688
+ return `${String(d.getMonth() + 1).padStart(2, "0")}.${String(d.getDate()).padStart(2, "0")}`;
689
+ };
690
+ var formatWeekRange = (weekStart) => {
691
+ const weekEnd = addDays(weekStart, 4);
692
+ return `${formatMMDD(weekStart)} ~ ${formatMMDD(weekEnd)}`;
693
+ };
694
+
695
+ // src/components/Timetable/WeekNavigation.tsx
696
+ var import_jsx_runtime12 = require("react/jsx-runtime");
697
+ var weekLabel = {
698
+ thisWeek: "\uC774\uBC88 \uC8FC",
699
+ nextWeek: "\uB2E4\uC74C \uC8FC",
700
+ twoWeeksLater: "\uB2E4\uB2E4\uC74C \uC8FC"
701
+ };
702
+ var WeekNavigation = (0, import_react3.forwardRef)(
703
+ function WeekNavigation2({ date, week, label, canPrev, canNext, onPrevWeek, onNextWeek, className }, ref) {
704
+ const showPrev = canPrev ?? (week ? week !== "thisWeek" : true);
705
+ const showNext = canNext ?? (week ? week !== "twoWeeksLater" : true);
706
+ const text = label ?? (week ? `${weekLabel[week]} (${formatWeekRange(date)})` : formatWeekRange(date));
707
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
708
+ "div",
709
+ {
710
+ ref,
711
+ className: cn(
712
+ "flex items-center justify-between",
713
+ "w-full h-11 px-3",
714
+ "bg-white border border-gray02",
715
+ "text-body2-regular text-primary",
716
+ className
717
+ ),
718
+ children: [
719
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(ArrowButton, { direction: "left", visible: showPrev, onClick: onPrevWeek }),
720
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { children: text }),
721
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(ArrowButton, { direction: "right", visible: showNext, onClick: onNextWeek })
722
+ ]
723
+ }
724
+ );
725
+ }
726
+ );
727
+ var ArrowButton = ({ direction, visible, onClick }) => {
728
+ if (!visible) {
729
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "w-6 h-6" });
730
+ }
731
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
732
+ "button",
733
+ {
734
+ type: "button",
735
+ onClick,
736
+ className: cn(
737
+ "flex items-center justify-center w-6 h-6",
738
+ "text-gray06 cursor-pointer",
739
+ "hover:bg-gray00 active:bg-gray01"
740
+ ),
741
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
742
+ IconChevronDownXS,
743
+ {
744
+ className: direction === "left" ? "rotate-90" : "-rotate-90",
745
+ stroke: "currentColor"
746
+ }
747
+ )
748
+ }
749
+ );
750
+ };
751
+
752
+ // src/components/Timetable/Timetable.tsx
753
+ var import_jsx_runtime13 = require("react/jsx-runtime");
754
+ var printColorHoverClass = {
755
+ Plotter: "hover:bg-print-plotter",
756
+ Printer: "hover:bg-print-printer",
757
+ Riso: "hover:bg-print-riso",
758
+ Fluorescent: "hover:bg-print-fluorescent",
759
+ UV: "hover:bg-print-uv",
760
+ "Seet Cutting": "hover:bg-print-seet-cutting",
761
+ "Laser Cutting": "hover:bg-print-laser-cutting"
762
+ };
763
+ var Timetable = (0, import_react4.forwardRef)(function Timetable2({
764
+ weekStart,
765
+ week,
766
+ days,
767
+ onPrevWeek,
768
+ onNextWeek,
769
+ onSelectSlot,
770
+ fluid = false,
771
+ hideWeekNavigation = false,
772
+ canPrevWeek,
773
+ canNextWeek,
774
+ className
775
+ }, ref) {
776
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { ref, className: cn(fluid && "w-full", className), children: [
777
+ !hideWeekNavigation && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
778
+ WeekNavigation,
779
+ {
780
+ date: weekStart,
781
+ week,
782
+ canPrev: canPrevWeek,
783
+ canNext: canNextWeek,
784
+ onPrevWeek,
785
+ onNextWeek
786
+ }
787
+ ),
788
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: cn("flex", fluid && "w-full"), children: days.map((day) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
789
+ DailyTimetable,
790
+ {
791
+ date: day.date,
792
+ slots: day.slots,
793
+ fluid,
794
+ onSelectTime: onSelectSlot ? (time) => onSelectSlot(day.date, time) : void 0
795
+ },
796
+ day.date
797
+ )) })
798
+ ] });
799
+ });
800
+ var DailyTimetable = ({ date, slots, fluid, onSelectTime, className }) => {
801
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: cn("flex flex-col", fluid ? "flex-1 min-w-0" : "w-18", className), children: [
802
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "h-13 flex items-center justify-center text-body3-medium text-secondary", children: formatDayLabel(date) }),
803
+ slots.map((slot) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
804
+ TimeItem,
805
+ {
806
+ state: slot.state,
807
+ label: slot.time,
808
+ printColor: slot.printColor,
809
+ color: slot.color,
810
+ fluid,
811
+ className: slot.className,
812
+ onClick: onSelectTime ? () => onSelectTime(slot.time) : void 0
813
+ },
814
+ slot.time
815
+ ))
816
+ ] });
817
+ };
818
+ var TimeItem = ({
819
+ state,
60
820
  label,
821
+ printColor,
822
+ color,
823
+ fluid,
61
824
  onClick,
62
825
  className
63
826
  }) => {
64
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
827
+ const clickable = (state === "default" || state === "selected") && !!onClick;
828
+ const style = state === "default" && color ? { "--tt-hover": color } : void 0;
829
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
830
+ "div",
831
+ {
832
+ onClick: clickable ? onClick : void 0,
833
+ style,
834
+ className: cn(
835
+ "h-18 flex items-center justify-center",
836
+ fluid ? "w-full" : "w-18",
837
+ "text-body1-medium text-center bg-white text-primary",
838
+ state === "none" && "bg-gray00 text-transparent",
839
+ state === "selected" && "bg-black text-gray02 hover:cursor-pointer",
840
+ state === "disabled" && "bg-gray00 text-gray03",
841
+ state === "default" && [
842
+ "hover:cursor-pointer",
843
+ color ? "hover:bg-(--tt-hover)" : printColor ? printColorHoverClass[printColor] : "hover:bg-gray00"
844
+ ],
845
+ className
846
+ ),
847
+ children: label
848
+ }
849
+ );
850
+ };
851
+
852
+ // src/components/TNB/TNB.tsx
853
+ var import_react5 = require("react");
854
+ var import_jsx_runtime14 = require("react/jsx-runtime");
855
+ function useControllableState2(controlled, defaultValue) {
856
+ const isControlled = controlled !== void 0;
857
+ const [uncontrolled, setUncontrolled] = (0, import_react5.useState)(defaultValue);
858
+ const value = isControlled ? controlled : uncontrolled;
859
+ const setValue = (0, import_react5.useCallback)(
860
+ (next) => {
861
+ if (!isControlled) setUncontrolled(next);
862
+ },
863
+ [isControlled]
864
+ );
865
+ return [value, setValue, isControlled];
866
+ }
867
+ var TNB = (0, import_react5.forwardRef)(function TNB2({
868
+ logo,
869
+ upperPartItemList,
870
+ upperPartIconList,
871
+ selected,
872
+ defaultSelected,
873
+ onSelectedChange,
874
+ selectedLower,
875
+ defaultSelectedLower,
876
+ onSelectedLowerChange,
877
+ onSelectItem,
878
+ linkComponent,
879
+ "aria-label": ariaLabel = "\uC8FC\uC694 \uBA54\uB274",
880
+ className
881
+ }, ref) {
882
+ const [upperValue, setUpperValue] = useControllableState2(
883
+ selected,
884
+ defaultSelected ?? null
885
+ );
886
+ const [lowerValueRaw, setLowerValue, lowerIsControlled] = useControllableState2(
887
+ selectedLower,
888
+ defaultSelectedLower ?? null
889
+ );
890
+ const currentUpper = upperPartItemList.find((item) => item.label === upperValue);
891
+ const currentLowerItemList = currentUpper?.lowerPartItemList ?? [];
892
+ const lowerValue = lowerIsControlled ? lowerValueRaw ?? void 0 : currentLowerItemList.some((item) => item.label === lowerValueRaw) ? lowerValueRaw : currentLowerItemList[0]?.label ?? void 0;
893
+ const handleSelectUpper = (label) => {
894
+ setUpperValue(label);
895
+ if (!lowerIsControlled) {
896
+ const nextLower = upperPartItemList.find((item) => item.label === label)?.lowerPartItemList[0]?.label ?? null;
897
+ setLowerValue(nextLower);
898
+ }
899
+ onSelectedChange?.(label);
900
+ onSelectItem?.(label);
901
+ };
902
+ const handleSelectLower = (label) => {
903
+ setLowerValue(label);
904
+ onSelectedLowerChange?.(label);
905
+ };
906
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("nav", { ref, "aria-label": ariaLabel, className: cn("w-full bg-white", className), children: [
907
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
908
+ UpperPart,
909
+ {
910
+ logo,
911
+ upperPartItemList,
912
+ upperPartIconList,
913
+ selected: upperValue ?? void 0,
914
+ onSelectItem: handleSelectUpper,
915
+ linkComponent
916
+ }
917
+ ),
918
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
919
+ LowerPart,
920
+ {
921
+ lowerPartItemList: currentLowerItemList,
922
+ selected: lowerValue,
923
+ onSelectItem: handleSelectLower,
924
+ linkComponent
925
+ }
926
+ )
927
+ ] });
928
+ });
929
+ var NavClickable = (0, import_react5.forwardRef)(function NavClickable2({ href, onClick, linkComponent: Link, current, disabled, className, children }, ref) {
930
+ const ariaCurrent = current ? "page" : void 0;
931
+ if (href && !disabled) {
932
+ if (Link) {
933
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
934
+ Link,
935
+ {
936
+ href,
937
+ onClick,
938
+ "aria-current": ariaCurrent,
939
+ className,
940
+ ref,
941
+ children
942
+ }
943
+ );
944
+ }
945
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
946
+ "a",
947
+ {
948
+ href,
949
+ onClick,
950
+ "aria-current": ariaCurrent,
951
+ className,
952
+ ref,
953
+ children
954
+ }
955
+ );
956
+ }
957
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
65
958
  "button",
66
959
  {
67
960
  type: "button",
961
+ onClick,
962
+ disabled,
963
+ "aria-current": ariaCurrent,
964
+ className,
965
+ ref,
966
+ children
967
+ }
968
+ );
969
+ });
970
+ var UpperPart = ({
971
+ logo,
972
+ upperPartItemList,
973
+ upperPartIconList,
974
+ selected,
975
+ onSelectItem,
976
+ linkComponent,
977
+ className
978
+ }) => {
979
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: cn("w-full h-13 px-4 flex items-center justify-between", className), children: [
980
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex items-center gap-6", children: [
981
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(NavIconButton, { ...logo, linkComponent }),
982
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "flex items-center gap-4", children: upperPartItemList.map((item) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
983
+ UpperPartTab,
984
+ {
985
+ label: item.label,
986
+ href: item.href,
987
+ selected: item.label === selected,
988
+ linkComponent,
989
+ onClick: () => {
990
+ item.onClick?.();
991
+ onSelectItem(item.label);
992
+ }
993
+ },
994
+ item.id ?? item.label
995
+ )) })
996
+ ] }),
997
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "flex items-center gap-2", children: upperPartIconList.map((icon, index) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
998
+ NavIconButton,
999
+ {
1000
+ ...icon,
1001
+ linkComponent
1002
+ },
1003
+ icon.id ?? icon.src ?? icon.label ?? index
1004
+ )) })
1005
+ ] });
1006
+ };
1007
+ var UpperPartTab = ({
1008
+ label,
1009
+ href,
1010
+ selected,
1011
+ onClick,
1012
+ linkComponent,
1013
+ className
1014
+ }) => {
1015
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1016
+ NavClickable,
1017
+ {
1018
+ href,
1019
+ onClick,
1020
+ linkComponent,
1021
+ current: selected,
68
1022
  className: cn(
69
- "w-full max-w-360 h-12 p-2.5 text-center text-head3-medium",
70
- `${primary ? "border-0" : "border border-gray02"}`,
71
- /** Disabled */
72
- `${variable == "disabled" ? primary ? "bg-gray01 text-gray04 border border-gray01" : "bg-gray02 text-gray04" : ""}`,
73
- /** Default */
74
- `${variable == "default" ? primary ? "bg-black text-white" : "bg-white text-strong" : ""}`,
75
- /** Hover */
76
- `${variable != "disabled" ? primary ? "hover:bg-gray08 hover:text-white" : "hover:bg-gray01 hover:text-strong" : ""}`,
77
- /** Hover */
78
- `${variable != "disabled" && "hover:cursor-pointer"}`,
79
- /** Pressed */
80
- `${variable == "pressed" ? primary ? "bg-gray09 text-white" : "bg-gray02 text-strong" : ""}`,
1023
+ "inline-flex px-1 py-1.5 text-body2-regular cursor-pointer no-underline",
1024
+ selected ? "text-strong font-medium underline underline-offset-4" : "text-quaternary hover:text-secondary",
81
1025
  className
82
1026
  ),
1027
+ children: label
1028
+ }
1029
+ );
1030
+ };
1031
+ var NavIconButton = (0, import_react5.forwardRef)(
1032
+ function NavIconButton2({ src, icon, alt, label, href, onClick, selected, badge, className, linkComponent }, forwardedRef) {
1033
+ const interactive = Boolean(onClick || href);
1034
+ const showBadge = badge !== void 0 && badge !== null && badge !== false;
1035
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
1036
+ NavClickable,
1037
+ {
1038
+ ref: forwardedRef,
1039
+ href,
1040
+ onClick,
1041
+ linkComponent,
1042
+ current: selected,
1043
+ disabled: !interactive,
1044
+ className: cn(
1045
+ "relative inline-flex h-8 min-w-8 items-center justify-center gap-1.5 rounded-full px-1.5",
1046
+ interactive && "cursor-pointer",
1047
+ selected ? "bg-black text-white" : "bg-transparent hover:bg-gray00 active:bg-gray01",
1048
+ className
1049
+ ),
1050
+ children: [
1051
+ icon ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "inline-flex h-5 w-5 items-center justify-center", children: icon }) : src ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("img", { src, alt: alt ?? label ?? "", className: "h-5 w-5" }) : null,
1052
+ label ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: cn("text-body2-regular", selected ? "text-white" : "text-secondary"), children: label }) : null,
1053
+ showBadge ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1054
+ "span",
1055
+ {
1056
+ "aria-hidden": badge === true,
1057
+ className: cn(
1058
+ "absolute -right-0.5 -top-0.5 flex items-center justify-center rounded-full bg-danger text-white",
1059
+ badge === true ? "h-2 w-2" : "h-4 min-w-4 px-1 text-caption-regular leading-none"
1060
+ ),
1061
+ children: badge === true ? null : badge
1062
+ }
1063
+ ) : null
1064
+ ]
1065
+ }
1066
+ );
1067
+ }
1068
+ );
1069
+ var LowerPart = ({
1070
+ lowerPartItemList,
1071
+ selected,
1072
+ onSelectItem,
1073
+ linkComponent,
1074
+ className
1075
+ }) => {
1076
+ if (lowerPartItemList.length === 0) {
1077
+ return null;
1078
+ }
1079
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1080
+ "div",
1081
+ {
1082
+ className: cn("w-full h-9 px-4 flex items-center gap-4 border-t border-gray02", className),
1083
+ children: lowerPartItemList.map((item) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1084
+ LowerPartItemButton,
1085
+ {
1086
+ label: item.label,
1087
+ href: item.href,
1088
+ selected: item.label === selected,
1089
+ linkComponent,
1090
+ onClick: () => {
1091
+ item.onClick?.();
1092
+ onSelectItem(item.label);
1093
+ }
1094
+ },
1095
+ item.id ?? item.label
1096
+ ))
1097
+ }
1098
+ );
1099
+ };
1100
+ var LowerPartItemButton = ({
1101
+ label,
1102
+ href,
1103
+ selected,
1104
+ onClick,
1105
+ linkComponent,
1106
+ className
1107
+ }) => {
1108
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1109
+ NavClickable,
1110
+ {
1111
+ href,
83
1112
  onClick,
1113
+ linkComponent,
1114
+ current: selected,
1115
+ className: cn(
1116
+ "inline-flex px-1.5 py-1 text-caption-regular cursor-pointer no-underline",
1117
+ "hover:bg-gray00 active:bg-gray01",
1118
+ selected ? "text-strong font-medium" : "text-quaternary",
1119
+ className
1120
+ ),
84
1121
  children: label
85
1122
  }
86
1123
  );
87
1124
  };
1125
+
1126
+ // src/components/Toast/Toast.tsx
1127
+ var import_react6 = require("react");
1128
+ var import_jsx_runtime15 = require("react/jsx-runtime");
1129
+ var EXIT_MS = 300;
1130
+ var Toast = (0, import_react6.forwardRef)(function Toast2({ message, open, duration = 3e3, onClose, position = "none", className }, ref) {
1131
+ const controlled = open !== void 0;
1132
+ const [mounted, setMounted] = (0, import_react6.useState)(!controlled || open);
1133
+ const [visible, setVisible] = (0, import_react6.useState)(!controlled || open);
1134
+ (0, import_react6.useEffect)(() => {
1135
+ if (!controlled) return;
1136
+ if (open) {
1137
+ setMounted(true);
1138
+ const raf = requestAnimationFrame(() => setVisible(true));
1139
+ return () => cancelAnimationFrame(raf);
1140
+ }
1141
+ setVisible(false);
1142
+ const timer = setTimeout(() => setMounted(false), EXIT_MS);
1143
+ return () => clearTimeout(timer);
1144
+ }, [controlled, open]);
1145
+ (0, import_react6.useEffect)(() => {
1146
+ if (!controlled || !open || !duration) return;
1147
+ const timer = setTimeout(() => onClose?.(), duration);
1148
+ return () => clearTimeout(timer);
1149
+ }, [controlled, open, duration, onClose]);
1150
+ if (!mounted) return null;
1151
+ const banner = /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1152
+ "div",
1153
+ {
1154
+ ref,
1155
+ role: "status",
1156
+ "aria-live": "polite",
1157
+ className: cn(
1158
+ "w-full h-fit py-2.5 bg-gray06",
1159
+ "font-pretendard text-white text-center font-semibold text-[17px]",
1160
+ "shadow-[0_2px_15px_rgba(0,0,0,0.18)]",
1161
+ controlled && "transition-opacity duration-300",
1162
+ controlled && (visible ? "opacity-100" : "opacity-0"),
1163
+ className
1164
+ ),
1165
+ children: message
1166
+ }
1167
+ );
1168
+ if (position === "none") return banner;
1169
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1170
+ "div",
1171
+ {
1172
+ className: cn(
1173
+ "fixed inset-x-0 z-5000 pointer-events-none",
1174
+ position === "top" ? "top-0" : "bottom-0"
1175
+ ),
1176
+ children: banner
1177
+ }
1178
+ );
1179
+ });
88
1180
  // Annotate the CommonJS export names for ESM import in node:
89
1181
  0 && (module.exports = {
90
- CTA
1182
+ BackButton,
1183
+ CTA,
1184
+ CategorySegment,
1185
+ CategorySegmentedControl,
1186
+ NoticeBadge,
1187
+ NoticeBar,
1188
+ SearchBar,
1189
+ SideRadioAccordion,
1190
+ TNB,
1191
+ Tag,
1192
+ Timetable,
1193
+ TitleInput,
1194
+ Toast,
1195
+ WeekNavigation
91
1196
  });
92
1197
  //# sourceMappingURL=index.js.map