@yeongseoksong/framework 1.1.0 → 1.2.0

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,191 @@ 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");
1480
+ var import_jsx_runtime29 = require("react/jsx-runtime");
1481
+ var BAR_HEIGHT = 60;
1308
1482
  function SdHeader({ navItems, loginFlag, children }) {
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
+ children
1537
+ ] })
1538
+ ] }) })
1539
+ }
1540
+ ),
1541
+ /* @__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: [
1542
+ topItems.map((item) => {
1543
+ const kids = childrenOf(item.id);
1544
+ if (kids.length === 0) {
1545
+ 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);
1546
+ }
1547
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1548
+ import_core28.NavLink,
1549
+ {
1550
+ label: item.label,
1551
+ href: item.href,
1552
+ childrenOffset: 28,
1553
+ onClick: kids.length > 0 ? void 0 : close,
1554
+ children: kids.map((kid) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.NavLink, { label: kid.label, href: kid.href, onClick: close }, kid.id))
1555
+ },
1556
+ item.id
1557
+ );
1558
+ }),
1559
+ 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
1560
  ] }) })
1329
1561
  ] });
1330
1562
  }
1331
1563
 
1332
1564
  // ui/organism/Footer.tsx
1333
- var import_core28 = require("@mantine/core");
1334
- var import_jsx_runtime29 = require("react/jsx-runtime");
1565
+ var import_core29 = require("@mantine/core");
1566
+ var import_icons_react5 = require("@tabler/icons-react");
1567
+ var import_jsx_runtime30 = require("react/jsx-runtime");
1335
1568
  function FooterNavColumns({ items }) {
1336
1569
  const topLevel = items.filter((item) => !item.parentId);
1337
1570
  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,
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: "sm", children: [
1572
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdText.Sub, { children: group.label }),
1573
+ getChildren(group.id).map((link) => /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdLink.Hint, { href: link.href, children: link.label }, link.id))
1574
+ ] }) }, group.id)) });
1575
+ }
1576
+ var SOCIAL_ICONS = {
1577
+ x: import_icons_react5.IconBrandX,
1578
+ youtube: import_icons_react5.IconBrandYoutube,
1579
+ instagram: import_icons_react5.IconBrandInstagram,
1580
+ facebook: import_icons_react5.IconBrandFacebook,
1581
+ linkedin: import_icons_react5.IconBrandLinkedin,
1582
+ github: import_icons_react5.IconBrandGithub,
1583
+ blog: import_icons_react5.IconWorld
1584
+ };
1585
+ function FooterSocials({ items }) {
1586
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Group, { gap: 0, wrap: "nowrap", children: items.map((item) => {
1587
+ var _a4, _b;
1588
+ const Icon = (_a4 = SOCIAL_ICONS[item.platform]) != null ? _a4 : import_icons_react5.IconWorld;
1589
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
1590
+ import_core29.ActionIcon,
1342
1591
  {
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
1592
+ component: "a",
1593
+ href: item.url,
1594
+ target: "_blank",
1595
+ rel: "noreferrer",
1596
+ size: "lg",
1597
+ color: "gray",
1598
+ variant: "subtle",
1599
+ "aria-label": (_b = item.label) != null ? _b : item.platform,
1600
+ children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Icon, { size: 18, stroke: 1.5 })
1355
1601
  },
1356
- link.id
1357
- ))
1358
- ] }) }, group.id)) });
1602
+ item.url
1603
+ );
1604
+ }) });
1605
+ }
1606
+ function InfoCell({ label, children }) {
1607
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.Group, { gap: 6, wrap: "nowrap", align: "baseline", children: [
1608
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdText.Sub, { c: "slate.4", style: { whiteSpace: "nowrap" }, children: label }),
1609
+ typeof children === "string" ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdText.Sub, { children }) : children
1610
+ ] });
1359
1611
  }
1360
1612
  function FooterCompanyInfo({ company }) {
1361
1613
  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 })
1614
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.SimpleGrid, { cols: { base: 2, sm: 2, md: 1 }, spacing: "md", verticalSpacing: 0, children: [
1615
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(InfoCell, { label: "\uC0C1\uD638", children: company.name }),
1616
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(InfoCell, { label: "\uC0AC\uC5C5\uC790\uB4F1\uB85D\uBC88\uD638", children: company.registrationNumber }),
1617
+ sortedAddresses.map((addr) => /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(InfoCell, { label: addr.label, children: addr.address }, addr.label)),
1618
+ /* @__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 }) }),
1619
+ company.fax && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(InfoCell, { label: "Fax", children: company.fax }),
1620
+ /* @__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
1621
  ] });
1388
1622
  }
1389
1623
  function SdFooter({ company, navItems, policyLinks, description }) {
1390
1624
  const visibleNav = filterAndSort(navItems);
1391
1625
  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 }) }) })
1626
+ 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: [
1627
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Logo, { size: "sm" }),
1628
+ description && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdText.Sub, { children: description }),
1629
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.Flex, { direction: { base: "column", md: "row" }, gap: 48, align: "flex-start", children: [
1630
+ /* @__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 }) }),
1631
+ 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
1632
  ] }),
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: [
1633
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Divider, {}),
1634
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.Group, { justify: "space-between", wrap: "wrap", gap: "xs", children: [
1635
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(SdText.Sub, { children: [
1404
1636
  "\xA9 ",
1405
1637
  company.copyrightYear,
1406
1638
  " ",
1407
1639
  company.name,
1408
1640
  ". All rights reserved."
1409
1641
  ] }),
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
- )) })
1642
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.Group, { gap: "lg", wrap: "wrap", children: [
1643
+ visiblePolicy.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Group, { gap: "lg", children: visiblePolicy.map((item) => {
1644
+ const Link4 = item.highlight ? SdLink.Strong : SdLink.Sub;
1645
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Link4, { href: item.href, children: item.label }, item.id);
1646
+ }) }),
1647
+ company.socials && company.socials.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(FooterSocials, { items: company.socials })
1648
+ ] })
1422
1649
  ] })
1423
- ] }) });
1650
+ ] }) }) });
1424
1651
  }
1425
1652
 
1426
1653
  // ui/organism/FeatureSection.tsx
1427
- var import_core29 = require("@mantine/core");
1428
- var import_jsx_runtime30 = require("react/jsx-runtime");
1654
+ var import_core30 = require("@mantine/core");
1655
+ var import_jsx_runtime31 = require("react/jsx-runtime");
1429
1656
  function SdFeatureSection(_a4) {
1430
1657
  var _b = _a4, {
1431
1658
  label,
@@ -1442,8 +1669,8 @@ function SdFeatureSection(_a4) {
1442
1669
  "cols",
1443
1670
  "py"
1444
1671
  ]);
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)(
1672
+ 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: [
1673
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
1447
1674
  SdTextBox.Section,
1448
1675
  {
1449
1676
  label,
@@ -1454,13 +1681,13 @@ function SdFeatureSection(_a4) {
1454
1681
  align: "center"
1455
1682
  }
1456
1683
  ),
1457
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdFeatures, { items, cols })
1684
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdFeatures, { items, cols })
1458
1685
  ] }) }));
1459
1686
  }
1460
1687
 
1461
1688
  // ui/organism/TimelineSection.tsx
1462
- var import_core30 = require("@mantine/core");
1463
- var import_jsx_runtime31 = require("react/jsx-runtime");
1689
+ var import_core31 = require("@mantine/core");
1690
+ var import_jsx_runtime32 = require("react/jsx-runtime");
1464
1691
  function SdTimelineSection(_a4) {
1465
1692
  var _b = _a4, {
1466
1693
  label,
@@ -1475,22 +1702,15 @@ function SdTimelineSection(_a4) {
1475
1702
  "items",
1476
1703
  "py"
1477
1704
  ]);
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 }) })
1705
+ 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: [
1706
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdTextBox.Section, { label, title, description }),
1707
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core31.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdTimeline, { items }) })
1488
1708
  ] })) });
1489
1709
  }
1490
1710
 
1491
1711
  // ui/organism/StepsSection.tsx
1492
- var import_core31 = require("@mantine/core");
1493
- var import_jsx_runtime32 = require("react/jsx-runtime");
1712
+ var import_core32 = require("@mantine/core");
1713
+ var import_jsx_runtime33 = require("react/jsx-runtime");
1494
1714
  function SdStepsSection(_a4) {
1495
1715
  var _b = _a4, {
1496
1716
  label,
@@ -1505,18 +1725,18 @@ function SdStepsSection(_a4) {
1505
1725
  "items",
1506
1726
  "py"
1507
1727
  ]);
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 })
1728
+ 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: [
1729
+ (label || title || description) && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdTextBox.Section, { label, title, description }),
1730
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdSteps.Bubble, { items })
1511
1731
  ] }) }));
1512
1732
  }
1513
1733
 
1514
1734
  // ui/organism/ErrorView.tsx
1515
- var import_core32 = require("@mantine/core");
1516
- var import_jsx_runtime33 = require("react/jsx-runtime");
1735
+ var import_core33 = require("@mantine/core");
1736
+ var import_jsx_runtime34 = require("react/jsx-runtime");
1517
1737
  function StatusCode({ code }) {
1518
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
1519
- import_core32.Text,
1738
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
1739
+ import_core33.Text,
1520
1740
  {
1521
1741
  fz: 160,
1522
1742
  fw: 900,
@@ -1529,15 +1749,15 @@ function StatusCode({ code }) {
1529
1749
  );
1530
1750
  }
1531
1751
  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." })
1752
+ 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: [
1753
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(StatusCode, { code: "500" }),
1754
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core33.Stack, { gap: "sm", align: "center", children: [
1755
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdTitle.Section, { children: "\uC11C\uBC84\uC5D0\uC11C \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4" }),
1756
+ /* @__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
1757
  ] }),
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" })
1758
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core33.Group, { gap: "sm", justify: "center", children: [
1759
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdButton.Primary, { onClick: onReset, children: "\uB2E4\uC2DC \uC2DC\uB3C4" }),
1760
+ onHome && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdButton.Ghost, { onClick: onHome, children: "\uD648\uC73C\uB85C" })
1541
1761
  ] })
1542
1762
  ] }) }) });
1543
1763
  }
@@ -1549,15 +1769,15 @@ function NotFound({
1549
1769
  },
1550
1770
  onBack = () => window.history.back()
1551
1771
  }) {
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 })
1772
+ 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: [
1773
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(StatusCode, { code: "404" }),
1774
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core33.Stack, { gap: "sm", align: "center", children: [
1775
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdTitle.Section, { children: title }),
1776
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdText.Body, { maw: 480, children: description })
1557
1777
  ] }),
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" })
1778
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core33.Group, { gap: "sm", justify: "center", children: [
1779
+ onHome && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdButton.Primary, { onClick: onHome, children: "\uD648\uC73C\uB85C" }),
1780
+ onBack && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdButton.Ghost, { onClick: onBack, children: "\uB4A4\uB85C \uAC00\uAE30" })
1561
1781
  ] })
1562
1782
  ] }) }) });
1563
1783
  }
@@ -1567,127 +1787,165 @@ var SdErrorView = {
1567
1787
  /** app/not-found.tsx — 404 Not Found */
1568
1788
  NotFound
1569
1789
  };
1790
+ var SdErrorViewPage = SdErrorView.Page;
1791
+ var SdErrorViewNotFound = SdErrorView.NotFound;
1570
1792
 
1571
1793
  // 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 })
1794
+ var import_core34 = require("@mantine/core");
1795
+ var import_jsx_runtime35 = require("react/jsx-runtime");
1796
+ function MainLayout({
1797
+ children,
1798
+ navItems,
1799
+ companyInfo
1800
+ }) {
1801
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core34.AppShell, { header: { height: 60 }, children: [
1802
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core34.AppShell.Header, { children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdHeader, { navItems, loginFlag: true }) }),
1803
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core34.AppShell.Main, { children }),
1804
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdFooter, { company: companyInfo, navItems })
1579
1805
  ] });
1580
1806
  }
1581
1807
 
1582
1808
  // ui/template/PageLayout.tsx
1583
- var import_core34 = require("@mantine/core");
1584
- var import_jsx_runtime35 = require("react/jsx-runtime");
1809
+ var import_core35 = require("@mantine/core");
1810
+ var import_jsx_runtime36 = require("react/jsx-runtime");
1585
1811
  function Content({ children }) {
1586
- return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdContainer, { py: "xl", children });
1812
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdContainer, { py: "xl", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core35.Stack, { gap: "xl", children }) });
1587
1813
  }
1588
1814
  function LayoutGap() {
1589
- return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core34.Space, { h: 48 });
1815
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core35.Space, { h: 48 });
1590
1816
  }
1591
1817
  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, {}),
1818
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_jsx_runtime36.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(Plain2, { children: [
1819
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdTextBox.Section, { label, title, description: description != null ? description : "" }),
1820
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core35.Divider, {}),
1603
1821
  children
1604
1822
  ] }) });
1605
1823
  }
1606
1824
  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 })
1825
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_jsx_runtime36.Fragment, { children: [
1826
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(LayoutGap, {}),
1827
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Content, { children })
1610
1828
  ] });
1611
1829
  }
1612
1830
  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)(
1831
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_jsx_runtime36.Fragment, { children: [
1832
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
1833
+ import_core35.Box,
1834
+ {
1835
+ style: {
1836
+ position: "relative",
1837
+ minHeight: "30svh",
1838
+ display: "flex",
1839
+ alignItems: "center",
1840
+ backgroundImage: image ? `url(${image})` : void 0,
1841
+ backgroundSize: "cover",
1842
+ backgroundPosition: "center",
1843
+ backgroundColor: "var(--mantine-color-slate-9)"
1844
+ },
1845
+ children: [
1846
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
1847
+ import_core35.Box,
1848
+ {
1849
+ style: {
1850
+ position: "absolute",
1851
+ inset: 0,
1852
+ background: "rgba(0, 0, 0, 0.55)"
1853
+ }
1854
+ }
1855
+ ),
1856
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdContainer, { style: { position: "relative", zIndex: 1, width: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
1857
+ import_core35.Box,
1858
+ {
1859
+ py: 48,
1860
+ px: 40,
1861
+ maw: 420,
1862
+ style: {
1863
+ backdropFilter: "blur(24px)",
1864
+ WebkitBackdropFilter: "blur(24px)",
1865
+ background: "rgba(255,255,255,0.10)",
1866
+ borderRadius: "var(--mantine-radius-md)",
1867
+ border: "1px solid rgba(255,255,255,0.18)"
1868
+ },
1869
+ children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
1870
+ SdTextBox.Hero,
1871
+ {
1872
+ label,
1873
+ title,
1874
+ description,
1875
+ ta: "left",
1876
+ align: "flex-start"
1877
+ }
1878
+ )
1879
+ }
1880
+ ) })
1881
+ ]
1882
+ }
1883
+ ),
1884
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Content, { children })
1885
+ ] });
1886
+ }
1887
+ function Brand({ label, title, description, children }) {
1888
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_jsx_runtime36.Fragment, { children: [
1889
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
1890
+ import_core35.Box,
1891
+ {
1892
+ style: {
1893
+ position: "relative",
1894
+ minHeight: "40svh",
1895
+ display: "flex",
1896
+ alignItems: "center",
1897
+ overflow: "hidden",
1898
+ background: "linear-gradient(135deg, var(--mantine-color-primary-8) 0%, var(--mantine-color-primary-6) 50%, var(--mantine-color-primary-4) 100%)"
1899
+ },
1900
+ children: [
1901
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
1902
+ import_core35.Box,
1903
+ {
1904
+ style: {
1905
+ position: "absolute",
1906
+ top: -80,
1907
+ right: -80,
1908
+ width: 360,
1909
+ height: 360,
1910
+ borderRadius: "50%",
1911
+ background: "rgba(255,255,255,0.06)",
1912
+ pointerEvents: "none"
1913
+ }
1914
+ }
1915
+ ),
1916
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
1917
+ import_core35.Box,
1918
+ {
1919
+ style: {
1920
+ position: "absolute",
1921
+ bottom: -60,
1922
+ left: -60,
1923
+ width: 240,
1924
+ height: 240,
1925
+ borderRadius: "50%",
1926
+ background: "rgba(255,255,255,0.04)",
1927
+ pointerEvents: "none"
1928
+ }
1929
+ }
1930
+ ),
1931
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdContainer, { style: { position: "relative", zIndex: 1, width: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
1643
1932
  SdTextBox.Hero,
1644
1933
  {
1645
1934
  label,
1646
1935
  title,
1647
1936
  description,
1648
- ta: "left",
1649
- align: "flex-start"
1937
+ ta: "center",
1938
+ align: "center",
1939
+ maw: 640,
1940
+ mx: "auto",
1941
+ pt: 80,
1942
+ pb: 64
1650
1943
  }
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 })
1944
+ ) })
1945
+ ]
1946
+ }
1947
+ ),
1948
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Content, { children })
1691
1949
  ] });
1692
1950
  }
1693
1951
  var PageLayout = {
@@ -1702,7 +1960,7 @@ var PageLayout = {
1702
1960
  };
1703
1961
 
1704
1962
  // ui/theme.ts
1705
- var import_core35 = require("@mantine/core");
1963
+ var import_core36 = require("@mantine/core");
1706
1964
  var primary = [
1707
1965
  "#e7f0fb",
1708
1966
  "#c8dcf4",
@@ -1776,7 +2034,7 @@ var indigo = [
1776
2034
  "#3730a3",
1777
2035
  "#312e81"
1778
2036
  ];
1779
- var theme = (0, import_core35.createTheme)({
2037
+ var theme = (0, import_core36.createTheme)({
1780
2038
  /* ---- Color ---- */
1781
2039
  colors: { primary, secondary, slate, cyan, indigo, dark: slate },
1782
2040
  primaryColor: "primary",
@@ -1788,20 +2046,20 @@ var theme = (0, import_core35.createTheme)({
1788
2046
  fontFamily: "'Noto Sans KR', ui-sans-serif, system-ui, sans-serif",
1789
2047
  fontWeight: "700",
1790
2048
  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" }
2049
+ h1: { fontSize: (0, import_core36.rem)(48), lineHeight: "1.1", fontWeight: "900" },
2050
+ h2: { fontSize: (0, import_core36.rem)(36), lineHeight: "1.1", fontWeight: "900" },
2051
+ h3: { fontSize: (0, import_core36.rem)(28), lineHeight: "1.15", fontWeight: "700" },
2052
+ h4: { fontSize: (0, import_core36.rem)(20), lineHeight: "1.3", fontWeight: "700" },
2053
+ h5: { fontSize: (0, import_core36.rem)(16), lineHeight: "1.4", fontWeight: "700" },
2054
+ h6: { fontSize: (0, import_core36.rem)(14), lineHeight: "1.4", fontWeight: "700" }
1797
2055
  }
1798
2056
  },
1799
2057
  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)
2058
+ xs: (0, import_core36.rem)(14),
2059
+ sm: (0, import_core36.rem)(16),
2060
+ md: (0, import_core36.rem)(18),
2061
+ lg: (0, import_core36.rem)(20),
2062
+ xl: (0, import_core36.rem)(22)
1805
2063
  },
1806
2064
  lineHeights: {
1807
2065
  xs: "1.4",
@@ -1812,18 +2070,18 @@ var theme = (0, import_core35.createTheme)({
1812
2070
  },
1813
2071
  defaultRadius: "md",
1814
2072
  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)
2073
+ xs: (0, import_core36.rem)(6),
2074
+ sm: (0, import_core36.rem)(8),
2075
+ md: (0, import_core36.rem)(10),
2076
+ lg: (0, import_core36.rem)(14),
2077
+ xl: (0, import_core36.rem)(18)
1820
2078
  },
1821
2079
  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)
2080
+ xs: (0, import_core36.rem)(8),
2081
+ sm: (0, import_core36.rem)(12),
2082
+ md: (0, import_core36.rem)(16),
2083
+ lg: (0, import_core36.rem)(24),
2084
+ xl: (0, import_core36.rem)(32)
1827
2085
  },
1828
2086
  shadows: {
1829
2087
  xs: "0 1px 2px 0 rgb(0 0 0 / 0.05)",
@@ -1898,11 +2156,15 @@ var theme = (0, import_core35.createTheme)({
1898
2156
  defaultProps: { radius: "sm" }
1899
2157
  },
1900
2158
  Divider: {
1901
- defaultProps: { c: "slate.5", pb: "xl" }
2159
+ defaultProps: { c: "slate.5" }
1902
2160
  },
1903
2161
  Anchor: {
1904
2162
  defaultProps: { c: "slate.5", fz: "sm", underline: "never" }
1905
2163
  },
2164
+ // SdHeader 모바일 드로어의 2단 아코디언 타이포를 SdLink와 맞춘다.
2165
+ NavLink: {
2166
+ defaultProps: { c: "slate.7", fz: "sm" }
2167
+ },
1906
2168
  Table: {
1907
2169
  defaultProps: {
1908
2170
  captionSide: "bottom"
@@ -1920,33 +2182,63 @@ var theme = (0, import_core35.createTheme)({
1920
2182
  MainLayout,
1921
2183
  PageLayout,
1922
2184
  SdBadge,
2185
+ SdBadgeDefault,
2186
+ SdBadgePrimary,
2187
+ SdBadgeSuccess,
2188
+ SdBadgeWarning,
1923
2189
  SdButton,
1924
2190
  SdButtonCancel,
1925
2191
  SdButtonDelete,
2192
+ SdButtonDownload,
2193
+ SdButtonExcel,
1926
2194
  SdButtonGhost,
1927
2195
  SdButtonOutline,
1928
2196
  SdButtonPrimary,
1929
2197
  SdButtonSecondary,
2198
+ SdButtonSubmit,
1930
2199
  SdButtonWhite,
1931
2200
  SdClients,
1932
2201
  SdClientsGrid,
1933
2202
  SdClientsMarquee,
1934
2203
  SdContainer,
1935
2204
  SdCta,
2205
+ SdCtaBanner,
2206
+ SdCtaInline,
2207
+ SdCtaSubtle,
1936
2208
  SdErrorView,
2209
+ SdErrorViewNotFound,
2210
+ SdErrorViewPage,
1937
2211
  SdFaq,
2212
+ SdFaqDefault,
2213
+ SdFaqFilled,
2214
+ SdFaqWithHeader,
1938
2215
  SdFeatureSection,
1939
2216
  SdFeatures,
1940
2217
  SdFooter,
1941
2218
  SdHeader,
1942
2219
  SdInput,
2220
+ SdInputEmail,
2221
+ SdInputPassword,
2222
+ SdInputSelect,
2223
+ SdInputText,
2224
+ SdInputTextarea,
2225
+ SdLink,
2226
+ SdLinkBody,
2227
+ SdLinkHint,
2228
+ SdLinkStrong,
2229
+ SdLinkSub,
1943
2230
  SdMap,
1944
2231
  SdMapSingle,
1945
2232
  SdMapTabs,
1946
2233
  SdModal,
1947
2234
  SdNumberIcon,
1948
2235
  SdPricingCard,
2236
+ SdPricingCardDefault,
2237
+ SdPricingCardFeatured,
2238
+ SdPricingCardGrid,
1949
2239
  SdQuote,
2240
+ SdQuoteCard,
2241
+ SdQuotePlain,
1950
2242
  SdSkeleton,
1951
2243
  SdSkeletonAvatar,
1952
2244
  SdSkeletonCard,
@@ -1955,22 +2247,44 @@ var theme = (0, import_core35.createTheme)({
1955
2247
  SdSkeletonTitle,
1956
2248
  SdSolution,
1957
2249
  SdSolutionCard,
2250
+ SdSolutionCardGrid,
2251
+ SdSolutionCardItem,
2252
+ SdSolutionFiltered,
2253
+ SdSolutionList,
1958
2254
  SdSteps,
2255
+ SdStepsBubble,
2256
+ SdStepsCard,
1959
2257
  SdStepsSection,
2258
+ SdStepsStrip,
1960
2259
  SdTable,
2260
+ SdTableSpec,
1961
2261
  SdTabs,
1962
2262
  SdTabsOutline,
1963
2263
  SdTabsPills,
1964
2264
  SdTabsUnderline,
1965
2265
  SdTestimonial,
2266
+ SdTestimonialCard,
2267
+ SdTestimonialGrid,
2268
+ SdTestimonialStrip,
1966
2269
  SdText,
2270
+ SdTextBody,
1967
2271
  SdTextBox,
1968
2272
  SdTextBoxCard,
1969
2273
  SdTextBoxHero,
1970
2274
  SdTextBoxSection,
1971
2275
  SdTextBoxSub,
2276
+ SdTextError,
2277
+ SdTextEyebrow,
2278
+ SdTextHint,
2279
+ SdTextNumeric,
2280
+ SdTextStrong,
2281
+ SdTextSub,
1972
2282
  SdTimeline,
1973
2283
  SdTimelineSection,
1974
2284
  SdTitle,
2285
+ SdTitleCard,
2286
+ SdTitleDisplay,
2287
+ SdTitleSection,
2288
+ SdTitleSub,
1975
2289
  theme
1976
2290
  });