@yeongseoksong/framework 1.0.2 → 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.mjs CHANGED
@@ -114,7 +114,11 @@ var SdTabs = {
114
114
  flexWrap: "wrap",
115
115
  justifyContent: "center"
116
116
  },
117
- tab: { fontWeight: "500", fontSize: "var(--mantine-h5-font-size)", paddingInline: "var(--mantine-spacing-lg)" }
117
+ tab: {
118
+ fontWeight: "500",
119
+ fontSize: "var(--mantine-h5-font-size)",
120
+ paddingInline: "var(--mantine-spacing-lg)"
121
+ }
118
122
  }
119
123
  }),
120
124
  Underline: createTabs({
@@ -122,7 +126,11 @@ var SdTabs = {
122
126
  color: "primary",
123
127
  styles: {
124
128
  list: { width: "fit-content", margin: "0 auto", gap: "var(--mantine-spacing-sm)" },
125
- tab: { fontWeight: "500", fontSize: "var(--mantine-h5-font-size)", paddingInline: "var(--mantine-spacing-lg)" }
129
+ tab: {
130
+ fontWeight: "500",
131
+ fontSize: "var(--mantine-h5-font-size)",
132
+ paddingInline: "var(--mantine-spacing-lg)"
133
+ }
126
134
  }
127
135
  }),
128
136
  Outline: createTabs({
@@ -131,7 +139,11 @@ var SdTabs = {
131
139
  radius: "md",
132
140
  styles: {
133
141
  list: { width: "fit-content", margin: "0 auto", gap: "var(--mantine-spacing-sm)" },
134
- tab: { fontWeight: "500", fontSize: "var(--mantine-h5-font-size)", paddingInline: "var(--mantine-spacing-lg)" }
142
+ tab: {
143
+ fontWeight: "500",
144
+ fontSize: "var(--mantine-h5-font-size)",
145
+ paddingInline: "var(--mantine-spacing-lg)"
146
+ }
135
147
  }
136
148
  })
137
149
  };
@@ -167,6 +179,10 @@ var SdTitle = {
167
179
  /** 소제목 */
168
180
  Sub: createTitle({ order: 5 })
169
181
  };
182
+ var SdTitleDisplay = SdTitle.Display;
183
+ var SdTitleSection = SdTitle.Section;
184
+ var SdTitleCard = SdTitle.Card;
185
+ var SdTitleSub = SdTitle.Sub;
170
186
 
171
187
  // ui/atom/Text.tsx
172
188
  import { Text as MantineText } from "@mantine/core";
@@ -182,20 +198,37 @@ var SdText = {
182
198
  Strong: createText({ fw: 700, c: "slate.9", fz: "md", style: { letterSpacing: "-0.04em" } }),
183
199
  Body: createText({ fw: 400, c: "slate.7", fz: "md", lh: 1.7 }),
184
200
  Sub: createText({ fw: 400, c: "slate.5", fz: "xs", lh: 1.6 }),
185
- Eyebrow: createText({ fw: 700, c: "primary.6", fz: "xs", style: { letterSpacing: "0.12em", textTransform: "uppercase" } }),
201
+ Eyebrow: createText({
202
+ fw: 700,
203
+ c: "primary.6",
204
+ fz: "xs",
205
+ style: { letterSpacing: "0.12em", textTransform: "uppercase" }
206
+ }),
186
207
  Error: createText({ fw: 400, c: "red.6", fz: "sm" }),
187
208
  Hint: createText({ fw: 400, c: "slate.4", fz: "xs", lh: 1.5 }),
188
- Numeric: createText({ fw: 700, c: "slate.8", fz: "md", style: { fontVariantNumeric: "tabular-nums", letterSpacing: "-0.02em" } })
209
+ Numeric: createText({
210
+ fw: 700,
211
+ c: "slate.8",
212
+ fz: "md",
213
+ style: { fontVariantNumeric: "tabular-nums", letterSpacing: "-0.02em" }
214
+ })
189
215
  };
216
+ var SdTextStrong = SdText.Strong;
217
+ var SdTextBody = SdText.Body;
218
+ var SdTextSub = SdText.Sub;
219
+ var SdTextEyebrow = SdText.Eyebrow;
220
+ var SdTextError = SdText.Error;
221
+ var SdTextHint = SdText.Hint;
222
+ var SdTextNumeric = SdText.Numeric;
190
223
 
191
224
  // ui/atom/Button.tsx
192
225
  import { Button as MantineButton } from "@mantine/core";
193
- import { IconTrash, IconX } from "@tabler/icons-react";
226
+ import { IconDownload, IconFileSpreadsheet, IconSend, IconTrash, IconX } from "@tabler/icons-react";
194
227
  import { jsx as jsx6 } from "react/jsx-runtime";
195
- function createButton(defaults) {
228
+ function createButton(defaults, defaultLabel) {
196
229
  return function SdButton2(_a4) {
197
230
  var _b = _a4, { children } = _b, props = __objRest(_b, ["children"]);
198
- return /* @__PURE__ */ jsx6(MantineButton, __spreadProps(__spreadValues(__spreadValues({}, defaults), props), { children }));
231
+ return /* @__PURE__ */ jsx6(MantineButton, __spreadProps(__spreadValues(__spreadValues({}, defaults), props), { children: children != null ? children : defaultLabel }));
199
232
  };
200
233
  }
201
234
  var SdButton = {
@@ -209,18 +242,37 @@ var SdButton = {
209
242
  Ghost: createButton({ variant: "subtle", color: "slate" }),
210
243
  /** 다크 배경 위 — white */
211
244
  White: createButton({ variant: "white" }),
212
- /** 삭제 filled red + 휴지통 아이콘 */
213
- Delete: createButton({ color: "red", leftSection: /* @__PURE__ */ jsx6(IconTrash, { size: 16 }) }),
214
- /** 취소 outline slate + X 아이콘 */
215
- Cancel: createButton({ variant: "outline", color: "slate", leftSection: /* @__PURE__ */ jsx6(IconX, { size: 16 }) })
245
+ // ── 표준 액션 버튼: 라벨·색·아이콘이 고정 (children으로 라벨 덮어쓰기 가능) ──
246
+ /** 전송 filled primary + 종이비행기 아이콘, 기본 라벨 "전송" */
247
+ Submit: createButton({ color: "primary", leftSection: /* @__PURE__ */ jsx6(IconSend, { size: 16 }) }, "\uC804\uC1A1"),
248
+ /** 삭제 filled red + 휴지통 아이콘, 기본 라벨 "삭제" */
249
+ Delete: createButton({ color: "red", leftSection: /* @__PURE__ */ jsx6(IconTrash, { size: 16 }) }, "\uC0AD\uC81C"),
250
+ /** 취소 — outline slate + X 아이콘, 기본 라벨 "취소" */
251
+ Cancel: createButton(
252
+ { variant: "outline", color: "slate", leftSection: /* @__PURE__ */ jsx6(IconX, { size: 16 }) },
253
+ "\uCDE8\uC18C"
254
+ ),
255
+ /** 엑셀 — outline green + 스프레드시트 아이콘, 기본 라벨 "엑셀" */
256
+ Excel: createButton(
257
+ { variant: "outline", color: "green", leftSection: /* @__PURE__ */ jsx6(IconFileSpreadsheet, { size: 16 }) },
258
+ "\uC5D1\uC140"
259
+ ),
260
+ /** 다운로드 — light primary + 다운로드 아이콘, 기본 라벨 "다운로드" */
261
+ Download: createButton(
262
+ { variant: "light", color: "primary", leftSection: /* @__PURE__ */ jsx6(IconDownload, { size: 16 }) },
263
+ "\uB2E4\uC6B4\uB85C\uB4DC"
264
+ )
216
265
  };
217
266
  var SdButtonPrimary = SdButton.Primary;
218
267
  var SdButtonSecondary = SdButton.Secondary;
219
268
  var SdButtonOutline = SdButton.Outline;
220
269
  var SdButtonGhost = SdButton.Ghost;
221
270
  var SdButtonWhite = SdButton.White;
271
+ var SdButtonSubmit = SdButton.Submit;
222
272
  var SdButtonDelete = SdButton.Delete;
223
273
  var SdButtonCancel = SdButton.Cancel;
274
+ var SdButtonExcel = SdButton.Excel;
275
+ var SdButtonDownload = SdButton.Download;
224
276
 
225
277
  // ui/atom/Quote.tsx
226
278
  import { Box as Box2, Card, Center, Group, Stack } from "@mantine/core";
@@ -249,6 +301,8 @@ var SdQuote = {
249
301
  Plain,
250
302
  Card: CardQuote
251
303
  };
304
+ var SdQuotePlain = SdQuote.Plain;
305
+ var SdQuoteCard = SdQuote.Card;
252
306
 
253
307
  // ui/atom/Table.tsx
254
308
  import { Table } from "@mantine/core";
@@ -296,6 +350,7 @@ var Spec = createTable(__spreadProps(__spreadValues({}, base), {
296
350
  Spec.Th = SpecTh;
297
351
  Spec.Td = SpecTd;
298
352
  var SdTable = Object.assign(createTable(base), { Spec });
353
+ var SdTableSpec = Spec;
299
354
 
300
355
  // ui/atom/Modal.tsx
301
356
  import { Modal } from "@mantine/core";
@@ -319,7 +374,17 @@ var SdModal = createModal({
319
374
  import { ThemeIcon } from "@mantine/core";
320
375
  import { jsx as jsx10 } from "react/jsx-runtime";
321
376
  function SdNumberIcon(_a4) {
322
- var _b = _a4, { value, size = 48, radius = "xl", color = "primary" } = _b, props = __objRest(_b, ["value", "size", "radius", "color"]);
377
+ var _b = _a4, {
378
+ value,
379
+ size = 48,
380
+ radius = "xl",
381
+ color = "primary"
382
+ } = _b, props = __objRest(_b, [
383
+ "value",
384
+ "size",
385
+ "radius",
386
+ "color"
387
+ ]);
323
388
  return /* @__PURE__ */ jsx10(ThemeIcon, __spreadProps(__spreadValues({ size, radius, color }, props), { children: /* @__PURE__ */ jsx10(SdText.Strong, { c: "white", children: value }) }));
324
389
  }
325
390
 
@@ -342,6 +407,10 @@ var SdBadge = {
342
407
  /** 주의/경고 */
343
408
  Warning: createBadge({ variant: "light", color: "orange" })
344
409
  };
410
+ var SdBadgeDefault = SdBadge.Default;
411
+ var SdBadgePrimary = SdBadge.Primary;
412
+ var SdBadgeSuccess = SdBadge.Success;
413
+ var SdBadgeWarning = SdBadge.Warning;
345
414
 
346
415
  // ui/atom/Input.tsx
347
416
  import {
@@ -358,19 +427,19 @@ function createTextInput(defaults) {
358
427
  };
359
428
  }
360
429
  function createTextarea(defaults) {
361
- return function SdInputTextarea(_a4) {
430
+ return function SdInputTextarea2(_a4) {
362
431
  var props = __objRest(_a4, []);
363
432
  return /* @__PURE__ */ jsx12(Textarea, __spreadValues(__spreadValues({}, defaults), props));
364
433
  };
365
434
  }
366
435
  function createPasswordInput(defaults) {
367
- return function SdInputPassword(_a4) {
436
+ return function SdInputPassword2(_a4) {
368
437
  var props = __objRest(_a4, []);
369
438
  return /* @__PURE__ */ jsx12(PasswordInput, __spreadValues(__spreadValues({}, defaults), props));
370
439
  };
371
440
  }
372
441
  function createSelect(defaults) {
373
- return function SdInputSelect(_a4) {
442
+ return function SdInputSelect2(_a4) {
374
443
  var props = __objRest(_a4, []);
375
444
  return /* @__PURE__ */ jsx12(Select, __spreadValues(__spreadValues({}, defaults), props));
376
445
  };
@@ -387,6 +456,11 @@ var SdInput = {
387
456
  /** 드롭다운 선택 */
388
457
  Select: createSelect({})
389
458
  };
459
+ var SdInputText = SdInput.Text;
460
+ var SdInputEmail = SdInput.Email;
461
+ var SdInputPassword = SdInput.Password;
462
+ var SdInputTextarea = SdInput.Textarea;
463
+ var SdInputSelect = SdInput.Select;
390
464
 
391
465
  // ui/atom/Skeleton.tsx
392
466
  import { Box as Box3, Skeleton as MantineSkeleton, Stack as Stack2 } from "@mantine/core";
@@ -412,7 +486,11 @@ function SkeletonCard({ height, lines = 3 }) {
412
486
  Box3,
413
487
  {
414
488
  p: "md",
415
- style: { borderRadius: "var(--mantine-radius-md)", border: "1px solid var(--mantine-color-gray-3)", height },
489
+ style: {
490
+ borderRadius: "var(--mantine-radius-md)",
491
+ border: "1px solid var(--mantine-color-gray-3)",
492
+ height
493
+ },
416
494
  children: /* @__PURE__ */ jsxs2(Stack2, { gap: "sm", children: [
417
495
  /* @__PURE__ */ jsx13(MantineSkeleton, { height: 20, width: "50%", radius: "sm" }),
418
496
  Array.from({ length: lines }).map((_, i) => /* @__PURE__ */ jsx13(
@@ -441,9 +519,60 @@ var SdSkeletonTitle = SkeletonTitle;
441
519
  var SdSkeletonImage = SkeletonImage;
442
520
  var SdSkeletonAvatar = SkeletonAvatar;
443
521
 
522
+ // ui/atom/Link.tsx
523
+ import { Anchor as MantineAnchor } from "@mantine/core";
524
+
525
+ // util/style.util.ts
526
+ function toCssColor(value) {
527
+ if (typeof value !== "string") return "";
528
+ return value.includes(".") ? `var(--mantine-color-${value.replace(".", "-")})` : value;
529
+ }
530
+
531
+ // ui/atom/Link.tsx
532
+ import { jsx as jsx14 } from "react/jsx-runtime";
533
+ var HOVER_COLOR = "var(--mantine-color-primary-6)";
534
+ function createLink(defaults) {
535
+ return function SdLink2(_a4) {
536
+ var _b = _a4, { children, onMouseEnter, onMouseLeave } = _b, props = __objRest(_b, ["children", "onMouseEnter", "onMouseLeave"]);
537
+ var _a5;
538
+ const baseColor = toCssColor((_a5 = props.c) != null ? _a5 : defaults.c);
539
+ const handleEnter = (e) => {
540
+ e.currentTarget.style.color = HOVER_COLOR;
541
+ onMouseEnter == null ? void 0 : onMouseEnter(e);
542
+ };
543
+ const handleLeave = (e) => {
544
+ e.currentTarget.style.color = baseColor;
545
+ onMouseLeave == null ? void 0 : onMouseLeave(e);
546
+ };
547
+ return /* @__PURE__ */ jsx14(
548
+ MantineAnchor,
549
+ __spreadProps(__spreadValues(__spreadValues({}, defaults), props), {
550
+ style: { transition: "color 0.15s" },
551
+ onMouseEnter: handleEnter,
552
+ onMouseLeave: handleLeave,
553
+ children
554
+ })
555
+ );
556
+ };
557
+ }
558
+ var SdLink = {
559
+ /** 최상위 강조 — 눈에 띄어야 하는 단일 링크 */
560
+ Strong: createLink({ fw: 700, c: "primary.6", fz: "xs", underline: "never" }),
561
+ /** 기본 — 본문·네비게이션 수준의 일반 링크 */
562
+ Body: createLink({ fw: 500, c: "slate.7", fz: 15, underline: "never" }),
563
+ /** 보조 — 연락처·정책 등 부가 정보 */
564
+ Sub: createLink({ fw: 400, c: "slate.5", fz: "xs", underline: "never" }),
565
+ /** 최소 강조 — 링크 목록처럼 밀도가 높고 톤을 낮춰야 하는 곳 */
566
+ Hint: createLink({ fw: 400, c: "slate.4", fz: "xs", underline: "never" })
567
+ };
568
+ var SdLinkStrong = SdLink.Strong;
569
+ var SdLinkBody = SdLink.Body;
570
+ var SdLinkSub = SdLink.Sub;
571
+ var SdLinkHint = SdLink.Hint;
572
+
444
573
  // ui/molecule/TextBox.tsx
445
574
  import { Stack as Stack3 } from "@mantine/core";
446
- import { jsx as jsx14, jsxs as jsxs3 } from "react/jsx-runtime";
575
+ import { jsx as jsx15, jsxs as jsxs3 } from "react/jsx-runtime";
447
576
  function createTextBox(titleVariant, defaultGap = "xs", descVariant = "Body", color_ = void 0) {
448
577
  return function SdTextBox2(_a4) {
449
578
  var _b = _a4, {
@@ -468,9 +597,9 @@ function createTextBox(titleVariant, defaultGap = "xs", descVariant = "Body", co
468
597
  const TitleComponent = SdTitle[variant];
469
598
  const DescComponent = SdText[descVariant];
470
599
  return /* @__PURE__ */ jsxs3(Stack3, __spreadProps(__spreadValues({ gap: defaultGap }, stackProps), { children: [
471
- label && /* @__PURE__ */ jsx14(SdText.Eyebrow, { children: label }),
472
- /* @__PURE__ */ jsx14(TitleComponent, { c: colorRes, children: title }),
473
- description && /* @__PURE__ */ jsx14(DescComponent, { c: colorRes, maw: maxDescWidth, mt: 4, children: description }),
600
+ label && /* @__PURE__ */ jsx15(SdText.Eyebrow, { children: label }),
601
+ /* @__PURE__ */ jsx15(TitleComponent, { c: colorRes, children: title }),
602
+ description && /* @__PURE__ */ jsx15(DescComponent, { c: colorRes, maw: maxDescWidth, mt: 4, children: description }),
474
603
  children
475
604
  ] }));
476
605
  };
@@ -495,77 +624,83 @@ function filterAndSort(items) {
495
624
  }
496
625
 
497
626
  // ui/molecule/Features.tsx
498
- import { jsx as jsx15, jsxs as jsxs4 } from "react/jsx-runtime";
627
+ import { jsx as jsx16, jsxs as jsxs4 } from "react/jsx-runtime";
499
628
  function SdFeatures({ items, cols = { base: 1, sm: 2, md: 3 } }) {
500
629
  const visible = filterAndSort(items);
501
- return /* @__PURE__ */ jsx15(SimpleGrid, { cols, spacing: "xl", children: visible.map((item) => /* @__PURE__ */ jsx15(
502
- Card2,
503
- {
504
- children: /* @__PURE__ */ jsxs4(Stack4, { gap: "sm", children: [
505
- item.icon,
506
- /* @__PURE__ */ jsx15(
507
- SdTextBox.Card,
508
- {
509
- label: item.label,
510
- title: item.title,
511
- description: item.description
512
- }
513
- )
514
- ] }, item.id)
515
- },
516
- item.id
517
- )) });
630
+ return /* @__PURE__ */ jsx16(SimpleGrid, { cols, spacing: "xl", children: visible.map((item) => /* @__PURE__ */ jsx16(Card2, { children: /* @__PURE__ */ jsxs4(Stack4, { gap: "sm", children: [
631
+ item.icon,
632
+ /* @__PURE__ */ jsx16(SdTextBox.Card, { label: item.label, title: item.title, description: item.description })
633
+ ] }, item.id) }, item.id)) });
518
634
  }
519
635
 
520
636
  // ui/molecule/Timeline.tsx
521
637
  import { Group as Group2, Stack as Stack5, Timeline as MantineTimeline } from "@mantine/core";
522
- import { jsx as jsx16, jsxs as jsxs5 } from "react/jsx-runtime";
638
+ import { jsx as jsx17, jsxs as jsxs5 } from "react/jsx-runtime";
523
639
  function SdTimeline({ items }) {
524
640
  const grouped = items.filter((item) => item.isShow).sort((a, b) => b.year - a.year || b.month - a.month).reduce((acc, item) => {
525
641
  var _a4, _b;
642
+ ;
526
643
  ((_b = acc[_a4 = item.year]) != null ? _b : acc[_a4] = []).push(item);
527
644
  return acc;
528
645
  }, {});
529
646
  const years = Object.keys(grouped).map(Number).sort((a, b) => b - a);
530
- return /* @__PURE__ */ jsx16(MantineTimeline, { active: items.length, bulletSize: 24, lineWidth: 2, children: years.map((year) => /* @__PURE__ */ jsx16(
531
- MantineTimeline.Item,
532
- {
533
- title: /* @__PURE__ */ jsxs5(SdTitle.Sub, { children: [
534
- year,
535
- "\uB144"
536
- ] }),
537
- children: /* @__PURE__ */ jsx16(Stack5, { gap: 6, mt: "xs", children: grouped[year].map((event) => /* @__PURE__ */ jsxs5(Group2, { gap: "md", align: "center", wrap: "nowrap", children: [
538
- /* @__PURE__ */ jsxs5(SdText.Eyebrow, { miw: 28, children: [
539
- event.month,
540
- "\uC6D4"
541
- ] }),
542
- /* @__PURE__ */ jsx16(SdText.Sub, { style: { flex: 1 }, children: event.description })
543
- ] }, event.id)) })
544
- },
545
- year
546
- )) });
647
+ return /* @__PURE__ */ jsx17(MantineTimeline, { active: items.length, bulletSize: 24, lineWidth: 2, children: years.map((year) => /* @__PURE__ */ jsx17(MantineTimeline.Item, { title: /* @__PURE__ */ jsxs5(SdTitle.Sub, { children: [
648
+ year,
649
+ "\uB144"
650
+ ] }), children: /* @__PURE__ */ jsx17(Stack5, { gap: 6, mt: "xs", children: grouped[year].map((event) => /* @__PURE__ */ jsxs5(Group2, { gap: "md", align: "center", wrap: "nowrap", children: [
651
+ /* @__PURE__ */ jsxs5(SdText.Eyebrow, { miw: 28, children: [
652
+ event.month,
653
+ "\uC6D4"
654
+ ] }),
655
+ /* @__PURE__ */ jsx17(SdText.Sub, { style: { flex: 1 }, children: event.description })
656
+ ] }, event.id)) }) }, year)) });
547
657
  }
548
658
 
549
659
  // ui/molecule/Steps.tsx
550
660
  import { Box as Box4, Card as Card3, Group as Group3, Stack as Stack6, ThemeIcon as ThemeIcon2 } from "@mantine/core";
551
661
  import { IconArrowDown, IconArrowRight } from "@tabler/icons-react";
552
662
  import { Fragment } from "react/jsx-runtime";
553
- import { Fragment as Fragment2, jsx as jsx17, jsxs as jsxs6 } from "react/jsx-runtime";
663
+ import { Fragment as Fragment2, jsx as jsx18, jsxs as jsxs6 } from "react/jsx-runtime";
554
664
  function BubbleStep({ item, index, isLast }) {
555
665
  return /* @__PURE__ */ jsxs6(Group3, { align: "flex-start", gap: "lg", wrap: "nowrap", children: [
556
- /* @__PURE__ */ jsxs6(Box4, { style: { display: "flex", flexDirection: "column", alignItems: "center", flexShrink: 0 }, children: [
557
- /* @__PURE__ */ jsx17(SdNumberIcon, { value: String(index + 1).padStart(2, "0") }),
558
- !isLast && /* @__PURE__ */ jsx17(Box4, { style: { width: 2, flex: 1, minHeight: 32, marginTop: 8, background: "var(--mantine-color-primary-2)" } })
559
- ] }),
560
- /* @__PURE__ */ jsx17(SdTextBox.Card, { title: item.title, description: item.description, pb: !isLast ? "xl" : 0, pt: 4 })
666
+ /* @__PURE__ */ jsxs6(
667
+ Box4,
668
+ {
669
+ style: { display: "flex", flexDirection: "column", alignItems: "center", flexShrink: 0 },
670
+ children: [
671
+ /* @__PURE__ */ jsx18(SdNumberIcon, { value: String(index + 1).padStart(2, "0") }),
672
+ !isLast && /* @__PURE__ */ jsx18(
673
+ Box4,
674
+ {
675
+ style: {
676
+ width: 2,
677
+ flex: 1,
678
+ minHeight: 32,
679
+ marginTop: 8,
680
+ background: "var(--mantine-color-primary-2)"
681
+ }
682
+ }
683
+ )
684
+ ]
685
+ }
686
+ ),
687
+ /* @__PURE__ */ jsx18(
688
+ SdTextBox.Card,
689
+ {
690
+ title: item.title,
691
+ description: item.description,
692
+ pb: !isLast ? "xl" : 0,
693
+ pt: 4
694
+ }
695
+ )
561
696
  ] });
562
697
  }
563
698
  function Bubble({ items }) {
564
- return /* @__PURE__ */ jsx17(Box4, { children: items.map((item, i) => /* @__PURE__ */ jsx17(BubbleStep, { item, index: i, isLast: i === items.length - 1 }, i)) });
699
+ return /* @__PURE__ */ jsx18(Box4, { children: items.map((item, i) => /* @__PURE__ */ jsx18(BubbleStep, { item, index: i, isLast: i === items.length - 1 }, i)) });
565
700
  }
566
701
  function CardStep({ item, index }) {
567
702
  return /* @__PURE__ */ jsxs6(Card3, { withBorder: true, radius: "md", p: 0, style: { height: "100%", overflow: "hidden" }, children: [
568
- /* @__PURE__ */ jsx17(
703
+ /* @__PURE__ */ jsx18(
569
704
  Box4,
570
705
  {
571
706
  py: "lg",
@@ -580,37 +715,40 @@ function CardStep({ item, index }) {
580
715
  ] })
581
716
  }
582
717
  ),
583
- /* @__PURE__ */ jsx17(Box4, { p: "lg", style: { textAlign: "center" }, children: /* @__PURE__ */ jsx17(SdTextBox.Card, { title: item.title, description: item.description }) })
718
+ /* @__PURE__ */ jsx18(Box4, { p: "lg", style: { textAlign: "center" }, children: /* @__PURE__ */ jsx18(SdTextBox.Card, { title: item.title, description: item.description }) })
584
719
  ] });
585
720
  }
586
721
  function CardArrow({ direction }) {
587
- return /* @__PURE__ */ jsx17(ThemeIcon2, { size: 36, radius: "xl", variant: "light", color: "primary", children: direction === "right" ? /* @__PURE__ */ jsx17(IconArrowRight, { size: 20, stroke: 2.5 }) : /* @__PURE__ */ jsx17(IconArrowDown, { size: 20, stroke: 2.5 }) });
722
+ return /* @__PURE__ */ jsx18(ThemeIcon2, { size: 36, radius: "xl", variant: "light", color: "primary", children: direction === "right" ? /* @__PURE__ */ jsx18(IconArrowRight, { size: 20, stroke: 2.5 }) : /* @__PURE__ */ jsx18(IconArrowDown, { size: 20, stroke: 2.5 }) });
588
723
  }
589
724
  function CardVariant({ items }) {
590
725
  return /* @__PURE__ */ jsxs6(Fragment2, { children: [
591
- /* @__PURE__ */ jsx17(Stack6, { gap: "sm", hiddenFrom: "sm", children: items.map((item, i) => /* @__PURE__ */ jsxs6(Fragment, { children: [
592
- /* @__PURE__ */ jsx17(CardStep, { item, index: i }),
593
- i < items.length - 1 && /* @__PURE__ */ jsx17(Box4, { style: { display: "flex", justifyContent: "center" }, children: /* @__PURE__ */ jsx17(CardArrow, { direction: "down" }) })
726
+ /* @__PURE__ */ jsx18(Stack6, { gap: "sm", hiddenFrom: "sm", children: items.map((item, i) => /* @__PURE__ */ jsxs6(Fragment, { children: [
727
+ /* @__PURE__ */ jsx18(CardStep, { item, index: i }),
728
+ i < items.length - 1 && /* @__PURE__ */ jsx18(Box4, { style: { display: "flex", justifyContent: "center" }, children: /* @__PURE__ */ jsx18(CardArrow, { direction: "down" }) })
594
729
  ] }, i)) }),
595
- /* @__PURE__ */ jsx17(Group3, { wrap: "nowrap", align: "stretch", gap: 0, visibleFrom: "sm", children: items.map((item, i) => /* @__PURE__ */ jsxs6(Fragment, { children: [
596
- /* @__PURE__ */ jsx17(Box4, { style: { flex: 1, minWidth: 0 }, children: /* @__PURE__ */ jsx17(CardStep, { item, index: i }) }),
597
- i < items.length - 1 && /* @__PURE__ */ jsx17(Box4, { style: { display: "flex", alignItems: "center", padding: "0 8px" }, children: /* @__PURE__ */ jsx17(CardArrow, { direction: "right" }) })
730
+ /* @__PURE__ */ jsx18(Group3, { wrap: "nowrap", align: "stretch", gap: 0, visibleFrom: "sm", children: items.map((item, i) => /* @__PURE__ */ jsxs6(Fragment, { children: [
731
+ /* @__PURE__ */ jsx18(Box4, { style: { flex: 1, minWidth: 0 }, children: /* @__PURE__ */ jsx18(CardStep, { item, index: i }) }),
732
+ i < items.length - 1 && /* @__PURE__ */ jsx18(Box4, { style: { display: "flex", alignItems: "center", padding: "0 8px" }, children: /* @__PURE__ */ jsx18(CardArrow, { direction: "right" }) })
598
733
  ] }, i)) })
599
734
  ] });
600
735
  }
601
736
  function StripStep({ item, index }) {
602
- return /* @__PURE__ */ jsx17(Box4, { pl: "md", style: { borderLeft: "3px solid var(--mantine-color-primary-6)" }, children: /* @__PURE__ */ jsxs6(Stack6, { gap: 4, children: [
737
+ return /* @__PURE__ */ jsx18(Box4, { pl: "md", style: { borderLeft: "3px solid var(--mantine-color-primary-6)" }, children: /* @__PURE__ */ jsxs6(Stack6, { gap: 4, children: [
603
738
  /* @__PURE__ */ jsxs6(SdText.Eyebrow, { children: [
604
739
  "STEP ",
605
740
  String(index + 1).padStart(2, "0")
606
741
  ] }),
607
- /* @__PURE__ */ jsx17(SdTextBox.Card, { title: item.title, description: item.description })
742
+ /* @__PURE__ */ jsx18(SdTextBox.Card, { title: item.title, description: item.description })
608
743
  ] }) });
609
744
  }
610
745
  function Strip({ items }) {
611
- return /* @__PURE__ */ jsx17(Stack6, { gap: "xl", children: items.map((item, i) => /* @__PURE__ */ jsx17(StripStep, { item, index: i }, i)) });
746
+ return /* @__PURE__ */ jsx18(Stack6, { gap: "xl", children: items.map((item, i) => /* @__PURE__ */ jsx18(StripStep, { item, index: i }, i)) });
612
747
  }
613
748
  var SdSteps = { Bubble, Card: CardVariant, Strip };
749
+ var SdStepsBubble = SdSteps.Bubble;
750
+ var SdStepsCard = SdSteps.Card;
751
+ var SdStepsStrip = SdSteps.Strip;
614
752
 
615
753
  // ui/molecule/Testimonial.tsx
616
754
  import {
@@ -622,13 +760,13 @@ import {
622
760
  SimpleGrid as SimpleGrid2,
623
761
  Stack as Stack7
624
762
  } from "@mantine/core";
625
- import { jsx as jsx18, jsxs as jsxs7 } from "react/jsx-runtime";
763
+ import { jsx as jsx19, jsxs as jsxs7 } from "react/jsx-runtime";
626
764
  function AuthorRow({ item }) {
627
765
  return /* @__PURE__ */ jsxs7(Group4, { gap: "sm", wrap: "nowrap", children: [
628
- item.avatar && /* @__PURE__ */ jsx18(Avatar, { src: item.avatar, size: "md", radius: "xl" }),
629
- !item.avatar && /* @__PURE__ */ jsx18(Avatar, { size: "md", radius: "xl", color: "primary", children: item.name.charAt(0) }),
766
+ item.avatar && /* @__PURE__ */ jsx19(Avatar, { src: item.avatar, size: "md", radius: "xl" }),
767
+ !item.avatar && /* @__PURE__ */ jsx19(Avatar, { size: "md", radius: "xl", color: "primary", children: item.name.charAt(0) }),
630
768
  /* @__PURE__ */ jsxs7(Stack7, { gap: 0, children: [
631
- /* @__PURE__ */ jsx18(SdText.Strong, { fz: "sm", children: item.name }),
769
+ /* @__PURE__ */ jsx19(SdText.Strong, { fz: "sm", children: item.name }),
632
770
  /* @__PURE__ */ jsxs7(SdText.Sub, { children: [
633
771
  item.role,
634
772
  item.company ? ` \xB7 ${item.company}` : ""
@@ -638,28 +776,28 @@ function AuthorRow({ item }) {
638
776
  }
639
777
  function CardTestimonial(_a4) {
640
778
  var _b = _a4, { item } = _b, boxProps = __objRest(_b, ["item"]);
641
- return /* @__PURE__ */ jsx18(Card4, __spreadProps(__spreadValues({ h: "100%" }, boxProps), { children: /* @__PURE__ */ jsxs7(Stack7, { gap: "md", h: "100%", children: [
642
- item.rating && /* @__PURE__ */ jsx18(Rating, { value: item.rating, readOnly: true, size: "sm", color: "primary" }),
779
+ return /* @__PURE__ */ jsx19(Card4, __spreadProps(__spreadValues({ h: "100%" }, boxProps), { children: /* @__PURE__ */ jsxs7(Stack7, { gap: "md", h: "100%", children: [
780
+ item.rating && /* @__PURE__ */ jsx19(Rating, { value: item.rating, readOnly: true, size: "sm", color: "primary" }),
643
781
  /* @__PURE__ */ jsxs7(Stack7, { gap: "xs", style: { flex: 1 }, children: [
644
- /* @__PURE__ */ jsx18(SdTitle.Display, { c: "primary.6", lh: 0.8, "aria-hidden": true, children: "\u201C" }),
645
- item.lines.map((line, i) => /* @__PURE__ */ jsx18(SdText.Body, { children: line }, i))
782
+ /* @__PURE__ */ jsx19(SdTitle.Display, { c: "primary.6", lh: 0.8, "aria-hidden": true, children: "\u201C" }),
783
+ item.lines.map((line, i) => /* @__PURE__ */ jsx19(SdText.Body, { children: line }, i))
646
784
  ] }),
647
- /* @__PURE__ */ jsx18(AuthorRow, { item })
785
+ /* @__PURE__ */ jsx19(AuthorRow, { item })
648
786
  ] }) }));
649
787
  }
650
788
  function Strip2(_a4) {
651
789
  var _b = _a4, { item } = _b, boxProps = __objRest(_b, ["item"]);
652
- return /* @__PURE__ */ jsx18(Box5, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ jsxs7(Stack7, { gap: "md", children: [
653
- item.rating && /* @__PURE__ */ jsx18(Rating, { value: item.rating, readOnly: true, size: "sm", color: "primary" }),
790
+ return /* @__PURE__ */ jsx19(Box5, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ jsxs7(Stack7, { gap: "md", children: [
791
+ item.rating && /* @__PURE__ */ jsx19(Rating, { value: item.rating, readOnly: true, size: "sm", color: "primary" }),
654
792
  /* @__PURE__ */ jsxs7(Group4, { gap: 4, align: "flex-start", children: [
655
- /* @__PURE__ */ jsx18(SdTitle.Display, { c: "primary.6", lh: 0.8, "aria-hidden": true, children: "\u201C" }),
656
- /* @__PURE__ */ jsx18(Stack7, { gap: "xs", style: { flex: 1 }, children: item.lines.map((line, i) => /* @__PURE__ */ jsx18(SdText.Body, { children: line }, i)) })
793
+ /* @__PURE__ */ jsx19(SdTitle.Display, { c: "primary.6", lh: 0.8, "aria-hidden": true, children: "\u201C" }),
794
+ /* @__PURE__ */ jsx19(Stack7, { gap: "xs", style: { flex: 1 }, children: item.lines.map((line, i) => /* @__PURE__ */ jsx19(SdText.Body, { children: line }, i)) })
657
795
  ] }),
658
- /* @__PURE__ */ jsx18(AuthorRow, { item })
796
+ /* @__PURE__ */ jsx19(AuthorRow, { item })
659
797
  ] }) }));
660
798
  }
661
799
  function Grid({ items, cols = { base: 1, sm: 2, md: 3 } }) {
662
- return /* @__PURE__ */ jsx18(SimpleGrid2, { cols, spacing: "xl", style: { alignItems: "stretch" }, children: items.map((item, i) => /* @__PURE__ */ jsx18(CardTestimonial, { item }, i)) });
800
+ return /* @__PURE__ */ jsx19(SimpleGrid2, { cols, spacing: "xl", style: { alignItems: "stretch" }, children: items.map((item, i) => /* @__PURE__ */ jsx19(CardTestimonial, { item }, i)) });
663
801
  }
664
802
  var SdTestimonial = {
665
803
  /** 카드형 — 그리드 배치용 */
@@ -669,6 +807,9 @@ var SdTestimonial = {
669
807
  /** 카드 그리드 — 여러 후기 목록 */
670
808
  Grid
671
809
  };
810
+ var SdTestimonialCard = SdTestimonial.Card;
811
+ var SdTestimonialStrip = SdTestimonial.Strip;
812
+ var SdTestimonialGrid = SdTestimonial.Grid;
672
813
 
673
814
  // ui/molecule/PricingCard.tsx
674
815
  import {
@@ -680,110 +821,80 @@ import {
680
821
  ThemeIcon as ThemeIcon3
681
822
  } from "@mantine/core";
682
823
  import { IconCheck, IconX as IconX2 } from "@tabler/icons-react";
683
- import { jsx as jsx19, jsxs as jsxs8 } from "react/jsx-runtime";
824
+ import { jsx as jsx20, jsxs as jsxs8 } from "react/jsx-runtime";
684
825
  function Default(_a4) {
685
826
  var _b = _a4, { item, onSelect } = _b, cardProps = __objRest(_b, ["item", "onSelect"]);
686
827
  var _a5;
687
- return /* @__PURE__ */ jsx19(
688
- Card5,
689
- __spreadProps(__spreadValues({
690
- withBorder: true,
691
- style: { position: "relative" }
692
- }, cardProps), {
693
- children: /* @__PURE__ */ jsxs8(Stack8, { gap: "xl", children: [
694
- /* @__PURE__ */ jsxs8(Stack8, { gap: "xs", children: [
695
- /* @__PURE__ */ jsxs8(Group5, { justify: "space-between", align: "flex-start", children: [
696
- /* @__PURE__ */ jsx19(SdTitle.Card, { children: item.name }),
697
- item.isPopular && /* @__PURE__ */ jsx19(SdBadge.Primary, { children: "\uCD94\uCC9C" })
698
- ] }),
699
- item.description && /* @__PURE__ */ jsx19(SdText.Sub, { children: item.description })
700
- ] }),
701
- /* @__PURE__ */ jsxs8(Group5, { gap: 4, align: "baseline", children: [
702
- /* @__PURE__ */ jsx19(SdTitle.Display, { children: item.price }),
703
- item.period && /* @__PURE__ */ jsxs8(SdText.Sub, { children: [
704
- "/ ",
705
- item.period
706
- ] })
707
- ] }),
708
- /* @__PURE__ */ jsx19(Divider, {}),
709
- /* @__PURE__ */ jsx19(Stack8, { gap: "sm", children: item.features.map((f, i) => /* @__PURE__ */ jsxs8(Group5, { gap: "sm", wrap: "nowrap", children: [
710
- /* @__PURE__ */ jsx19(
711
- ThemeIcon3,
712
- {
713
- size: "xs",
714
- radius: "xl",
715
- color: f.included ? "primary" : "slate",
716
- variant: f.included ? "filled" : "subtle",
717
- children: f.included ? /* @__PURE__ */ jsx19(IconCheck, { size: 12 }) : /* @__PURE__ */ jsx19(IconX2, { size: 12 })
718
- }
719
- ),
720
- /* @__PURE__ */ jsx19(
721
- SdText.Body,
722
- {
723
- fz: "sm",
724
- c: f.included ? "slate.7" : "slate.4",
725
- children: f.text
726
- }
727
- )
728
- ] }, i)) }),
729
- /* @__PURE__ */ jsx19(SdButton.Outline, { fullWidth: true, onClick: () => onSelect == null ? void 0 : onSelect(item), children: (_a5 = item.ctaLabel) != null ? _a5 : "\uC2DC\uC791\uD558\uAE30" })
828
+ return /* @__PURE__ */ jsx20(Card5, __spreadProps(__spreadValues({ withBorder: true, style: { position: "relative" } }, cardProps), { children: /* @__PURE__ */ jsxs8(Stack8, { gap: "xl", children: [
829
+ /* @__PURE__ */ jsxs8(Stack8, { gap: "xs", children: [
830
+ /* @__PURE__ */ jsxs8(Group5, { justify: "space-between", align: "flex-start", children: [
831
+ /* @__PURE__ */ jsx20(SdTitle.Card, { children: item.name }),
832
+ item.isPopular && /* @__PURE__ */ jsx20(SdBadge.Primary, { children: "\uCD94\uCC9C" })
833
+ ] }),
834
+ item.description && /* @__PURE__ */ jsx20(SdText.Sub, { children: item.description })
835
+ ] }),
836
+ /* @__PURE__ */ jsxs8(Group5, { gap: 4, align: "baseline", children: [
837
+ /* @__PURE__ */ jsx20(SdTitle.Display, { children: item.price }),
838
+ item.period && /* @__PURE__ */ jsxs8(SdText.Sub, { children: [
839
+ "/ ",
840
+ item.period
730
841
  ] })
731
- })
732
- );
842
+ ] }),
843
+ /* @__PURE__ */ jsx20(Divider, {}),
844
+ /* @__PURE__ */ jsx20(Stack8, { gap: "sm", children: item.features.map((f, i) => /* @__PURE__ */ jsxs8(Group5, { gap: "sm", wrap: "nowrap", children: [
845
+ /* @__PURE__ */ jsx20(
846
+ ThemeIcon3,
847
+ {
848
+ size: "xs",
849
+ radius: "xl",
850
+ color: f.included ? "primary" : "slate",
851
+ variant: f.included ? "filled" : "subtle",
852
+ children: f.included ? /* @__PURE__ */ jsx20(IconCheck, { size: 12 }) : /* @__PURE__ */ jsx20(IconX2, { size: 12 })
853
+ }
854
+ ),
855
+ /* @__PURE__ */ jsx20(SdText.Body, { fz: "sm", c: f.included ? "slate.7" : "slate.4", children: f.text })
856
+ ] }, i)) }),
857
+ /* @__PURE__ */ jsx20(SdButton.Outline, { fullWidth: true, onClick: () => onSelect == null ? void 0 : onSelect(item), children: (_a5 = item.ctaLabel) != null ? _a5 : "\uC2DC\uC791\uD558\uAE30" })
858
+ ] }) }));
733
859
  }
734
860
  function Featured(_a4) {
735
861
  var _b = _a4, { item, onSelect } = _b, cardProps = __objRest(_b, ["item", "onSelect"]);
736
862
  var _a5;
737
- return /* @__PURE__ */ jsx19(
738
- Card5,
739
- __spreadProps(__spreadValues({
740
- bg: "primary.6",
741
- style: { position: "relative" }
742
- }, cardProps), {
743
- children: /* @__PURE__ */ jsxs8(Stack8, { gap: "xl", children: [
744
- /* @__PURE__ */ jsxs8(Stack8, { gap: "xs", children: [
745
- /* @__PURE__ */ jsxs8(Group5, { justify: "space-between", align: "flex-start", children: [
746
- /* @__PURE__ */ jsx19(SdTitle.Card, { c: "white", children: item.name }),
747
- item.isPopular && /* @__PURE__ */ jsx19(SdBadge.Default, { c: "white", style: { borderColor: "rgba(255,255,255,0.5)" }, children: "\uCD94\uCC9C" })
748
- ] }),
749
- item.description && /* @__PURE__ */ jsx19(SdText.Body, { c: "primary.1", children: item.description })
750
- ] }),
751
- /* @__PURE__ */ jsxs8(Group5, { gap: 4, align: "baseline", children: [
752
- /* @__PURE__ */ jsx19(SdTitle.Display, { c: "white", children: item.price }),
753
- item.period && /* @__PURE__ */ jsxs8(SdText.Body, { c: "primary.2", children: [
754
- "/ ",
755
- item.period
756
- ] })
757
- ] }),
758
- /* @__PURE__ */ jsx19(Divider, { color: "primary.4" }),
759
- /* @__PURE__ */ jsx19(Stack8, { gap: "sm", children: item.features.map((f, i) => /* @__PURE__ */ jsxs8(Group5, { gap: "sm", wrap: "nowrap", children: [
760
- /* @__PURE__ */ jsx19(
761
- ThemeIcon3,
762
- {
763
- size: "xs",
764
- radius: "xl",
765
- color: "white",
766
- variant: f.included ? "filled" : "subtle",
767
- children: f.included ? /* @__PURE__ */ jsx19(IconCheck, { size: 12, color: "var(--mantine-color-primary-6)" }) : /* @__PURE__ */ jsx19(IconX2, { size: 12, color: "rgba(255,255,255,0.4)" })
768
- }
769
- ),
770
- /* @__PURE__ */ jsx19(
771
- SdText.Body,
772
- {
773
- fz: "sm",
774
- c: f.included ? "white" : "primary.3",
775
- children: f.text
776
- }
777
- )
778
- ] }, i)) }),
779
- /* @__PURE__ */ jsx19(SdButton.White, { fullWidth: true, onClick: () => onSelect == null ? void 0 : onSelect(item), children: (_a5 = item.ctaLabel) != null ? _a5 : "\uC2DC\uC791\uD558\uAE30" })
863
+ return /* @__PURE__ */ jsx20(Card5, __spreadProps(__spreadValues({ bg: "primary.6", style: { position: "relative" } }, cardProps), { children: /* @__PURE__ */ jsxs8(Stack8, { gap: "xl", children: [
864
+ /* @__PURE__ */ jsxs8(Stack8, { gap: "xs", children: [
865
+ /* @__PURE__ */ jsxs8(Group5, { justify: "space-between", align: "flex-start", children: [
866
+ /* @__PURE__ */ jsx20(SdTitle.Card, { c: "white", children: item.name }),
867
+ item.isPopular && /* @__PURE__ */ jsx20(SdBadge.Default, { c: "white", style: { borderColor: "rgba(255,255,255,0.5)" }, children: "\uCD94\uCC9C" })
868
+ ] }),
869
+ item.description && /* @__PURE__ */ jsx20(SdText.Body, { c: "primary.1", children: item.description })
870
+ ] }),
871
+ /* @__PURE__ */ jsxs8(Group5, { gap: 4, align: "baseline", children: [
872
+ /* @__PURE__ */ jsx20(SdTitle.Display, { c: "white", children: item.price }),
873
+ item.period && /* @__PURE__ */ jsxs8(SdText.Body, { c: "primary.2", children: [
874
+ "/ ",
875
+ item.period
780
876
  ] })
781
- })
782
- );
877
+ ] }),
878
+ /* @__PURE__ */ jsx20(Divider, { color: "primary.4" }),
879
+ /* @__PURE__ */ jsx20(Stack8, { gap: "sm", children: item.features.map((f, i) => /* @__PURE__ */ jsxs8(Group5, { gap: "sm", wrap: "nowrap", children: [
880
+ /* @__PURE__ */ jsx20(
881
+ ThemeIcon3,
882
+ {
883
+ size: "xs",
884
+ radius: "xl",
885
+ color: "white",
886
+ variant: f.included ? "filled" : "subtle",
887
+ children: f.included ? /* @__PURE__ */ jsx20(IconCheck, { size: 12, color: "var(--mantine-color-primary-6)" }) : /* @__PURE__ */ jsx20(IconX2, { size: 12, color: "rgba(255,255,255,0.4)" })
888
+ }
889
+ ),
890
+ /* @__PURE__ */ jsx20(SdText.Body, { fz: "sm", c: f.included ? "white" : "primary.3", children: f.text })
891
+ ] }, i)) }),
892
+ /* @__PURE__ */ jsx20(SdButton.White, { fullWidth: true, onClick: () => onSelect == null ? void 0 : onSelect(item), children: (_a5 = item.ctaLabel) != null ? _a5 : "\uC2DC\uC791\uD558\uAE30" })
893
+ ] }) }));
783
894
  }
784
895
  function Grid2({ items, cols = { base: 1, sm: 2, md: 3 }, onSelect }) {
785
- return /* @__PURE__ */ jsx19(SimpleGrid3, { cols, spacing: "xl", style: { alignItems: "stretch" }, children: items.map(
786
- (item, i) => item.isPopular ? /* @__PURE__ */ jsx19(Featured, { item, onSelect }, i) : /* @__PURE__ */ jsx19(Default, { item, onSelect }, i)
896
+ return /* @__PURE__ */ jsx20(SimpleGrid3, { cols, spacing: "xl", style: { alignItems: "stretch" }, children: items.map(
897
+ (item, i) => item.isPopular ? /* @__PURE__ */ jsx20(Featured, { item, onSelect }, i) : /* @__PURE__ */ jsx20(Default, { item, onSelect }, i)
787
898
  ) });
788
899
  }
789
900
  var SdPricingCard = {
@@ -794,33 +905,36 @@ var SdPricingCard = {
794
905
  /** 가격 그리드 (isPopular 항목은 자동으로 Featured 처리) */
795
906
  Grid: Grid2
796
907
  };
908
+ var SdPricingCardDefault = SdPricingCard.Default;
909
+ var SdPricingCardFeatured = SdPricingCard.Featured;
910
+ var SdPricingCardGrid = SdPricingCard.Grid;
797
911
 
798
912
  // ui/molecule/Faq.tsx
799
913
  import { Accordion, Box as Box7, Stack as Stack9 } from "@mantine/core";
800
- import { jsx as jsx20, jsxs as jsxs9 } from "react/jsx-runtime";
914
+ import { jsx as jsx21, jsxs as jsxs9 } from "react/jsx-runtime";
801
915
  function Default2(_a4) {
802
916
  var _b = _a4, { items } = _b, boxProps = __objRest(_b, ["items"]);
803
- return /* @__PURE__ */ jsx20(Box7, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ jsx20(Accordion, { variant: "separated", radius: "md", children: items.map((item, i) => /* @__PURE__ */ jsxs9(Accordion.Item, { value: String(i), children: [
804
- /* @__PURE__ */ jsx20(Accordion.Control, { children: /* @__PURE__ */ jsx20(SdText.Strong, { fz: "sm", children: item.question }) }),
805
- /* @__PURE__ */ jsx20(Accordion.Panel, { children: /* @__PURE__ */ jsx20(SdText.Body, { fz: "sm", children: item.answer }) })
917
+ return /* @__PURE__ */ jsx21(Box7, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ jsx21(Accordion, { variant: "separated", radius: "md", children: items.map((item, i) => /* @__PURE__ */ jsxs9(Accordion.Item, { value: String(i), children: [
918
+ /* @__PURE__ */ jsx21(Accordion.Control, { children: /* @__PURE__ */ jsx21(SdText.Strong, { fz: "sm", children: item.question }) }),
919
+ /* @__PURE__ */ jsx21(Accordion.Panel, { children: /* @__PURE__ */ jsx21(SdText.Body, { fz: "sm", children: item.answer }) })
806
920
  ] }, i)) }) }));
807
921
  }
808
922
  function Filled(_a4) {
809
923
  var _b = _a4, { items } = _b, boxProps = __objRest(_b, ["items"]);
810
- return /* @__PURE__ */ jsx20(Box7, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ jsx20(Accordion, { variant: "filled", radius: "md", children: items.map((item, i) => /* @__PURE__ */ jsxs9(Accordion.Item, { value: String(i), children: [
811
- /* @__PURE__ */ jsx20(Accordion.Control, { children: /* @__PURE__ */ jsx20(SdText.Strong, { fz: "sm", children: item.question }) }),
812
- /* @__PURE__ */ jsx20(Accordion.Panel, { children: /* @__PURE__ */ jsx20(SdText.Body, { fz: "sm", children: item.answer }) })
924
+ return /* @__PURE__ */ jsx21(Box7, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ jsx21(Accordion, { variant: "filled", radius: "md", children: items.map((item, i) => /* @__PURE__ */ jsxs9(Accordion.Item, { value: String(i), children: [
925
+ /* @__PURE__ */ jsx21(Accordion.Control, { children: /* @__PURE__ */ jsx21(SdText.Strong, { fz: "sm", children: item.question }) }),
926
+ /* @__PURE__ */ jsx21(Accordion.Panel, { children: /* @__PURE__ */ jsx21(SdText.Body, { fz: "sm", children: item.answer }) })
813
927
  ] }, i)) }) }));
814
928
  }
815
929
  function WithHeader(_a4) {
816
930
  var _b = _a4, { label, title, description, items } = _b, boxProps = __objRest(_b, ["label", "title", "description", "items"]);
817
931
  return /* @__PURE__ */ jsxs9(Stack9, __spreadProps(__spreadValues({ gap: "xl" }, boxProps), { children: [
818
932
  /* @__PURE__ */ jsxs9(Stack9, { gap: "xs", children: [
819
- label && /* @__PURE__ */ jsx20(SdText.Eyebrow, { children: label }),
820
- /* @__PURE__ */ jsx20(SdTitle.Section, { children: title }),
821
- description && /* @__PURE__ */ jsx20(SdText.Body, { children: description })
933
+ label && /* @__PURE__ */ jsx21(SdText.Eyebrow, { children: label }),
934
+ /* @__PURE__ */ jsx21(SdTitle.Section, { children: title }),
935
+ description && /* @__PURE__ */ jsx21(SdText.Body, { children: description })
822
936
  ] }),
823
- /* @__PURE__ */ jsx20(Default2, { items })
937
+ /* @__PURE__ */ jsx21(Default2, { items })
824
938
  ] }));
825
939
  }
826
940
  var SdFaq = {
@@ -831,10 +945,13 @@ var SdFaq = {
831
945
  /** 헤더 + 아코디언 조합 */
832
946
  WithHeader
833
947
  };
948
+ var SdFaqDefault = SdFaq.Default;
949
+ var SdFaqFilled = SdFaq.Filled;
950
+ var SdFaqWithHeader = SdFaq.WithHeader;
834
951
 
835
952
  // ui/molecule/Cta.tsx
836
953
  import { Box as Box8, Center as Center2, Group as Group6, Stack as Stack10 } from "@mantine/core";
837
- import { jsx as jsx21, jsxs as jsxs10 } from "react/jsx-runtime";
954
+ import { jsx as jsx22, jsxs as jsxs10 } from "react/jsx-runtime";
838
955
  function Banner(_a4) {
839
956
  var _b = _a4, {
840
957
  label,
@@ -853,34 +970,17 @@ function Banner(_a4) {
853
970
  "onPrimary",
854
971
  "onSecondary"
855
972
  ]);
856
- return /* @__PURE__ */ jsx21(
857
- Box8,
858
- __spreadProps(__spreadValues({
859
- bg: "primary.7",
860
- py: { base: "xl", md: 80 },
861
- px: { base: "md", md: "xl" }
862
- }, boxProps), {
863
- children: /* @__PURE__ */ jsx21(Center2, { children: /* @__PURE__ */ jsxs10(Stack10, { gap: "xl", align: "center", maw: 600, children: [
864
- /* @__PURE__ */ jsxs10(Stack10, { gap: "sm", align: "center", children: [
865
- label && /* @__PURE__ */ jsx21(SdText.Eyebrow, { c: "primary.3", children: label }),
866
- /* @__PURE__ */ jsx21(SdTitle.Section, { c: "white", ta: "center", children: title }),
867
- description && /* @__PURE__ */ jsx21(SdText.Body, { c: "primary.2", ta: "center", children: description })
868
- ] }),
869
- /* @__PURE__ */ jsxs10(Group6, { gap: "sm", children: [
870
- /* @__PURE__ */ jsx21(SdButton.White, { size: "md", onClick: onPrimary, children: primaryLabel }),
871
- secondaryLabel && /* @__PURE__ */ jsx21(
872
- SdButton.Ghost,
873
- {
874
- size: "md",
875
- c: "primary.2",
876
- onClick: onSecondary,
877
- children: secondaryLabel
878
- }
879
- )
880
- ] })
881
- ] }) })
882
- })
883
- );
973
+ return /* @__PURE__ */ jsx22(Box8, __spreadProps(__spreadValues({ bg: "primary.7", py: { base: "xl", md: 80 }, px: { base: "md", md: "xl" } }, boxProps), { children: /* @__PURE__ */ jsx22(Center2, { children: /* @__PURE__ */ jsxs10(Stack10, { gap: "xl", align: "center", maw: 600, children: [
974
+ /* @__PURE__ */ jsxs10(Stack10, { gap: "sm", align: "center", children: [
975
+ label && /* @__PURE__ */ jsx22(SdText.Eyebrow, { c: "primary.3", children: label }),
976
+ /* @__PURE__ */ jsx22(SdTitle.Section, { c: "white", ta: "center", children: title }),
977
+ description && /* @__PURE__ */ jsx22(SdText.Body, { c: "primary.2", ta: "center", children: description })
978
+ ] }),
979
+ /* @__PURE__ */ jsxs10(Group6, { gap: "sm", children: [
980
+ /* @__PURE__ */ jsx22(SdButton.White, { size: "md", onClick: onPrimary, children: primaryLabel }),
981
+ secondaryLabel && /* @__PURE__ */ jsx22(SdButton.Ghost, { size: "md", c: "primary.2", onClick: onSecondary, children: secondaryLabel })
982
+ ] })
983
+ ] }) }) }));
884
984
  }
885
985
  function Subtle(_a4) {
886
986
  var _b = _a4, {
@@ -900,7 +1000,7 @@ function Subtle(_a4) {
900
1000
  "onPrimary",
901
1001
  "onSecondary"
902
1002
  ]);
903
- return /* @__PURE__ */ jsx21(
1003
+ return /* @__PURE__ */ jsx22(
904
1004
  Box8,
905
1005
  __spreadProps(__spreadValues({
906
1006
  bg: "primary.0",
@@ -908,15 +1008,15 @@ function Subtle(_a4) {
908
1008
  px: { base: "md", md: "xl" },
909
1009
  style: { borderRadius: "var(--mantine-radius-lg)" }
910
1010
  }, boxProps), {
911
- children: /* @__PURE__ */ jsx21(Center2, { children: /* @__PURE__ */ jsxs10(Stack10, { gap: "lg", align: "center", maw: 560, children: [
1011
+ children: /* @__PURE__ */ jsx22(Center2, { children: /* @__PURE__ */ jsxs10(Stack10, { gap: "lg", align: "center", maw: 560, children: [
912
1012
  /* @__PURE__ */ jsxs10(Stack10, { gap: "sm", align: "center", children: [
913
- label && /* @__PURE__ */ jsx21(SdText.Eyebrow, { children: label }),
914
- /* @__PURE__ */ jsx21(SdTitle.Section, { ta: "center", children: title }),
915
- description && /* @__PURE__ */ jsx21(SdText.Body, { ta: "center", children: description })
1013
+ label && /* @__PURE__ */ jsx22(SdText.Eyebrow, { children: label }),
1014
+ /* @__PURE__ */ jsx22(SdTitle.Section, { ta: "center", children: title }),
1015
+ description && /* @__PURE__ */ jsx22(SdText.Body, { ta: "center", children: description })
916
1016
  ] }),
917
1017
  /* @__PURE__ */ jsxs10(Group6, { gap: "sm", children: [
918
- /* @__PURE__ */ jsx21(SdButton.Primary, { size: "md", onClick: onPrimary, children: primaryLabel }),
919
- secondaryLabel && /* @__PURE__ */ jsx21(SdButton.Outline, { size: "md", onClick: onSecondary, children: secondaryLabel })
1018
+ /* @__PURE__ */ jsx22(SdButton.Primary, { size: "md", onClick: onPrimary, children: primaryLabel }),
1019
+ secondaryLabel && /* @__PURE__ */ jsx22(SdButton.Outline, { size: "md", onClick: onSecondary, children: secondaryLabel })
920
1020
  ] })
921
1021
  ] }) })
922
1022
  })
@@ -940,7 +1040,7 @@ function Inline(_a4) {
940
1040
  "onPrimary",
941
1041
  "onSecondary"
942
1042
  ]);
943
- return /* @__PURE__ */ jsx21(
1043
+ return /* @__PURE__ */ jsx22(
944
1044
  Box8,
945
1045
  __spreadProps(__spreadValues({
946
1046
  py: { base: "xl", md: 48 },
@@ -952,13 +1052,13 @@ function Inline(_a4) {
952
1052
  }, boxProps), {
953
1053
  children: /* @__PURE__ */ jsxs10(Group6, { justify: "space-between", align: "center", gap: "xl", children: [
954
1054
  /* @__PURE__ */ jsxs10(Stack10, { gap: "xs", style: { flex: 1 }, children: [
955
- label && /* @__PURE__ */ jsx21(SdText.Eyebrow, { children: label }),
956
- /* @__PURE__ */ jsx21(SdTitle.Card, { children: title }),
957
- description && /* @__PURE__ */ jsx21(SdText.Sub, { children: description })
1055
+ label && /* @__PURE__ */ jsx22(SdText.Eyebrow, { children: label }),
1056
+ /* @__PURE__ */ jsx22(SdTitle.Card, { children: title }),
1057
+ description && /* @__PURE__ */ jsx22(SdText.Sub, { children: description })
958
1058
  ] }),
959
1059
  /* @__PURE__ */ jsxs10(Group6, { gap: "sm", wrap: "nowrap", children: [
960
- /* @__PURE__ */ jsx21(SdButton.Primary, { size: "md", onClick: onPrimary, children: primaryLabel }),
961
- secondaryLabel && /* @__PURE__ */ jsx21(SdButton.Outline, { size: "md", onClick: onSecondary, children: secondaryLabel })
1060
+ /* @__PURE__ */ jsx22(SdButton.Primary, { size: "md", onClick: onPrimary, children: primaryLabel }),
1061
+ secondaryLabel && /* @__PURE__ */ jsx22(SdButton.Outline, { size: "md", onClick: onSecondary, children: secondaryLabel })
962
1062
  ] })
963
1063
  ] })
964
1064
  })
@@ -972,35 +1072,27 @@ var SdCta = {
972
1072
  /** 좌우 분할 인라인 CTA */
973
1073
  Inline
974
1074
  };
1075
+ var SdCtaBanner = SdCta.Banner;
1076
+ var SdCtaSubtle = SdCta.Subtle;
1077
+ var SdCtaInline = SdCta.Inline;
975
1078
 
976
1079
  // ui/molecule/Solution.tsx
977
1080
  import { useState } from "react";
978
- import {
979
- Button as Button2,
980
- Divider as Divider2,
981
- Group as Group7,
982
- Stack as Stack12,
983
- ThemeIcon as ThemeIcon4
984
- } from "@mantine/core";
1081
+ import { Button as Button2, Divider as Divider2, Group as Group7, Stack as Stack12, ThemeIcon as ThemeIcon4 } from "@mantine/core";
985
1082
  import Link3 from "next/link";
986
1083
 
987
1084
  // ui/molecule/SolutionCard.tsx
988
- import {
989
- Button,
990
- Card as Card6,
991
- SimpleGrid as SimpleGrid4,
992
- Stack as Stack11
993
- } from "@mantine/core";
1085
+ import { Button, Card as Card6, SimpleGrid as SimpleGrid4, Stack as Stack11 } from "@mantine/core";
994
1086
  import Link2 from "next/link";
995
- import { jsx as jsx22, jsxs as jsxs11 } from "react/jsx-runtime";
1087
+ import { jsx as jsx23, jsxs as jsxs11 } from "react/jsx-runtime";
996
1088
  function SolutionCardItem(_a4) {
997
1089
  var _b = _a4, { item, onSelect } = _b, cardProps = __objRest(_b, ["item", "onSelect"]);
998
1090
  var _a5, _b2;
999
- return /* @__PURE__ */ jsx22(Card6, __spreadProps(__spreadValues({ withBorder: true }, cardProps), { children: /* @__PURE__ */ jsxs11(Stack11, { gap: "md", children: [
1091
+ return /* @__PURE__ */ jsx23(Card6, __spreadProps(__spreadValues({ withBorder: true }, cardProps), { children: /* @__PURE__ */ jsxs11(Stack11, { gap: "md", children: [
1000
1092
  item.icon,
1001
- /* @__PURE__ */ jsx22(SdBadge.Primary, { children: item.category }),
1002
- /* @__PURE__ */ jsx22(SdTitle.Card, { children: item.title }),
1003
- /* @__PURE__ */ jsx22(SdText.Body, { children: item.description }),
1093
+ /* @__PURE__ */ jsx23(SdBadge.Primary, { children: item.category }),
1094
+ /* @__PURE__ */ jsx23(SdTitle.Card, { children: item.title }),
1095
+ /* @__PURE__ */ jsx23(SdText.Body, { children: item.description }),
1004
1096
  item.href ? /* @__PURE__ */ jsxs11(Button, { variant: "subtle", color: "slate", component: Link2, href: item.href, children: [
1005
1097
  (_a5 = item.ctaLabel) != null ? _a5 : "\uC790\uC138\uD788 \uBCF4\uAE30",
1006
1098
  " \u2192"
@@ -1011,7 +1103,7 @@ function SolutionCardItem(_a4) {
1011
1103
  ] }) }));
1012
1104
  }
1013
1105
  function Grid3({ items, cols = { base: 1, sm: 2, md: 3 }, onSelect }) {
1014
- return /* @__PURE__ */ jsx22(SimpleGrid4, { cols, spacing: "xl", children: items.map((item, i) => /* @__PURE__ */ jsx22(SolutionCardItem, { item, onSelect }, i)) });
1106
+ return /* @__PURE__ */ jsx23(SimpleGrid4, { cols, spacing: "xl", children: items.map((item, i) => /* @__PURE__ */ jsx23(SolutionCardItem, { item, onSelect }, i)) });
1015
1107
  }
1016
1108
  var SdSolutionCard = {
1017
1109
  /** 단일 compact 카드 */
@@ -1019,29 +1111,31 @@ var SdSolutionCard = {
1019
1111
  /** 카드 그리드 */
1020
1112
  Grid: Grid3
1021
1113
  };
1114
+ var SdSolutionCardItem = SdSolutionCard.Item;
1115
+ var SdSolutionCardGrid = SdSolutionCard.Grid;
1022
1116
 
1023
1117
  // ui/molecule/Solution.tsx
1024
- import { jsx as jsx23, jsxs as jsxs12 } from "react/jsx-runtime";
1118
+ import { jsx as jsx24, jsxs as jsxs12 } from "react/jsx-runtime";
1025
1119
  function Filtered({ items, allLabel = "\uC804\uCCB4", cols, onSelect }) {
1026
1120
  const categories = ["all", ...Array.from(new Set(items.map((i) => i.category)))];
1027
1121
  const [active, setActive] = useState("all");
1028
1122
  const filtered = active === "all" ? items : items.filter((i) => i.category === active);
1029
1123
  return /* @__PURE__ */ jsxs12(Stack12, { gap: "xl", children: [
1030
- /* @__PURE__ */ jsx23(SdTabs.Pills, { value: active, onChange: (v) => setActive(v != null ? v : "all"), children: /* @__PURE__ */ jsx23(SdTabs.Pills.List, { children: categories.map((cat) => /* @__PURE__ */ jsx23(SdTabs.Pills.Tab, { value: cat, children: cat === "all" ? allLabel : cat }, cat)) }) }),
1031
- /* @__PURE__ */ jsx23(SdSolutionCard.Grid, { items: filtered, cols, onSelect })
1124
+ /* @__PURE__ */ jsx24(SdTabs.Pills, { value: active, onChange: (v) => setActive(v != null ? v : "all"), children: /* @__PURE__ */ jsx24(SdTabs.Pills.List, { children: categories.map((cat) => /* @__PURE__ */ jsx24(SdTabs.Pills.Tab, { value: cat, children: cat === "all" ? allLabel : cat }, cat)) }) }),
1125
+ /* @__PURE__ */ jsx24(SdSolutionCard.Grid, { items: filtered, cols, onSelect })
1032
1126
  ] });
1033
1127
  }
1034
1128
  function List({ items, onSelect }) {
1035
- return /* @__PURE__ */ jsx23(Stack12, { gap: 0, children: items.map((item, i) => {
1129
+ return /* @__PURE__ */ jsx24(Stack12, { gap: 0, children: items.map((item, i) => {
1036
1130
  var _a4, _b;
1037
1131
  return /* @__PURE__ */ jsxs12("div", { children: [
1038
- i > 0 && /* @__PURE__ */ jsx23(Divider2, {}),
1132
+ i > 0 && /* @__PURE__ */ jsx24(Divider2, {}),
1039
1133
  /* @__PURE__ */ jsxs12(Group7, { align: "flex-start", py: "lg", gap: "lg", children: [
1040
- item.icon && /* @__PURE__ */ jsx23(ThemeIcon4, { variant: "light", color: "primary", size: "xl", radius: "md", children: item.icon }),
1134
+ item.icon && /* @__PURE__ */ jsx24(ThemeIcon4, { variant: "light", color: "primary", size: "xl", radius: "md", children: item.icon }),
1041
1135
  /* @__PURE__ */ jsxs12(Stack12, { gap: "xs", style: { flex: 1 }, children: [
1042
- /* @__PURE__ */ jsx23(SdBadge.Primary, { children: item.category }),
1043
- /* @__PURE__ */ jsx23(SdTitle.Card, { children: item.title }),
1044
- /* @__PURE__ */ jsx23(SdText.Body, { children: item.description }),
1136
+ /* @__PURE__ */ jsx24(SdBadge.Primary, { children: item.category }),
1137
+ /* @__PURE__ */ jsx24(SdTitle.Card, { children: item.title }),
1138
+ /* @__PURE__ */ jsx24(SdText.Body, { children: item.description }),
1045
1139
  item.href ? /* @__PURE__ */ jsxs12(
1046
1140
  Button2,
1047
1141
  {
@@ -1077,10 +1171,12 @@ var SdSolution = {
1077
1171
  /** 수평 리스트 레이아웃 (상세 탐색용) */
1078
1172
  List
1079
1173
  };
1174
+ var SdSolutionFiltered = SdSolution.Filtered;
1175
+ var SdSolutionList = SdSolution.List;
1080
1176
 
1081
1177
  // ui/molecule/Clients.tsx
1082
1178
  import { Anchor, Box as Box9, SimpleGrid as SimpleGrid5, Tooltip } from "@mantine/core";
1083
- import { jsx as jsx24, jsxs as jsxs13 } from "react/jsx-runtime";
1179
+ import { jsx as jsx25, jsxs as jsxs13 } from "react/jsx-runtime";
1084
1180
  var grayStyle = {
1085
1181
  filter: "grayscale(1) opacity(0.5)",
1086
1182
  transition: "filter 0.25s"
@@ -1089,7 +1185,7 @@ var colorStyle = {
1089
1185
  filter: "grayscale(0) opacity(1)"
1090
1186
  };
1091
1187
  function LogoImage({ client, height }) {
1092
- return /* @__PURE__ */ jsx24(Tooltip, { label: client.name, withArrow: true, children: /* @__PURE__ */ jsx24(Anchor, { href: client.url, target: "_blank", rel: "noopener noreferrer", children: /* @__PURE__ */ jsx24(
1188
+ return /* @__PURE__ */ jsx25(Tooltip, { label: client.name, withArrow: true, children: /* @__PURE__ */ jsx25(Anchor, { href: client.url, target: "_blank", rel: "noopener noreferrer", children: /* @__PURE__ */ jsx25(
1093
1189
  "img",
1094
1190
  {
1095
1191
  src: client.logo,
@@ -1105,14 +1201,26 @@ function Grid4({
1105
1201
  cols = { base: 2, sm: 3, md: 4, lg: 6 },
1106
1202
  logoHeight = 40
1107
1203
  }) {
1108
- return /* @__PURE__ */ jsx24(SimpleGrid5, { cols, spacing: "xl", children: items.map((client, i) => /* @__PURE__ */ jsx24(Box9, { style: { display: "flex", alignItems: "center", justifyContent: "center", padding: "12px 8px" }, children: /* @__PURE__ */ jsx24(LogoImage, { client, height: logoHeight }) }, i)) });
1204
+ return /* @__PURE__ */ jsx25(SimpleGrid5, { cols, spacing: "xl", children: items.map((client, i) => /* @__PURE__ */ jsx25(
1205
+ Box9,
1206
+ {
1207
+ style: {
1208
+ display: "flex",
1209
+ alignItems: "center",
1210
+ justifyContent: "center",
1211
+ padding: "12px 8px"
1212
+ },
1213
+ children: /* @__PURE__ */ jsx25(LogoImage, { client, height: logoHeight })
1214
+ },
1215
+ i
1216
+ )) });
1109
1217
  }
1110
1218
  var KEYFRAME = `@keyframes sd-clients-marquee { from { transform: translateX(0) } to { transform: translateX(-50%) } }`;
1111
1219
  function Marquee({ items, speed = 40, logoHeight = 36, gap = 64 }) {
1112
1220
  const doubled = [...items, ...items];
1113
1221
  return /* @__PURE__ */ jsxs13(Box9, { style: { overflow: "hidden" }, children: [
1114
- /* @__PURE__ */ jsx24("style", { children: KEYFRAME }),
1115
- /* @__PURE__ */ jsx24(
1222
+ /* @__PURE__ */ jsx25("style", { children: KEYFRAME }),
1223
+ /* @__PURE__ */ jsx25(
1116
1224
  Box9,
1117
1225
  {
1118
1226
  style: {
@@ -1123,12 +1231,14 @@ function Marquee({ items, speed = 40, logoHeight = 36, gap = 64 }) {
1123
1231
  animation: `sd-clients-marquee ${speed}s linear infinite`
1124
1232
  },
1125
1233
  onMouseEnter: (e) => {
1234
+ ;
1126
1235
  e.currentTarget.style.animationPlayState = "paused";
1127
1236
  },
1128
1237
  onMouseLeave: (e) => {
1238
+ ;
1129
1239
  e.currentTarget.style.animationPlayState = "running";
1130
1240
  },
1131
- children: doubled.map((client, i) => /* @__PURE__ */ jsx24(LogoImage, { client, height: logoHeight }, i))
1241
+ children: doubled.map((client, i) => /* @__PURE__ */ jsx25(LogoImage, { client, height: logoHeight }, i))
1132
1242
  }
1133
1243
  )
1134
1244
  ] });
@@ -1145,10 +1255,10 @@ var SdClientsMarquee = Marquee;
1145
1255
  // ui/molecule/Map.tsx
1146
1256
  import { useState as useState2 } from "react";
1147
1257
  import { Box as Box10, Stack as Stack13 } from "@mantine/core";
1148
- import { jsx as jsx25, jsxs as jsxs14 } from "react/jsx-runtime";
1258
+ import { jsx as jsx26, jsxs as jsxs14 } from "react/jsx-runtime";
1149
1259
  function MapFrame({ address, height }) {
1150
1260
  return /* @__PURE__ */ jsxs14(Stack13, { gap: "xs", children: [
1151
- /* @__PURE__ */ jsx25(Box10, { style: { borderRadius: "var(--mantine-radius-md)", overflow: "hidden", height }, children: /* @__PURE__ */ jsx25(
1261
+ /* @__PURE__ */ jsx26(Box10, { style: { borderRadius: "var(--mantine-radius-md)", overflow: "hidden", height }, children: /* @__PURE__ */ jsx26(
1152
1262
  "iframe",
1153
1263
  {
1154
1264
  src: address.embbedUrl,
@@ -1172,18 +1282,18 @@ function MapFrame({ address, height }) {
1172
1282
  function Single(_a4) {
1173
1283
  var _b = _a4, { address, height = 400 } = _b, boxProps = __objRest(_b, ["address", "height"]);
1174
1284
  if (!address.embbedUrl) return null;
1175
- return /* @__PURE__ */ jsx25(Box10, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ jsx25(MapFrame, { address, height }) }));
1285
+ return /* @__PURE__ */ jsx26(Box10, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ jsx26(MapFrame, { address, height }) }));
1176
1286
  }
1177
1287
  function Tabs2({ addresses, height = 400 }) {
1178
1288
  var _a4, _b, _c;
1179
1289
  const mapped = addresses.filter((a) => a.embbedUrl);
1180
1290
  const [active, setActive] = useState2((_b = (_a4 = mapped[0]) == null ? void 0 : _a4.label) != null ? _b : "");
1181
1291
  if (mapped.length === 0) return null;
1182
- if (mapped.length === 1) return /* @__PURE__ */ jsx25(MapFrame, { address: mapped[0], height });
1292
+ if (mapped.length === 1) return /* @__PURE__ */ jsx26(MapFrame, { address: mapped[0], height });
1183
1293
  const current = (_c = mapped.find((a) => a.label === active)) != null ? _c : mapped[0];
1184
1294
  return /* @__PURE__ */ jsxs14(Stack13, { gap: "md", children: [
1185
- /* @__PURE__ */ jsx25(SdTabs.Pills, { value: active, onChange: (v) => setActive(v != null ? v : mapped[0].label), children: /* @__PURE__ */ jsx25(SdTabs.Pills.List, { children: mapped.map((addr) => /* @__PURE__ */ jsx25(SdTabs.Pills.Tab, { value: addr.label, children: addr.label }, addr.label)) }) }),
1186
- /* @__PURE__ */ jsx25(MapFrame, { address: current, height })
1295
+ /* @__PURE__ */ jsx26(SdTabs.Pills, { value: active, onChange: (v) => setActive(v != null ? v : mapped[0].label), children: /* @__PURE__ */ jsx26(SdTabs.Pills.List, { children: mapped.map((addr) => /* @__PURE__ */ jsx26(SdTabs.Pills.Tab, { value: addr.label, children: addr.label }, addr.label)) }) }),
1296
+ /* @__PURE__ */ jsx26(MapFrame, { address: current, height })
1187
1297
  ] });
1188
1298
  }
1189
1299
  var SdMap = {
@@ -1199,7 +1309,7 @@ var SdMapTabs = Tabs2;
1199
1309
  import { Carousel } from "@mantine/carousel";
1200
1310
  import { Anchor as Anchor2, Box as Box11, Group as Group8, Stack as Stack14 } from "@mantine/core";
1201
1311
  import { IconArrowNarrowRight } from "@tabler/icons-react";
1202
- import { Fragment as Fragment3, jsx as jsx26, jsxs as jsxs15 } from "react/jsx-runtime";
1312
+ import { Fragment as Fragment3, jsx as jsx27, jsxs as jsxs15 } from "react/jsx-runtime";
1203
1313
  var variantMap = {
1204
1314
  primary: SdButton.Primary,
1205
1315
  secondary: SdButton.Secondary,
@@ -1209,12 +1319,12 @@ var variantMap = {
1209
1319
  function CtaButton({ cta }) {
1210
1320
  var _a4;
1211
1321
  const Button3 = variantMap[(_a4 = cta.variant) != null ? _a4 : "primary"];
1212
- return /* @__PURE__ */ jsx26(Anchor2, { href: cta.href, underline: "never", children: cta.icon ? /* @__PURE__ */ jsx26(Button3, { size: "md", rightSection: /* @__PURE__ */ jsx26(IconArrowNarrowRight, {}), children: cta.label }) : /* @__PURE__ */ jsx26(Button3, { size: "md", children: cta.label }) });
1322
+ return /* @__PURE__ */ jsx27(Anchor2, { href: cta.href, underline: "never", children: cta.icon ? /* @__PURE__ */ jsx27(Button3, { size: "md", rightSection: /* @__PURE__ */ jsx27(IconArrowNarrowRight, {}), children: cta.label }) : /* @__PURE__ */ jsx27(Button3, { size: "md", children: cta.label }) });
1213
1323
  }
1214
1324
  function HeroCarousel({ slides, children }) {
1215
- if (children) return /* @__PURE__ */ jsx26(Fragment3, { children });
1325
+ if (children) return /* @__PURE__ */ jsx27(Fragment3, { children });
1216
1326
  const filterdSlides = filterAndSort(slides);
1217
- return /* @__PURE__ */ jsx26(Carousel, { withIndicators: true, height: "60svh", children: filterdSlides.map((slide, i) => /* @__PURE__ */ jsx26(Carousel.Slide, { children: /* @__PURE__ */ jsx26(
1327
+ return /* @__PURE__ */ jsx27(Carousel, { withIndicators: true, height: "60svh", children: filterdSlides.map((slide, i) => /* @__PURE__ */ jsx27(Carousel.Slide, { children: /* @__PURE__ */ jsx27(
1218
1328
  Box11,
1219
1329
  {
1220
1330
  style: {
@@ -1227,7 +1337,7 @@ function HeroCarousel({ slides, children }) {
1227
1337
  justifyContent: "center"
1228
1338
  },
1229
1339
  children: /* @__PURE__ */ jsxs15(Stack14, { align: "center", style: { textAlign: "center", maxWidth: 780 }, px: "xl", children: [
1230
- /* @__PURE__ */ jsx26(
1340
+ /* @__PURE__ */ jsx27(
1231
1341
  SdTextBox.Hero,
1232
1342
  {
1233
1343
  title: slide.title,
@@ -1236,137 +1346,199 @@ function HeroCarousel({ slides, children }) {
1236
1346
  align: "center"
1237
1347
  }
1238
1348
  ),
1239
- slide.ctas && slide.ctas.length > 0 && /* @__PURE__ */ jsx26(Group8, { gap: "sm", mt: "md", children: slide.ctas.map((cta, i2) => /* @__PURE__ */ jsx26(CtaButton, { cta }, cta.href)) })
1349
+ slide.ctas && slide.ctas.length > 0 && /* @__PURE__ */ jsx27(Group8, { gap: "sm", mt: "md", children: slide.ctas.map((cta, i2) => /* @__PURE__ */ jsx27(CtaButton, { cta }, cta.href)) })
1240
1350
  ] })
1241
1351
  }
1242
1352
  ) }, i)) });
1243
1353
  }
1244
1354
 
1245
1355
  // ui/organism/Header.tsx
1246
- import { Anchor as Anchor3, Drawer, Group as Group9, Burger, Stack as Stack15 } from "@mantine/core";
1247
- import { useDisclosure } from "@mantine/hooks";
1248
- import { Fragment as Fragment4, jsx as jsx27, jsxs as jsxs16 } from "react/jsx-runtime";
1356
+ import { Box as Box12, Burger, Drawer, Group as Group9, NavLink, Stack as Stack15 } from "@mantine/core";
1357
+ import { useDisclosure, useFocusWithin, useHover, useMergedRef } from "@mantine/hooks";
1358
+ import { Fragment as Fragment4, jsx as jsx28, jsxs as jsxs16 } from "react/jsx-runtime";
1359
+ var BAR_HEIGHT = 60;
1249
1360
  function SdHeader({ navItems, loginFlag, children }) {
1250
1361
  const [opened, { toggle, close }] = useDisclosure();
1251
- const visibleTopItems = navItems.filter((item) => item.isShow && !item.parentId).sort((a, b) => a.order - b.order);
1362
+ const visibleItems = filterAndSort(navItems);
1363
+ const topItems = visibleItems.filter((item) => !item.parentId);
1364
+ const childrenOf = (parentId) => visibleItems.filter((item) => item.parentId === parentId);
1365
+ const hasAnyChildren = visibleItems.some((item) => item.parentId);
1366
+ const { hovered, ref: hoverRef } = useHover();
1367
+ const { focused, ref: focusRef } = useFocusWithin();
1368
+ const rootRef = useMergedRef(hoverRef, focusRef);
1369
+ const expanded = hasAnyChildren && (hovered || focused);
1252
1370
  return /* @__PURE__ */ jsxs16(Fragment4, { children: [
1253
- /* @__PURE__ */ jsx27(SdContainer, { h: "100%", children: /* @__PURE__ */ jsxs16(Group9, { justify: "space-between", h: "100%", children: [
1254
- /* @__PURE__ */ jsx27(Logo, {}),
1255
- /* @__PURE__ */ jsx27(Group9, { gap: "xl", visibleFrom: "sm", children: visibleTopItems.map((item) => /* @__PURE__ */ jsx27(Anchor3, { href: item.href, c: "slate.7", fw: 500, underline: "never", fz: 15, children: item.label }, item.id)) }),
1256
- /* @__PURE__ */ jsx27(Burger, { hiddenFrom: "sm", opened, onClick: toggle }),
1257
- loginFlag && /* @__PURE__ */ jsxs16(Group9, { gap: "sm", visibleFrom: "sm", children: [
1258
- /* @__PURE__ */ jsx27(SdButton.Ghost, { size: "sm", children: "\uB85C\uADF8\uC778" }),
1259
- /* @__PURE__ */ jsx27(SdButton.Primary, { size: "sm", children: "\uBB34\uB8CC \uC2DC\uC791" })
1260
- ] }),
1261
- children
1262
- ] }) }),
1263
- /* @__PURE__ */ jsx27(Drawer, { opened, onClose: close, hiddenFrom: "sm", size: "xs", children: /* @__PURE__ */ jsxs16(Stack15, { children: [
1264
- visibleTopItems.map((item) => /* @__PURE__ */ jsx27(Anchor3, { href: item.href, c: "slate.7", fw: 500, underline: "never", fz: 16, onClick: close, children: item.label }, item.id)),
1265
- loginFlag && /* @__PURE__ */ jsxs16(Stack15, { gap: "xs", mt: "md", children: [
1266
- /* @__PURE__ */ jsx27(SdButton.Ghost, { size: "sm", children: "\uB85C\uADF8\uC778" }),
1267
- /* @__PURE__ */ jsx27(SdButton.Primary, { size: "sm", children: "\uBB34\uB8CC \uC2DC\uC791" })
1268
- ] })
1371
+ /* @__PURE__ */ jsx28(
1372
+ Box12,
1373
+ {
1374
+ ref: rootRef,
1375
+ pos: "relative",
1376
+ bg: "var(--mantine-color-body)",
1377
+ style: {
1378
+ boxShadow: expanded ? "var(--mantine-shadow-md)" : void 0,
1379
+ borderBottom: expanded ? "1px solid var(--mantine-color-slate-2)" : void 0,
1380
+ transition: "box-shadow 0.15s"
1381
+ },
1382
+ children: /* @__PURE__ */ jsx28(SdContainer, { children: /* @__PURE__ */ jsxs16(Group9, { justify: "space-between", align: "flex-start", wrap: "nowrap", children: [
1383
+ /* @__PURE__ */ jsx28(Group9, { h: BAR_HEIGHT, align: "center", children: /* @__PURE__ */ jsx28(Logo, {}) }),
1384
+ /* @__PURE__ */ jsx28(Group9, { gap: "xl", align: "flex-start", wrap: "nowrap", visibleFrom: "sm", children: topItems.map((item) => {
1385
+ const kids = childrenOf(item.id);
1386
+ return /* @__PURE__ */ jsxs16(Stack15, { gap: 0, align: "center", children: [
1387
+ /* @__PURE__ */ jsx28(Group9, { h: BAR_HEIGHT, align: "center", children: item.href ? /* @__PURE__ */ jsx28(SdLink.Body, { href: item.href, children: item.label }) : /* @__PURE__ */ jsx28(SdText.Strong, { children: item.label }) }),
1388
+ kids.length > 0 && /*
1389
+ Mantine Collapse를 쓰지 않는다 — 접힐 때 display:none이 되어
1390
+ 하위 링크가 폭 계산에서 빠졌다가 펼칠 때 다시 들어오면서
1391
+ 컬럼 폭(=상단 nav 간격)이 튄다.
1392
+ height 0 + overflow hidden은 폭 기여를 유지하므로 간격이 고정된다.
1393
+ visibility:hidden이 접힌 상태의 링크를 탭 순서에서도 빼준다.
1394
+ */
1395
+ /* @__PURE__ */ jsx28(
1396
+ Box12,
1397
+ {
1398
+ "aria-hidden": !expanded,
1399
+ style: {
1400
+ height: expanded ? "auto" : 0,
1401
+ overflow: "hidden",
1402
+ opacity: expanded ? 1 : 0,
1403
+ visibility: expanded ? "visible" : "hidden",
1404
+ transition: "opacity 0.15s ease"
1405
+ },
1406
+ children: /* @__PURE__ */ jsx28(Stack15, { gap: "xs", pt: 4, pb: "lg", align: "center", children: kids.map((kid) => /* @__PURE__ */ jsx28(SdLink.Sub, { href: kid.href, children: kid.label }, kid.id)) })
1407
+ }
1408
+ )
1409
+ ] }, item.id);
1410
+ }) }),
1411
+ /* @__PURE__ */ jsxs16(Group9, { h: BAR_HEIGHT, align: "center", gap: "sm", wrap: "nowrap", children: [
1412
+ /* @__PURE__ */ jsx28(Burger, { hiddenFrom: "sm", opened, onClick: toggle }),
1413
+ loginFlag && /* @__PURE__ */ jsx28(Group9, { gap: "sm", visibleFrom: "sm", children: /* @__PURE__ */ jsx28(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) }),
1414
+ children
1415
+ ] })
1416
+ ] }) })
1417
+ }
1418
+ ),
1419
+ /* @__PURE__ */ jsx28(Drawer, { opened, onClose: close, hiddenFrom: "sm", size: "xs", children: /* @__PURE__ */ jsxs16(Stack15, { gap: 0, children: [
1420
+ topItems.map((item) => {
1421
+ const kids = childrenOf(item.id);
1422
+ if (kids.length === 0) {
1423
+ return /* @__PURE__ */ jsx28(Box12, { px: "sm", py: 8, children: /* @__PURE__ */ jsx28(SdLink.Body, { href: item.href, onClick: close, children: item.label }) }, item.id);
1424
+ }
1425
+ return /* @__PURE__ */ jsx28(
1426
+ NavLink,
1427
+ {
1428
+ label: item.label,
1429
+ href: item.href,
1430
+ childrenOffset: 28,
1431
+ onClick: kids.length > 0 ? void 0 : close,
1432
+ children: kids.map((kid) => /* @__PURE__ */ jsx28(NavLink, { label: kid.label, href: kid.href, onClick: close }, kid.id))
1433
+ },
1434
+ item.id
1435
+ );
1436
+ }),
1437
+ loginFlag && /* @__PURE__ */ jsx28(Stack15, { gap: "xs", mt: "md", children: /* @__PURE__ */ jsx28(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
1269
1438
  ] }) })
1270
1439
  ] });
1271
1440
  }
1272
1441
 
1273
1442
  // ui/organism/Footer.tsx
1274
- import { Anchor as Anchor4, Box as Box12, Divider as Divider3, Grid as Grid5, Group as Group10, Stack as Stack16 } from "@mantine/core";
1275
- import { Fragment as Fragment5, jsx as jsx28, jsxs as jsxs17 } from "react/jsx-runtime";
1443
+ import { ActionIcon, Box as Box13, Divider as Divider3, Flex, Grid as Grid5, Group as Group10, SimpleGrid as SimpleGrid6, Stack as Stack16 } from "@mantine/core";
1444
+ import {
1445
+ IconBrandFacebook,
1446
+ IconBrandGithub,
1447
+ IconBrandInstagram,
1448
+ IconBrandLinkedin,
1449
+ IconBrandX,
1450
+ IconBrandYoutube,
1451
+ IconWorld
1452
+ } from "@tabler/icons-react";
1453
+ import { Fragment as Fragment5, jsx as jsx29, jsxs as jsxs17 } from "react/jsx-runtime";
1276
1454
  function FooterNavColumns({ items }) {
1277
1455
  const topLevel = items.filter((item) => !item.parentId);
1278
1456
  const getChildren = (parentId) => items.filter((item) => item.parentId === parentId);
1279
- return /* @__PURE__ */ jsx28(Fragment5, { children: topLevel.map((group) => /* @__PURE__ */ jsx28(Grid5.Col, { span: { base: 6, sm: 4, md: "auto" }, children: /* @__PURE__ */ jsxs17(Stack16, { gap: "sm", children: [
1280
- /* @__PURE__ */ jsx28(SdText.Strong, { fz: "sm", children: group.label }),
1281
- getChildren(group.id).map((link) => /* @__PURE__ */ jsx28(
1282
- Anchor4,
1457
+ return /* @__PURE__ */ jsx29(Fragment5, { children: topLevel.map((group) => /* @__PURE__ */ jsx29(Grid5.Col, { span: { base: 6, sm: 4, md: "auto" }, children: /* @__PURE__ */ jsxs17(Stack16, { gap: "sm", children: [
1458
+ /* @__PURE__ */ jsx29(SdText.Sub, { children: group.label }),
1459
+ getChildren(group.id).map((link) => /* @__PURE__ */ jsx29(SdLink.Hint, { href: link.href, children: link.label }, link.id))
1460
+ ] }) }, group.id)) });
1461
+ }
1462
+ var SOCIAL_ICONS = {
1463
+ x: IconBrandX,
1464
+ youtube: IconBrandYoutube,
1465
+ instagram: IconBrandInstagram,
1466
+ facebook: IconBrandFacebook,
1467
+ linkedin: IconBrandLinkedin,
1468
+ github: IconBrandGithub,
1469
+ blog: IconWorld
1470
+ };
1471
+ function FooterSocials({ items }) {
1472
+ return /* @__PURE__ */ jsx29(Group10, { gap: 0, wrap: "nowrap", children: items.map((item) => {
1473
+ var _a4, _b;
1474
+ const Icon = (_a4 = SOCIAL_ICONS[item.platform]) != null ? _a4 : IconWorld;
1475
+ return /* @__PURE__ */ jsx29(
1476
+ ActionIcon,
1283
1477
  {
1284
- href: link.href,
1285
- fz: "sm",
1286
- c: "slate.6",
1287
- underline: "never",
1288
- style: { transition: "color 0.15s" },
1289
- onMouseEnter: (e) => {
1290
- e.currentTarget.style.color = "var(--mantine-color-primary-6)";
1291
- },
1292
- onMouseLeave: (e) => {
1293
- e.currentTarget.style.color = "";
1294
- },
1295
- children: link.label
1478
+ component: "a",
1479
+ href: item.url,
1480
+ target: "_blank",
1481
+ rel: "noreferrer",
1482
+ size: "lg",
1483
+ color: "gray",
1484
+ variant: "subtle",
1485
+ "aria-label": (_b = item.label) != null ? _b : item.platform,
1486
+ children: /* @__PURE__ */ jsx29(Icon, { size: 18, stroke: 1.5 })
1296
1487
  },
1297
- link.id
1298
- ))
1299
- ] }) }, group.id)) });
1488
+ item.url
1489
+ );
1490
+ }) });
1491
+ }
1492
+ function InfoCell({ label, children }) {
1493
+ return /* @__PURE__ */ jsxs17(Group10, { gap: 6, wrap: "nowrap", align: "baseline", children: [
1494
+ /* @__PURE__ */ jsx29(SdText.Sub, { c: "slate.4", style: { whiteSpace: "nowrap" }, children: label }),
1495
+ typeof children === "string" ? /* @__PURE__ */ jsx29(SdText.Sub, { children }) : children
1496
+ ] });
1300
1497
  }
1301
1498
  function FooterCompanyInfo({ company }) {
1302
1499
  const sortedAddresses = [...company.addresses].sort((a, b) => a.order - b.order);
1303
- return /* @__PURE__ */ jsxs17(Group10, { gap: "xs", wrap: "wrap", children: [
1304
- /* @__PURE__ */ jsx28(SdText.Sub, { children: company.name }),
1305
- /* @__PURE__ */ jsx28(SdText.Sub, { c: "slate.4", children: "|" }),
1306
- /* @__PURE__ */ jsxs17(SdText.Sub, { children: [
1307
- "\uC0AC\uC5C5\uC790\uB4F1\uB85D\uBC88\uD638 ",
1308
- company.registrationNumber
1309
- ] }),
1310
- sortedAddresses.map((addr) => /* @__PURE__ */ jsxs17(Group10, { gap: "xs", wrap: "nowrap", children: [
1311
- /* @__PURE__ */ jsx28(SdText.Sub, { c: "slate.4", children: "|" }),
1312
- /* @__PURE__ */ jsx28(SdText.Sub, { children: addr.address })
1313
- ] }, addr.label)),
1314
- /* @__PURE__ */ jsx28(SdText.Sub, { c: "slate.4", children: "|" }),
1315
- /* @__PURE__ */ jsxs17(Anchor4, { href: `tel:${company.tel}`, fz: "xs", c: "slate.5", underline: "never", children: [
1316
- "Tel ",
1317
- company.tel
1318
- ] }),
1319
- company.fax && /* @__PURE__ */ jsxs17(Fragment5, { children: [
1320
- /* @__PURE__ */ jsx28(SdText.Sub, { c: "slate.4", children: "|" }),
1321
- /* @__PURE__ */ jsxs17(SdText.Sub, { children: [
1322
- "Fax ",
1323
- company.fax
1324
- ] })
1325
- ] }),
1326
- /* @__PURE__ */ jsx28(SdText.Sub, { c: "slate.4", children: "|" }),
1327
- /* @__PURE__ */ jsx28(Anchor4, { href: `mailto:${company.email}`, fz: "xs", c: "slate.5", underline: "never", children: company.email })
1500
+ return /* @__PURE__ */ jsxs17(SimpleGrid6, { cols: { base: 2, sm: 2, md: 1 }, spacing: "md", verticalSpacing: 0, children: [
1501
+ /* @__PURE__ */ jsx29(InfoCell, { label: "\uC0C1\uD638", children: company.name }),
1502
+ /* @__PURE__ */ jsx29(InfoCell, { label: "\uC0AC\uC5C5\uC790\uB4F1\uB85D\uBC88\uD638", children: company.registrationNumber }),
1503
+ sortedAddresses.map((addr) => /* @__PURE__ */ jsx29(InfoCell, { label: addr.label, children: addr.address }, addr.label)),
1504
+ /* @__PURE__ */ jsx29(InfoCell, { label: "Tel", children: /* @__PURE__ */ jsx29(SdLink.Sub, { href: `tel:${company.tel}`, children: company.tel }) }),
1505
+ company.fax && /* @__PURE__ */ jsx29(InfoCell, { label: "Fax", children: company.fax }),
1506
+ /* @__PURE__ */ jsx29(InfoCell, { label: "Email", children: /* @__PURE__ */ jsx29(SdLink.Sub, { href: `mailto:${company.email}`, children: company.email }) })
1328
1507
  ] });
1329
1508
  }
1330
1509
  function SdFooter({ company, navItems, policyLinks, description }) {
1331
1510
  const visibleNav = filterAndSort(navItems);
1332
1511
  const visiblePolicy = filterAndSort(policyLinks);
1333
- return /* @__PURE__ */ jsx28(Box12, { component: "footer", py: "xl", children: /* @__PURE__ */ jsxs17(SdContainer, { children: [
1334
- /* @__PURE__ */ jsxs17(Grid5, { style: { "--grid-gutter": "48px" }, children: [
1335
- /* @__PURE__ */ jsx28(Grid5.Col, { span: { base: 12, md: 4 }, children: /* @__PURE__ */ jsxs17(Stack16, { gap: "md", children: [
1336
- /* @__PURE__ */ jsx28(Logo, { size: "sm" }),
1337
- description && /* @__PURE__ */ jsx28(SdText.Body, { c: "slate.4", fz: "sm", children: description })
1338
- ] }) }),
1339
- visibleNav.length > 0 && /* @__PURE__ */ jsx28(Grid5.Col, { span: { base: 12, md: 8 }, children: /* @__PURE__ */ jsx28(Grid5, { style: { "--grid-gutter": "24px" }, children: /* @__PURE__ */ jsx28(FooterNavColumns, { items: visibleNav }) }) })
1512
+ return /* @__PURE__ */ jsx29(Box13, { component: "footer", children: /* @__PURE__ */ jsx29(SdContainer, { children: /* @__PURE__ */ jsxs17(Stack16, { children: [
1513
+ /* @__PURE__ */ jsx29(Logo, { size: "sm" }),
1514
+ description && /* @__PURE__ */ jsx29(SdText.Sub, { children: description }),
1515
+ /* @__PURE__ */ jsxs17(Flex, { direction: { base: "column", md: "row" }, gap: 48, align: "flex-start", children: [
1516
+ /* @__PURE__ */ jsx29(Box13, { flex: { base: "0 0 auto", md: "1 1 0" }, w: { base: "100%", md: "auto" }, children: /* @__PURE__ */ jsx29(FooterCompanyInfo, { company }) }),
1517
+ visibleNav.length > 0 && /* @__PURE__ */ jsx29(Box13, { flex: { base: "0 0 auto", md: "2 1 0" }, w: { base: "100%", md: "auto" }, children: /* @__PURE__ */ jsx29(Grid5, { style: { "--grid-gutter": "24px" }, children: /* @__PURE__ */ jsx29(FooterNavColumns, { items: visibleNav }) }) })
1340
1518
  ] }),
1341
- /* @__PURE__ */ jsx28(Divider3, {}),
1342
- /* @__PURE__ */ jsx28(FooterCompanyInfo, { company }),
1343
- /* @__PURE__ */ jsxs17(Group10, { justify: "space-between", wrap: "wrap", gap: "xs", mt: "md", children: [
1344
- /* @__PURE__ */ jsxs17(SdText.Sub, { c: "slate.5", children: [
1519
+ /* @__PURE__ */ jsx29(Divider3, {}),
1520
+ /* @__PURE__ */ jsxs17(Group10, { justify: "space-between", wrap: "wrap", gap: "xs", children: [
1521
+ /* @__PURE__ */ jsxs17(SdText.Sub, { children: [
1345
1522
  "\xA9 ",
1346
1523
  company.copyrightYear,
1347
1524
  " ",
1348
1525
  company.name,
1349
1526
  ". All rights reserved."
1350
1527
  ] }),
1351
- visiblePolicy.length > 0 && /* @__PURE__ */ jsx28(Group10, { gap: "lg", children: visiblePolicy.map((item) => /* @__PURE__ */ jsx28(
1352
- Anchor4,
1353
- {
1354
- href: item.href,
1355
- fz: "xs",
1356
- fw: item.highlight ? 700 : 400,
1357
- c: item.highlight ? "white" : "slate.5",
1358
- underline: "never",
1359
- children: item.label
1360
- },
1361
- item.id
1362
- )) })
1528
+ /* @__PURE__ */ jsxs17(Group10, { gap: "lg", wrap: "wrap", children: [
1529
+ visiblePolicy.length > 0 && /* @__PURE__ */ jsx29(Group10, { gap: "lg", children: visiblePolicy.map((item) => {
1530
+ const Link4 = item.highlight ? SdLink.Strong : SdLink.Sub;
1531
+ return /* @__PURE__ */ jsx29(Link4, { href: item.href, children: item.label }, item.id);
1532
+ }) }),
1533
+ company.socials && company.socials.length > 0 && /* @__PURE__ */ jsx29(FooterSocials, { items: company.socials })
1534
+ ] })
1363
1535
  ] })
1364
- ] }) });
1536
+ ] }) }) });
1365
1537
  }
1366
1538
 
1367
1539
  // ui/organism/FeatureSection.tsx
1368
1540
  import { Stack as Stack17 } from "@mantine/core";
1369
- import { jsx as jsx29, jsxs as jsxs18 } from "react/jsx-runtime";
1541
+ import { jsx as jsx30, jsxs as jsxs18 } from "react/jsx-runtime";
1370
1542
  function SdFeatureSection(_a4) {
1371
1543
  var _b = _a4, {
1372
1544
  label,
@@ -1383,8 +1555,8 @@ function SdFeatureSection(_a4) {
1383
1555
  "cols",
1384
1556
  "py"
1385
1557
  ]);
1386
- return /* @__PURE__ */ jsx29(SdContainer, __spreadProps(__spreadValues({ py }, boxProps), { children: /* @__PURE__ */ jsxs18(Stack17, { gap: "xl", children: [
1387
- /* @__PURE__ */ jsx29(
1558
+ return /* @__PURE__ */ jsx30(SdContainer, __spreadProps(__spreadValues({ py }, boxProps), { children: /* @__PURE__ */ jsxs18(Stack17, { gap: "xl", children: [
1559
+ /* @__PURE__ */ jsx30(
1388
1560
  SdTextBox.Section,
1389
1561
  {
1390
1562
  label,
@@ -1395,13 +1567,13 @@ function SdFeatureSection(_a4) {
1395
1567
  align: "center"
1396
1568
  }
1397
1569
  ),
1398
- /* @__PURE__ */ jsx29(SdFeatures, { items, cols })
1570
+ /* @__PURE__ */ jsx30(SdFeatures, { items, cols })
1399
1571
  ] }) }));
1400
1572
  }
1401
1573
 
1402
1574
  // ui/organism/TimelineSection.tsx
1403
1575
  import { Center as Center3, Stack as Stack18 } from "@mantine/core";
1404
- import { jsx as jsx30, jsxs as jsxs19 } from "react/jsx-runtime";
1576
+ import { jsx as jsx31, jsxs as jsxs19 } from "react/jsx-runtime";
1405
1577
  function SdTimelineSection(_a4) {
1406
1578
  var _b = _a4, {
1407
1579
  label,
@@ -1416,22 +1588,15 @@ function SdTimelineSection(_a4) {
1416
1588
  "items",
1417
1589
  "py"
1418
1590
  ]);
1419
- return /* @__PURE__ */ jsx30(Center3, { children: /* @__PURE__ */ jsxs19(Stack18, __spreadProps(__spreadValues({ py, gap: "md" }, boxProps), { children: [
1420
- /* @__PURE__ */ jsx30(
1421
- SdTextBox.Section,
1422
- {
1423
- label,
1424
- title,
1425
- description
1426
- }
1427
- ),
1428
- /* @__PURE__ */ jsx30(Center3, { children: /* @__PURE__ */ jsx30(SdTimeline, { items }) })
1591
+ return /* @__PURE__ */ jsx31(Center3, { children: /* @__PURE__ */ jsxs19(Stack18, __spreadProps(__spreadValues({ py, gap: "md" }, boxProps), { children: [
1592
+ /* @__PURE__ */ jsx31(SdTextBox.Section, { label, title, description }),
1593
+ /* @__PURE__ */ jsx31(Center3, { children: /* @__PURE__ */ jsx31(SdTimeline, { items }) })
1429
1594
  ] })) });
1430
1595
  }
1431
1596
 
1432
1597
  // ui/organism/StepsSection.tsx
1433
1598
  import { Stack as Stack19 } from "@mantine/core";
1434
- import { jsx as jsx31, jsxs as jsxs20 } from "react/jsx-runtime";
1599
+ import { jsx as jsx32, jsxs as jsxs20 } from "react/jsx-runtime";
1435
1600
  function SdStepsSection(_a4) {
1436
1601
  var _b = _a4, {
1437
1602
  label,
@@ -1446,17 +1611,17 @@ function SdStepsSection(_a4) {
1446
1611
  "items",
1447
1612
  "py"
1448
1613
  ]);
1449
- return /* @__PURE__ */ jsx31(SdContainer, __spreadProps(__spreadValues({ py }, boxProps), { children: /* @__PURE__ */ jsxs20(Stack19, { gap: "xl", children: [
1450
- (label || title || description) && /* @__PURE__ */ jsx31(SdTextBox.Section, { label, title, description }),
1451
- /* @__PURE__ */ jsx31(SdSteps.Bubble, { items })
1614
+ return /* @__PURE__ */ jsx32(SdContainer, __spreadProps(__spreadValues({ py }, boxProps), { children: /* @__PURE__ */ jsxs20(Stack19, { gap: "xl", children: [
1615
+ (label || title || description) && /* @__PURE__ */ jsx32(SdTextBox.Section, { label, title, description }),
1616
+ /* @__PURE__ */ jsx32(SdSteps.Bubble, { items })
1452
1617
  ] }) }));
1453
1618
  }
1454
1619
 
1455
1620
  // ui/organism/ErrorView.tsx
1456
1621
  import { Center as Center4, Group as Group11, Stack as Stack20, Text as Text2 } from "@mantine/core";
1457
- import { jsx as jsx32, jsxs as jsxs21 } from "react/jsx-runtime";
1622
+ import { jsx as jsx33, jsxs as jsxs21 } from "react/jsx-runtime";
1458
1623
  function StatusCode({ code }) {
1459
- return /* @__PURE__ */ jsx32(
1624
+ return /* @__PURE__ */ jsx33(
1460
1625
  Text2,
1461
1626
  {
1462
1627
  fz: 160,
@@ -1470,15 +1635,15 @@ function StatusCode({ code }) {
1470
1635
  );
1471
1636
  }
1472
1637
  function Page({ error, onReset, onHome }) {
1473
- return /* @__PURE__ */ jsx32(Center4, { mih: "60vh", children: /* @__PURE__ */ jsx32(SdContainer, { children: /* @__PURE__ */ jsxs21(Stack20, { align: "center", gap: "lg", ta: "center", children: [
1474
- /* @__PURE__ */ jsx32(StatusCode, { code: "500" }),
1638
+ return /* @__PURE__ */ jsx33(Center4, { mih: "60vh", children: /* @__PURE__ */ jsx33(SdContainer, { children: /* @__PURE__ */ jsxs21(Stack20, { align: "center", gap: "lg", ta: "center", children: [
1639
+ /* @__PURE__ */ jsx33(StatusCode, { code: "500" }),
1475
1640
  /* @__PURE__ */ jsxs21(Stack20, { gap: "sm", align: "center", children: [
1476
- /* @__PURE__ */ jsx32(SdTitle.Section, { children: "\uC11C\uBC84\uC5D0\uC11C \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4" }),
1477
- /* @__PURE__ */ jsx32(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." })
1641
+ /* @__PURE__ */ jsx33(SdTitle.Section, { children: "\uC11C\uBC84\uC5D0\uC11C \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4" }),
1642
+ /* @__PURE__ */ jsx33(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." })
1478
1643
  ] }),
1479
1644
  /* @__PURE__ */ jsxs21(Group11, { gap: "sm", justify: "center", children: [
1480
- /* @__PURE__ */ jsx32(SdButton.Primary, { onClick: onReset, children: "\uB2E4\uC2DC \uC2DC\uB3C4" }),
1481
- onHome && /* @__PURE__ */ jsx32(SdButton.Ghost, { onClick: onHome, children: "\uD648\uC73C\uB85C" })
1645
+ /* @__PURE__ */ jsx33(SdButton.Primary, { onClick: onReset, children: "\uB2E4\uC2DC \uC2DC\uB3C4" }),
1646
+ onHome && /* @__PURE__ */ jsx33(SdButton.Ghost, { onClick: onHome, children: "\uD648\uC73C\uB85C" })
1482
1647
  ] })
1483
1648
  ] }) }) });
1484
1649
  }
@@ -1490,15 +1655,15 @@ function NotFound({
1490
1655
  },
1491
1656
  onBack = () => window.history.back()
1492
1657
  }) {
1493
- return /* @__PURE__ */ jsx32(Center4, { mih: "60vh", children: /* @__PURE__ */ jsx32(SdContainer, { children: /* @__PURE__ */ jsxs21(Stack20, { align: "center", gap: "lg", ta: "center", children: [
1494
- /* @__PURE__ */ jsx32(StatusCode, { code: "404" }),
1658
+ return /* @__PURE__ */ jsx33(Center4, { mih: "60vh", children: /* @__PURE__ */ jsx33(SdContainer, { children: /* @__PURE__ */ jsxs21(Stack20, { align: "center", gap: "lg", ta: "center", children: [
1659
+ /* @__PURE__ */ jsx33(StatusCode, { code: "404" }),
1495
1660
  /* @__PURE__ */ jsxs21(Stack20, { gap: "sm", align: "center", children: [
1496
- /* @__PURE__ */ jsx32(SdTitle.Section, { children: title }),
1497
- /* @__PURE__ */ jsx32(SdText.Body, { maw: 480, children: description })
1661
+ /* @__PURE__ */ jsx33(SdTitle.Section, { children: title }),
1662
+ /* @__PURE__ */ jsx33(SdText.Body, { maw: 480, children: description })
1498
1663
  ] }),
1499
1664
  /* @__PURE__ */ jsxs21(Group11, { gap: "sm", justify: "center", children: [
1500
- onHome && /* @__PURE__ */ jsx32(SdButton.Primary, { onClick: onHome, children: "\uD648\uC73C\uB85C" }),
1501
- onBack && /* @__PURE__ */ jsx32(SdButton.Ghost, { onClick: onBack, children: "\uB4A4\uB85C \uAC00\uAE30" })
1665
+ onHome && /* @__PURE__ */ jsx33(SdButton.Primary, { onClick: onHome, children: "\uD648\uC73C\uB85C" }),
1666
+ onBack && /* @__PURE__ */ jsx33(SdButton.Ghost, { onClick: onBack, children: "\uB4A4\uB85C \uAC00\uAE30" })
1502
1667
  ] })
1503
1668
  ] }) }) });
1504
1669
  }
@@ -1508,127 +1673,165 @@ var SdErrorView = {
1508
1673
  /** app/not-found.tsx — 404 Not Found */
1509
1674
  NotFound
1510
1675
  };
1676
+ var SdErrorViewPage = SdErrorView.Page;
1677
+ var SdErrorViewNotFound = SdErrorView.NotFound;
1511
1678
 
1512
1679
  // ui/template/MainLayout.tsx
1513
1680
  import { AppShell } from "@mantine/core";
1514
- import { jsx as jsx33, jsxs as jsxs22 } from "react/jsx-runtime";
1515
- function MainLayout({ children, navItems, companyInfo }) {
1681
+ import { jsx as jsx34, jsxs as jsxs22 } from "react/jsx-runtime";
1682
+ function MainLayout({
1683
+ children,
1684
+ navItems,
1685
+ companyInfo
1686
+ }) {
1516
1687
  return /* @__PURE__ */ jsxs22(AppShell, { header: { height: 60 }, children: [
1517
- /* @__PURE__ */ jsx33(AppShell.Header, { children: /* @__PURE__ */ jsx33(SdHeader, { navItems }) }),
1518
- /* @__PURE__ */ jsx33(AppShell.Main, { children }),
1519
- /* @__PURE__ */ jsx33(SdFooter, { company: companyInfo })
1688
+ /* @__PURE__ */ jsx34(AppShell.Header, { children: /* @__PURE__ */ jsx34(SdHeader, { navItems, loginFlag: true }) }),
1689
+ /* @__PURE__ */ jsx34(AppShell.Main, { children }),
1690
+ /* @__PURE__ */ jsx34(SdFooter, { company: companyInfo, navItems })
1520
1691
  ] });
1521
1692
  }
1522
1693
 
1523
1694
  // ui/template/PageLayout.tsx
1524
- import { Box as Box14, Divider as Divider4, Space } from "@mantine/core";
1525
- import { Fragment as Fragment6, jsx as jsx34, jsxs as jsxs23 } from "react/jsx-runtime";
1695
+ import { Box as Box15, Divider as Divider4, Space, Stack as Stack21 } from "@mantine/core";
1696
+ import { Fragment as Fragment6, jsx as jsx35, jsxs as jsxs23 } from "react/jsx-runtime";
1526
1697
  function Content({ children }) {
1527
- return /* @__PURE__ */ jsx34(SdContainer, { py: "xl", children });
1698
+ return /* @__PURE__ */ jsx35(SdContainer, { py: "xl", children: /* @__PURE__ */ jsx35(Stack21, { gap: "xl", children }) });
1528
1699
  }
1529
1700
  function LayoutGap() {
1530
- return /* @__PURE__ */ jsx34(Space, { h: 48 });
1701
+ return /* @__PURE__ */ jsx35(Space, { h: 48 });
1531
1702
  }
1532
1703
  function Minimal({ label, title, description, children }) {
1533
- return /* @__PURE__ */ jsx34(Fragment6, { children: /* @__PURE__ */ jsxs23(Plain2, { children: [
1534
- /* @__PURE__ */ jsx34(
1535
- SdTextBox.Section,
1536
- {
1537
- label,
1538
- title,
1539
- description: description != null ? description : "",
1540
- mb: "xl"
1541
- }
1542
- ),
1543
- /* @__PURE__ */ jsx34(Divider4, {}),
1704
+ return /* @__PURE__ */ jsx35(Fragment6, { children: /* @__PURE__ */ jsxs23(Plain2, { children: [
1705
+ /* @__PURE__ */ jsx35(SdTextBox.Section, { label, title, description: description != null ? description : "" }),
1706
+ /* @__PURE__ */ jsx35(Divider4, {}),
1544
1707
  children
1545
1708
  ] }) });
1546
1709
  }
1547
1710
  function Plain2({ children }) {
1548
1711
  return /* @__PURE__ */ jsxs23(Fragment6, { children: [
1549
- /* @__PURE__ */ jsx34(LayoutGap, {}),
1550
- /* @__PURE__ */ jsx34(Content, { children })
1712
+ /* @__PURE__ */ jsx35(LayoutGap, {}),
1713
+ /* @__PURE__ */ jsx35(Content, { children })
1551
1714
  ] });
1552
1715
  }
1553
1716
  function Image2({ image, label, title, description, children }) {
1554
1717
  return /* @__PURE__ */ jsxs23(Fragment6, { children: [
1555
- /* @__PURE__ */ jsxs23(Box14, { style: {
1556
- position: "relative",
1557
- minHeight: "30svh",
1558
- display: "flex",
1559
- alignItems: "center",
1560
- backgroundImage: image ? `url(${image})` : void 0,
1561
- backgroundSize: "cover",
1562
- backgroundPosition: "center",
1563
- backgroundColor: "var(--mantine-color-slate-9)"
1564
- }, children: [
1565
- /* @__PURE__ */ jsx34(Box14, { style: {
1566
- position: "absolute",
1567
- inset: 0,
1568
- background: "rgba(0, 0, 0, 0.55)"
1569
- } }),
1570
- /* @__PURE__ */ jsx34(SdContainer, { style: { position: "relative", zIndex: 1, width: "100%" }, children: /* @__PURE__ */ jsx34(
1571
- Box14,
1572
- {
1573
- py: 48,
1574
- px: 40,
1575
- maw: 420,
1576
- style: {
1577
- backdropFilter: "blur(24px)",
1578
- WebkitBackdropFilter: "blur(24px)",
1579
- background: "rgba(255,255,255,0.10)",
1580
- borderRadius: "var(--mantine-radius-md)",
1581
- border: "1px solid rgba(255,255,255,0.18)"
1582
- },
1583
- children: /* @__PURE__ */ jsx34(
1584
- SdTextBox.Hero,
1718
+ /* @__PURE__ */ jsxs23(
1719
+ Box15,
1720
+ {
1721
+ style: {
1722
+ position: "relative",
1723
+ minHeight: "30svh",
1724
+ display: "flex",
1725
+ alignItems: "center",
1726
+ backgroundImage: image ? `url(${image})` : void 0,
1727
+ backgroundSize: "cover",
1728
+ backgroundPosition: "center",
1729
+ backgroundColor: "var(--mantine-color-slate-9)"
1730
+ },
1731
+ children: [
1732
+ /* @__PURE__ */ jsx35(
1733
+ Box15,
1585
1734
  {
1586
- label,
1587
- title,
1588
- description,
1589
- ta: "left",
1590
- align: "flex-start"
1735
+ style: {
1736
+ position: "absolute",
1737
+ inset: 0,
1738
+ background: "rgba(0, 0, 0, 0.55)"
1739
+ }
1591
1740
  }
1592
- )
1593
- }
1594
- ) })
1595
- ] }),
1596
- /* @__PURE__ */ jsx34(Content, { children })
1741
+ ),
1742
+ /* @__PURE__ */ jsx35(SdContainer, { style: { position: "relative", zIndex: 1, width: "100%" }, children: /* @__PURE__ */ jsx35(
1743
+ Box15,
1744
+ {
1745
+ py: 48,
1746
+ px: 40,
1747
+ maw: 420,
1748
+ style: {
1749
+ backdropFilter: "blur(24px)",
1750
+ WebkitBackdropFilter: "blur(24px)",
1751
+ background: "rgba(255,255,255,0.10)",
1752
+ borderRadius: "var(--mantine-radius-md)",
1753
+ border: "1px solid rgba(255,255,255,0.18)"
1754
+ },
1755
+ children: /* @__PURE__ */ jsx35(
1756
+ SdTextBox.Hero,
1757
+ {
1758
+ label,
1759
+ title,
1760
+ description,
1761
+ ta: "left",
1762
+ align: "flex-start"
1763
+ }
1764
+ )
1765
+ }
1766
+ ) })
1767
+ ]
1768
+ }
1769
+ ),
1770
+ /* @__PURE__ */ jsx35(Content, { children })
1597
1771
  ] });
1598
1772
  }
1599
1773
  function Brand({ label, title, description, children }) {
1600
1774
  return /* @__PURE__ */ jsxs23(Fragment6, { children: [
1601
- /* @__PURE__ */ jsxs23(Box14, { style: {
1602
- position: "relative",
1603
- minHeight: "40svh",
1604
- display: "flex",
1605
- alignItems: "center",
1606
- overflow: "hidden",
1607
- background: "linear-gradient(135deg, var(--mantine-color-primary-8) 0%, var(--mantine-color-primary-6) 50%, var(--mantine-color-primary-4) 100%)"
1608
- }, children: [
1609
- /* @__PURE__ */ jsx34(Box14, { style: {
1610
- position: "absolute",
1611
- top: -80,
1612
- right: -80,
1613
- width: 360,
1614
- height: 360,
1615
- borderRadius: "50%",
1616
- background: "rgba(255,255,255,0.06)",
1617
- pointerEvents: "none"
1618
- } }),
1619
- /* @__PURE__ */ jsx34(Box14, { style: {
1620
- position: "absolute",
1621
- bottom: -60,
1622
- left: -60,
1623
- width: 240,
1624
- height: 240,
1625
- borderRadius: "50%",
1626
- background: "rgba(255,255,255,0.04)",
1627
- pointerEvents: "none"
1628
- } }),
1629
- /* @__PURE__ */ jsx34(SdContainer, { style: { position: "relative", zIndex: 1, width: "100%" }, children: /* @__PURE__ */ jsx34(SdTextBox.Hero, { label, title, description, ta: "center", align: "center", maw: 640, mx: "auto", pt: 80, pb: 64 }) })
1630
- ] }),
1631
- /* @__PURE__ */ jsx34(Content, { children })
1775
+ /* @__PURE__ */ jsxs23(
1776
+ Box15,
1777
+ {
1778
+ style: {
1779
+ position: "relative",
1780
+ minHeight: "40svh",
1781
+ display: "flex",
1782
+ alignItems: "center",
1783
+ overflow: "hidden",
1784
+ background: "linear-gradient(135deg, var(--mantine-color-primary-8) 0%, var(--mantine-color-primary-6) 50%, var(--mantine-color-primary-4) 100%)"
1785
+ },
1786
+ children: [
1787
+ /* @__PURE__ */ jsx35(
1788
+ Box15,
1789
+ {
1790
+ style: {
1791
+ position: "absolute",
1792
+ top: -80,
1793
+ right: -80,
1794
+ width: 360,
1795
+ height: 360,
1796
+ borderRadius: "50%",
1797
+ background: "rgba(255,255,255,0.06)",
1798
+ pointerEvents: "none"
1799
+ }
1800
+ }
1801
+ ),
1802
+ /* @__PURE__ */ jsx35(
1803
+ Box15,
1804
+ {
1805
+ style: {
1806
+ position: "absolute",
1807
+ bottom: -60,
1808
+ left: -60,
1809
+ width: 240,
1810
+ height: 240,
1811
+ borderRadius: "50%",
1812
+ background: "rgba(255,255,255,0.04)",
1813
+ pointerEvents: "none"
1814
+ }
1815
+ }
1816
+ ),
1817
+ /* @__PURE__ */ jsx35(SdContainer, { style: { position: "relative", zIndex: 1, width: "100%" }, children: /* @__PURE__ */ jsx35(
1818
+ SdTextBox.Hero,
1819
+ {
1820
+ label,
1821
+ title,
1822
+ description,
1823
+ ta: "center",
1824
+ align: "center",
1825
+ maw: 640,
1826
+ mx: "auto",
1827
+ pt: 80,
1828
+ pb: 64
1829
+ }
1830
+ ) })
1831
+ ]
1832
+ }
1833
+ ),
1834
+ /* @__PURE__ */ jsx35(Content, { children })
1632
1835
  ] });
1633
1836
  }
1634
1837
  var PageLayout = {
@@ -1839,11 +2042,15 @@ var theme = createTheme({
1839
2042
  defaultProps: { radius: "sm" }
1840
2043
  },
1841
2044
  Divider: {
1842
- defaultProps: { c: "slate.5", pb: "xl" }
2045
+ defaultProps: { c: "slate.5" }
1843
2046
  },
1844
2047
  Anchor: {
1845
2048
  defaultProps: { c: "slate.5", fz: "sm", underline: "never" }
1846
2049
  },
2050
+ // SdHeader 모바일 드로어의 2단 아코디언 타이포를 SdLink와 맞춘다.
2051
+ NavLink: {
2052
+ defaultProps: { c: "slate.7", fz: "sm" }
2053
+ },
1847
2054
  Table: {
1848
2055
  defaultProps: {
1849
2056
  captionSide: "bottom"
@@ -1860,33 +2067,63 @@ export {
1860
2067
  MainLayout,
1861
2068
  PageLayout,
1862
2069
  SdBadge,
2070
+ SdBadgeDefault,
2071
+ SdBadgePrimary,
2072
+ SdBadgeSuccess,
2073
+ SdBadgeWarning,
1863
2074
  SdButton,
1864
2075
  SdButtonCancel,
1865
2076
  SdButtonDelete,
2077
+ SdButtonDownload,
2078
+ SdButtonExcel,
1866
2079
  SdButtonGhost,
1867
2080
  SdButtonOutline,
1868
2081
  SdButtonPrimary,
1869
2082
  SdButtonSecondary,
2083
+ SdButtonSubmit,
1870
2084
  SdButtonWhite,
1871
2085
  SdClients,
1872
2086
  SdClientsGrid,
1873
2087
  SdClientsMarquee,
1874
2088
  SdContainer,
1875
2089
  SdCta,
2090
+ SdCtaBanner,
2091
+ SdCtaInline,
2092
+ SdCtaSubtle,
1876
2093
  SdErrorView,
2094
+ SdErrorViewNotFound,
2095
+ SdErrorViewPage,
1877
2096
  SdFaq,
2097
+ SdFaqDefault,
2098
+ SdFaqFilled,
2099
+ SdFaqWithHeader,
1878
2100
  SdFeatureSection,
1879
2101
  SdFeatures,
1880
2102
  SdFooter,
1881
2103
  SdHeader,
1882
2104
  SdInput,
2105
+ SdInputEmail,
2106
+ SdInputPassword,
2107
+ SdInputSelect,
2108
+ SdInputText,
2109
+ SdInputTextarea,
2110
+ SdLink,
2111
+ SdLinkBody,
2112
+ SdLinkHint,
2113
+ SdLinkStrong,
2114
+ SdLinkSub,
1883
2115
  SdMap,
1884
2116
  SdMapSingle,
1885
2117
  SdMapTabs,
1886
2118
  SdModal,
1887
2119
  SdNumberIcon,
1888
2120
  SdPricingCard,
2121
+ SdPricingCardDefault,
2122
+ SdPricingCardFeatured,
2123
+ SdPricingCardGrid,
1889
2124
  SdQuote,
2125
+ SdQuoteCard,
2126
+ SdQuotePlain,
1890
2127
  SdSkeleton,
1891
2128
  SdSkeletonAvatar,
1892
2129
  SdSkeletonCard,
@@ -1895,22 +2132,44 @@ export {
1895
2132
  SdSkeletonTitle,
1896
2133
  SdSolution,
1897
2134
  SdSolutionCard,
2135
+ SdSolutionCardGrid,
2136
+ SdSolutionCardItem,
2137
+ SdSolutionFiltered,
2138
+ SdSolutionList,
1898
2139
  SdSteps,
2140
+ SdStepsBubble,
2141
+ SdStepsCard,
1899
2142
  SdStepsSection,
2143
+ SdStepsStrip,
1900
2144
  SdTable,
2145
+ SdTableSpec,
1901
2146
  SdTabs,
1902
2147
  SdTabsOutline,
1903
2148
  SdTabsPills,
1904
2149
  SdTabsUnderline,
1905
2150
  SdTestimonial,
2151
+ SdTestimonialCard,
2152
+ SdTestimonialGrid,
2153
+ SdTestimonialStrip,
1906
2154
  SdText,
2155
+ SdTextBody,
1907
2156
  SdTextBox,
1908
2157
  SdTextBoxCard,
1909
2158
  SdTextBoxHero,
1910
2159
  SdTextBoxSection,
1911
2160
  SdTextBoxSub,
2161
+ SdTextError,
2162
+ SdTextEyebrow,
2163
+ SdTextHint,
2164
+ SdTextNumeric,
2165
+ SdTextStrong,
2166
+ SdTextSub,
1912
2167
  SdTimeline,
1913
2168
  SdTimelineSection,
1914
2169
  SdTitle,
2170
+ SdTitleCard,
2171
+ SdTitleDisplay,
2172
+ SdTitleSection,
2173
+ SdTitleSub,
1915
2174
  theme
1916
2175
  };