@yeongseoksong/framework 1.1.0 → 1.3.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/ui/index.cjs CHANGED
@@ -65,33 +65,63 @@ __export(ui_exports, {
65
65
  MainLayout: () => MainLayout,
66
66
  PageLayout: () => PageLayout,
67
67
  SdBadge: () => SdBadge,
68
+ SdBadgeDefault: () => SdBadgeDefault,
69
+ SdBadgePrimary: () => SdBadgePrimary,
70
+ SdBadgeSuccess: () => SdBadgeSuccess,
71
+ SdBadgeWarning: () => SdBadgeWarning,
68
72
  SdButton: () => SdButton,
69
73
  SdButtonCancel: () => SdButtonCancel,
70
74
  SdButtonDelete: () => SdButtonDelete,
75
+ SdButtonDownload: () => SdButtonDownload,
76
+ SdButtonExcel: () => SdButtonExcel,
71
77
  SdButtonGhost: () => SdButtonGhost,
72
78
  SdButtonOutline: () => SdButtonOutline,
73
79
  SdButtonPrimary: () => SdButtonPrimary,
74
80
  SdButtonSecondary: () => SdButtonSecondary,
81
+ SdButtonSubmit: () => SdButtonSubmit,
75
82
  SdButtonWhite: () => SdButtonWhite,
76
83
  SdClients: () => SdClients,
77
84
  SdClientsGrid: () => SdClientsGrid,
78
85
  SdClientsMarquee: () => SdClientsMarquee,
79
86
  SdContainer: () => SdContainer,
80
87
  SdCta: () => SdCta,
88
+ SdCtaBanner: () => SdCtaBanner,
89
+ SdCtaInline: () => SdCtaInline,
90
+ SdCtaSubtle: () => SdCtaSubtle,
81
91
  SdErrorView: () => SdErrorView,
92
+ SdErrorViewNotFound: () => SdErrorViewNotFound,
93
+ SdErrorViewPage: () => SdErrorViewPage,
82
94
  SdFaq: () => SdFaq,
95
+ SdFaqDefault: () => SdFaqDefault,
96
+ SdFaqFilled: () => SdFaqFilled,
97
+ SdFaqWithHeader: () => SdFaqWithHeader,
83
98
  SdFeatureSection: () => SdFeatureSection,
84
99
  SdFeatures: () => SdFeatures,
85
100
  SdFooter: () => SdFooter,
86
101
  SdHeader: () => SdHeader,
87
102
  SdInput: () => SdInput,
103
+ SdInputEmail: () => SdInputEmail,
104
+ SdInputPassword: () => SdInputPassword,
105
+ SdInputSelect: () => SdInputSelect,
106
+ SdInputText: () => SdInputText,
107
+ SdInputTextarea: () => SdInputTextarea,
108
+ SdLink: () => SdLink,
109
+ SdLinkBody: () => SdLinkBody,
110
+ SdLinkHint: () => SdLinkHint,
111
+ SdLinkStrong: () => SdLinkStrong,
112
+ SdLinkSub: () => SdLinkSub,
88
113
  SdMap: () => SdMap,
89
114
  SdMapSingle: () => SdMapSingle,
90
115
  SdMapTabs: () => SdMapTabs,
91
116
  SdModal: () => SdModal,
92
117
  SdNumberIcon: () => SdNumberIcon,
93
118
  SdPricingCard: () => SdPricingCard,
119
+ SdPricingCardDefault: () => SdPricingCardDefault,
120
+ SdPricingCardFeatured: () => SdPricingCardFeatured,
121
+ SdPricingCardGrid: () => SdPricingCardGrid,
94
122
  SdQuote: () => SdQuote,
123
+ SdQuoteCard: () => SdQuoteCard,
124
+ SdQuotePlain: () => SdQuotePlain,
95
125
  SdSkeleton: () => SdSkeleton,
96
126
  SdSkeletonAvatar: () => SdSkeletonAvatar,
97
127
  SdSkeletonCard: () => SdSkeletonCard,
@@ -100,23 +130,45 @@ __export(ui_exports, {
100
130
  SdSkeletonTitle: () => SdSkeletonTitle,
101
131
  SdSolution: () => SdSolution,
102
132
  SdSolutionCard: () => SdSolutionCard,
133
+ SdSolutionCardGrid: () => SdSolutionCardGrid,
134
+ SdSolutionCardItem: () => SdSolutionCardItem,
135
+ SdSolutionFiltered: () => SdSolutionFiltered,
136
+ SdSolutionList: () => SdSolutionList,
103
137
  SdSteps: () => SdSteps,
138
+ SdStepsBubble: () => SdStepsBubble,
139
+ SdStepsCard: () => SdStepsCard,
104
140
  SdStepsSection: () => SdStepsSection,
141
+ SdStepsStrip: () => SdStepsStrip,
105
142
  SdTable: () => SdTable,
143
+ SdTableSpec: () => SdTableSpec,
106
144
  SdTabs: () => SdTabs,
107
145
  SdTabsOutline: () => SdTabsOutline,
108
146
  SdTabsPills: () => SdTabsPills,
109
147
  SdTabsUnderline: () => SdTabsUnderline,
110
148
  SdTestimonial: () => SdTestimonial,
149
+ SdTestimonialCard: () => SdTestimonialCard,
150
+ SdTestimonialGrid: () => SdTestimonialGrid,
151
+ SdTestimonialStrip: () => SdTestimonialStrip,
111
152
  SdText: () => SdText,
153
+ SdTextBody: () => SdTextBody,
112
154
  SdTextBox: () => SdTextBox,
113
155
  SdTextBoxCard: () => SdTextBoxCard,
114
156
  SdTextBoxHero: () => SdTextBoxHero,
115
157
  SdTextBoxSection: () => SdTextBoxSection,
116
158
  SdTextBoxSub: () => SdTextBoxSub,
159
+ SdTextError: () => SdTextError,
160
+ SdTextEyebrow: () => SdTextEyebrow,
161
+ SdTextHint: () => SdTextHint,
162
+ SdTextNumeric: () => SdTextNumeric,
163
+ SdTextStrong: () => SdTextStrong,
164
+ SdTextSub: () => SdTextSub,
117
165
  SdTimeline: () => SdTimeline,
118
166
  SdTimelineSection: () => SdTimelineSection,
119
167
  SdTitle: () => SdTitle,
168
+ SdTitleCard: () => SdTitleCard,
169
+ SdTitleDisplay: () => SdTitleDisplay,
170
+ SdTitleSection: () => SdTitleSection,
171
+ SdTitleSub: () => SdTitleSub,
120
172
  theme: () => theme
121
173
  });
122
174
  module.exports = __toCommonJS(ui_exports);
@@ -204,7 +256,11 @@ var SdTabs = {
204
256
  flexWrap: "wrap",
205
257
  justifyContent: "center"
206
258
  },
207
- tab: { fontWeight: "500", fontSize: "var(--mantine-h5-font-size)", paddingInline: "var(--mantine-spacing-lg)" }
259
+ tab: {
260
+ fontWeight: "500",
261
+ fontSize: "var(--mantine-h5-font-size)",
262
+ paddingInline: "var(--mantine-spacing-lg)"
263
+ }
208
264
  }
209
265
  }),
210
266
  Underline: createTabs({
@@ -212,7 +268,11 @@ var SdTabs = {
212
268
  color: "primary",
213
269
  styles: {
214
270
  list: { width: "fit-content", margin: "0 auto", gap: "var(--mantine-spacing-sm)" },
215
- tab: { fontWeight: "500", fontSize: "var(--mantine-h5-font-size)", paddingInline: "var(--mantine-spacing-lg)" }
271
+ tab: {
272
+ fontWeight: "500",
273
+ fontSize: "var(--mantine-h5-font-size)",
274
+ paddingInline: "var(--mantine-spacing-lg)"
275
+ }
216
276
  }
217
277
  }),
218
278
  Outline: createTabs({
@@ -221,7 +281,11 @@ var SdTabs = {
221
281
  radius: "md",
222
282
  styles: {
223
283
  list: { width: "fit-content", margin: "0 auto", gap: "var(--mantine-spacing-sm)" },
224
- tab: { fontWeight: "500", fontSize: "var(--mantine-h5-font-size)", paddingInline: "var(--mantine-spacing-lg)" }
284
+ tab: {
285
+ fontWeight: "500",
286
+ fontSize: "var(--mantine-h5-font-size)",
287
+ paddingInline: "var(--mantine-spacing-lg)"
288
+ }
225
289
  }
226
290
  })
227
291
  };
@@ -257,6 +321,10 @@ var SdTitle = {
257
321
  /** 소제목 */
258
322
  Sub: createTitle({ order: 5 })
259
323
  };
324
+ var SdTitleDisplay = SdTitle.Display;
325
+ var SdTitleSection = SdTitle.Section;
326
+ var SdTitleCard = SdTitle.Card;
327
+ var SdTitleSub = SdTitle.Sub;
260
328
 
261
329
  // ui/atom/Text.tsx
262
330
  var import_core5 = require("@mantine/core");
@@ -272,20 +340,37 @@ var SdText = {
272
340
  Strong: createText({ fw: 700, c: "slate.9", fz: "md", style: { letterSpacing: "-0.04em" } }),
273
341
  Body: createText({ fw: 400, c: "slate.7", fz: "md", lh: 1.7 }),
274
342
  Sub: createText({ fw: 400, c: "slate.5", fz: "xs", lh: 1.6 }),
275
- Eyebrow: createText({ fw: 700, c: "primary.6", fz: "xs", style: { letterSpacing: "0.12em", textTransform: "uppercase" } }),
343
+ Eyebrow: createText({
344
+ fw: 700,
345
+ c: "primary.6",
346
+ fz: "xs",
347
+ style: { letterSpacing: "0.12em", textTransform: "uppercase" }
348
+ }),
276
349
  Error: createText({ fw: 400, c: "red.6", fz: "sm" }),
277
350
  Hint: createText({ fw: 400, c: "slate.4", fz: "xs", lh: 1.5 }),
278
- Numeric: createText({ fw: 700, c: "slate.8", fz: "md", style: { fontVariantNumeric: "tabular-nums", letterSpacing: "-0.02em" } })
351
+ Numeric: createText({
352
+ fw: 700,
353
+ c: "slate.8",
354
+ fz: "md",
355
+ style: { fontVariantNumeric: "tabular-nums", letterSpacing: "-0.02em" }
356
+ })
279
357
  };
358
+ var SdTextStrong = SdText.Strong;
359
+ var SdTextBody = SdText.Body;
360
+ var SdTextSub = SdText.Sub;
361
+ var SdTextEyebrow = SdText.Eyebrow;
362
+ var SdTextError = SdText.Error;
363
+ var SdTextHint = SdText.Hint;
364
+ var SdTextNumeric = SdText.Numeric;
280
365
 
281
366
  // ui/atom/Button.tsx
282
367
  var import_core6 = require("@mantine/core");
283
368
  var import_icons_react = require("@tabler/icons-react");
284
369
  var import_jsx_runtime6 = require("react/jsx-runtime");
285
- function createButton(defaults) {
370
+ function createButton(defaults, defaultLabel) {
286
371
  return function SdButton2(_a4) {
287
372
  var _b = _a4, { children } = _b, props = __objRest(_b, ["children"]);
288
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_core6.Button, __spreadProps(__spreadValues(__spreadValues({}, defaults), props), { children }));
373
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_core6.Button, __spreadProps(__spreadValues(__spreadValues({}, defaults), props), { children: children != null ? children : defaultLabel }));
289
374
  };
290
375
  }
291
376
  var SdButton = {
@@ -299,18 +384,37 @@ var SdButton = {
299
384
  Ghost: createButton({ variant: "subtle", color: "slate" }),
300
385
  /** 다크 배경 위 — white */
301
386
  White: createButton({ variant: "white" }),
302
- /** 삭제 filled red + 휴지통 아이콘 */
303
- Delete: createButton({ color: "red", leftSection: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_icons_react.IconTrash, { size: 16 }) }),
304
- /** 취소 outline slate + X 아이콘 */
305
- Cancel: createButton({ variant: "outline", color: "slate", leftSection: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_icons_react.IconX, { size: 16 }) })
387
+ // ── 표준 액션 버튼: 라벨·색·아이콘이 고정 (children으로 라벨 덮어쓰기 가능) ──
388
+ /** 전송 filled primary + 종이비행기 아이콘, 기본 라벨 "전송" */
389
+ Submit: createButton({ color: "primary", leftSection: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_icons_react.IconSend, { size: 16 }) }, "\uC804\uC1A1"),
390
+ /** 삭제 filled red + 휴지통 아이콘, 기본 라벨 "삭제" */
391
+ Delete: createButton({ color: "red", leftSection: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_icons_react.IconTrash, { size: 16 }) }, "\uC0AD\uC81C"),
392
+ /** 취소 — outline slate + X 아이콘, 기본 라벨 "취소" */
393
+ Cancel: createButton(
394
+ { variant: "outline", color: "slate", leftSection: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_icons_react.IconX, { size: 16 }) },
395
+ "\uCDE8\uC18C"
396
+ ),
397
+ /** 엑셀 — outline green + 스프레드시트 아이콘, 기본 라벨 "엑셀" */
398
+ Excel: createButton(
399
+ { variant: "outline", color: "green", leftSection: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_icons_react.IconFileSpreadsheet, { size: 16 }) },
400
+ "\uC5D1\uC140"
401
+ ),
402
+ /** 다운로드 — light primary + 다운로드 아이콘, 기본 라벨 "다운로드" */
403
+ Download: createButton(
404
+ { variant: "light", color: "primary", leftSection: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_icons_react.IconDownload, { size: 16 }) },
405
+ "\uB2E4\uC6B4\uB85C\uB4DC"
406
+ )
306
407
  };
307
408
  var SdButtonPrimary = SdButton.Primary;
308
409
  var SdButtonSecondary = SdButton.Secondary;
309
410
  var SdButtonOutline = SdButton.Outline;
310
411
  var SdButtonGhost = SdButton.Ghost;
311
412
  var SdButtonWhite = SdButton.White;
413
+ var SdButtonSubmit = SdButton.Submit;
312
414
  var SdButtonDelete = SdButton.Delete;
313
415
  var SdButtonCancel = SdButton.Cancel;
416
+ var SdButtonExcel = SdButton.Excel;
417
+ var SdButtonDownload = SdButton.Download;
314
418
 
315
419
  // ui/atom/Quote.tsx
316
420
  var import_core7 = require("@mantine/core");
@@ -339,6 +443,8 @@ var SdQuote = {
339
443
  Plain,
340
444
  Card: CardQuote
341
445
  };
446
+ var SdQuotePlain = SdQuote.Plain;
447
+ var SdQuoteCard = SdQuote.Card;
342
448
 
343
449
  // ui/atom/Table.tsx
344
450
  var import_core8 = require("@mantine/core");
@@ -386,6 +492,7 @@ var Spec = createTable(__spreadProps(__spreadValues({}, base), {
386
492
  Spec.Th = SpecTh;
387
493
  Spec.Td = SpecTd;
388
494
  var SdTable = Object.assign(createTable(base), { Spec });
495
+ var SdTableSpec = Spec;
389
496
 
390
497
  // ui/atom/Modal.tsx
391
498
  var import_core9 = require("@mantine/core");
@@ -409,7 +516,17 @@ var SdModal = createModal({
409
516
  var import_core10 = require("@mantine/core");
410
517
  var import_jsx_runtime10 = require("react/jsx-runtime");
411
518
  function SdNumberIcon(_a4) {
412
- var _b = _a4, { value, size = 48, radius = "xl", color = "primary" } = _b, props = __objRest(_b, ["value", "size", "radius", "color"]);
519
+ var _b = _a4, {
520
+ value,
521
+ size = 48,
522
+ radius = "xl",
523
+ color = "primary"
524
+ } = _b, props = __objRest(_b, [
525
+ "value",
526
+ "size",
527
+ "radius",
528
+ "color"
529
+ ]);
413
530
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_core10.ThemeIcon, __spreadProps(__spreadValues({ size, radius, color }, props), { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SdText.Strong, { c: "white", children: value }) }));
414
531
  }
415
532
 
@@ -432,6 +549,10 @@ var SdBadge = {
432
549
  /** 주의/경고 */
433
550
  Warning: createBadge({ variant: "light", color: "orange" })
434
551
  };
552
+ var SdBadgeDefault = SdBadge.Default;
553
+ var SdBadgePrimary = SdBadge.Primary;
554
+ var SdBadgeSuccess = SdBadge.Success;
555
+ var SdBadgeWarning = SdBadge.Warning;
435
556
 
436
557
  // ui/atom/Input.tsx
437
558
  var import_core12 = require("@mantine/core");
@@ -443,19 +564,19 @@ function createTextInput(defaults) {
443
564
  };
444
565
  }
445
566
  function createTextarea(defaults) {
446
- return function SdInputTextarea(_a4) {
567
+ return function SdInputTextarea2(_a4) {
447
568
  var props = __objRest(_a4, []);
448
569
  return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_core12.Textarea, __spreadValues(__spreadValues({}, defaults), props));
449
570
  };
450
571
  }
451
572
  function createPasswordInput(defaults) {
452
- return function SdInputPassword(_a4) {
573
+ return function SdInputPassword2(_a4) {
453
574
  var props = __objRest(_a4, []);
454
575
  return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_core12.PasswordInput, __spreadValues(__spreadValues({}, defaults), props));
455
576
  };
456
577
  }
457
578
  function createSelect(defaults) {
458
- return function SdInputSelect(_a4) {
579
+ return function SdInputSelect2(_a4) {
459
580
  var props = __objRest(_a4, []);
460
581
  return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_core12.Select, __spreadValues(__spreadValues({}, defaults), props));
461
582
  };
@@ -472,6 +593,11 @@ var SdInput = {
472
593
  /** 드롭다운 선택 */
473
594
  Select: createSelect({})
474
595
  };
596
+ var SdInputText = SdInput.Text;
597
+ var SdInputEmail = SdInput.Email;
598
+ var SdInputPassword = SdInput.Password;
599
+ var SdInputTextarea = SdInput.Textarea;
600
+ var SdInputSelect = SdInput.Select;
475
601
 
476
602
  // ui/atom/Skeleton.tsx
477
603
  var import_core13 = require("@mantine/core");
@@ -497,7 +623,11 @@ function SkeletonCard({ height, lines = 3 }) {
497
623
  import_core13.Box,
498
624
  {
499
625
  p: "md",
500
- style: { borderRadius: "var(--mantine-radius-md)", border: "1px solid var(--mantine-color-gray-3)", height },
626
+ style: {
627
+ borderRadius: "var(--mantine-radius-md)",
628
+ border: "1px solid var(--mantine-color-gray-3)",
629
+ height
630
+ },
501
631
  children: /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_core13.Stack, { gap: "sm", children: [
502
632
  /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_core13.Skeleton, { height: 20, width: "50%", radius: "sm" }),
503
633
  Array.from({ length: lines }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
@@ -526,9 +656,60 @@ var SdSkeletonTitle = SkeletonTitle;
526
656
  var SdSkeletonImage = SkeletonImage;
527
657
  var SdSkeletonAvatar = SkeletonAvatar;
528
658
 
529
- // ui/molecule/TextBox.tsx
659
+ // ui/atom/Link.tsx
530
660
  var import_core14 = require("@mantine/core");
661
+
662
+ // util/style.util.ts
663
+ function toCssColor(value) {
664
+ if (typeof value !== "string") return "";
665
+ return value.includes(".") ? `var(--mantine-color-${value.replace(".", "-")})` : value;
666
+ }
667
+
668
+ // ui/atom/Link.tsx
531
669
  var import_jsx_runtime14 = require("react/jsx-runtime");
670
+ var HOVER_COLOR = "var(--mantine-color-primary-6)";
671
+ function createLink(defaults) {
672
+ return function SdLink2(_a4) {
673
+ var _b = _a4, { children, onMouseEnter, onMouseLeave } = _b, props = __objRest(_b, ["children", "onMouseEnter", "onMouseLeave"]);
674
+ var _a5;
675
+ const baseColor = toCssColor((_a5 = props.c) != null ? _a5 : defaults.c);
676
+ const handleEnter = (e) => {
677
+ e.currentTarget.style.color = HOVER_COLOR;
678
+ onMouseEnter == null ? void 0 : onMouseEnter(e);
679
+ };
680
+ const handleLeave = (e) => {
681
+ e.currentTarget.style.color = baseColor;
682
+ onMouseLeave == null ? void 0 : onMouseLeave(e);
683
+ };
684
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
685
+ import_core14.Anchor,
686
+ __spreadProps(__spreadValues(__spreadValues({}, defaults), props), {
687
+ style: { transition: "color 0.15s" },
688
+ onMouseEnter: handleEnter,
689
+ onMouseLeave: handleLeave,
690
+ children
691
+ })
692
+ );
693
+ };
694
+ }
695
+ var SdLink = {
696
+ /** 최상위 강조 — 눈에 띄어야 하는 단일 링크 */
697
+ Strong: createLink({ fw: 700, c: "primary.6", fz: "xs", underline: "never" }),
698
+ /** 기본 — 본문·네비게이션 수준의 일반 링크 */
699
+ Body: createLink({ fw: 500, c: "slate.7", fz: 15, underline: "never" }),
700
+ /** 보조 — 연락처·정책 등 부가 정보 */
701
+ Sub: createLink({ fw: 400, c: "slate.5", fz: "xs", underline: "never" }),
702
+ /** 최소 강조 — 링크 목록처럼 밀도가 높고 톤을 낮춰야 하는 곳 */
703
+ Hint: createLink({ fw: 400, c: "slate.4", fz: "xs", underline: "never" })
704
+ };
705
+ var SdLinkStrong = SdLink.Strong;
706
+ var SdLinkBody = SdLink.Body;
707
+ var SdLinkSub = SdLink.Sub;
708
+ var SdLinkHint = SdLink.Hint;
709
+
710
+ // ui/molecule/TextBox.tsx
711
+ var import_core15 = require("@mantine/core");
712
+ var import_jsx_runtime15 = require("react/jsx-runtime");
532
713
  function createTextBox(titleVariant, defaultGap = "xs", descVariant = "Body", color_ = void 0) {
533
714
  return function SdTextBox2(_a4) {
534
715
  var _b = _a4, {
@@ -552,10 +733,10 @@ function createTextBox(titleVariant, defaultGap = "xs", descVariant = "Body", co
552
733
  const variant = variantOverride != null ? variantOverride : titleVariant;
553
734
  const TitleComponent = SdTitle[variant];
554
735
  const DescComponent = SdText[descVariant];
555
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_core14.Stack, __spreadProps(__spreadValues({ gap: defaultGap }, stackProps), { children: [
556
- label && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(SdText.Eyebrow, { children: label }),
557
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(TitleComponent, { c: colorRes, children: title }),
558
- description && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(DescComponent, { c: colorRes, maw: maxDescWidth, mt: 4, children: description }),
736
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core15.Stack, __spreadProps(__spreadValues({ gap: defaultGap }, stackProps), { children: [
737
+ label && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(SdText.Eyebrow, { children: label }),
738
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(TitleComponent, { c: colorRes, children: title }),
739
+ description && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(DescComponent, { c: colorRes, maw: maxDescWidth, mt: 4, children: description }),
559
740
  children
560
741
  ] }));
561
742
  };
@@ -572,7 +753,7 @@ var SdTextBoxCard = SdTextBox.Card;
572
753
  var SdTextBoxSub = SdTextBox.Sub;
573
754
 
574
755
  // ui/molecule/Features.tsx
575
- var import_core15 = require("@mantine/core");
756
+ var import_core16 = require("@mantine/core");
576
757
 
577
758
  // util/sort.util.ts
578
759
  function filterAndSort(items) {
@@ -580,78 +761,84 @@ function filterAndSort(items) {
580
761
  }
581
762
 
582
763
  // ui/molecule/Features.tsx
583
- var import_jsx_runtime15 = require("react/jsx-runtime");
764
+ var import_jsx_runtime16 = require("react/jsx-runtime");
584
765
  function SdFeatures({ items, cols = { base: 1, sm: 2, md: 3 } }) {
585
766
  const visible = filterAndSort(items);
586
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core15.SimpleGrid, { cols, spacing: "xl", children: visible.map((item) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
587
- import_core15.Card,
588
- {
589
- children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core15.Stack, { gap: "sm", children: [
590
- item.icon,
591
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
592
- SdTextBox.Card,
593
- {
594
- label: item.label,
595
- title: item.title,
596
- description: item.description
597
- }
598
- )
599
- ] }, item.id)
600
- },
601
- item.id
602
- )) });
767
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core16.SimpleGrid, { cols, spacing: "xl", children: visible.map((item) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core16.Card, { children: /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_core16.Stack, { gap: "sm", children: [
768
+ item.icon,
769
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(SdTextBox.Card, { label: item.label, title: item.title, description: item.description })
770
+ ] }, item.id) }, item.id)) });
603
771
  }
604
772
 
605
773
  // ui/molecule/Timeline.tsx
606
- var import_core16 = require("@mantine/core");
607
- var import_jsx_runtime16 = require("react/jsx-runtime");
774
+ var import_core17 = require("@mantine/core");
775
+ var import_jsx_runtime17 = require("react/jsx-runtime");
608
776
  function SdTimeline({ items }) {
609
777
  const grouped = items.filter((item) => item.isShow).sort((a, b) => b.year - a.year || b.month - a.month).reduce((acc, item) => {
610
778
  var _a4, _b;
779
+ ;
611
780
  ((_b = acc[_a4 = item.year]) != null ? _b : acc[_a4] = []).push(item);
612
781
  return acc;
613
782
  }, {});
614
783
  const years = Object.keys(grouped).map(Number).sort((a, b) => b - a);
615
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core16.Timeline, { active: items.length, bulletSize: 24, lineWidth: 2, children: years.map((year) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
616
- import_core16.Timeline.Item,
617
- {
618
- title: /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(SdTitle.Sub, { children: [
619
- year,
620
- "\uB144"
621
- ] }),
622
- children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core16.Stack, { gap: 6, mt: "xs", children: grouped[year].map((event) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_core16.Group, { gap: "md", align: "center", wrap: "nowrap", children: [
623
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(SdText.Eyebrow, { miw: 28, children: [
624
- event.month,
625
- "\uC6D4"
626
- ] }),
627
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(SdText.Sub, { style: { flex: 1 }, children: event.description })
628
- ] }, event.id)) })
629
- },
630
- year
631
- )) });
784
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core17.Timeline, { active: items.length, bulletSize: 24, lineWidth: 2, children: years.map((year) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core17.Timeline.Item, { title: /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(SdTitle.Sub, { children: [
785
+ year,
786
+ "\uB144"
787
+ ] }), children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core17.Stack, { gap: 6, mt: "xs", children: grouped[year].map((event) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_core17.Group, { gap: "md", align: "center", wrap: "nowrap", children: [
788
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(SdText.Eyebrow, { miw: 28, children: [
789
+ event.month,
790
+ "\uC6D4"
791
+ ] }),
792
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(SdText.Sub, { style: { flex: 1 }, children: event.description })
793
+ ] }, event.id)) }) }, year)) });
632
794
  }
633
795
 
634
796
  // ui/molecule/Steps.tsx
635
- var import_core17 = require("@mantine/core");
797
+ var import_core18 = require("@mantine/core");
636
798
  var import_icons_react2 = require("@tabler/icons-react");
637
- var import_jsx_runtime17 = require("react/jsx-runtime");
638
799
  var import_jsx_runtime18 = require("react/jsx-runtime");
800
+ var import_jsx_runtime19 = require("react/jsx-runtime");
639
801
  function BubbleStep({ item, index, isLast }) {
640
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.Group, { align: "flex-start", gap: "lg", wrap: "nowrap", children: [
641
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.Box, { style: { display: "flex", flexDirection: "column", alignItems: "center", flexShrink: 0 }, children: [
642
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SdNumberIcon, { value: String(index + 1).padStart(2, "0") }),
643
- !isLast && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Box, { style: { width: 2, flex: 1, minHeight: 32, marginTop: 8, background: "var(--mantine-color-primary-2)" } })
644
- ] }),
645
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SdTextBox.Card, { title: item.title, description: item.description, pb: !isLast ? "xl" : 0, pt: 4 })
802
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Group, { align: "flex-start", gap: "lg", wrap: "nowrap", children: [
803
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
804
+ import_core18.Box,
805
+ {
806
+ style: { display: "flex", flexDirection: "column", alignItems: "center", flexShrink: 0 },
807
+ children: [
808
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SdNumberIcon, { value: String(index + 1).padStart(2, "0") }),
809
+ !isLast && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
810
+ import_core18.Box,
811
+ {
812
+ style: {
813
+ width: 2,
814
+ flex: 1,
815
+ minHeight: 32,
816
+ marginTop: 8,
817
+ background: "var(--mantine-color-primary-2)"
818
+ }
819
+ }
820
+ )
821
+ ]
822
+ }
823
+ ),
824
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
825
+ SdTextBox.Card,
826
+ {
827
+ title: item.title,
828
+ description: item.description,
829
+ pb: !isLast ? "xl" : 0,
830
+ pt: 4
831
+ }
832
+ )
646
833
  ] });
647
834
  }
648
835
  function Bubble({ items }) {
649
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Box, { children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(BubbleStep, { item, index: i, isLast: i === items.length - 1 }, i)) });
836
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Box, { children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(BubbleStep, { item, index: i, isLast: i === items.length - 1 }, i)) });
650
837
  }
651
838
  function CardStep({ item, index }) {
652
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.Card, { withBorder: true, radius: "md", p: 0, style: { height: "100%", overflow: "hidden" }, children: [
653
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
654
- import_core17.Box,
839
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Card, { withBorder: true, radius: "md", p: 0, style: { height: "100%", overflow: "hidden" }, children: [
840
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
841
+ import_core18.Box,
655
842
  {
656
843
  py: "lg",
657
844
  style: {
@@ -659,54 +846,57 @@ function CardStep({ item, index }) {
659
846
  justifyContent: "center",
660
847
  background: "var(--mantine-color-primary-0)"
661
848
  },
662
- children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(SdText.Eyebrow, { children: [
849
+ children: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(SdText.Eyebrow, { children: [
663
850
  "STEP ",
664
851
  String(index + 1).padStart(2, "0")
665
852
  ] })
666
853
  }
667
854
  ),
668
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Box, { p: "lg", style: { textAlign: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SdTextBox.Card, { title: item.title, description: item.description }) })
855
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Box, { p: "lg", style: { textAlign: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SdTextBox.Card, { title: item.title, description: item.description }) })
669
856
  ] });
670
857
  }
671
858
  function CardArrow({ direction }) {
672
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.ThemeIcon, { size: 36, radius: "xl", variant: "light", color: "primary", children: direction === "right" ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_icons_react2.IconArrowRight, { size: 20, stroke: 2.5 }) : /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_icons_react2.IconArrowDown, { size: 20, stroke: 2.5 }) });
859
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.ThemeIcon, { size: 36, radius: "xl", variant: "light", color: "primary", children: direction === "right" ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_icons_react2.IconArrowRight, { size: 20, stroke: 2.5 }) : /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_icons_react2.IconArrowDown, { size: 20, stroke: 2.5 }) });
673
860
  }
674
861
  function CardVariant({ items }) {
675
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_jsx_runtime18.Fragment, { children: [
676
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Stack, { gap: "sm", hiddenFrom: "sm", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_jsx_runtime17.Fragment, { children: [
677
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(CardStep, { item, index: i }),
678
- i < items.length - 1 && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Box, { style: { display: "flex", justifyContent: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(CardArrow, { direction: "down" }) })
862
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_jsx_runtime19.Fragment, { children: [
863
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Stack, { gap: "sm", hiddenFrom: "sm", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_jsx_runtime18.Fragment, { children: [
864
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(CardStep, { item, index: i }),
865
+ i < items.length - 1 && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Box, { style: { display: "flex", justifyContent: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(CardArrow, { direction: "down" }) })
679
866
  ] }, i)) }),
680
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Group, { wrap: "nowrap", align: "stretch", gap: 0, visibleFrom: "sm", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_jsx_runtime17.Fragment, { children: [
681
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Box, { style: { flex: 1, minWidth: 0 }, children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(CardStep, { item, index: i }) }),
682
- i < items.length - 1 && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Box, { style: { display: "flex", alignItems: "center", padding: "0 8px" }, children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(CardArrow, { direction: "right" }) })
867
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Group, { wrap: "nowrap", align: "stretch", gap: 0, visibleFrom: "sm", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_jsx_runtime18.Fragment, { children: [
868
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Box, { style: { flex: 1, minWidth: 0 }, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(CardStep, { item, index: i }) }),
869
+ i < items.length - 1 && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Box, { style: { display: "flex", alignItems: "center", padding: "0 8px" }, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(CardArrow, { direction: "right" }) })
683
870
  ] }, i)) })
684
871
  ] });
685
872
  }
686
873
  function StripStep({ item, index }) {
687
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Box, { pl: "md", style: { borderLeft: "3px solid var(--mantine-color-primary-6)" }, children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.Stack, { gap: 4, children: [
688
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(SdText.Eyebrow, { children: [
874
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Box, { pl: "md", style: { borderLeft: "3px solid var(--mantine-color-primary-6)" }, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Stack, { gap: 4, children: [
875
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(SdText.Eyebrow, { children: [
689
876
  "STEP ",
690
877
  String(index + 1).padStart(2, "0")
691
878
  ] }),
692
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SdTextBox.Card, { title: item.title, description: item.description })
879
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SdTextBox.Card, { title: item.title, description: item.description })
693
880
  ] }) });
694
881
  }
695
882
  function Strip({ items }) {
696
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Stack, { gap: "xl", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(StripStep, { item, index: i }, i)) });
883
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Stack, { gap: "xl", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(StripStep, { item, index: i }, i)) });
697
884
  }
698
885
  var SdSteps = { Bubble, Card: CardVariant, Strip };
886
+ var SdStepsBubble = SdSteps.Bubble;
887
+ var SdStepsCard = SdSteps.Card;
888
+ var SdStepsStrip = SdSteps.Strip;
699
889
 
700
890
  // ui/molecule/Testimonial.tsx
701
- var import_core18 = require("@mantine/core");
702
- var import_jsx_runtime19 = require("react/jsx-runtime");
891
+ var import_core19 = require("@mantine/core");
892
+ var import_jsx_runtime20 = require("react/jsx-runtime");
703
893
  function AuthorRow({ item }) {
704
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Group, { gap: "sm", wrap: "nowrap", children: [
705
- item.avatar && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Avatar, { src: item.avatar, size: "md", radius: "xl" }),
706
- !item.avatar && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Avatar, { size: "md", radius: "xl", color: "primary", children: item.name.charAt(0) }),
707
- /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Stack, { gap: 0, children: [
708
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SdText.Strong, { fz: "sm", children: item.name }),
709
- /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(SdText.Sub, { children: [
894
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Group, { gap: "sm", wrap: "nowrap", children: [
895
+ item.avatar && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Avatar, { src: item.avatar, size: "md", radius: "xl" }),
896
+ !item.avatar && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Avatar, { size: "md", radius: "xl", color: "primary", children: item.name.charAt(0) }),
897
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Stack, { gap: 0, children: [
898
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdText.Strong, { fz: "sm", children: item.name }),
899
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(SdText.Sub, { children: [
710
900
  item.role,
711
901
  item.company ? ` \xB7 ${item.company}` : ""
712
902
  ] })
@@ -715,28 +905,28 @@ function AuthorRow({ item }) {
715
905
  }
716
906
  function CardTestimonial(_a4) {
717
907
  var _b = _a4, { item } = _b, boxProps = __objRest(_b, ["item"]);
718
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Card, __spreadProps(__spreadValues({ h: "100%" }, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Stack, { gap: "md", h: "100%", children: [
719
- item.rating && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Rating, { value: item.rating, readOnly: true, size: "sm", color: "primary" }),
720
- /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Stack, { gap: "xs", style: { flex: 1 }, children: [
721
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SdTitle.Display, { c: "primary.6", lh: 0.8, "aria-hidden": true, children: "\u201C" }),
722
- item.lines.map((line, i) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SdText.Body, { children: line }, i))
908
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Card, __spreadProps(__spreadValues({ h: "100%" }, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Stack, { gap: "md", h: "100%", children: [
909
+ item.rating && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Rating, { value: item.rating, readOnly: true, size: "sm", color: "primary" }),
910
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Stack, { gap: "xs", style: { flex: 1 }, children: [
911
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdTitle.Display, { c: "primary.6", lh: 0.8, "aria-hidden": true, children: "\u201C" }),
912
+ item.lines.map((line, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdText.Body, { children: line }, i))
723
913
  ] }),
724
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(AuthorRow, { item })
914
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(AuthorRow, { item })
725
915
  ] }) }));
726
916
  }
727
917
  function Strip2(_a4) {
728
918
  var _b = _a4, { item } = _b, boxProps = __objRest(_b, ["item"]);
729
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Box, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Stack, { gap: "md", children: [
730
- item.rating && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Rating, { value: item.rating, readOnly: true, size: "sm", color: "primary" }),
731
- /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Group, { gap: 4, align: "flex-start", children: [
732
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SdTitle.Display, { c: "primary.6", lh: 0.8, "aria-hidden": true, children: "\u201C" }),
733
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Stack, { gap: "xs", style: { flex: 1 }, children: item.lines.map((line, i) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SdText.Body, { children: line }, i)) })
919
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Box, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Stack, { gap: "md", children: [
920
+ item.rating && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Rating, { value: item.rating, readOnly: true, size: "sm", color: "primary" }),
921
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Group, { gap: 4, align: "flex-start", children: [
922
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdTitle.Display, { c: "primary.6", lh: 0.8, "aria-hidden": true, children: "\u201C" }),
923
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Stack, { gap: "xs", style: { flex: 1 }, children: item.lines.map((line, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdText.Body, { children: line }, i)) })
734
924
  ] }),
735
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(AuthorRow, { item })
925
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(AuthorRow, { item })
736
926
  ] }) }));
737
927
  }
738
928
  function Grid({ items, cols = { base: 1, sm: 2, md: 3 } }) {
739
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.SimpleGrid, { cols, spacing: "xl", style: { alignItems: "stretch" }, children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(CardTestimonial, { item }, i)) });
929
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.SimpleGrid, { cols, spacing: "xl", style: { alignItems: "stretch" }, children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(CardTestimonial, { item }, i)) });
740
930
  }
741
931
  var SdTestimonial = {
742
932
  /** 카드형 — 그리드 배치용 */
@@ -746,114 +936,87 @@ var SdTestimonial = {
746
936
  /** 카드 그리드 — 여러 후기 목록 */
747
937
  Grid
748
938
  };
939
+ var SdTestimonialCard = SdTestimonial.Card;
940
+ var SdTestimonialStrip = SdTestimonial.Strip;
941
+ var SdTestimonialGrid = SdTestimonial.Grid;
749
942
 
750
943
  // ui/molecule/PricingCard.tsx
751
- var import_core19 = require("@mantine/core");
944
+ var import_core20 = require("@mantine/core");
752
945
  var import_icons_react3 = require("@tabler/icons-react");
753
- var import_jsx_runtime20 = require("react/jsx-runtime");
946
+ var import_jsx_runtime21 = require("react/jsx-runtime");
754
947
  function Default(_a4) {
755
948
  var _b = _a4, { item, onSelect } = _b, cardProps = __objRest(_b, ["item", "onSelect"]);
756
949
  var _a5;
757
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
758
- import_core19.Card,
759
- __spreadProps(__spreadValues({
760
- withBorder: true,
761
- style: { position: "relative" }
762
- }, cardProps), {
763
- children: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Stack, { gap: "xl", children: [
764
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Stack, { gap: "xs", children: [
765
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Group, { justify: "space-between", align: "flex-start", children: [
766
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdTitle.Card, { children: item.name }),
767
- item.isPopular && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdBadge.Primary, { children: "\uCD94\uCC9C" })
768
- ] }),
769
- item.description && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdText.Sub, { children: item.description })
770
- ] }),
771
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Group, { gap: 4, align: "baseline", children: [
772
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdTitle.Display, { children: item.price }),
773
- item.period && /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(SdText.Sub, { children: [
774
- "/ ",
775
- item.period
776
- ] })
777
- ] }),
778
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Divider, {}),
779
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Stack, { gap: "sm", children: item.features.map((f, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Group, { gap: "sm", wrap: "nowrap", children: [
780
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
781
- import_core19.ThemeIcon,
782
- {
783
- size: "xs",
784
- radius: "xl",
785
- color: f.included ? "primary" : "slate",
786
- variant: f.included ? "filled" : "subtle",
787
- children: f.included ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_icons_react3.IconCheck, { size: 12 }) : /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_icons_react3.IconX, { size: 12 })
788
- }
789
- ),
790
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
791
- SdText.Body,
792
- {
793
- fz: "sm",
794
- c: f.included ? "slate.7" : "slate.4",
795
- children: f.text
796
- }
797
- )
798
- ] }, i)) }),
799
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdButton.Outline, { fullWidth: true, onClick: () => onSelect == null ? void 0 : onSelect(item), children: (_a5 = item.ctaLabel) != null ? _a5 : "\uC2DC\uC791\uD558\uAE30" })
950
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Card, __spreadProps(__spreadValues({ withBorder: true, style: { position: "relative" } }, cardProps), { children: /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Stack, { gap: "xl", children: [
951
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Stack, { gap: "xs", children: [
952
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Group, { justify: "space-between", align: "flex-start", children: [
953
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdTitle.Card, { children: item.name }),
954
+ item.isPopular && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdBadge.Primary, { children: "\uCD94\uCC9C" })
955
+ ] }),
956
+ item.description && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdText.Sub, { children: item.description })
957
+ ] }),
958
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Group, { gap: 4, align: "baseline", children: [
959
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdTitle.Display, { children: item.price }),
960
+ item.period && /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(SdText.Sub, { children: [
961
+ "/ ",
962
+ item.period
800
963
  ] })
801
- })
802
- );
964
+ ] }),
965
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Divider, {}),
966
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Stack, { gap: "sm", children: item.features.map((f, i) => /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Group, { gap: "sm", wrap: "nowrap", children: [
967
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
968
+ import_core20.ThemeIcon,
969
+ {
970
+ size: "xs",
971
+ radius: "xl",
972
+ color: f.included ? "primary" : "slate",
973
+ variant: f.included ? "filled" : "subtle",
974
+ children: f.included ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_icons_react3.IconCheck, { size: 12 }) : /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_icons_react3.IconX, { size: 12 })
975
+ }
976
+ ),
977
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdText.Body, { fz: "sm", c: f.included ? "slate.7" : "slate.4", children: f.text })
978
+ ] }, i)) }),
979
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdButton.Outline, { fullWidth: true, onClick: () => onSelect == null ? void 0 : onSelect(item), children: (_a5 = item.ctaLabel) != null ? _a5 : "\uC2DC\uC791\uD558\uAE30" })
980
+ ] }) }));
803
981
  }
804
982
  function Featured(_a4) {
805
983
  var _b = _a4, { item, onSelect } = _b, cardProps = __objRest(_b, ["item", "onSelect"]);
806
984
  var _a5;
807
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
808
- import_core19.Card,
809
- __spreadProps(__spreadValues({
810
- bg: "primary.6",
811
- style: { position: "relative" }
812
- }, cardProps), {
813
- children: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Stack, { gap: "xl", children: [
814
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Stack, { gap: "xs", children: [
815
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Group, { justify: "space-between", align: "flex-start", children: [
816
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdTitle.Card, { c: "white", children: item.name }),
817
- item.isPopular && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdBadge.Default, { c: "white", style: { borderColor: "rgba(255,255,255,0.5)" }, children: "\uCD94\uCC9C" })
818
- ] }),
819
- item.description && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdText.Body, { c: "primary.1", children: item.description })
820
- ] }),
821
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Group, { gap: 4, align: "baseline", children: [
822
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdTitle.Display, { c: "white", children: item.price }),
823
- item.period && /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(SdText.Body, { c: "primary.2", children: [
824
- "/ ",
825
- item.period
826
- ] })
827
- ] }),
828
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Divider, { color: "primary.4" }),
829
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Stack, { gap: "sm", children: item.features.map((f, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Group, { gap: "sm", wrap: "nowrap", children: [
830
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
831
- import_core19.ThemeIcon,
832
- {
833
- size: "xs",
834
- radius: "xl",
835
- color: "white",
836
- variant: f.included ? "filled" : "subtle",
837
- children: f.included ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_icons_react3.IconCheck, { size: 12, color: "var(--mantine-color-primary-6)" }) : /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_icons_react3.IconX, { size: 12, color: "rgba(255,255,255,0.4)" })
838
- }
839
- ),
840
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
841
- SdText.Body,
842
- {
843
- fz: "sm",
844
- c: f.included ? "white" : "primary.3",
845
- children: f.text
846
- }
847
- )
848
- ] }, i)) }),
849
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdButton.White, { fullWidth: true, onClick: () => onSelect == null ? void 0 : onSelect(item), children: (_a5 = item.ctaLabel) != null ? _a5 : "\uC2DC\uC791\uD558\uAE30" })
985
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Card, __spreadProps(__spreadValues({ bg: "primary.6", style: { position: "relative" } }, cardProps), { children: /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Stack, { gap: "xl", children: [
986
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Stack, { gap: "xs", children: [
987
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Group, { justify: "space-between", align: "flex-start", children: [
988
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdTitle.Card, { c: "white", children: item.name }),
989
+ item.isPopular && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdBadge.Default, { c: "white", style: { borderColor: "rgba(255,255,255,0.5)" }, children: "\uCD94\uCC9C" })
990
+ ] }),
991
+ item.description && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdText.Body, { c: "primary.1", children: item.description })
992
+ ] }),
993
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Group, { gap: 4, align: "baseline", children: [
994
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdTitle.Display, { c: "white", children: item.price }),
995
+ item.period && /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(SdText.Body, { c: "primary.2", children: [
996
+ "/ ",
997
+ item.period
850
998
  ] })
851
- })
852
- );
999
+ ] }),
1000
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Divider, { color: "primary.4" }),
1001
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Stack, { gap: "sm", children: item.features.map((f, i) => /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Group, { gap: "sm", wrap: "nowrap", children: [
1002
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
1003
+ import_core20.ThemeIcon,
1004
+ {
1005
+ size: "xs",
1006
+ radius: "xl",
1007
+ color: "white",
1008
+ variant: f.included ? "filled" : "subtle",
1009
+ children: f.included ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_icons_react3.IconCheck, { size: 12, color: "var(--mantine-color-primary-6)" }) : /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_icons_react3.IconX, { size: 12, color: "rgba(255,255,255,0.4)" })
1010
+ }
1011
+ ),
1012
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdText.Body, { fz: "sm", c: f.included ? "white" : "primary.3", children: f.text })
1013
+ ] }, i)) }),
1014
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdButton.White, { fullWidth: true, onClick: () => onSelect == null ? void 0 : onSelect(item), children: (_a5 = item.ctaLabel) != null ? _a5 : "\uC2DC\uC791\uD558\uAE30" })
1015
+ ] }) }));
853
1016
  }
854
1017
  function Grid2({ items, cols = { base: 1, sm: 2, md: 3 }, onSelect }) {
855
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.SimpleGrid, { cols, spacing: "xl", style: { alignItems: "stretch" }, children: items.map(
856
- (item, i) => item.isPopular ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Featured, { item, onSelect }, i) : /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Default, { item, onSelect }, i)
1018
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.SimpleGrid, { cols, spacing: "xl", style: { alignItems: "stretch" }, children: items.map(
1019
+ (item, i) => item.isPopular ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(Featured, { item, onSelect }, i) : /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(Default, { item, onSelect }, i)
857
1020
  ) });
858
1021
  }
859
1022
  var SdPricingCard = {
@@ -864,33 +1027,36 @@ var SdPricingCard = {
864
1027
  /** 가격 그리드 (isPopular 항목은 자동으로 Featured 처리) */
865
1028
  Grid: Grid2
866
1029
  };
1030
+ var SdPricingCardDefault = SdPricingCard.Default;
1031
+ var SdPricingCardFeatured = SdPricingCard.Featured;
1032
+ var SdPricingCardGrid = SdPricingCard.Grid;
867
1033
 
868
1034
  // ui/molecule/Faq.tsx
869
- var import_core20 = require("@mantine/core");
870
- var import_jsx_runtime21 = require("react/jsx-runtime");
1035
+ var import_core21 = require("@mantine/core");
1036
+ var import_jsx_runtime22 = require("react/jsx-runtime");
871
1037
  function Default2(_a4) {
872
1038
  var _b = _a4, { items } = _b, boxProps = __objRest(_b, ["items"]);
873
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Box, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Accordion, { variant: "separated", radius: "md", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Accordion.Item, { value: String(i), children: [
874
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Accordion.Control, { children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdText.Strong, { fz: "sm", children: item.question }) }),
875
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Accordion.Panel, { children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdText.Body, { fz: "sm", children: item.answer }) })
1039
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Box, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Accordion, { variant: "separated", radius: "md", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Accordion.Item, { value: String(i), children: [
1040
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Accordion.Control, { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdText.Strong, { fz: "sm", children: item.question }) }),
1041
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Accordion.Panel, { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdText.Body, { fz: "sm", children: item.answer }) })
876
1042
  ] }, i)) }) }));
877
1043
  }
878
1044
  function Filled(_a4) {
879
1045
  var _b = _a4, { items } = _b, boxProps = __objRest(_b, ["items"]);
880
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Box, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Accordion, { variant: "filled", radius: "md", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Accordion.Item, { value: String(i), children: [
881
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Accordion.Control, { children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdText.Strong, { fz: "sm", children: item.question }) }),
882
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Accordion.Panel, { children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdText.Body, { fz: "sm", children: item.answer }) })
1046
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Box, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Accordion, { variant: "filled", radius: "md", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Accordion.Item, { value: String(i), children: [
1047
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Accordion.Control, { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdText.Strong, { fz: "sm", children: item.question }) }),
1048
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Accordion.Panel, { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdText.Body, { fz: "sm", children: item.answer }) })
883
1049
  ] }, i)) }) }));
884
1050
  }
885
1051
  function WithHeader(_a4) {
886
1052
  var _b = _a4, { label, title, description, items } = _b, boxProps = __objRest(_b, ["label", "title", "description", "items"]);
887
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Stack, __spreadProps(__spreadValues({ gap: "xl" }, boxProps), { children: [
888
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Stack, { gap: "xs", children: [
889
- label && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdText.Eyebrow, { children: label }),
890
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdTitle.Section, { children: title }),
891
- description && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdText.Body, { children: description })
1053
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Stack, __spreadProps(__spreadValues({ gap: "xl" }, boxProps), { children: [
1054
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Stack, { gap: "xs", children: [
1055
+ label && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdText.Eyebrow, { children: label }),
1056
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdTitle.Section, { children: title }),
1057
+ description && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdText.Body, { children: description })
892
1058
  ] }),
893
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(Default2, { items })
1059
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Default2, { items })
894
1060
  ] }));
895
1061
  }
896
1062
  var SdFaq = {
@@ -901,10 +1067,13 @@ var SdFaq = {
901
1067
  /** 헤더 + 아코디언 조합 */
902
1068
  WithHeader
903
1069
  };
1070
+ var SdFaqDefault = SdFaq.Default;
1071
+ var SdFaqFilled = SdFaq.Filled;
1072
+ var SdFaqWithHeader = SdFaq.WithHeader;
904
1073
 
905
1074
  // ui/molecule/Cta.tsx
906
- var import_core21 = require("@mantine/core");
907
- var import_jsx_runtime22 = require("react/jsx-runtime");
1075
+ var import_core22 = require("@mantine/core");
1076
+ var import_jsx_runtime23 = require("react/jsx-runtime");
908
1077
  function Banner(_a4) {
909
1078
  var _b = _a4, {
910
1079
  label,
@@ -923,34 +1092,17 @@ function Banner(_a4) {
923
1092
  "onPrimary",
924
1093
  "onSecondary"
925
1094
  ]);
926
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
927
- import_core21.Box,
928
- __spreadProps(__spreadValues({
929
- bg: "primary.7",
930
- py: { base: "xl", md: 80 },
931
- px: { base: "md", md: "xl" }
932
- }, boxProps), {
933
- children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Stack, { gap: "xl", align: "center", maw: 600, children: [
934
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Stack, { gap: "sm", align: "center", children: [
935
- label && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdText.Eyebrow, { c: "primary.3", children: label }),
936
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdTitle.Section, { c: "white", ta: "center", children: title }),
937
- description && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdText.Body, { c: "primary.2", ta: "center", children: description })
938
- ] }),
939
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Group, { gap: "sm", children: [
940
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdButton.White, { size: "md", onClick: onPrimary, children: primaryLabel }),
941
- secondaryLabel && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
942
- SdButton.Ghost,
943
- {
944
- size: "md",
945
- c: "primary.2",
946
- onClick: onSecondary,
947
- children: secondaryLabel
948
- }
949
- )
950
- ] })
951
- ] }) })
952
- })
953
- );
1095
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.Box, __spreadProps(__spreadValues({ bg: "primary.7", py: { base: "xl", md: 80 }, px: { base: "md", md: "xl" } }, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Stack, { gap: "xl", align: "center", maw: 600, children: [
1096
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Stack, { gap: "sm", align: "center", children: [
1097
+ label && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdText.Eyebrow, { c: "primary.3", children: label }),
1098
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdTitle.Section, { c: "white", ta: "center", children: title }),
1099
+ description && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdText.Body, { c: "primary.2", ta: "center", children: description })
1100
+ ] }),
1101
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Group, { gap: "sm", children: [
1102
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdButton.White, { size: "md", onClick: onPrimary, children: primaryLabel }),
1103
+ secondaryLabel && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdButton.Ghost, { size: "md", c: "primary.2", onClick: onSecondary, children: secondaryLabel })
1104
+ ] })
1105
+ ] }) }) }));
954
1106
  }
955
1107
  function Subtle(_a4) {
956
1108
  var _b = _a4, {
@@ -970,23 +1122,23 @@ function Subtle(_a4) {
970
1122
  "onPrimary",
971
1123
  "onSecondary"
972
1124
  ]);
973
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
974
- import_core21.Box,
1125
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
1126
+ import_core22.Box,
975
1127
  __spreadProps(__spreadValues({
976
1128
  bg: "primary.0",
977
1129
  py: { base: "xl", md: 60 },
978
1130
  px: { base: "md", md: "xl" },
979
1131
  style: { borderRadius: "var(--mantine-radius-lg)" }
980
1132
  }, boxProps), {
981
- children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Stack, { gap: "lg", align: "center", maw: 560, children: [
982
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Stack, { gap: "sm", align: "center", children: [
983
- label && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdText.Eyebrow, { children: label }),
984
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdTitle.Section, { ta: "center", children: title }),
985
- description && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdText.Body, { ta: "center", children: description })
1133
+ children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Stack, { gap: "lg", align: "center", maw: 560, children: [
1134
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Stack, { gap: "sm", align: "center", children: [
1135
+ label && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdText.Eyebrow, { children: label }),
1136
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdTitle.Section, { ta: "center", children: title }),
1137
+ description && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdText.Body, { ta: "center", children: description })
986
1138
  ] }),
987
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Group, { gap: "sm", children: [
988
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdButton.Primary, { size: "md", onClick: onPrimary, children: primaryLabel }),
989
- secondaryLabel && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdButton.Outline, { size: "md", onClick: onSecondary, children: secondaryLabel })
1139
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Group, { gap: "sm", children: [
1140
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdButton.Primary, { size: "md", onClick: onPrimary, children: primaryLabel }),
1141
+ secondaryLabel && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdButton.Outline, { size: "md", onClick: onSecondary, children: secondaryLabel })
990
1142
  ] })
991
1143
  ] }) })
992
1144
  })
@@ -1010,8 +1162,8 @@ function Inline(_a4) {
1010
1162
  "onPrimary",
1011
1163
  "onSecondary"
1012
1164
  ]);
1013
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
1014
- import_core21.Box,
1165
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
1166
+ import_core22.Box,
1015
1167
  __spreadProps(__spreadValues({
1016
1168
  py: { base: "xl", md: 48 },
1017
1169
  px: { base: "md", md: "xl" },
@@ -1020,15 +1172,15 @@ function Inline(_a4) {
1020
1172
  borderBottom: "1px solid var(--mantine-color-slate-2)"
1021
1173
  }
1022
1174
  }, boxProps), {
1023
- children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Group, { justify: "space-between", align: "center", gap: "xl", children: [
1024
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Stack, { gap: "xs", style: { flex: 1 }, children: [
1025
- label && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdText.Eyebrow, { children: label }),
1026
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdTitle.Card, { children: title }),
1027
- description && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdText.Sub, { children: description })
1175
+ children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Group, { justify: "space-between", align: "center", gap: "xl", children: [
1176
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Stack, { gap: "xs", style: { flex: 1 }, children: [
1177
+ label && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdText.Eyebrow, { children: label }),
1178
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdTitle.Card, { children: title }),
1179
+ description && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdText.Sub, { children: description })
1028
1180
  ] }),
1029
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Group, { gap: "sm", wrap: "nowrap", children: [
1030
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdButton.Primary, { size: "md", onClick: onPrimary, children: primaryLabel }),
1031
- secondaryLabel && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdButton.Outline, { size: "md", onClick: onSecondary, children: secondaryLabel })
1181
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Group, { gap: "sm", wrap: "nowrap", children: [
1182
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdButton.Primary, { size: "md", onClick: onPrimary, children: primaryLabel }),
1183
+ secondaryLabel && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdButton.Outline, { size: "md", onClick: onSecondary, children: secondaryLabel })
1032
1184
  ] })
1033
1185
  ] })
1034
1186
  })
@@ -1042,35 +1194,38 @@ var SdCta = {
1042
1194
  /** 좌우 분할 인라인 CTA */
1043
1195
  Inline
1044
1196
  };
1197
+ var SdCtaBanner = SdCta.Banner;
1198
+ var SdCtaSubtle = SdCta.Subtle;
1199
+ var SdCtaInline = SdCta.Inline;
1045
1200
 
1046
1201
  // ui/molecule/Solution.tsx
1047
1202
  var import_react = require("react");
1048
- var import_core23 = require("@mantine/core");
1203
+ var import_core24 = require("@mantine/core");
1049
1204
  var import_link3 = __toESM(require("next/link"));
1050
1205
 
1051
1206
  // ui/molecule/SolutionCard.tsx
1052
- var import_core22 = require("@mantine/core");
1207
+ var import_core23 = require("@mantine/core");
1053
1208
  var import_link2 = __toESM(require("next/link"));
1054
- var import_jsx_runtime23 = require("react/jsx-runtime");
1209
+ var import_jsx_runtime24 = require("react/jsx-runtime");
1055
1210
  function SolutionCardItem(_a4) {
1056
1211
  var _b = _a4, { item, onSelect } = _b, cardProps = __objRest(_b, ["item", "onSelect"]);
1057
1212
  var _a5, _b2;
1058
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.Card, __spreadProps(__spreadValues({ withBorder: true }, cardProps), { children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Stack, { gap: "md", children: [
1213
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core23.Card, __spreadProps(__spreadValues({ withBorder: true }, cardProps), { children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_core23.Stack, { gap: "md", children: [
1059
1214
  item.icon,
1060
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdBadge.Primary, { children: item.category }),
1061
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdTitle.Card, { children: item.title }),
1062
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdText.Body, { children: item.description }),
1063
- item.href ? /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Button, { variant: "subtle", color: "slate", component: import_link2.default, href: item.href, children: [
1215
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdBadge.Primary, { children: item.category }),
1216
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdTitle.Card, { children: item.title }),
1217
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdText.Body, { children: item.description }),
1218
+ item.href ? /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_core23.Button, { variant: "subtle", color: "slate", component: import_link2.default, href: item.href, children: [
1064
1219
  (_a5 = item.ctaLabel) != null ? _a5 : "\uC790\uC138\uD788 \uBCF4\uAE30",
1065
1220
  " \u2192"
1066
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(SdButton.Ghost, { onClick: () => onSelect == null ? void 0 : onSelect(item), children: [
1221
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(SdButton.Ghost, { onClick: () => onSelect == null ? void 0 : onSelect(item), children: [
1067
1222
  (_b2 = item.ctaLabel) != null ? _b2 : "\uC790\uC138\uD788 \uBCF4\uAE30",
1068
1223
  " \u2192"
1069
1224
  ] })
1070
1225
  ] }) }));
1071
1226
  }
1072
1227
  function Grid3({ items, cols = { base: 1, sm: 2, md: 3 }, onSelect }) {
1073
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.SimpleGrid, { cols, spacing: "xl", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SolutionCardItem, { item, onSelect }, i)) });
1228
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core23.SimpleGrid, { cols, spacing: "xl", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SolutionCardItem, { item, onSelect }, i)) });
1074
1229
  }
1075
1230
  var SdSolutionCard = {
1076
1231
  /** 단일 compact 카드 */
@@ -1078,31 +1233,33 @@ var SdSolutionCard = {
1078
1233
  /** 카드 그리드 */
1079
1234
  Grid: Grid3
1080
1235
  };
1236
+ var SdSolutionCardItem = SdSolutionCard.Item;
1237
+ var SdSolutionCardGrid = SdSolutionCard.Grid;
1081
1238
 
1082
1239
  // ui/molecule/Solution.tsx
1083
- var import_jsx_runtime24 = require("react/jsx-runtime");
1240
+ var import_jsx_runtime25 = require("react/jsx-runtime");
1084
1241
  function Filtered({ items, allLabel = "\uC804\uCCB4", cols, onSelect }) {
1085
1242
  const categories = ["all", ...Array.from(new Set(items.map((i) => i.category)))];
1086
1243
  const [active, setActive] = (0, import_react.useState)("all");
1087
1244
  const filtered = active === "all" ? items : items.filter((i) => i.category === active);
1088
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_core23.Stack, { gap: "xl", children: [
1089
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdTabs.Pills, { value: active, onChange: (v) => setActive(v != null ? v : "all"), children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdTabs.Pills.List, { children: categories.map((cat) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdTabs.Pills.Tab, { value: cat, children: cat === "all" ? allLabel : cat }, cat)) }) }),
1090
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdSolutionCard.Grid, { items: filtered, cols, onSelect })
1245
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_core24.Stack, { gap: "xl", children: [
1246
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SdTabs.Pills, { value: active, onChange: (v) => setActive(v != null ? v : "all"), children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SdTabs.Pills.List, { children: categories.map((cat) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SdTabs.Pills.Tab, { value: cat, children: cat === "all" ? allLabel : cat }, cat)) }) }),
1247
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SdSolutionCard.Grid, { items: filtered, cols, onSelect })
1091
1248
  ] });
1092
1249
  }
1093
1250
  function List({ items, onSelect }) {
1094
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core23.Stack, { gap: 0, children: items.map((item, i) => {
1251
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_core24.Stack, { gap: 0, children: items.map((item, i) => {
1095
1252
  var _a4, _b;
1096
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { children: [
1097
- i > 0 && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core23.Divider, {}),
1098
- /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_core23.Group, { align: "flex-start", py: "lg", gap: "lg", children: [
1099
- item.icon && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core23.ThemeIcon, { variant: "light", color: "primary", size: "xl", radius: "md", children: item.icon }),
1100
- /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_core23.Stack, { gap: "xs", style: { flex: 1 }, children: [
1101
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdBadge.Primary, { children: item.category }),
1102
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdTitle.Card, { children: item.title }),
1103
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdText.Body, { children: item.description }),
1104
- item.href ? /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
1105
- import_core23.Button,
1253
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { children: [
1254
+ i > 0 && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_core24.Divider, {}),
1255
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_core24.Group, { align: "flex-start", py: "lg", gap: "lg", children: [
1256
+ item.icon && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_core24.ThemeIcon, { variant: "light", color: "primary", size: "xl", radius: "md", children: item.icon }),
1257
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_core24.Stack, { gap: "xs", style: { flex: 1 }, children: [
1258
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SdBadge.Primary, { children: item.category }),
1259
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SdTitle.Card, { children: item.title }),
1260
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SdText.Body, { children: item.description }),
1261
+ item.href ? /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
1262
+ import_core24.Button,
1106
1263
  {
1107
1264
  variant: "subtle",
1108
1265
  color: "slate",
@@ -1114,7 +1271,7 @@ function List({ items, onSelect }) {
1114
1271
  " \u2192"
1115
1272
  ]
1116
1273
  }
1117
- ) : /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
1274
+ ) : /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
1118
1275
  SdButton.Ghost,
1119
1276
  {
1120
1277
  onClick: () => onSelect == null ? void 0 : onSelect(item),
@@ -1136,10 +1293,12 @@ var SdSolution = {
1136
1293
  /** 수평 리스트 레이아웃 (상세 탐색용) */
1137
1294
  List
1138
1295
  };
1296
+ var SdSolutionFiltered = SdSolution.Filtered;
1297
+ var SdSolutionList = SdSolution.List;
1139
1298
 
1140
1299
  // ui/molecule/Clients.tsx
1141
- var import_core24 = require("@mantine/core");
1142
- var import_jsx_runtime25 = require("react/jsx-runtime");
1300
+ var import_core25 = require("@mantine/core");
1301
+ var import_jsx_runtime26 = require("react/jsx-runtime");
1143
1302
  var grayStyle = {
1144
1303
  filter: "grayscale(1) opacity(0.5)",
1145
1304
  transition: "filter 0.25s"
@@ -1148,7 +1307,7 @@ var colorStyle = {
1148
1307
  filter: "grayscale(0) opacity(1)"
1149
1308
  };
1150
1309
  function LogoImage({ client, height }) {
1151
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_core24.Tooltip, { label: client.name, withArrow: true, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_core24.Anchor, { href: client.url, target: "_blank", rel: "noopener noreferrer", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1310
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.Tooltip, { label: client.name, withArrow: true, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.Anchor, { href: client.url, target: "_blank", rel: "noopener noreferrer", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1152
1311
  "img",
1153
1312
  {
1154
1313
  src: client.logo,
@@ -1164,15 +1323,27 @@ function Grid4({
1164
1323
  cols = { base: 2, sm: 3, md: 4, lg: 6 },
1165
1324
  logoHeight = 40
1166
1325
  }) {
1167
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_core24.SimpleGrid, { cols, spacing: "xl", children: items.map((client, i) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_core24.Box, { style: { display: "flex", alignItems: "center", justifyContent: "center", padding: "12px 8px" }, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(LogoImage, { client, height: logoHeight }) }, i)) });
1326
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.SimpleGrid, { cols, spacing: "xl", children: items.map((client, i) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1327
+ import_core25.Box,
1328
+ {
1329
+ style: {
1330
+ display: "flex",
1331
+ alignItems: "center",
1332
+ justifyContent: "center",
1333
+ padding: "12px 8px"
1334
+ },
1335
+ children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(LogoImage, { client, height: logoHeight })
1336
+ },
1337
+ i
1338
+ )) });
1168
1339
  }
1169
1340
  var KEYFRAME = `@keyframes sd-clients-marquee { from { transform: translateX(0) } to { transform: translateX(-50%) } }`;
1170
1341
  function Marquee({ items, speed = 40, logoHeight = 36, gap = 64 }) {
1171
1342
  const doubled = [...items, ...items];
1172
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_core24.Box, { style: { overflow: "hidden" }, children: [
1173
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("style", { children: KEYFRAME }),
1174
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1175
- import_core24.Box,
1343
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_core25.Box, { style: { overflow: "hidden" }, children: [
1344
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("style", { children: KEYFRAME }),
1345
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1346
+ import_core25.Box,
1176
1347
  {
1177
1348
  style: {
1178
1349
  display: "flex",
@@ -1182,12 +1353,14 @@ function Marquee({ items, speed = 40, logoHeight = 36, gap = 64 }) {
1182
1353
  animation: `sd-clients-marquee ${speed}s linear infinite`
1183
1354
  },
1184
1355
  onMouseEnter: (e) => {
1356
+ ;
1185
1357
  e.currentTarget.style.animationPlayState = "paused";
1186
1358
  },
1187
1359
  onMouseLeave: (e) => {
1360
+ ;
1188
1361
  e.currentTarget.style.animationPlayState = "running";
1189
1362
  },
1190
- children: doubled.map((client, i) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(LogoImage, { client, height: logoHeight }, i))
1363
+ children: doubled.map((client, i) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(LogoImage, { client, height: logoHeight }, i))
1191
1364
  }
1192
1365
  )
1193
1366
  ] });
@@ -1203,11 +1376,11 @@ var SdClientsMarquee = Marquee;
1203
1376
 
1204
1377
  // ui/molecule/Map.tsx
1205
1378
  var import_react2 = require("react");
1206
- var import_core25 = require("@mantine/core");
1207
- var import_jsx_runtime26 = require("react/jsx-runtime");
1379
+ var import_core26 = require("@mantine/core");
1380
+ var import_jsx_runtime27 = require("react/jsx-runtime");
1208
1381
  function MapFrame({ address, height }) {
1209
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_core25.Stack, { gap: "xs", children: [
1210
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.Box, { style: { borderRadius: "var(--mantine-radius-md)", overflow: "hidden", height }, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1382
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_core26.Stack, { gap: "xs", children: [
1383
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core26.Box, { style: { borderRadius: "var(--mantine-radius-md)", overflow: "hidden", height }, children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
1211
1384
  "iframe",
1212
1385
  {
1213
1386
  src: address.embbedUrl,
@@ -1220,7 +1393,7 @@ function MapFrame({ address, height }) {
1220
1393
  title: address.label
1221
1394
  }
1222
1395
  ) }),
1223
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(SdText.Sub, { children: [
1396
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(SdText.Sub, { children: [
1224
1397
  "[",
1225
1398
  address.label,
1226
1399
  "] ",
@@ -1231,18 +1404,18 @@ function MapFrame({ address, height }) {
1231
1404
  function Single(_a4) {
1232
1405
  var _b = _a4, { address, height = 400 } = _b, boxProps = __objRest(_b, ["address", "height"]);
1233
1406
  if (!address.embbedUrl) return null;
1234
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.Box, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(MapFrame, { address, height }) }));
1407
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core26.Box, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(MapFrame, { address, height }) }));
1235
1408
  }
1236
1409
  function Tabs2({ addresses, height = 400 }) {
1237
1410
  var _a4, _b, _c;
1238
1411
  const mapped = addresses.filter((a) => a.embbedUrl);
1239
1412
  const [active, setActive] = (0, import_react2.useState)((_b = (_a4 = mapped[0]) == null ? void 0 : _a4.label) != null ? _b : "");
1240
1413
  if (mapped.length === 0) return null;
1241
- if (mapped.length === 1) return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(MapFrame, { address: mapped[0], height });
1414
+ if (mapped.length === 1) return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(MapFrame, { address: mapped[0], height });
1242
1415
  const current = (_c = mapped.find((a) => a.label === active)) != null ? _c : mapped[0];
1243
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_core25.Stack, { gap: "md", children: [
1244
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SdTabs.Pills, { value: active, onChange: (v) => setActive(v != null ? v : mapped[0].label), children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SdTabs.Pills.List, { children: mapped.map((addr) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SdTabs.Pills.Tab, { value: addr.label, children: addr.label }, addr.label)) }) }),
1245
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(MapFrame, { address: current, height })
1416
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_core26.Stack, { gap: "md", children: [
1417
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(SdTabs.Pills, { value: active, onChange: (v) => setActive(v != null ? v : mapped[0].label), children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(SdTabs.Pills.List, { children: mapped.map((addr) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(SdTabs.Pills.Tab, { value: addr.label, children: addr.label }, addr.label)) }) }),
1418
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(MapFrame, { address: current, height })
1246
1419
  ] });
1247
1420
  }
1248
1421
  var SdMap = {
@@ -1256,9 +1429,9 @@ var SdMapTabs = Tabs2;
1256
1429
 
1257
1430
  // ui/organism/HeroCarousel.tsx
1258
1431
  var import_carousel = require("@mantine/carousel");
1259
- var import_core26 = require("@mantine/core");
1432
+ var import_core27 = require("@mantine/core");
1260
1433
  var import_icons_react4 = require("@tabler/icons-react");
1261
- var import_jsx_runtime27 = require("react/jsx-runtime");
1434
+ var import_jsx_runtime28 = require("react/jsx-runtime");
1262
1435
  var variantMap = {
1263
1436
  primary: SdButton.Primary,
1264
1437
  secondary: SdButton.Secondary,
@@ -1268,13 +1441,13 @@ var variantMap = {
1268
1441
  function CtaButton({ cta }) {
1269
1442
  var _a4;
1270
1443
  const Button3 = variantMap[(_a4 = cta.variant) != null ? _a4 : "primary"];
1271
- return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core26.Anchor, { href: cta.href, underline: "never", children: cta.icon ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Button3, { size: "md", rightSection: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_icons_react4.IconArrowNarrowRight, {}), children: cta.label }) : /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Button3, { size: "md", children: cta.label }) });
1444
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core27.Anchor, { href: cta.href, underline: "never", children: cta.icon ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Button3, { size: "md", rightSection: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_icons_react4.IconArrowNarrowRight, {}), children: cta.label }) : /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Button3, { size: "md", children: cta.label }) });
1272
1445
  }
1273
1446
  function HeroCarousel({ slides, children }) {
1274
- if (children) return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_jsx_runtime27.Fragment, { children });
1447
+ if (children) return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_jsx_runtime28.Fragment, { children });
1275
1448
  const filterdSlides = filterAndSort(slides);
1276
- return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_carousel.Carousel, { withIndicators: true, height: "60svh", children: filterdSlides.map((slide, i) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_carousel.Carousel.Slide, { children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
1277
- import_core26.Box,
1449
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_carousel.Carousel, { withIndicators: true, height: "60svh", children: filterdSlides.map((slide, i) => /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_carousel.Carousel.Slide, { children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1450
+ import_core27.Box,
1278
1451
  {
1279
1452
  style: {
1280
1453
  height: "100%",
@@ -1285,8 +1458,8 @@ function HeroCarousel({ slides, children }) {
1285
1458
  alignItems: "center",
1286
1459
  justifyContent: "center"
1287
1460
  },
1288
- children: /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_core26.Stack, { align: "center", style: { textAlign: "center", maxWidth: 780 }, px: "xl", children: [
1289
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
1461
+ children: /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_core27.Stack, { align: "center", style: { textAlign: "center", maxWidth: 780 }, px: "xl", children: [
1462
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1290
1463
  SdTextBox.Hero,
1291
1464
  {
1292
1465
  title: slide.title,
@@ -1295,137 +1468,194 @@ function HeroCarousel({ slides, children }) {
1295
1468
  align: "center"
1296
1469
  }
1297
1470
  ),
1298
- slide.ctas && slide.ctas.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core26.Group, { gap: "sm", mt: "md", children: slide.ctas.map((cta, i2) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(CtaButton, { cta }, cta.href)) })
1471
+ slide.ctas && slide.ctas.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core27.Group, { gap: "sm", mt: "md", children: slide.ctas.map((cta, i2) => /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(CtaButton, { cta }, cta.href)) })
1299
1472
  ] })
1300
1473
  }
1301
1474
  ) }, i)) });
1302
1475
  }
1303
1476
 
1304
1477
  // ui/organism/Header.tsx
1305
- var import_core27 = require("@mantine/core");
1478
+ var import_core28 = require("@mantine/core");
1306
1479
  var import_hooks = require("@mantine/hooks");
1307
- var import_jsx_runtime28 = require("react/jsx-runtime");
1308
- function SdHeader({ navItems, loginFlag, children }) {
1480
+ var import_jsx_runtime29 = require("react/jsx-runtime");
1481
+ var BAR_HEIGHT = 60;
1482
+ function SdHeader({ navItems, loginFlag }) {
1309
1483
  const [opened, { toggle, close }] = (0, import_hooks.useDisclosure)();
1310
- const visibleTopItems = navItems.filter((item) => item.isShow && !item.parentId).sort((a, b) => a.order - b.order);
1311
- return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_jsx_runtime28.Fragment, { children: [
1312
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(SdContainer, { h: "100%", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_core27.Group, { justify: "space-between", h: "100%", children: [
1313
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Logo, {}),
1314
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core27.Group, { gap: "xl", visibleFrom: "sm", children: visibleTopItems.map((item) => /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core27.Anchor, { href: item.href, c: "slate.7", fw: 500, underline: "never", fz: 15, children: item.label }, item.id)) }),
1315
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core27.Burger, { hiddenFrom: "sm", opened, onClick: toggle }),
1316
- loginFlag && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_core27.Group, { gap: "sm", visibleFrom: "sm", children: [
1317
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(SdButton.Ghost, { size: "sm", children: "\uB85C\uADF8\uC778" }),
1318
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(SdButton.Primary, { size: "sm", children: "\uBB34\uB8CC \uC2DC\uC791" })
1319
- ] }),
1320
- children
1321
- ] }) }),
1322
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core27.Drawer, { opened, onClose: close, hiddenFrom: "sm", size: "xs", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_core27.Stack, { children: [
1323
- visibleTopItems.map((item) => /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core27.Anchor, { href: item.href, c: "slate.7", fw: 500, underline: "never", fz: 16, onClick: close, children: item.label }, item.id)),
1324
- loginFlag && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_core27.Stack, { gap: "xs", mt: "md", children: [
1325
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(SdButton.Ghost, { size: "sm", children: "\uB85C\uADF8\uC778" }),
1326
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(SdButton.Primary, { size: "sm", children: "\uBB34\uB8CC \uC2DC\uC791" })
1327
- ] })
1484
+ const visibleItems = filterAndSort(navItems);
1485
+ const topItems = visibleItems.filter((item) => !item.parentId);
1486
+ const childrenOf = (parentId) => visibleItems.filter((item) => item.parentId === parentId);
1487
+ const hasAnyChildren = visibleItems.some((item) => item.parentId);
1488
+ const { hovered, ref: hoverRef } = (0, import_hooks.useHover)();
1489
+ const { focused, ref: focusRef } = (0, import_hooks.useFocusWithin)();
1490
+ const rootRef = (0, import_hooks.useMergedRef)(hoverRef, focusRef);
1491
+ const expanded = hasAnyChildren && (hovered || focused);
1492
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_jsx_runtime29.Fragment, { children: [
1493
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1494
+ import_core28.Box,
1495
+ {
1496
+ ref: rootRef,
1497
+ pos: "relative",
1498
+ bg: "var(--mantine-color-body)",
1499
+ style: {
1500
+ boxShadow: expanded ? "var(--mantine-shadow-md)" : void 0,
1501
+ borderBottom: expanded ? "1px solid var(--mantine-color-slate-2)" : void 0,
1502
+ transition: "box-shadow 0.15s"
1503
+ },
1504
+ children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core28.Group, { justify: "space-between", align: "flex-start", wrap: "nowrap", children: [
1505
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Group, { h: BAR_HEIGHT, align: "center", children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(Logo, {}) }),
1506
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Group, { gap: "xl", align: "flex-start", wrap: "nowrap", visibleFrom: "sm", children: topItems.map((item) => {
1507
+ const kids = childrenOf(item.id);
1508
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core28.Stack, { gap: 0, align: "center", children: [
1509
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Group, { h: BAR_HEIGHT, align: "center", children: item.href ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdLink.Body, { href: item.href, children: item.label }) : /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdText.Strong, { children: item.label }) }),
1510
+ kids.length > 0 && /*
1511
+ Mantine Collapse를 쓰지 않는다 — 접힐 때 display:none이 되어
1512
+ 하위 링크가 폭 계산에서 빠졌다가 펼칠 때 다시 들어오면서
1513
+ 컬럼 폭(=상단 nav 간격)이 튄다.
1514
+ height 0 + overflow hidden은 폭 기여를 유지하므로 간격이 고정된다.
1515
+ visibility:hidden이 접힌 상태의 링크를 탭 순서에서도 빼준다.
1516
+ */
1517
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1518
+ import_core28.Box,
1519
+ {
1520
+ "aria-hidden": !expanded,
1521
+ style: {
1522
+ height: expanded ? "auto" : 0,
1523
+ overflow: "hidden",
1524
+ opacity: expanded ? 1 : 0,
1525
+ visibility: expanded ? "visible" : "hidden",
1526
+ transition: "opacity 0.15s ease"
1527
+ },
1528
+ children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Stack, { gap: "xs", pt: 4, pb: "lg", align: "center", children: kids.map((kid) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdLink.Sub, { href: kid.href, children: kid.label }, kid.id)) })
1529
+ }
1530
+ )
1531
+ ] }, item.id);
1532
+ }) }),
1533
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core28.Group, { h: BAR_HEIGHT, align: "center", gap: "sm", wrap: "nowrap", children: [
1534
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Burger, { hiddenFrom: "sm", opened, onClick: toggle }),
1535
+ loginFlag && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Group, { gap: "sm", visibleFrom: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
1536
+ ] })
1537
+ ] }) })
1538
+ }
1539
+ ),
1540
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Drawer, { opened, onClose: close, hiddenFrom: "sm", size: "xs", children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core28.Stack, { gap: 0, children: [
1541
+ topItems.map((item) => {
1542
+ const kids = childrenOf(item.id);
1543
+ if (kids.length === 0) {
1544
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Box, { px: "sm", py: 8, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdLink.Body, { href: item.href, onClick: close, children: item.label }) }, item.id);
1545
+ }
1546
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1547
+ import_core28.NavLink,
1548
+ {
1549
+ label: item.label,
1550
+ href: item.href,
1551
+ childrenOffset: 28,
1552
+ onClick: kids.length > 0 ? void 0 : close,
1553
+ children: kids.map((kid) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.NavLink, { label: kid.label, href: kid.href, onClick: close }, kid.id))
1554
+ },
1555
+ item.id
1556
+ );
1557
+ }),
1558
+ loginFlag && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Stack, { gap: "xs", mt: "md", children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
1328
1559
  ] }) })
1329
1560
  ] });
1330
1561
  }
1331
1562
 
1332
1563
  // ui/organism/Footer.tsx
1333
- var import_core28 = require("@mantine/core");
1334
- var import_jsx_runtime29 = require("react/jsx-runtime");
1564
+ var import_core29 = require("@mantine/core");
1565
+ var import_icons_react5 = require("@tabler/icons-react");
1566
+ var import_jsx_runtime30 = require("react/jsx-runtime");
1335
1567
  function FooterNavColumns({ items }) {
1336
1568
  const topLevel = items.filter((item) => !item.parentId);
1337
1569
  const getChildren = (parentId) => items.filter((item) => item.parentId === parentId);
1338
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_jsx_runtime29.Fragment, { children: topLevel.map((group) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Grid.Col, { span: { base: 6, sm: 4, md: "auto" }, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core28.Stack, { gap: "sm", children: [
1339
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdText.Strong, { fz: "sm", children: group.label }),
1340
- getChildren(group.id).map((link) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1341
- import_core28.Anchor,
1570
+ const CHILD_THRESH = 4;
1571
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_jsx_runtime30.Fragment, { children: topLevel.map((group) => /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Grid.Col, { span: { base: 6, sm: 4, md: "auto" }, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.Stack, { gap: "xs", children: [
1572
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdText.Sub, { children: group.label }),
1573
+ getChildren(group.id).map((link, id) => {
1574
+ if (id >= CHILD_THRESH) return;
1575
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdLink.Hint, { href: link.href, children: link.label }, link.id);
1576
+ })
1577
+ ] }) }, group.id)) });
1578
+ }
1579
+ var SOCIAL_ICONS = {
1580
+ x: import_icons_react5.IconBrandX,
1581
+ youtube: import_icons_react5.IconBrandYoutube,
1582
+ instagram: import_icons_react5.IconBrandInstagram,
1583
+ facebook: import_icons_react5.IconBrandFacebook,
1584
+ linkedin: import_icons_react5.IconBrandLinkedin,
1585
+ github: import_icons_react5.IconBrandGithub,
1586
+ blog: import_icons_react5.IconWorld
1587
+ };
1588
+ function FooterSocials({ items }) {
1589
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Group, { gap: 0, wrap: "nowrap", children: items.map((item) => {
1590
+ var _a4, _b;
1591
+ const Icon = (_a4 = SOCIAL_ICONS[item.platform]) != null ? _a4 : import_icons_react5.IconWorld;
1592
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
1593
+ import_core29.ActionIcon,
1342
1594
  {
1343
- href: link.href,
1344
- fz: "sm",
1345
- c: "slate.6",
1346
- underline: "never",
1347
- style: { transition: "color 0.15s" },
1348
- onMouseEnter: (e) => {
1349
- e.currentTarget.style.color = "var(--mantine-color-primary-6)";
1350
- },
1351
- onMouseLeave: (e) => {
1352
- e.currentTarget.style.color = "";
1353
- },
1354
- children: link.label
1595
+ component: "a",
1596
+ href: item.url,
1597
+ target: "_blank",
1598
+ rel: "noreferrer",
1599
+ size: "lg",
1600
+ color: "gray",
1601
+ variant: "subtle",
1602
+ "aria-label": (_b = item.label) != null ? _b : item.platform,
1603
+ children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Icon, { size: 18, stroke: 1.5 })
1355
1604
  },
1356
- link.id
1357
- ))
1358
- ] }) }, group.id)) });
1605
+ item.url
1606
+ );
1607
+ }) });
1608
+ }
1609
+ function InfoCell({ label, children }) {
1610
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.Group, { gap: 6, wrap: "nowrap", align: "baseline", children: [
1611
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdText.Sub, { c: "slate.4", style: { whiteSpace: "nowrap" }, children: label }),
1612
+ typeof children === "string" ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdText.Sub, { children }) : children
1613
+ ] });
1359
1614
  }
1360
1615
  function FooterCompanyInfo({ company }) {
1361
1616
  const sortedAddresses = [...company.addresses].sort((a, b) => a.order - b.order);
1362
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core28.Group, { gap: "xs", wrap: "wrap", children: [
1363
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdText.Sub, { children: company.name }),
1364
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdText.Sub, { c: "slate.4", children: "|" }),
1365
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(SdText.Sub, { children: [
1366
- "\uC0AC\uC5C5\uC790\uB4F1\uB85D\uBC88\uD638 ",
1367
- company.registrationNumber
1368
- ] }),
1369
- sortedAddresses.map((addr) => /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core28.Group, { gap: "xs", wrap: "nowrap", children: [
1370
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdText.Sub, { c: "slate.4", children: "|" }),
1371
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdText.Sub, { children: addr.address })
1372
- ] }, addr.label)),
1373
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdText.Sub, { c: "slate.4", children: "|" }),
1374
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core28.Anchor, { href: `tel:${company.tel}`, fz: "xs", c: "slate.5", underline: "never", children: [
1375
- "Tel ",
1376
- company.tel
1377
- ] }),
1378
- company.fax && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_jsx_runtime29.Fragment, { children: [
1379
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdText.Sub, { c: "slate.4", children: "|" }),
1380
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(SdText.Sub, { children: [
1381
- "Fax ",
1382
- company.fax
1383
- ] })
1384
- ] }),
1385
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdText.Sub, { c: "slate.4", children: "|" }),
1386
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Anchor, { href: `mailto:${company.email}`, fz: "xs", c: "slate.5", underline: "never", children: company.email })
1617
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.SimpleGrid, { cols: { base: 2, sm: 2, md: 1 }, spacing: "md", verticalSpacing: 0, children: [
1618
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(InfoCell, { label: "\uC0C1\uD638", children: company.name }),
1619
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(InfoCell, { label: "\uC0AC\uC5C5\uC790\uB4F1\uB85D\uBC88\uD638", children: company.registrationNumber }),
1620
+ sortedAddresses.map((addr) => /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(InfoCell, { label: addr.label, children: addr.address }, addr.label)),
1621
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(InfoCell, { label: "Tel", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdLink.Sub, { href: `tel:${company.tel}`, children: company.tel }) }),
1622
+ company.fax && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(InfoCell, { label: "Fax", children: company.fax }),
1623
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(InfoCell, { label: "Email", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdLink.Sub, { href: `mailto:${company.email}`, children: company.email }) })
1387
1624
  ] });
1388
1625
  }
1389
1626
  function SdFooter({ company, navItems, policyLinks, description }) {
1390
1627
  const visibleNav = filterAndSort(navItems);
1391
1628
  const visiblePolicy = filterAndSort(policyLinks);
1392
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Box, { component: "footer", py: "xl", children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(SdContainer, { children: [
1393
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core28.Grid, { style: { "--grid-gutter": "48px" }, children: [
1394
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Grid.Col, { span: { base: 12, md: 4 }, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core28.Stack, { gap: "md", children: [
1395
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(Logo, { size: "sm" }),
1396
- description && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdText.Body, { c: "slate.4", fz: "sm", children: description })
1397
- ] }) }),
1398
- visibleNav.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Grid.Col, { span: { base: 12, md: 8 }, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Grid, { style: { "--grid-gutter": "24px" }, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(FooterNavColumns, { items: visibleNav }) }) })
1629
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Box, { component: "footer", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.Stack, { children: [
1630
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Logo, { size: "sm" }),
1631
+ description && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdText.Sub, { children: description }),
1632
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.Flex, { direction: { base: "column", md: "row" }, gap: 48, align: "flex-start", children: [
1633
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Box, { flex: { base: "0 0 auto", md: "1 1 0" }, w: { base: "100%", md: "auto" }, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(FooterCompanyInfo, { company }) }),
1634
+ visibleNav.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Box, { flex: { base: "0 0 auto", md: "2 1 0" }, w: { base: "100%", md: "auto" }, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Grid, { style: { "--grid-gutter": "24px" }, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(FooterNavColumns, { items: visibleNav }) }) })
1399
1635
  ] }),
1400
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Divider, {}),
1401
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(FooterCompanyInfo, { company }),
1402
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core28.Group, { justify: "space-between", wrap: "wrap", gap: "xs", mt: "md", children: [
1403
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(SdText.Sub, { c: "slate.5", children: [
1636
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Divider, {}),
1637
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.Group, { justify: "space-between", wrap: "wrap", gap: "xs", children: [
1638
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(SdText.Sub, { children: [
1404
1639
  "\xA9 ",
1405
1640
  company.copyrightYear,
1406
1641
  " ",
1407
1642
  company.name,
1408
1643
  ". All rights reserved."
1409
1644
  ] }),
1410
- visiblePolicy.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Group, { gap: "lg", children: visiblePolicy.map((item) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1411
- import_core28.Anchor,
1412
- {
1413
- href: item.href,
1414
- fz: "xs",
1415
- fw: item.highlight ? 700 : 400,
1416
- c: item.highlight ? "white" : "slate.5",
1417
- underline: "never",
1418
- children: item.label
1419
- },
1420
- item.id
1421
- )) })
1645
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.Group, { gap: "lg", wrap: "wrap", children: [
1646
+ visiblePolicy.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Group, { gap: "lg", children: visiblePolicy.map((item) => {
1647
+ const Link4 = item.highlight ? SdLink.Strong : SdLink.Sub;
1648
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Link4, { href: item.href, children: item.label }, item.id);
1649
+ }) }),
1650
+ company.socials && company.socials.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(FooterSocials, { items: company.socials })
1651
+ ] })
1422
1652
  ] })
1423
- ] }) });
1653
+ ] }) }) });
1424
1654
  }
1425
1655
 
1426
1656
  // ui/organism/FeatureSection.tsx
1427
- var import_core29 = require("@mantine/core");
1428
- var import_jsx_runtime30 = require("react/jsx-runtime");
1657
+ var import_core30 = require("@mantine/core");
1658
+ var import_jsx_runtime31 = require("react/jsx-runtime");
1429
1659
  function SdFeatureSection(_a4) {
1430
1660
  var _b = _a4, {
1431
1661
  label,
@@ -1442,8 +1672,8 @@ function SdFeatureSection(_a4) {
1442
1672
  "cols",
1443
1673
  "py"
1444
1674
  ]);
1445
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdContainer, __spreadProps(__spreadValues({ py }, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.Stack, { gap: "xl", children: [
1446
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
1675
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdContainer, __spreadProps(__spreadValues({ py }, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core30.Stack, { gap: "xl", children: [
1676
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
1447
1677
  SdTextBox.Section,
1448
1678
  {
1449
1679
  label,
@@ -1454,13 +1684,13 @@ function SdFeatureSection(_a4) {
1454
1684
  align: "center"
1455
1685
  }
1456
1686
  ),
1457
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdFeatures, { items, cols })
1687
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdFeatures, { items, cols })
1458
1688
  ] }) }));
1459
1689
  }
1460
1690
 
1461
1691
  // ui/organism/TimelineSection.tsx
1462
- var import_core30 = require("@mantine/core");
1463
- var import_jsx_runtime31 = require("react/jsx-runtime");
1692
+ var import_core31 = require("@mantine/core");
1693
+ var import_jsx_runtime32 = require("react/jsx-runtime");
1464
1694
  function SdTimelineSection(_a4) {
1465
1695
  var _b = _a4, {
1466
1696
  label,
@@ -1475,22 +1705,15 @@ function SdTimelineSection(_a4) {
1475
1705
  "items",
1476
1706
  "py"
1477
1707
  ]);
1478
- return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core30.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core30.Stack, __spreadProps(__spreadValues({ py, gap: "md" }, boxProps), { children: [
1479
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
1480
- SdTextBox.Section,
1481
- {
1482
- label,
1483
- title,
1484
- description
1485
- }
1486
- ),
1487
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core30.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdTimeline, { items }) })
1708
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core31.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core31.Stack, __spreadProps(__spreadValues({ py, gap: "md" }, boxProps), { children: [
1709
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdTextBox.Section, { label, title, description }),
1710
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core31.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdTimeline, { items }) })
1488
1711
  ] })) });
1489
1712
  }
1490
1713
 
1491
1714
  // ui/organism/StepsSection.tsx
1492
- var import_core31 = require("@mantine/core");
1493
- var import_jsx_runtime32 = require("react/jsx-runtime");
1715
+ var import_core32 = require("@mantine/core");
1716
+ var import_jsx_runtime33 = require("react/jsx-runtime");
1494
1717
  function SdStepsSection(_a4) {
1495
1718
  var _b = _a4, {
1496
1719
  label,
@@ -1505,18 +1728,18 @@ function SdStepsSection(_a4) {
1505
1728
  "items",
1506
1729
  "py"
1507
1730
  ]);
1508
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdContainer, __spreadProps(__spreadValues({ py }, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core31.Stack, { gap: "xl", children: [
1509
- (label || title || description) && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdTextBox.Section, { label, title, description }),
1510
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdSteps.Bubble, { items })
1731
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdContainer, __spreadProps(__spreadValues({ py }, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core32.Stack, { gap: "xl", children: [
1732
+ (label || title || description) && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdTextBox.Section, { label, title, description }),
1733
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdSteps.Bubble, { items })
1511
1734
  ] }) }));
1512
1735
  }
1513
1736
 
1514
1737
  // ui/organism/ErrorView.tsx
1515
- var import_core32 = require("@mantine/core");
1516
- var import_jsx_runtime33 = require("react/jsx-runtime");
1738
+ var import_core33 = require("@mantine/core");
1739
+ var import_jsx_runtime34 = require("react/jsx-runtime");
1517
1740
  function StatusCode({ code }) {
1518
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
1519
- import_core32.Text,
1741
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
1742
+ import_core33.Text,
1520
1743
  {
1521
1744
  fz: 160,
1522
1745
  fw: 900,
@@ -1529,15 +1752,15 @@ function StatusCode({ code }) {
1529
1752
  );
1530
1753
  }
1531
1754
  function Page({ error, onReset, onHome }) {
1532
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core32.Center, { mih: "60vh", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core32.Stack, { align: "center", gap: "lg", ta: "center", children: [
1533
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(StatusCode, { code: "500" }),
1534
- /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core32.Stack, { gap: "sm", align: "center", children: [
1535
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdTitle.Section, { children: "\uC11C\uBC84\uC5D0\uC11C \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4" }),
1536
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdText.Body, { maw: 480, children: "\uC608\uAE30\uCE58 \uC54A\uC740 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694." })
1755
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core33.Center, { mih: "60vh", children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core33.Stack, { align: "center", gap: "lg", ta: "center", children: [
1756
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(StatusCode, { code: "500" }),
1757
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core33.Stack, { gap: "sm", align: "center", children: [
1758
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdTitle.Section, { children: "\uC11C\uBC84\uC5D0\uC11C \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4" }),
1759
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdText.Body, { maw: 480, children: "\uC608\uAE30\uCE58 \uC54A\uC740 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694." })
1537
1760
  ] }),
1538
- /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core32.Group, { gap: "sm", justify: "center", children: [
1539
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdButton.Primary, { onClick: onReset, children: "\uB2E4\uC2DC \uC2DC\uB3C4" }),
1540
- onHome && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdButton.Ghost, { onClick: onHome, children: "\uD648\uC73C\uB85C" })
1761
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core33.Group, { gap: "sm", justify: "center", children: [
1762
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdButton.Primary, { onClick: onReset, children: "\uB2E4\uC2DC \uC2DC\uB3C4" }),
1763
+ onHome && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdButton.Ghost, { onClick: onHome, children: "\uD648\uC73C\uB85C" })
1541
1764
  ] })
1542
1765
  ] }) }) });
1543
1766
  }
@@ -1549,15 +1772,15 @@ function NotFound({
1549
1772
  },
1550
1773
  onBack = () => window.history.back()
1551
1774
  }) {
1552
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core32.Center, { mih: "60vh", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core32.Stack, { align: "center", gap: "lg", ta: "center", children: [
1553
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(StatusCode, { code: "404" }),
1554
- /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core32.Stack, { gap: "sm", align: "center", children: [
1555
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdTitle.Section, { children: title }),
1556
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdText.Body, { maw: 480, children: description })
1775
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core33.Center, { mih: "60vh", children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core33.Stack, { align: "center", gap: "lg", ta: "center", children: [
1776
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(StatusCode, { code: "404" }),
1777
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core33.Stack, { gap: "sm", align: "center", children: [
1778
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdTitle.Section, { children: title }),
1779
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdText.Body, { maw: 480, children: description })
1557
1780
  ] }),
1558
- /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core32.Group, { gap: "sm", justify: "center", children: [
1559
- onHome && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdButton.Primary, { onClick: onHome, children: "\uD648\uC73C\uB85C" }),
1560
- onBack && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdButton.Ghost, { onClick: onBack, children: "\uB4A4\uB85C \uAC00\uAE30" })
1781
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core33.Group, { gap: "sm", justify: "center", children: [
1782
+ onHome && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdButton.Primary, { onClick: onHome, children: "\uD648\uC73C\uB85C" }),
1783
+ onBack && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdButton.Ghost, { onClick: onBack, children: "\uB4A4\uB85C \uAC00\uAE30" })
1561
1784
  ] })
1562
1785
  ] }) }) });
1563
1786
  }
@@ -1567,127 +1790,166 @@ var SdErrorView = {
1567
1790
  /** app/not-found.tsx — 404 Not Found */
1568
1791
  NotFound
1569
1792
  };
1793
+ var SdErrorViewPage = SdErrorView.Page;
1794
+ var SdErrorViewNotFound = SdErrorView.NotFound;
1570
1795
 
1571
1796
  // ui/template/MainLayout.tsx
1572
- var import_core33 = require("@mantine/core");
1573
- var import_jsx_runtime34 = require("react/jsx-runtime");
1574
- function MainLayout({ children, navItems, companyInfo }) {
1575
- return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core33.AppShell, { header: { height: 60 }, children: [
1576
- /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core33.AppShell.Header, { children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdHeader, { navItems }) }),
1577
- /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core33.AppShell.Main, { children }),
1578
- /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdFooter, { company: companyInfo })
1797
+ var import_core34 = require("@mantine/core");
1798
+ var import_jsx_runtime35 = require("react/jsx-runtime");
1799
+ function MainLayout({
1800
+ children,
1801
+ navItems,
1802
+ companyInfo,
1803
+ loginFlag
1804
+ }) {
1805
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core34.AppShell, { header: { height: 60 }, children: [
1806
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core34.AppShell.Header, { children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdHeader, { navItems, loginFlag }) }),
1807
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core34.AppShell.Main, { children }),
1808
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdFooter, { company: companyInfo, navItems })
1579
1809
  ] });
1580
1810
  }
1581
1811
 
1582
1812
  // ui/template/PageLayout.tsx
1583
- var import_core34 = require("@mantine/core");
1584
- var import_jsx_runtime35 = require("react/jsx-runtime");
1813
+ var import_core35 = require("@mantine/core");
1814
+ var import_jsx_runtime36 = require("react/jsx-runtime");
1585
1815
  function Content({ children }) {
1586
- return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdContainer, { py: "xl", children });
1816
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdContainer, { py: "xl", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core35.Stack, { gap: "xl", children }) });
1587
1817
  }
1588
1818
  function LayoutGap() {
1589
- return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core34.Space, { h: 48 });
1819
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core35.Space, { h: 48 });
1590
1820
  }
1591
1821
  function Minimal({ label, title, description, children }) {
1592
- return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_jsx_runtime35.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(Plain2, { children: [
1593
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
1594
- SdTextBox.Section,
1595
- {
1596
- label,
1597
- title,
1598
- description: description != null ? description : "",
1599
- mb: "xl"
1600
- }
1601
- ),
1602
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core34.Divider, {}),
1822
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_jsx_runtime36.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(Plain2, { children: [
1823
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdTextBox.Section, { label, title, description: description != null ? description : "" }),
1824
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core35.Divider, {}),
1603
1825
  children
1604
1826
  ] }) });
1605
1827
  }
1606
1828
  function Plain2({ children }) {
1607
- return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_jsx_runtime35.Fragment, { children: [
1608
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(LayoutGap, {}),
1609
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(Content, { children })
1829
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_jsx_runtime36.Fragment, { children: [
1830
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(LayoutGap, {}),
1831
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Content, { children })
1610
1832
  ] });
1611
1833
  }
1612
1834
  function Image2({ image, label, title, description, children }) {
1613
- return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_jsx_runtime35.Fragment, { children: [
1614
- /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core34.Box, { style: {
1615
- position: "relative",
1616
- minHeight: "30svh",
1617
- display: "flex",
1618
- alignItems: "center",
1619
- backgroundImage: image ? `url(${image})` : void 0,
1620
- backgroundSize: "cover",
1621
- backgroundPosition: "center",
1622
- backgroundColor: "var(--mantine-color-slate-9)"
1623
- }, children: [
1624
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core34.Box, { style: {
1625
- position: "absolute",
1626
- inset: 0,
1627
- background: "rgba(0, 0, 0, 0.55)"
1628
- } }),
1629
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdContainer, { style: { position: "relative", zIndex: 1, width: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
1630
- import_core34.Box,
1631
- {
1632
- py: 48,
1633
- px: 40,
1634
- maw: 420,
1635
- style: {
1636
- backdropFilter: "blur(24px)",
1637
- WebkitBackdropFilter: "blur(24px)",
1638
- background: "rgba(255,255,255,0.10)",
1639
- borderRadius: "var(--mantine-radius-md)",
1640
- border: "1px solid rgba(255,255,255,0.18)"
1641
- },
1642
- children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
1835
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_jsx_runtime36.Fragment, { children: [
1836
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
1837
+ import_core35.Box,
1838
+ {
1839
+ style: {
1840
+ position: "relative",
1841
+ minHeight: "30svh",
1842
+ display: "flex",
1843
+ alignItems: "center",
1844
+ backgroundImage: image ? `url(${image})` : void 0,
1845
+ backgroundSize: "cover",
1846
+ backgroundPosition: "center",
1847
+ backgroundColor: "var(--mantine-color-slate-9)"
1848
+ },
1849
+ children: [
1850
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
1851
+ import_core35.Box,
1852
+ {
1853
+ style: {
1854
+ position: "absolute",
1855
+ inset: 0,
1856
+ background: "rgba(0, 0, 0, 0.55)"
1857
+ }
1858
+ }
1859
+ ),
1860
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdContainer, { style: { position: "relative", zIndex: 1, width: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
1861
+ import_core35.Box,
1862
+ {
1863
+ py: 48,
1864
+ px: 40,
1865
+ maw: 420,
1866
+ style: {
1867
+ backdropFilter: "blur(24px)",
1868
+ WebkitBackdropFilter: "blur(24px)",
1869
+ background: "rgba(255,255,255,0.10)",
1870
+ borderRadius: "var(--mantine-radius-md)",
1871
+ border: "1px solid rgba(255,255,255,0.18)"
1872
+ },
1873
+ children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
1874
+ SdTextBox.Hero,
1875
+ {
1876
+ label,
1877
+ title,
1878
+ description,
1879
+ ta: "left",
1880
+ align: "flex-start"
1881
+ }
1882
+ )
1883
+ }
1884
+ ) })
1885
+ ]
1886
+ }
1887
+ ),
1888
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Content, { children })
1889
+ ] });
1890
+ }
1891
+ function Brand({ label, title, description, children }) {
1892
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_jsx_runtime36.Fragment, { children: [
1893
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
1894
+ import_core35.Box,
1895
+ {
1896
+ style: {
1897
+ position: "relative",
1898
+ minHeight: "40svh",
1899
+ display: "flex",
1900
+ alignItems: "center",
1901
+ overflow: "hidden",
1902
+ background: "linear-gradient(135deg, var(--mantine-color-primary-8) 0%, var(--mantine-color-primary-6) 50%, var(--mantine-color-primary-4) 100%)"
1903
+ },
1904
+ children: [
1905
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
1906
+ import_core35.Box,
1907
+ {
1908
+ style: {
1909
+ position: "absolute",
1910
+ top: -80,
1911
+ right: -80,
1912
+ width: 360,
1913
+ height: 360,
1914
+ borderRadius: "50%",
1915
+ background: "rgba(255,255,255,0.06)",
1916
+ pointerEvents: "none"
1917
+ }
1918
+ }
1919
+ ),
1920
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
1921
+ import_core35.Box,
1922
+ {
1923
+ style: {
1924
+ position: "absolute",
1925
+ bottom: -60,
1926
+ left: -60,
1927
+ width: 240,
1928
+ height: 240,
1929
+ borderRadius: "50%",
1930
+ background: "rgba(255,255,255,0.04)",
1931
+ pointerEvents: "none"
1932
+ }
1933
+ }
1934
+ ),
1935
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdContainer, { style: { position: "relative", zIndex: 1, width: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
1643
1936
  SdTextBox.Hero,
1644
1937
  {
1645
1938
  label,
1646
1939
  title,
1647
1940
  description,
1648
- ta: "left",
1649
- align: "flex-start"
1941
+ ta: "center",
1942
+ align: "center",
1943
+ maw: 640,
1944
+ mx: "auto",
1945
+ pt: 80,
1946
+ pb: 64
1650
1947
  }
1651
- )
1652
- }
1653
- ) })
1654
- ] }),
1655
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(Content, { children })
1656
- ] });
1657
- }
1658
- function Brand({ label, title, description, children }) {
1659
- return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_jsx_runtime35.Fragment, { children: [
1660
- /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core34.Box, { style: {
1661
- position: "relative",
1662
- minHeight: "40svh",
1663
- display: "flex",
1664
- alignItems: "center",
1665
- overflow: "hidden",
1666
- background: "linear-gradient(135deg, var(--mantine-color-primary-8) 0%, var(--mantine-color-primary-6) 50%, var(--mantine-color-primary-4) 100%)"
1667
- }, children: [
1668
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core34.Box, { style: {
1669
- position: "absolute",
1670
- top: -80,
1671
- right: -80,
1672
- width: 360,
1673
- height: 360,
1674
- borderRadius: "50%",
1675
- background: "rgba(255,255,255,0.06)",
1676
- pointerEvents: "none"
1677
- } }),
1678
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core34.Box, { style: {
1679
- position: "absolute",
1680
- bottom: -60,
1681
- left: -60,
1682
- width: 240,
1683
- height: 240,
1684
- borderRadius: "50%",
1685
- background: "rgba(255,255,255,0.04)",
1686
- pointerEvents: "none"
1687
- } }),
1688
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdContainer, { style: { position: "relative", zIndex: 1, width: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdTextBox.Hero, { label, title, description, ta: "center", align: "center", maw: 640, mx: "auto", pt: 80, pb: 64 }) })
1689
- ] }),
1690
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(Content, { children })
1948
+ ) })
1949
+ ]
1950
+ }
1951
+ ),
1952
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Content, { children })
1691
1953
  ] });
1692
1954
  }
1693
1955
  var PageLayout = {
@@ -1702,7 +1964,7 @@ var PageLayout = {
1702
1964
  };
1703
1965
 
1704
1966
  // ui/theme.ts
1705
- var import_core35 = require("@mantine/core");
1967
+ var import_core36 = require("@mantine/core");
1706
1968
  var primary = [
1707
1969
  "#e7f0fb",
1708
1970
  "#c8dcf4",
@@ -1752,33 +2014,53 @@ var slate = [
1752
2014
  "#0f172a"
1753
2015
  // 9 slate-900
1754
2016
  ];
1755
- var cyan = [
1756
- "#ecfeff",
1757
- "#cffafe",
1758
- "#a5f3fc",
1759
- "#67e8f9",
1760
- "#22d3ee",
1761
- "#06b6d4",
1762
- "#0891b2",
1763
- "#0e7490",
1764
- "#155e75",
1765
- "#164e63"
2017
+ var red = [
2018
+ "#fef2f2",
2019
+ // 0 red-50
2020
+ "#fee2e2",
2021
+ // 1 red-100
2022
+ "#fecaca",
2023
+ // 2 red-200
2024
+ "#fca5a5",
2025
+ // 3 red-300
2026
+ "#f87171",
2027
+ // 4 red-400
2028
+ "#ef4444",
2029
+ // 5 red-500
2030
+ "#dc2626",
2031
+ // 6 red-600
2032
+ "#b91c1c",
2033
+ // 7 red-700
2034
+ "#991b1b",
2035
+ // 8 red-800
2036
+ "#7f1d1d"
2037
+ // 9 red-900
1766
2038
  ];
1767
- var indigo = [
1768
- "#eef2ff",
1769
- "#e0e7ff",
1770
- "#c7d2fe",
1771
- "#a5b4fc",
1772
- "#818cf8",
1773
- "#6366f1",
1774
- "#4f46e5",
1775
- "#4338ca",
1776
- "#3730a3",
1777
- "#312e81"
2039
+ var green = [
2040
+ "#f0fdf4",
2041
+ // 0 green-50
2042
+ "#dcfce7",
2043
+ // 1 green-100
2044
+ "#bbf7d0",
2045
+ // 2 green-200
2046
+ "#86efac",
2047
+ // 3 green-300
2048
+ "#4ade80",
2049
+ // 4 green-400
2050
+ "#22c55e",
2051
+ // 5 green-500
2052
+ "#16a34a",
2053
+ // 6 green-600
2054
+ "#15803d",
2055
+ // 7 green-700
2056
+ "#166534",
2057
+ // 8 green-800
2058
+ "#14532d"
2059
+ // 9 green-900
1778
2060
  ];
1779
- var theme = (0, import_core35.createTheme)({
2061
+ var theme = (0, import_core36.createTheme)({
1780
2062
  /* ---- Color ---- */
1781
- colors: { primary, secondary, slate, cyan, indigo, dark: slate },
2063
+ colors: { primary, secondary, slate, red, green, dark: slate },
1782
2064
  primaryColor: "primary",
1783
2065
  primaryShade: { light: 6, dark: 5 },
1784
2066
  /* ---- Type ---- */
@@ -1788,20 +2070,20 @@ var theme = (0, import_core35.createTheme)({
1788
2070
  fontFamily: "'Noto Sans KR', ui-sans-serif, system-ui, sans-serif",
1789
2071
  fontWeight: "700",
1790
2072
  sizes: {
1791
- h1: { fontSize: (0, import_core35.rem)(48), lineHeight: "1.1", fontWeight: "900" },
1792
- h2: { fontSize: (0, import_core35.rem)(36), lineHeight: "1.1", fontWeight: "900" },
1793
- h3: { fontSize: (0, import_core35.rem)(28), lineHeight: "1.15", fontWeight: "700" },
1794
- h4: { fontSize: (0, import_core35.rem)(20), lineHeight: "1.3", fontWeight: "700" },
1795
- h5: { fontSize: (0, import_core35.rem)(16), lineHeight: "1.4", fontWeight: "700" },
1796
- h6: { fontSize: (0, import_core35.rem)(14), lineHeight: "1.4", fontWeight: "700" }
2073
+ h1: { fontSize: (0, import_core36.rem)(48), lineHeight: "1.1", fontWeight: "900" },
2074
+ h2: { fontSize: (0, import_core36.rem)(36), lineHeight: "1.1", fontWeight: "900" },
2075
+ h3: { fontSize: (0, import_core36.rem)(28), lineHeight: "1.15", fontWeight: "700" },
2076
+ h4: { fontSize: (0, import_core36.rem)(20), lineHeight: "1.3", fontWeight: "700" },
2077
+ h5: { fontSize: (0, import_core36.rem)(16), lineHeight: "1.4", fontWeight: "700" },
2078
+ h6: { fontSize: (0, import_core36.rem)(14), lineHeight: "1.4", fontWeight: "700" }
1797
2079
  }
1798
2080
  },
1799
2081
  fontSizes: {
1800
- xs: (0, import_core35.rem)(14),
1801
- sm: (0, import_core35.rem)(16),
1802
- md: (0, import_core35.rem)(18),
1803
- lg: (0, import_core35.rem)(20),
1804
- xl: (0, import_core35.rem)(22)
2082
+ xs: (0, import_core36.rem)(14),
2083
+ sm: (0, import_core36.rem)(16),
2084
+ md: (0, import_core36.rem)(18),
2085
+ lg: (0, import_core36.rem)(20),
2086
+ xl: (0, import_core36.rem)(22)
1805
2087
  },
1806
2088
  lineHeights: {
1807
2089
  xs: "1.4",
@@ -1812,18 +2094,18 @@ var theme = (0, import_core35.createTheme)({
1812
2094
  },
1813
2095
  defaultRadius: "md",
1814
2096
  radius: {
1815
- xs: (0, import_core35.rem)(6),
1816
- sm: (0, import_core35.rem)(8),
1817
- md: (0, import_core35.rem)(10),
1818
- lg: (0, import_core35.rem)(14),
1819
- xl: (0, import_core35.rem)(18)
2097
+ xs: (0, import_core36.rem)(6),
2098
+ sm: (0, import_core36.rem)(8),
2099
+ md: (0, import_core36.rem)(10),
2100
+ lg: (0, import_core36.rem)(14),
2101
+ xl: (0, import_core36.rem)(18)
1820
2102
  },
1821
2103
  spacing: {
1822
- xs: (0, import_core35.rem)(8),
1823
- sm: (0, import_core35.rem)(12),
1824
- md: (0, import_core35.rem)(16),
1825
- lg: (0, import_core35.rem)(24),
1826
- xl: (0, import_core35.rem)(32)
2104
+ xs: (0, import_core36.rem)(8),
2105
+ sm: (0, import_core36.rem)(12),
2106
+ md: (0, import_core36.rem)(16),
2107
+ lg: (0, import_core36.rem)(24),
2108
+ xl: (0, import_core36.rem)(32)
1827
2109
  },
1828
2110
  shadows: {
1829
2111
  xs: "0 1px 2px 0 rgb(0 0 0 / 0.05)",
@@ -1898,11 +2180,15 @@ var theme = (0, import_core35.createTheme)({
1898
2180
  defaultProps: { radius: "sm" }
1899
2181
  },
1900
2182
  Divider: {
1901
- defaultProps: { c: "slate.5", pb: "xl" }
2183
+ defaultProps: { c: "slate.5" }
1902
2184
  },
1903
2185
  Anchor: {
1904
2186
  defaultProps: { c: "slate.5", fz: "sm", underline: "never" }
1905
2187
  },
2188
+ // SdHeader 모바일 드로어의 2단 아코디언 타이포를 SdLink와 맞춘다.
2189
+ NavLink: {
2190
+ defaultProps: { c: "slate.7", fz: "sm" }
2191
+ },
1906
2192
  Table: {
1907
2193
  defaultProps: {
1908
2194
  captionSide: "bottom"
@@ -1920,33 +2206,63 @@ var theme = (0, import_core35.createTheme)({
1920
2206
  MainLayout,
1921
2207
  PageLayout,
1922
2208
  SdBadge,
2209
+ SdBadgeDefault,
2210
+ SdBadgePrimary,
2211
+ SdBadgeSuccess,
2212
+ SdBadgeWarning,
1923
2213
  SdButton,
1924
2214
  SdButtonCancel,
1925
2215
  SdButtonDelete,
2216
+ SdButtonDownload,
2217
+ SdButtonExcel,
1926
2218
  SdButtonGhost,
1927
2219
  SdButtonOutline,
1928
2220
  SdButtonPrimary,
1929
2221
  SdButtonSecondary,
2222
+ SdButtonSubmit,
1930
2223
  SdButtonWhite,
1931
2224
  SdClients,
1932
2225
  SdClientsGrid,
1933
2226
  SdClientsMarquee,
1934
2227
  SdContainer,
1935
2228
  SdCta,
2229
+ SdCtaBanner,
2230
+ SdCtaInline,
2231
+ SdCtaSubtle,
1936
2232
  SdErrorView,
2233
+ SdErrorViewNotFound,
2234
+ SdErrorViewPage,
1937
2235
  SdFaq,
2236
+ SdFaqDefault,
2237
+ SdFaqFilled,
2238
+ SdFaqWithHeader,
1938
2239
  SdFeatureSection,
1939
2240
  SdFeatures,
1940
2241
  SdFooter,
1941
2242
  SdHeader,
1942
2243
  SdInput,
2244
+ SdInputEmail,
2245
+ SdInputPassword,
2246
+ SdInputSelect,
2247
+ SdInputText,
2248
+ SdInputTextarea,
2249
+ SdLink,
2250
+ SdLinkBody,
2251
+ SdLinkHint,
2252
+ SdLinkStrong,
2253
+ SdLinkSub,
1943
2254
  SdMap,
1944
2255
  SdMapSingle,
1945
2256
  SdMapTabs,
1946
2257
  SdModal,
1947
2258
  SdNumberIcon,
1948
2259
  SdPricingCard,
2260
+ SdPricingCardDefault,
2261
+ SdPricingCardFeatured,
2262
+ SdPricingCardGrid,
1949
2263
  SdQuote,
2264
+ SdQuoteCard,
2265
+ SdQuotePlain,
1950
2266
  SdSkeleton,
1951
2267
  SdSkeletonAvatar,
1952
2268
  SdSkeletonCard,
@@ -1955,22 +2271,44 @@ var theme = (0, import_core35.createTheme)({
1955
2271
  SdSkeletonTitle,
1956
2272
  SdSolution,
1957
2273
  SdSolutionCard,
2274
+ SdSolutionCardGrid,
2275
+ SdSolutionCardItem,
2276
+ SdSolutionFiltered,
2277
+ SdSolutionList,
1958
2278
  SdSteps,
2279
+ SdStepsBubble,
2280
+ SdStepsCard,
1959
2281
  SdStepsSection,
2282
+ SdStepsStrip,
1960
2283
  SdTable,
2284
+ SdTableSpec,
1961
2285
  SdTabs,
1962
2286
  SdTabsOutline,
1963
2287
  SdTabsPills,
1964
2288
  SdTabsUnderline,
1965
2289
  SdTestimonial,
2290
+ SdTestimonialCard,
2291
+ SdTestimonialGrid,
2292
+ SdTestimonialStrip,
1966
2293
  SdText,
2294
+ SdTextBody,
1967
2295
  SdTextBox,
1968
2296
  SdTextBoxCard,
1969
2297
  SdTextBoxHero,
1970
2298
  SdTextBoxSection,
1971
2299
  SdTextBoxSub,
2300
+ SdTextError,
2301
+ SdTextEyebrow,
2302
+ SdTextHint,
2303
+ SdTextNumeric,
2304
+ SdTextStrong,
2305
+ SdTextSub,
1972
2306
  SdTimeline,
1973
2307
  SdTimelineSection,
1974
2308
  SdTitle,
2309
+ SdTitleCard,
2310
+ SdTitleDisplay,
2311
+ SdTitleSection,
2312
+ SdTitleSub,
1975
2313
  theme
1976
2314
  });