@yeongseoksong/framework 1.3.1 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/ui/index.cjs CHANGED
@@ -64,11 +64,16 @@ __export(ui_exports, {
64
64
  Logo: () => Logo,
65
65
  MainLayout: () => MainLayout,
66
66
  PageLayout: () => PageLayout,
67
+ PageLayoutBrand: () => PageLayoutBrand,
68
+ PageLayoutImage: () => PageLayoutImage,
69
+ PageLayoutMinimal: () => PageLayoutMinimal,
70
+ PageLayoutPlain: () => PageLayoutPlain,
67
71
  SdBadge: () => SdBadge,
68
72
  SdBadgeDefault: () => SdBadgeDefault,
69
73
  SdBadgePrimary: () => SdBadgePrimary,
70
74
  SdBadgeSuccess: () => SdBadgeSuccess,
71
75
  SdBadgeWarning: () => SdBadgeWarning,
76
+ SdBreadcrumb: () => SdBreadcrumb,
72
77
  SdButton: () => SdButton,
73
78
  SdButtonCancel: () => SdButtonCancel,
74
79
  SdButtonDelete: () => SdButtonDelete,
@@ -99,17 +104,41 @@ __export(ui_exports, {
99
104
  SdFeatures: () => SdFeatures,
100
105
  SdFooter: () => SdFooter,
101
106
  SdHeader: () => SdHeader,
107
+ SdHeaderMega: () => SdHeaderMega,
108
+ SdHeaderPanel: () => SdHeaderPanel,
109
+ SdHeaderSimple: () => SdHeaderSimple,
102
110
  SdInput: () => SdInput,
111
+ SdInputAutocomplete: () => SdInputAutocomplete,
112
+ SdInputCheckbox: () => SdInputCheckbox,
113
+ SdInputColor: () => SdInputColor,
114
+ SdInputDate: () => SdInputDate,
115
+ SdInputDateRange: () => SdInputDateRange,
103
116
  SdInputEmail: () => SdInputEmail,
117
+ SdInputFile: () => SdInputFile,
118
+ SdInputJson: () => SdInputJson,
119
+ SdInputMultiSelect: () => SdInputMultiSelect,
120
+ SdInputNativeSelect: () => SdInputNativeSelect,
121
+ SdInputNumber: () => SdInputNumber,
104
122
  SdInputPassword: () => SdInputPassword,
123
+ SdInputPinCode: () => SdInputPinCode,
124
+ SdInputRadioGroup: () => SdInputRadioGroup,
125
+ SdInputRating: () => SdInputRating,
126
+ SdInputSegmented: () => SdInputSegmented,
105
127
  SdInputSelect: () => SdInputSelect,
128
+ SdInputSlider: () => SdInputSlider,
129
+ SdInputSwitch: () => SdInputSwitch,
130
+ SdInputTags: () => SdInputTags,
106
131
  SdInputText: () => SdInputText,
107
132
  SdInputTextarea: () => SdInputTextarea,
133
+ SdInputTime: () => SdInputTime,
108
134
  SdLink: () => SdLink,
109
135
  SdLinkBody: () => SdLinkBody,
110
136
  SdLinkHint: () => SdLinkHint,
111
137
  SdLinkStrong: () => SdLinkStrong,
112
138
  SdLinkSub: () => SdLinkSub,
139
+ SdLoginView: () => SdLoginView,
140
+ SdLoginViewCard: () => SdLoginViewCard,
141
+ SdLoginViewSplit: () => SdLoginViewSplit,
113
142
  SdMap: () => SdMap,
114
143
  SdMapSingle: () => SdMapSingle,
115
144
  SdMapTabs: () => SdMapTabs,
@@ -122,6 +151,9 @@ __export(ui_exports, {
122
151
  SdQuote: () => SdQuote,
123
152
  SdQuoteCard: () => SdQuoteCard,
124
153
  SdQuotePlain: () => SdQuotePlain,
154
+ SdResult: () => SdResult,
155
+ SdResultError: () => SdResultError,
156
+ SdResultSuccess: () => SdResultSuccess,
125
157
  SdSkeleton: () => SdSkeleton,
126
158
  SdSkeletonAvatar: () => SdSkeletonAvatar,
127
159
  SdSkeletonCard: () => SdSkeletonCard,
@@ -169,6 +201,16 @@ __export(ui_exports, {
169
201
  SdTitleDisplay: () => SdTitleDisplay,
170
202
  SdTitleSection: () => SdTitleSection,
171
203
  SdTitleSub: () => SdTitleSub,
204
+ SdToast: () => SdToast,
205
+ SdToastClean: () => SdToastClean,
206
+ SdToastError: () => SdToastError,
207
+ SdToastHide: () => SdToastHide,
208
+ SdToastInfo: () => SdToastInfo,
209
+ SdToastLoading: () => SdToastLoading,
210
+ SdToastProvider: () => SdToastProvider,
211
+ SdToastSuccess: () => SdToastSuccess,
212
+ SdToastUpdate: () => SdToastUpdate,
213
+ SdToastWarning: () => SdToastWarning,
172
214
  theme: () => theme
173
215
  });
174
216
  module.exports = __toCommonJS(ui_exports);
@@ -210,6 +252,7 @@ function Logo(_props) {
210
252
  }
211
253
 
212
254
  // ui/atom/Tabs.tsx
255
+ var import_react = require("react");
213
256
  var import_core3 = require("@mantine/core");
214
257
 
215
258
  // ui/atom/Container.tsx
@@ -231,8 +274,30 @@ function SdScrollableList(_a4) {
231
274
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_core3.Box, { style: { overflowX: "auto", width: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_core3.Tabs.List, __spreadProps(__spreadValues({}, props), { children })) });
232
275
  }
233
276
  function createTabs(defaults, scrollable = false) {
234
- function SdTabsRoot(props) {
235
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_core3.Tabs, __spreadValues(__spreadValues({}, defaults), props));
277
+ function SdTabsRoot(_a4) {
278
+ var _b = _a4, { syncHash, value, onChange } = _b, props = __objRest(_b, ["syncHash", "value", "onChange"]);
279
+ const [hashValue, setHashValue] = (0, import_react.useState)(null);
280
+ (0, import_react.useEffect)(() => {
281
+ if (!syncHash) return;
282
+ const apply = () => {
283
+ const id = decodeURIComponent(window.location.hash.slice(1));
284
+ if (id) setHashValue(id);
285
+ };
286
+ apply();
287
+ window.addEventListener("hashchange", apply);
288
+ return () => window.removeEventListener("hashchange", apply);
289
+ }, [syncHash]);
290
+ if (!syncHash) {
291
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_core3.Tabs, __spreadProps(__spreadValues(__spreadValues({}, defaults), props), { value, onChange }));
292
+ }
293
+ const handleChange = (next) => {
294
+ if (next) {
295
+ window.history.replaceState(null, "", `#${next}`);
296
+ setHashValue(next);
297
+ }
298
+ onChange == null ? void 0 : onChange(next);
299
+ };
300
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_core3.Tabs, __spreadProps(__spreadValues(__spreadValues({}, defaults), props), { value: value != null ? value : hashValue, onChange: handleChange }));
236
301
  }
237
302
  SdTabsRoot.List = scrollable ? SdScrollableList : import_core3.Tabs.List;
238
303
  SdTabsRoot.Tab = import_core3.Tabs.Tab;
@@ -328,6 +393,36 @@ var SdTitleSub = SdTitle.Sub;
328
393
 
329
394
  // ui/atom/Text.tsx
330
395
  var import_core5 = require("@mantine/core");
396
+
397
+ // ui/typography.ts
398
+ var textStyles = {
399
+ /** 최상위 강조 */
400
+ Strong: { fw: 700, c: "slate.9", fz: "md", style: { letterSpacing: "-0.04em" } },
401
+ /** 기본 본문 */
402
+ Body: { fw: 500, c: "slate.7", fz: "sm", lh: 1.7 },
403
+ /** 보조 정보 */
404
+ Sub: { fw: 400, c: "slate.5", fz: "xs", lh: 1.6 },
405
+ /** 최소 강조 — 밀도 높은 목록 */
406
+ Hint: { fw: 400, c: "slate.4", fz: "xs", lh: 1.5 },
407
+ /** 섹션 라벨 */
408
+ Eyebrow: {
409
+ fw: 700,
410
+ c: "primary.6",
411
+ fz: "xs",
412
+ style: { letterSpacing: "0.12em", textTransform: "uppercase" }
413
+ },
414
+ /** 오류 메시지 */
415
+ Error: { fw: 400, c: "red.6", fz: "sm" },
416
+ /** 숫자 — 자릿수 정렬 */
417
+ Numeric: {
418
+ fw: 700,
419
+ c: "slate.8",
420
+ fz: "md",
421
+ style: { fontVariantNumeric: "tabular-nums", letterSpacing: "-0.02em" }
422
+ }
423
+ };
424
+
425
+ // ui/atom/Text.tsx
331
426
  var import_jsx_runtime5 = require("react/jsx-runtime");
332
427
  function createText(defaults) {
333
428
  return function SdText2(_a4) {
@@ -337,23 +432,13 @@ function createText(defaults) {
337
432
  };
338
433
  }
339
434
  var SdText = {
340
- Strong: createText({ fw: 700, c: "slate.9", fz: "md", style: { letterSpacing: "-0.04em" } }),
341
- Body: createText({ fw: 400, c: "slate.7", fz: "md", lh: 1.7 }),
342
- Sub: createText({ fw: 400, c: "slate.5", fz: "xs", lh: 1.6 }),
343
- Eyebrow: createText({
344
- fw: 700,
345
- c: "primary.6",
346
- fz: "xs",
347
- style: { letterSpacing: "0.12em", textTransform: "uppercase" }
348
- }),
349
- Error: createText({ fw: 400, c: "red.6", fz: "sm" }),
350
- Hint: createText({ fw: 400, c: "slate.4", fz: "xs", lh: 1.5 }),
351
- Numeric: createText({
352
- fw: 700,
353
- c: "slate.8",
354
- fz: "md",
355
- style: { fontVariantNumeric: "tabular-nums", letterSpacing: "-0.02em" }
356
- })
435
+ Strong: createText(textStyles.Strong),
436
+ Body: createText(textStyles.Body),
437
+ Sub: createText(textStyles.Sub),
438
+ Eyebrow: createText(textStyles.Eyebrow),
439
+ Error: createText(textStyles.Error),
440
+ Hint: createText(textStyles.Hint),
441
+ Numeric: createText(textStyles.Numeric)
357
442
  };
358
443
  var SdTextStrong = SdText.Strong;
359
444
  var SdTextBody = SdText.Body;
@@ -547,7 +632,7 @@ var SdBadge = {
547
632
  /** 성공/완료 */
548
633
  Success: createBadge({ variant: "light", color: "green" }),
549
634
  /** 주의/경고 */
550
- Warning: createBadge({ variant: "light", color: "orange" })
635
+ Warning: createBadge({ variant: "light", color: "amber" })
551
636
  };
552
637
  var SdBadgeDefault = SdBadge.Default;
553
638
  var SdBadgePrimary = SdBadge.Primary;
@@ -556,48 +641,127 @@ var SdBadgeWarning = SdBadge.Warning;
556
641
 
557
642
  // ui/atom/Input.tsx
558
643
  var import_core12 = require("@mantine/core");
644
+ var import_dates = require("@mantine/dates");
559
645
  var import_jsx_runtime12 = require("react/jsx-runtime");
560
- function createTextInput(defaults) {
561
- return function SdInput2(_a4) {
562
- var props = __objRest(_a4, []);
563
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_core12.TextInput, __spreadValues(__spreadValues({}, defaults), props));
564
- };
565
- }
566
- function createTextarea(defaults) {
567
- return function SdInputTextarea2(_a4) {
568
- var props = __objRest(_a4, []);
569
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_core12.Textarea, __spreadValues(__spreadValues({}, defaults), props));
646
+ function createInput(Component, defaults) {
647
+ return function SdInput2(props) {
648
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Component, __spreadValues(__spreadValues({}, defaults), props));
570
649
  };
571
650
  }
572
- function createPasswordInput(defaults) {
573
- return function SdInputPassword2(_a4) {
574
- var props = __objRest(_a4, []);
575
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_core12.PasswordInput, __spreadValues(__spreadValues({}, defaults), props));
651
+ function createWrappedInput(Component, defaults) {
652
+ return function SdWrappedInput(_a4) {
653
+ var _b = _a4, {
654
+ label,
655
+ description,
656
+ error,
657
+ required,
658
+ withAsterisk
659
+ } = _b, rest = __objRest(_b, [
660
+ "label",
661
+ "description",
662
+ "error",
663
+ "required",
664
+ "withAsterisk"
665
+ ]);
666
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
667
+ import_core12.Input.Wrapper,
668
+ {
669
+ label,
670
+ description,
671
+ error,
672
+ required,
673
+ withAsterisk,
674
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Component, __spreadValues(__spreadValues({}, defaults), rest))
675
+ }
676
+ );
576
677
  };
577
678
  }
578
- function createSelect(defaults) {
579
- return function SdInputSelect2(_a4) {
580
- var props = __objRest(_a4, []);
581
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_core12.Select, __spreadValues(__spreadValues({}, defaults), props));
582
- };
679
+ function SdInputRadio(_a4) {
680
+ var _b = _a4, { data, orientation = "horizontal" } = _b, props = __objRest(_b, ["data", "orientation"]);
681
+ const Layout = orientation === "vertical" ? import_core12.Stack : import_core12.Group;
682
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_core12.Radio.Group, __spreadProps(__spreadValues({}, props), { children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Layout, { gap: "sm", mt: "xs", children: data.map((item) => /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_core12.Radio, { value: item.value, label: item.label, disabled: item.disabled }, item.value)) }) }));
583
683
  }
584
684
  var SdInput = {
685
+ // ── 텍스트 ──
585
686
  /** 일반 텍스트 — 이름, 회사명 등 */
586
- Text: createTextInput({}),
687
+ Text: createInput(import_core12.TextInput),
587
688
  /** 이메일 입력 */
588
- Email: createTextInput({ type: "email" }),
689
+ Email: createInput(import_core12.TextInput, { type: "email" }),
589
690
  /** 비밀번호 입력 — 마스킹 토글 포함 */
590
- Password: createPasswordInput({}),
691
+ Password: createInput(import_core12.PasswordInput),
591
692
  /** 멀티라인 텍스트 — 문의 메시지 등 */
592
- Textarea: createTextarea({ autosize: true, minRows: 3 }),
693
+ Textarea: createInput(import_core12.Textarea, { autosize: true, minRows: 3 }),
694
+ /** JSON 입력 — 포맷·검증 버튼 포함 */
695
+ Json: createInput(import_core12.JsonInput, { autosize: true, minRows: 4, formatOnBlur: true }),
696
+ // ── 숫자 ──
697
+ /** 숫자 입력 — 증감 컨트롤 포함 */
698
+ Number: createInput(import_core12.NumberInput),
699
+ /** 범위 선택 슬라이더 */
700
+ Slider: createWrappedInput(import_core12.Slider),
701
+ /** 별점 */
702
+ Rating: createWrappedInput(import_core12.Rating),
703
+ /** 인증번호 등 자리수가 고정된 코드 */
704
+ PinCode: createWrappedInput(import_core12.PinInput),
705
+ // ── 선택 ──
593
706
  /** 드롭다운 선택 */
594
- Select: createSelect({})
707
+ Select: createInput(import_core12.Select),
708
+ /** 브라우저 기본 select — 모바일·간단한 목록 */
709
+ NativeSelect: createInput(import_core12.NativeSelect),
710
+ /** 다중 선택 */
711
+ MultiSelect: createInput(import_core12.MultiSelect),
712
+ /** 입력하며 후보를 좁히는 자동완성(자유 입력 허용) */
713
+ Autocomplete: createInput(import_core12.Autocomplete),
714
+ /** 자유롭게 추가하는 태그 목록 */
715
+ Tags: createInput(import_core12.TagsInput),
716
+ /** 라디오 그룹 — data로 항목을 넘긴다 */
717
+ Radio: SdInputRadio,
718
+ /** 두세 개 중 하나 — 탭처럼 보이는 선택 */
719
+ Segmented: createWrappedInput(import_core12.SegmentedControl),
720
+ // ── 불리언 ──
721
+ /** 체크박스 — getInputProps(name, { type: 'checkbox' }) */
722
+ Checkbox: createInput(import_core12.Checkbox),
723
+ /** 스위치 — 즉시 반영되는 on/off */
724
+ Switch: createInput(import_core12.Switch),
725
+ // ── 기타 ──
726
+ /** 파일 선택 */
727
+ File: createInput(import_core12.FileInput, { clearable: true }),
728
+ /** 색상 선택 */
729
+ Color: createInput(import_core12.ColorInput),
730
+ // ── 날짜·시간 (@mantine/dates) ──
731
+ /** 날짜 — 직접 입력 + 달력 팝오버. 값은 'YYYY-MM-DD' 문자열 */
732
+ Date: createInput(import_dates.DateInput, { valueFormat: "YYYY-MM-DD", clearable: true }),
733
+ /** 기간 — 시작·종료 두 날짜 */
734
+ DateRange: createInput(import_dates.DatePickerInput, {
735
+ type: "range",
736
+ valueFormat: "YYYY-MM-DD",
737
+ clearable: true
738
+ }),
739
+ /** 시각 */
740
+ Time: createInput(import_dates.TimeInput)
595
741
  };
596
742
  var SdInputText = SdInput.Text;
597
743
  var SdInputEmail = SdInput.Email;
598
744
  var SdInputPassword = SdInput.Password;
599
745
  var SdInputTextarea = SdInput.Textarea;
746
+ var SdInputJson = SdInput.Json;
747
+ var SdInputNumber = SdInput.Number;
748
+ var SdInputSlider = SdInput.Slider;
749
+ var SdInputRating = SdInput.Rating;
750
+ var SdInputPinCode = SdInput.PinCode;
600
751
  var SdInputSelect = SdInput.Select;
752
+ var SdInputNativeSelect = SdInput.NativeSelect;
753
+ var SdInputMultiSelect = SdInput.MultiSelect;
754
+ var SdInputAutocomplete = SdInput.Autocomplete;
755
+ var SdInputTags = SdInput.Tags;
756
+ var SdInputRadioGroup = SdInput.Radio;
757
+ var SdInputSegmented = SdInput.Segmented;
758
+ var SdInputCheckbox = SdInput.Checkbox;
759
+ var SdInputSwitch = SdInput.Switch;
760
+ var SdInputFile = SdInput.File;
761
+ var SdInputColor = SdInput.Color;
762
+ var SdInputDate = SdInput.Date;
763
+ var SdInputDateRange = SdInput.DateRange;
764
+ var SdInputTime = SdInput.Time;
601
765
 
602
766
  // ui/atom/Skeleton.tsx
603
767
  var import_core13 = require("@mantine/core");
@@ -659,7 +823,7 @@ var SdSkeletonAvatar = SkeletonAvatar;
659
823
  // ui/atom/Link.tsx
660
824
  var import_core14 = require("@mantine/core");
661
825
 
662
- // util/style.util.ts
826
+ // ui/style.util.ts
663
827
  function toCssColor(value) {
664
828
  if (typeof value !== "string") return "";
665
829
  return value.includes(".") ? `var(--mantine-color-${value.replace(".", "-")})` : value;
@@ -668,11 +832,16 @@ function toCssColor(value) {
668
832
  // ui/atom/Link.tsx
669
833
  var import_jsx_runtime14 = require("react/jsx-runtime");
670
834
  var HOVER_COLOR = "var(--mantine-color-primary-6)";
671
- function createLink(defaults) {
835
+ function createLink(defaults, Fallback) {
672
836
  return function SdLink2(_a4) {
673
837
  var _b = _a4, { children, onMouseEnter, onMouseLeave } = _b, props = __objRest(_b, ["children", "onMouseEnter", "onMouseLeave"]);
674
838
  var _a5;
675
839
  const baseColor = toCssColor((_a5 = props.c) != null ? _a5 : defaults.c);
840
+ const resolved = typeof children === "string" ? t(children) : children;
841
+ if (!props.href) {
842
+ const _b2 = props, { href: _href, target: _target, rel: _rel } = _b2, textProps = __objRest(_b2, ["href", "target", "rel"]);
843
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Fallback, __spreadProps(__spreadValues({}, textProps), { children }));
844
+ }
676
845
  const handleEnter = (e) => {
677
846
  e.currentTarget.style.color = HOVER_COLOR;
678
847
  onMouseEnter == null ? void 0 : onMouseEnter(e);
@@ -687,29 +856,88 @@ function createLink(defaults) {
687
856
  style: { transition: "color 0.15s" },
688
857
  onMouseEnter: handleEnter,
689
858
  onMouseLeave: handleLeave,
690
- children
859
+ children: resolved
691
860
  })
692
861
  );
693
862
  };
694
863
  }
864
+ function linkStyle(base2, extra) {
865
+ return Object.assign({ underline: "never" }, base2, extra);
866
+ }
695
867
  var SdLink = {
696
868
  /** 최상위 강조 — 눈에 띄어야 하는 단일 링크 */
697
- Strong: createLink({ fw: 700, c: "primary.6", fz: "xs", underline: "never" }),
869
+ Strong: createLink(linkStyle(textStyles.Strong), SdText.Strong),
698
870
  /** 기본 — 본문·네비게이션 수준의 일반 링크 */
699
- Body: createLink({ fw: 500, c: "slate.7", fz: 15, underline: "never" }),
871
+ Body: createLink(linkStyle(textStyles.Body), SdText.Body),
700
872
  /** 보조 — 연락처·정책 등 부가 정보 */
701
- Sub: createLink({ fw: 400, c: "slate.5", fz: "xs", underline: "never" }),
873
+ Sub: createLink(linkStyle(textStyles.Sub), SdText.Sub),
702
874
  /** 최소 강조 — 링크 목록처럼 밀도가 높고 톤을 낮춰야 하는 곳 */
703
- Hint: createLink({ fw: 400, c: "slate.4", fz: "xs", underline: "never" })
875
+ Hint: createLink(linkStyle(textStyles.Hint), SdText.Hint)
704
876
  };
705
877
  var SdLinkStrong = SdLink.Strong;
706
878
  var SdLinkBody = SdLink.Body;
707
879
  var SdLinkSub = SdLink.Sub;
708
880
  var SdLinkHint = SdLink.Hint;
709
881
 
882
+ // ui/atom/Toast.tsx
883
+ var import_notifications = require("@mantine/notifications");
884
+ var import_icons_react2 = require("@tabler/icons-react");
885
+ var import_jsx_runtime15 = require("react/jsx-runtime");
886
+ var toastStyles = {
887
+ /** 성공 — 저장·전송 완료 */
888
+ Success: { color: "green", icon: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_icons_react2.IconCheck, { size: 18 }), title: "\uC644\uB8CC" },
889
+ /** 실패 — 요청 오류·검증 실패 */
890
+ Error: { color: "red", icon: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_icons_react2.IconX, { size: 18 }), title: "\uC624\uB958" },
891
+ /** 주의 — 되돌릴 수 없는 동작 안내 등 */
892
+ Warning: { color: "amber", icon: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_icons_react2.IconAlertTriangle, { size: 18 }), title: "\uC8FC\uC758" },
893
+ /** 안내 — 중립 정보 */
894
+ Info: { color: "primary", icon: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_icons_react2.IconInfoCircle, { size: 18 }), title: "\uC548\uB0B4" },
895
+ /** 진행 중 — 스피너 + 자동 닫힘 없음. Update로 결과 변형으로 바꾼다. */
896
+ Loading: { loading: true, autoClose: false, withCloseButton: false, title: "\uCC98\uB9AC \uC911" }
897
+ };
898
+ function createToast(defaults) {
899
+ return function SdToast2(message, options) {
900
+ return import_notifications.notifications.show(__spreadValues(__spreadProps(__spreadValues({}, defaults), { message }), options));
901
+ };
902
+ }
903
+ var SdToast = {
904
+ Success: createToast(toastStyles.Success),
905
+ Error: createToast(toastStyles.Error),
906
+ Warning: createToast(toastStyles.Warning),
907
+ Info: createToast(toastStyles.Info),
908
+ Loading: createToast(toastStyles.Loading),
909
+ /**
910
+ * 이미 떠 있는 알림을 다른 변형으로 교체한다 — `Loading` → `Success`/`Error` 전환용.
911
+ * `loading: false`·`autoClose`를 먼저 깔아 두므로 스피너가 그대로 남지 않는다.
912
+ */
913
+ Update: (id, variant, message, options) => import_notifications.notifications.update(__spreadValues(__spreadProps(__spreadValues({
914
+ id,
915
+ loading: false,
916
+ autoClose: 4e3,
917
+ withCloseButton: true
918
+ }, toastStyles[variant]), {
919
+ message
920
+ }), options)),
921
+ /** 특정 알림 닫기 */
922
+ Hide: (id) => import_notifications.notifications.hide(id),
923
+ /** 떠 있는 알림 전부 닫기 */
924
+ Clean: () => import_notifications.notifications.clean()
925
+ };
926
+ function SdToastProvider(props) {
927
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_notifications.Notifications, __spreadValues({ position: "top-right", autoClose: 4e3, limit: 3 }, props));
928
+ }
929
+ var SdToastSuccess = SdToast.Success;
930
+ var SdToastError = SdToast.Error;
931
+ var SdToastWarning = SdToast.Warning;
932
+ var SdToastInfo = SdToast.Info;
933
+ var SdToastLoading = SdToast.Loading;
934
+ var SdToastUpdate = SdToast.Update;
935
+ var SdToastHide = SdToast.Hide;
936
+ var SdToastClean = SdToast.Clean;
937
+
710
938
  // ui/molecule/TextBox.tsx
711
939
  var import_core15 = require("@mantine/core");
712
- var import_jsx_runtime15 = require("react/jsx-runtime");
940
+ var import_jsx_runtime16 = require("react/jsx-runtime");
713
941
  function createTextBox(titleVariant, defaultGap = "xs", descVariant = "Body", color_ = void 0) {
714
942
  return function SdTextBox2(_a4) {
715
943
  var _b = _a4, {
@@ -733,10 +961,10 @@ function createTextBox(titleVariant, defaultGap = "xs", descVariant = "Body", co
733
961
  const variant = variantOverride != null ? variantOverride : titleVariant;
734
962
  const TitleComponent = SdTitle[variant];
735
963
  const DescComponent = SdText[descVariant];
736
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core15.Stack, __spreadProps(__spreadValues({ gap: defaultGap }, stackProps), { children: [
737
- label && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(SdText.Eyebrow, { children: label }),
738
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(TitleComponent, { c: colorRes, children: title }),
739
- description && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(DescComponent, { c: colorRes, maw: maxDescWidth, mt: 4, children: description }),
964
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_core15.Stack, __spreadProps(__spreadValues({ gap: defaultGap }, stackProps), { children: [
965
+ label && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(SdText.Eyebrow, { children: label }),
966
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(TitleComponent, { c: colorRes, children: title }),
967
+ description && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(DescComponent, { c: colorRes, maw: maxDescWidth, mt: 4, children: description }),
740
968
  children
741
969
  ] }));
742
970
  };
@@ -756,23 +984,24 @@ var SdTextBoxSub = SdTextBox.Sub;
756
984
  var import_core16 = require("@mantine/core");
757
985
 
758
986
  // util/sort.util.ts
759
- function filterAndSort(items) {
760
- return (items != null ? items : []).filter((item) => item.isShow).sort((a, b) => a.order - b.order);
987
+ function filterAndSort(items, direction = "asc") {
988
+ const sign = direction === "asc" ? 1 : -1;
989
+ return (items != null ? items : []).filter((item) => item.isShow).sort((a, b) => (a.order - b.order) * sign);
761
990
  }
762
991
 
763
992
  // ui/molecule/Features.tsx
764
- var import_jsx_runtime16 = require("react/jsx-runtime");
993
+ var import_jsx_runtime17 = require("react/jsx-runtime");
765
994
  function SdFeatures({ items, cols = { base: 1, sm: 2, md: 3 } }) {
766
995
  const visible = filterAndSort(items);
767
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core16.SimpleGrid, { cols, spacing: "xl", children: visible.map((item) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core16.Card, { children: /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_core16.Stack, { gap: "sm", children: [
996
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.SimpleGrid, { cols, spacing: "xl", children: visible.map((item) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Card, { children: /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_core16.Stack, { gap: "sm", children: [
768
997
  item.icon,
769
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(SdTextBox.Card, { label: item.label, title: item.title, description: item.description })
998
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(SdTextBox.Card, { label: item.label, title: item.title, description: item.description })
770
999
  ] }, item.id) }, item.id)) });
771
1000
  }
772
1001
 
773
1002
  // ui/molecule/Timeline.tsx
774
1003
  var import_core17 = require("@mantine/core");
775
- var import_jsx_runtime17 = require("react/jsx-runtime");
1004
+ var import_jsx_runtime18 = require("react/jsx-runtime");
776
1005
  function SdTimeline({ items }) {
777
1006
  const grouped = items.filter((item) => item.isShow).sort((a, b) => b.year - a.year || b.month - a.month).reduce((acc, item) => {
778
1007
  var _a4, _b;
@@ -781,32 +1010,32 @@ function SdTimeline({ items }) {
781
1010
  return acc;
782
1011
  }, {});
783
1012
  const years = Object.keys(grouped).map(Number).sort((a, b) => b - a);
784
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core17.Timeline, { active: items.length, bulletSize: 24, lineWidth: 2, children: years.map((year) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core17.Timeline.Item, { title: /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(SdTitle.Sub, { children: [
1013
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Timeline, { active: items.length, bulletSize: 24, lineWidth: 2, children: years.map((year) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Timeline.Item, { title: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(SdTitle.Sub, { children: [
785
1014
  year,
786
1015
  "\uB144"
787
- ] }), children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core17.Stack, { gap: 6, mt: "xs", children: grouped[year].map((event) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_core17.Group, { gap: "md", align: "center", wrap: "nowrap", children: [
788
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(SdText.Eyebrow, { miw: 28, children: [
1016
+ ] }), children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Stack, { gap: 6, mt: "xs", children: grouped[year].map((event) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.Group, { gap: "md", align: "center", wrap: "nowrap", children: [
1017
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(SdText.Eyebrow, { miw: 28, children: [
789
1018
  event.month,
790
1019
  "\uC6D4"
791
1020
  ] }),
792
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(SdText.Sub, { style: { flex: 1 }, children: event.description })
1021
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SdText.Sub, { style: { flex: 1 }, children: event.description })
793
1022
  ] }, event.id)) }) }, year)) });
794
1023
  }
795
1024
 
796
1025
  // ui/molecule/Steps.tsx
797
1026
  var import_core18 = require("@mantine/core");
798
- var import_icons_react2 = require("@tabler/icons-react");
799
- var import_jsx_runtime18 = require("react/jsx-runtime");
1027
+ var import_icons_react3 = require("@tabler/icons-react");
800
1028
  var import_jsx_runtime19 = require("react/jsx-runtime");
1029
+ var import_jsx_runtime20 = require("react/jsx-runtime");
801
1030
  function BubbleStep({ item, index, isLast }) {
802
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Group, { align: "flex-start", gap: "lg", wrap: "nowrap", children: [
803
- /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
1031
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core18.Group, { align: "flex-start", gap: "lg", wrap: "nowrap", children: [
1032
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
804
1033
  import_core18.Box,
805
1034
  {
806
1035
  style: { display: "flex", flexDirection: "column", alignItems: "center", flexShrink: 0 },
807
1036
  children: [
808
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SdNumberIcon, { value: String(index + 1).padStart(2, "0") }),
809
- !isLast && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1037
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdNumberIcon, { value: String(index + 1).padStart(2, "0"), color: "primary" }),
1038
+ !isLast && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
810
1039
  import_core18.Box,
811
1040
  {
812
1041
  style: {
@@ -821,7 +1050,7 @@ function BubbleStep({ item, index, isLast }) {
821
1050
  ]
822
1051
  }
823
1052
  ),
824
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1053
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
825
1054
  SdTextBox.Card,
826
1055
  {
827
1056
  title: item.title,
@@ -833,11 +1062,11 @@ function BubbleStep({ item, index, isLast }) {
833
1062
  ] });
834
1063
  }
835
1064
  function Bubble({ items }) {
836
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Box, { children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(BubbleStep, { item, index: i, isLast: i === items.length - 1 }, i)) });
1065
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core18.Box, { children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(BubbleStep, { item, index: i, isLast: i === items.length - 1 }, i)) });
837
1066
  }
838
1067
  function CardStep({ item, index }) {
839
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Card, { withBorder: true, radius: "md", p: 0, style: { height: "100%", overflow: "hidden" }, children: [
840
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1068
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core18.Card, { withBorder: true, radius: "md", p: 0, style: { height: "100%", overflow: "hidden" }, children: [
1069
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
841
1070
  import_core18.Box,
842
1071
  {
843
1072
  py: "lg",
@@ -846,41 +1075,41 @@ function CardStep({ item, index }) {
846
1075
  justifyContent: "center",
847
1076
  background: "var(--mantine-color-primary-0)"
848
1077
  },
849
- children: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(SdText.Eyebrow, { children: [
1078
+ children: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(SdText.Eyebrow, { children: [
850
1079
  "STEP ",
851
1080
  String(index + 1).padStart(2, "0")
852
1081
  ] })
853
1082
  }
854
1083
  ),
855
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Box, { p: "lg", style: { textAlign: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SdTextBox.Card, { title: item.title, description: item.description }) })
1084
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core18.Box, { p: "lg", style: { textAlign: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdTextBox.Card, { title: item.title, description: item.description }) })
856
1085
  ] });
857
1086
  }
858
1087
  function CardArrow({ direction }) {
859
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.ThemeIcon, { size: 36, radius: "xl", variant: "light", color: "primary", children: direction === "right" ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_icons_react2.IconArrowRight, { size: 20, stroke: 2.5 }) : /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_icons_react2.IconArrowDown, { size: 20, stroke: 2.5 }) });
1088
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core18.ThemeIcon, { size: 36, radius: "xl", variant: "light", color: "primary", children: direction === "right" ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_icons_react3.IconArrowRight, { size: 20, stroke: 2.5 }) : /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_icons_react3.IconArrowDown, { size: 20, stroke: 2.5 }) });
860
1089
  }
861
1090
  function CardVariant({ items }) {
862
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_jsx_runtime19.Fragment, { children: [
863
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Stack, { gap: "sm", hiddenFrom: "sm", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_jsx_runtime18.Fragment, { children: [
864
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(CardStep, { item, index: i }),
865
- i < items.length - 1 && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Box, { style: { display: "flex", justifyContent: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(CardArrow, { direction: "down" }) })
1091
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_jsx_runtime20.Fragment, { children: [
1092
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core18.Stack, { gap: "sm", hiddenFrom: "sm", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_jsx_runtime19.Fragment, { children: [
1093
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(CardStep, { item, index: i }),
1094
+ i < items.length - 1 && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core18.Box, { style: { display: "flex", justifyContent: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(CardArrow, { direction: "down" }) })
866
1095
  ] }, i)) }),
867
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Group, { wrap: "nowrap", align: "stretch", gap: 0, visibleFrom: "sm", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_jsx_runtime18.Fragment, { children: [
868
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Box, { style: { flex: 1, minWidth: 0 }, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(CardStep, { item, index: i }) }),
869
- i < items.length - 1 && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Box, { style: { display: "flex", alignItems: "center", padding: "0 8px" }, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(CardArrow, { direction: "right" }) })
1096
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core18.Group, { wrap: "nowrap", align: "stretch", gap: 0, visibleFrom: "sm", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_jsx_runtime19.Fragment, { children: [
1097
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core18.Box, { style: { flex: 1, minWidth: 0 }, children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(CardStep, { item, index: i }) }),
1098
+ i < items.length - 1 && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core18.Box, { style: { display: "flex", alignItems: "center", padding: "0 8px" }, children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(CardArrow, { direction: "right" }) })
870
1099
  ] }, i)) })
871
1100
  ] });
872
1101
  }
873
1102
  function StripStep({ item, index }) {
874
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Box, { pl: "md", style: { borderLeft: "3px solid var(--mantine-color-primary-6)" }, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Stack, { gap: 4, children: [
875
- /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(SdText.Eyebrow, { children: [
1103
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core18.Box, { pl: "md", style: { borderLeft: "3px solid var(--mantine-color-primary-6)" }, children: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core18.Stack, { gap: 4, children: [
1104
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(SdText.Eyebrow, { children: [
876
1105
  "STEP ",
877
1106
  String(index + 1).padStart(2, "0")
878
1107
  ] }),
879
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SdTextBox.Card, { title: item.title, description: item.description })
1108
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdTextBox.Card, { title: item.title, description: item.description })
880
1109
  ] }) });
881
1110
  }
882
1111
  function Strip({ items }) {
883
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Stack, { gap: "xl", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(StripStep, { item, index: i }, i)) });
1112
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core18.Stack, { gap: "xl", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(StripStep, { item, index: i }, i)) });
884
1113
  }
885
1114
  var SdSteps = { Bubble, Card: CardVariant, Strip };
886
1115
  var SdStepsBubble = SdSteps.Bubble;
@@ -889,14 +1118,14 @@ var SdStepsStrip = SdSteps.Strip;
889
1118
 
890
1119
  // ui/molecule/Testimonial.tsx
891
1120
  var import_core19 = require("@mantine/core");
892
- var import_jsx_runtime20 = require("react/jsx-runtime");
1121
+ var import_jsx_runtime21 = require("react/jsx-runtime");
893
1122
  function AuthorRow({ item }) {
894
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Group, { gap: "sm", wrap: "nowrap", children: [
895
- item.avatar && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Avatar, { src: item.avatar, size: "md", radius: "xl" }),
896
- !item.avatar && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Avatar, { size: "md", radius: "xl", color: "primary", children: item.name.charAt(0) }),
897
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Stack, { gap: 0, children: [
898
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdText.Strong, { fz: "sm", children: item.name }),
899
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(SdText.Sub, { children: [
1123
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core19.Group, { gap: "sm", wrap: "nowrap", children: [
1124
+ item.avatar && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core19.Avatar, { src: item.avatar, size: "md", radius: "xl" }),
1125
+ !item.avatar && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core19.Avatar, { size: "md", radius: "xl", color: "primary", children: item.name.charAt(0) }),
1126
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core19.Stack, { gap: 0, children: [
1127
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdText.Strong, { fz: "sm", children: item.name }),
1128
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(SdText.Sub, { children: [
900
1129
  item.role,
901
1130
  item.company ? ` \xB7 ${item.company}` : ""
902
1131
  ] })
@@ -905,28 +1134,28 @@ function AuthorRow({ item }) {
905
1134
  }
906
1135
  function CardTestimonial(_a4) {
907
1136
  var _b = _a4, { item } = _b, boxProps = __objRest(_b, ["item"]);
908
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Card, __spreadProps(__spreadValues({ h: "100%" }, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Stack, { gap: "md", h: "100%", children: [
909
- item.rating && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Rating, { value: item.rating, readOnly: true, size: "sm", color: "primary" }),
910
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Stack, { gap: "xs", style: { flex: 1 }, children: [
911
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdTitle.Display, { c: "primary.6", lh: 0.8, "aria-hidden": true, children: "\u201C" }),
912
- item.lines.map((line, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdText.Body, { children: line }, i))
1137
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core19.Card, __spreadProps(__spreadValues({ h: "100%" }, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core19.Stack, { gap: "md", h: "100%", children: [
1138
+ item.rating && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core19.Rating, { value: item.rating, readOnly: true, size: "sm", color: "primary" }),
1139
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core19.Stack, { gap: "xs", style: { flex: 1 }, children: [
1140
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdTitle.Display, { c: "primary.6", lh: 0.8, "aria-hidden": true, children: "\u201C" }),
1141
+ item.lines.map((line, i) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdText.Body, { children: line }, i))
913
1142
  ] }),
914
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(AuthorRow, { item })
1143
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(AuthorRow, { item })
915
1144
  ] }) }));
916
1145
  }
917
1146
  function Strip2(_a4) {
918
1147
  var _b = _a4, { item } = _b, boxProps = __objRest(_b, ["item"]);
919
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Box, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Stack, { gap: "md", children: [
920
- item.rating && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Rating, { value: item.rating, readOnly: true, size: "sm", color: "primary" }),
921
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Group, { gap: 4, align: "flex-start", children: [
922
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdTitle.Display, { c: "primary.6", lh: 0.8, "aria-hidden": true, children: "\u201C" }),
923
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Stack, { gap: "xs", style: { flex: 1 }, children: item.lines.map((line, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdText.Body, { children: line }, i)) })
1148
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core19.Box, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core19.Stack, { gap: "md", children: [
1149
+ item.rating && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core19.Rating, { value: item.rating, readOnly: true, size: "sm", color: "primary" }),
1150
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core19.Group, { gap: 4, align: "flex-start", children: [
1151
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdTitle.Display, { c: "primary.6", lh: 0.8, "aria-hidden": true, children: "\u201C" }),
1152
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core19.Stack, { gap: "xs", style: { flex: 1 }, children: item.lines.map((line, i) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdText.Body, { children: line }, i)) })
924
1153
  ] }),
925
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(AuthorRow, { item })
1154
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(AuthorRow, { item })
926
1155
  ] }) }));
927
1156
  }
928
1157
  function Grid({ items, cols = { base: 1, sm: 2, md: 3 } }) {
929
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.SimpleGrid, { cols, spacing: "xl", style: { alignItems: "stretch" }, children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(CardTestimonial, { item }, i)) });
1158
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core19.SimpleGrid, { cols, spacing: "xl", style: { alignItems: "stretch" }, children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(CardTestimonial, { item }, i)) });
930
1159
  }
931
1160
  var SdTestimonial = {
932
1161
  /** 카드형 — 그리드 배치용 */
@@ -942,81 +1171,81 @@ var SdTestimonialGrid = SdTestimonial.Grid;
942
1171
 
943
1172
  // ui/molecule/PricingCard.tsx
944
1173
  var import_core20 = require("@mantine/core");
945
- var import_icons_react3 = require("@tabler/icons-react");
946
- var import_jsx_runtime21 = require("react/jsx-runtime");
1174
+ var import_icons_react4 = require("@tabler/icons-react");
1175
+ var import_jsx_runtime22 = require("react/jsx-runtime");
947
1176
  function Default(_a4) {
948
1177
  var _b = _a4, { item, onSelect } = _b, cardProps = __objRest(_b, ["item", "onSelect"]);
949
1178
  var _a5;
950
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Card, __spreadProps(__spreadValues({ withBorder: true, style: { position: "relative" } }, cardProps), { children: /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Stack, { gap: "xl", children: [
951
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Stack, { gap: "xs", children: [
952
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Group, { justify: "space-between", align: "flex-start", children: [
953
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdTitle.Card, { children: item.name }),
954
- item.isPopular && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdBadge.Primary, { children: "\uCD94\uCC9C" })
1179
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core20.Card, __spreadProps(__spreadValues({ withBorder: true, style: { position: "relative" } }, cardProps), { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core20.Stack, { gap: "xl", children: [
1180
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core20.Stack, { gap: "xs", children: [
1181
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core20.Group, { justify: "space-between", align: "flex-start", children: [
1182
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdTitle.Card, { children: item.name }),
1183
+ item.isPopular && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdBadge.Primary, { children: "\uCD94\uCC9C" })
955
1184
  ] }),
956
- item.description && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdText.Sub, { children: item.description })
1185
+ item.description && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdText.Sub, { children: item.description })
957
1186
  ] }),
958
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Group, { gap: 4, align: "baseline", children: [
959
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdTitle.Display, { children: item.price }),
960
- item.period && /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(SdText.Sub, { children: [
1187
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core20.Group, { gap: 4, align: "baseline", children: [
1188
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdTitle.Display, { children: item.price }),
1189
+ item.period && /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(SdText.Sub, { children: [
961
1190
  "/ ",
962
1191
  item.period
963
1192
  ] })
964
1193
  ] }),
965
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Divider, {}),
966
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Stack, { gap: "sm", children: item.features.map((f, i) => /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Group, { gap: "sm", wrap: "nowrap", children: [
967
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
1194
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core20.Divider, {}),
1195
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core20.Stack, { gap: "sm", children: item.features.map((f, i) => /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core20.Group, { gap: "sm", wrap: "nowrap", children: [
1196
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
968
1197
  import_core20.ThemeIcon,
969
1198
  {
970
1199
  size: "xs",
971
1200
  radius: "xl",
972
1201
  color: f.included ? "primary" : "slate",
973
1202
  variant: f.included ? "filled" : "subtle",
974
- children: f.included ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_icons_react3.IconCheck, { size: 12 }) : /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_icons_react3.IconX, { size: 12 })
1203
+ children: f.included ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_icons_react4.IconCheck, { size: 12 }) : /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_icons_react4.IconX, { size: 12 })
975
1204
  }
976
1205
  ),
977
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdText.Body, { fz: "sm", c: f.included ? "slate.7" : "slate.4", children: f.text })
1206
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdText.Body, { fz: "sm", c: f.included ? "slate.7" : "slate.4", children: f.text })
978
1207
  ] }, i)) }),
979
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdButton.Outline, { fullWidth: true, onClick: () => onSelect == null ? void 0 : onSelect(item), children: (_a5 = item.ctaLabel) != null ? _a5 : "\uC2DC\uC791\uD558\uAE30" })
1208
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdButton.Outline, { fullWidth: true, onClick: () => onSelect == null ? void 0 : onSelect(item), children: (_a5 = item.ctaLabel) != null ? _a5 : "\uC2DC\uC791\uD558\uAE30" })
980
1209
  ] }) }));
981
1210
  }
982
1211
  function Featured(_a4) {
983
1212
  var _b = _a4, { item, onSelect } = _b, cardProps = __objRest(_b, ["item", "onSelect"]);
984
1213
  var _a5;
985
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Card, __spreadProps(__spreadValues({ bg: "primary.6", style: { position: "relative" } }, cardProps), { children: /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Stack, { gap: "xl", children: [
986
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Stack, { gap: "xs", children: [
987
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Group, { justify: "space-between", align: "flex-start", children: [
988
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdTitle.Card, { c: "white", children: item.name }),
989
- item.isPopular && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdBadge.Default, { c: "white", style: { borderColor: "rgba(255,255,255,0.5)" }, children: "\uCD94\uCC9C" })
1214
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core20.Card, __spreadProps(__spreadValues({ bg: "primary.6", style: { position: "relative" } }, cardProps), { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core20.Stack, { gap: "xl", children: [
1215
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core20.Stack, { gap: "xs", children: [
1216
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core20.Group, { justify: "space-between", align: "flex-start", children: [
1217
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdTitle.Card, { c: "white", children: item.name }),
1218
+ item.isPopular && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdBadge.Default, { c: "white", style: { borderColor: "rgba(255,255,255,0.5)" }, children: "\uCD94\uCC9C" })
990
1219
  ] }),
991
- item.description && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdText.Body, { c: "primary.1", children: item.description })
1220
+ item.description && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdText.Body, { c: "primary.1", children: item.description })
992
1221
  ] }),
993
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Group, { gap: 4, align: "baseline", children: [
994
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdTitle.Display, { c: "white", children: item.price }),
995
- item.period && /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(SdText.Body, { c: "primary.2", children: [
1222
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core20.Group, { gap: 4, align: "baseline", children: [
1223
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdTitle.Display, { c: "white", children: item.price }),
1224
+ item.period && /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(SdText.Body, { c: "primary.2", children: [
996
1225
  "/ ",
997
1226
  item.period
998
1227
  ] })
999
1228
  ] }),
1000
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Divider, { color: "primary.4" }),
1001
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Stack, { gap: "sm", children: item.features.map((f, i) => /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Group, { gap: "sm", wrap: "nowrap", children: [
1002
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
1229
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core20.Divider, { color: "primary.4" }),
1230
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core20.Stack, { gap: "sm", children: item.features.map((f, i) => /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core20.Group, { gap: "sm", wrap: "nowrap", children: [
1231
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
1003
1232
  import_core20.ThemeIcon,
1004
1233
  {
1005
1234
  size: "xs",
1006
1235
  radius: "xl",
1007
1236
  color: "white",
1008
1237
  variant: f.included ? "filled" : "subtle",
1009
- children: f.included ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_icons_react3.IconCheck, { size: 12, color: "var(--mantine-color-primary-6)" }) : /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_icons_react3.IconX, { size: 12, color: "rgba(255,255,255,0.4)" })
1238
+ children: f.included ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_icons_react4.IconCheck, { size: 12, color: "var(--mantine-color-primary-6)" }) : /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_icons_react4.IconX, { size: 12, color: "rgba(255,255,255,0.4)" })
1010
1239
  }
1011
1240
  ),
1012
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdText.Body, { fz: "sm", c: f.included ? "white" : "primary.3", children: f.text })
1241
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdText.Body, { fz: "sm", c: f.included ? "white" : "primary.3", children: f.text })
1013
1242
  ] }, i)) }),
1014
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdButton.White, { fullWidth: true, onClick: () => onSelect == null ? void 0 : onSelect(item), children: (_a5 = item.ctaLabel) != null ? _a5 : "\uC2DC\uC791\uD558\uAE30" })
1243
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdButton.White, { fullWidth: true, onClick: () => onSelect == null ? void 0 : onSelect(item), children: (_a5 = item.ctaLabel) != null ? _a5 : "\uC2DC\uC791\uD558\uAE30" })
1015
1244
  ] }) }));
1016
1245
  }
1017
1246
  function Grid2({ items, cols = { base: 1, sm: 2, md: 3 }, onSelect }) {
1018
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.SimpleGrid, { cols, spacing: "xl", style: { alignItems: "stretch" }, children: items.map(
1019
- (item, i) => item.isPopular ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(Featured, { item, onSelect }, i) : /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(Default, { item, onSelect }, i)
1247
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core20.SimpleGrid, { cols, spacing: "xl", style: { alignItems: "stretch" }, children: items.map(
1248
+ (item, i) => item.isPopular ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Featured, { item, onSelect }, i) : /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Default, { item, onSelect }, i)
1020
1249
  ) });
1021
1250
  }
1022
1251
  var SdPricingCard = {
@@ -1033,30 +1262,30 @@ var SdPricingCardGrid = SdPricingCard.Grid;
1033
1262
 
1034
1263
  // ui/molecule/Faq.tsx
1035
1264
  var import_core21 = require("@mantine/core");
1036
- var import_jsx_runtime22 = require("react/jsx-runtime");
1265
+ var import_jsx_runtime23 = require("react/jsx-runtime");
1037
1266
  function Default2(_a4) {
1038
1267
  var _b = _a4, { items } = _b, boxProps = __objRest(_b, ["items"]);
1039
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Box, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Accordion, { variant: "separated", radius: "md", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Accordion.Item, { value: String(i), children: [
1040
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Accordion.Control, { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdText.Strong, { fz: "sm", children: item.question }) }),
1041
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Accordion.Panel, { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdText.Body, { fz: "sm", children: item.answer }) })
1268
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core21.Box, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core21.Accordion, { variant: "separated", radius: "md", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core21.Accordion.Item, { value: String(i), children: [
1269
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core21.Accordion.Control, { children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdText.Strong, { fz: "sm", children: item.question }) }),
1270
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core21.Accordion.Panel, { children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdText.Body, { fz: "sm", children: item.answer }) })
1042
1271
  ] }, i)) }) }));
1043
1272
  }
1044
1273
  function Filled(_a4) {
1045
1274
  var _b = _a4, { items } = _b, boxProps = __objRest(_b, ["items"]);
1046
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Box, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Accordion, { variant: "filled", radius: "md", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Accordion.Item, { value: String(i), children: [
1047
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Accordion.Control, { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdText.Strong, { fz: "sm", children: item.question }) }),
1048
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Accordion.Panel, { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdText.Body, { fz: "sm", children: item.answer }) })
1275
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core21.Box, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core21.Accordion, { variant: "filled", radius: "md", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core21.Accordion.Item, { value: String(i), children: [
1276
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core21.Accordion.Control, { children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdText.Strong, { fz: "sm", children: item.question }) }),
1277
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core21.Accordion.Panel, { children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdText.Body, { fz: "sm", children: item.answer }) })
1049
1278
  ] }, i)) }) }));
1050
1279
  }
1051
1280
  function WithHeader(_a4) {
1052
1281
  var _b = _a4, { label, title, description, items } = _b, boxProps = __objRest(_b, ["label", "title", "description", "items"]);
1053
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Stack, __spreadProps(__spreadValues({ gap: "xl" }, boxProps), { children: [
1054
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Stack, { gap: "xs", children: [
1055
- label && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdText.Eyebrow, { children: label }),
1056
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdTitle.Section, { children: title }),
1057
- description && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdText.Body, { children: description })
1282
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core21.Stack, __spreadProps(__spreadValues({ gap: "xl" }, boxProps), { children: [
1283
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core21.Stack, { gap: "xs", children: [
1284
+ label && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdText.Eyebrow, { children: label }),
1285
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdTitle.Section, { children: title }),
1286
+ description && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdText.Body, { children: description })
1058
1287
  ] }),
1059
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Default2, { items })
1288
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Default2, { items })
1060
1289
  ] }));
1061
1290
  }
1062
1291
  var SdFaq = {
@@ -1073,7 +1302,7 @@ var SdFaqWithHeader = SdFaq.WithHeader;
1073
1302
 
1074
1303
  // ui/molecule/Cta.tsx
1075
1304
  var import_core22 = require("@mantine/core");
1076
- var import_jsx_runtime23 = require("react/jsx-runtime");
1305
+ var import_jsx_runtime24 = require("react/jsx-runtime");
1077
1306
  function Banner(_a4) {
1078
1307
  var _b = _a4, {
1079
1308
  label,
@@ -1092,15 +1321,15 @@ function Banner(_a4) {
1092
1321
  "onPrimary",
1093
1322
  "onSecondary"
1094
1323
  ]);
1095
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.Box, __spreadProps(__spreadValues({ bg: "primary.7", py: { base: "xl", md: 80 }, px: { base: "md", md: "xl" } }, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Stack, { gap: "xl", align: "center", maw: 600, children: [
1096
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Stack, { gap: "sm", align: "center", children: [
1097
- label && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdText.Eyebrow, { c: "primary.3", children: label }),
1098
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdTitle.Section, { c: "white", ta: "center", children: title }),
1099
- description && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdText.Body, { c: "primary.2", ta: "center", children: description })
1324
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core22.Box, __spreadProps(__spreadValues({ bg: "primary.7", py: { base: "xl", md: 80 }, px: { base: "md", md: "xl" } }, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core22.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_core22.Stack, { gap: "xl", align: "center", maw: 600, children: [
1325
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_core22.Stack, { gap: "sm", align: "center", children: [
1326
+ label && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdText.Eyebrow, { c: "primary.3", children: label }),
1327
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdTitle.Section, { c: "white", ta: "center", children: title }),
1328
+ description && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdText.Body, { c: "primary.2", ta: "center", children: description })
1100
1329
  ] }),
1101
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Group, { gap: "sm", children: [
1102
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdButton.White, { size: "md", onClick: onPrimary, children: primaryLabel }),
1103
- secondaryLabel && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdButton.Ghost, { size: "md", c: "primary.2", onClick: onSecondary, children: secondaryLabel })
1330
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_core22.Group, { gap: "sm", children: [
1331
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdButton.White, { size: "md", onClick: onPrimary, children: primaryLabel }),
1332
+ secondaryLabel && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdButton.Ghost, { size: "md", c: "primary.2", onClick: onSecondary, children: secondaryLabel })
1104
1333
  ] })
1105
1334
  ] }) }) }));
1106
1335
  }
@@ -1122,7 +1351,7 @@ function Subtle(_a4) {
1122
1351
  "onPrimary",
1123
1352
  "onSecondary"
1124
1353
  ]);
1125
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
1354
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
1126
1355
  import_core22.Box,
1127
1356
  __spreadProps(__spreadValues({
1128
1357
  bg: "primary.0",
@@ -1130,15 +1359,15 @@ function Subtle(_a4) {
1130
1359
  px: { base: "md", md: "xl" },
1131
1360
  style: { borderRadius: "var(--mantine-radius-lg)" }
1132
1361
  }, boxProps), {
1133
- children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Stack, { gap: "lg", align: "center", maw: 560, children: [
1134
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Stack, { gap: "sm", align: "center", children: [
1135
- label && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdText.Eyebrow, { children: label }),
1136
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdTitle.Section, { ta: "center", children: title }),
1137
- description && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdText.Body, { ta: "center", children: description })
1362
+ children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core22.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_core22.Stack, { gap: "lg", align: "center", maw: 560, children: [
1363
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_core22.Stack, { gap: "sm", align: "center", children: [
1364
+ label && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdText.Eyebrow, { children: label }),
1365
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdTitle.Section, { ta: "center", children: title }),
1366
+ description && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdText.Body, { ta: "center", children: description })
1138
1367
  ] }),
1139
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Group, { gap: "sm", children: [
1140
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdButton.Primary, { size: "md", onClick: onPrimary, children: primaryLabel }),
1141
- secondaryLabel && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdButton.Outline, { size: "md", onClick: onSecondary, children: secondaryLabel })
1368
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_core22.Group, { gap: "sm", children: [
1369
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdButton.Primary, { size: "md", onClick: onPrimary, children: primaryLabel }),
1370
+ secondaryLabel && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdButton.Outline, { size: "md", onClick: onSecondary, children: secondaryLabel })
1142
1371
  ] })
1143
1372
  ] }) })
1144
1373
  })
@@ -1162,7 +1391,7 @@ function Inline(_a4) {
1162
1391
  "onPrimary",
1163
1392
  "onSecondary"
1164
1393
  ]);
1165
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
1394
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
1166
1395
  import_core22.Box,
1167
1396
  __spreadProps(__spreadValues({
1168
1397
  py: { base: "xl", md: 48 },
@@ -1172,15 +1401,15 @@ function Inline(_a4) {
1172
1401
  borderBottom: "1px solid var(--mantine-color-slate-2)"
1173
1402
  }
1174
1403
  }, boxProps), {
1175
- children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Group, { justify: "space-between", align: "center", gap: "xl", children: [
1176
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Stack, { gap: "xs", style: { flex: 1 }, children: [
1177
- label && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdText.Eyebrow, { children: label }),
1178
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdTitle.Card, { children: title }),
1179
- description && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdText.Sub, { children: description })
1404
+ children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_core22.Group, { justify: "space-between", align: "center", gap: "xl", children: [
1405
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_core22.Stack, { gap: "xs", style: { flex: 1 }, children: [
1406
+ label && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdText.Eyebrow, { children: label }),
1407
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdTitle.Card, { children: title }),
1408
+ description && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdText.Sub, { children: description })
1180
1409
  ] }),
1181
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Group, { gap: "sm", wrap: "nowrap", children: [
1182
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdButton.Primary, { size: "md", onClick: onPrimary, children: primaryLabel }),
1183
- secondaryLabel && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdButton.Outline, { size: "md", onClick: onSecondary, children: secondaryLabel })
1410
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_core22.Group, { gap: "sm", wrap: "nowrap", children: [
1411
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdButton.Primary, { size: "md", onClick: onPrimary, children: primaryLabel }),
1412
+ secondaryLabel && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdButton.Outline, { size: "md", onClick: onSecondary, children: secondaryLabel })
1184
1413
  ] })
1185
1414
  ] })
1186
1415
  })
@@ -1199,33 +1428,33 @@ var SdCtaSubtle = SdCta.Subtle;
1199
1428
  var SdCtaInline = SdCta.Inline;
1200
1429
 
1201
1430
  // ui/molecule/Solution.tsx
1202
- var import_react = require("react");
1431
+ var import_react2 = require("react");
1203
1432
  var import_core24 = require("@mantine/core");
1204
1433
  var import_link3 = __toESM(require("next/link"));
1205
1434
 
1206
1435
  // ui/molecule/SolutionCard.tsx
1207
1436
  var import_core23 = require("@mantine/core");
1208
1437
  var import_link2 = __toESM(require("next/link"));
1209
- var import_jsx_runtime24 = require("react/jsx-runtime");
1438
+ var import_jsx_runtime25 = require("react/jsx-runtime");
1210
1439
  function SolutionCardItem(_a4) {
1211
1440
  var _b = _a4, { item, onSelect } = _b, cardProps = __objRest(_b, ["item", "onSelect"]);
1212
1441
  var _a5, _b2;
1213
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core23.Card, __spreadProps(__spreadValues({ withBorder: true }, cardProps), { children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_core23.Stack, { gap: "md", children: [
1442
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_core23.Card, __spreadProps(__spreadValues({ withBorder: true, h: "100%", style: { display: "flex", flexDirection: "column" } }, cardProps), { children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_core23.Stack, { gap: "md", style: { flex: 1 }, children: [
1214
1443
  item.icon,
1215
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdBadge.Primary, { children: item.category }),
1216
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdTitle.Card, { children: item.title }),
1217
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SdText.Body, { children: item.description }),
1218
- item.href ? /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_core23.Button, { variant: "subtle", color: "slate", component: import_link2.default, href: item.href, children: [
1444
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SdBadge.Primary, { children: item.category }),
1445
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SdTitle.Card, { children: item.title }),
1446
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SdText.Body, { children: item.description }),
1447
+ item.href ? /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_core23.Button, { variant: "subtle", color: "slate", component: import_link2.default, href: item.href, mt: "auto", children: [
1219
1448
  (_a5 = item.ctaLabel) != null ? _a5 : "\uC790\uC138\uD788 \uBCF4\uAE30",
1220
1449
  " \u2192"
1221
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(SdButton.Ghost, { onClick: () => onSelect == null ? void 0 : onSelect(item), children: [
1450
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(SdButton.Ghost, { onClick: () => onSelect == null ? void 0 : onSelect(item), mt: "auto", children: [
1222
1451
  (_b2 = item.ctaLabel) != null ? _b2 : "\uC790\uC138\uD788 \uBCF4\uAE30",
1223
1452
  " \u2192"
1224
1453
  ] })
1225
1454
  ] }) }));
1226
1455
  }
1227
1456
  function Grid3({ items, cols = { base: 1, sm: 2, md: 3 }, onSelect }) {
1228
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core23.SimpleGrid, { cols, spacing: "xl", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SolutionCardItem, { item, onSelect }, i)) });
1457
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_core23.SimpleGrid, { cols, spacing: "xl", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SolutionCardItem, { item, onSelect }, i)) });
1229
1458
  }
1230
1459
  var SdSolutionCard = {
1231
1460
  /** 단일 compact 카드 */
@@ -1237,28 +1466,28 @@ var SdSolutionCardItem = SdSolutionCard.Item;
1237
1466
  var SdSolutionCardGrid = SdSolutionCard.Grid;
1238
1467
 
1239
1468
  // ui/molecule/Solution.tsx
1240
- var import_jsx_runtime25 = require("react/jsx-runtime");
1469
+ var import_jsx_runtime26 = require("react/jsx-runtime");
1241
1470
  function Filtered({ items, allLabel = "\uC804\uCCB4", cols, onSelect }) {
1242
1471
  const categories = ["all", ...Array.from(new Set(items.map((i) => i.category)))];
1243
- const [active, setActive] = (0, import_react.useState)("all");
1472
+ const [active, setActive] = (0, import_react2.useState)("all");
1244
1473
  const filtered = active === "all" ? items : items.filter((i) => i.category === active);
1245
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_core24.Stack, { gap: "xl", children: [
1246
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SdTabs.Pills, { value: active, onChange: (v) => setActive(v != null ? v : "all"), children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SdTabs.Pills.List, { children: categories.map((cat) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SdTabs.Pills.Tab, { value: cat, children: cat === "all" ? allLabel : cat }, cat)) }) }),
1247
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SdSolutionCard.Grid, { items: filtered, cols, onSelect })
1474
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_core24.Stack, { gap: "xl", children: [
1475
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SdTabs.Pills, { value: active, onChange: (v) => setActive(v != null ? v : "all"), children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SdTabs.Pills.List, { children: categories.map((cat) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SdTabs.Pills.Tab, { value: cat, children: cat === "all" ? allLabel : cat }, cat)) }) }),
1476
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SdSolutionCard.Grid, { items: filtered, cols, onSelect })
1248
1477
  ] });
1249
1478
  }
1250
1479
  function List({ items, onSelect }) {
1251
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_core24.Stack, { gap: 0, children: items.map((item, i) => {
1480
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core24.Stack, { gap: 0, children: items.map((item, i) => {
1252
1481
  var _a4, _b;
1253
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { children: [
1254
- i > 0 && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_core24.Divider, {}),
1255
- /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_core24.Group, { align: "flex-start", py: "lg", gap: "lg", children: [
1256
- item.icon && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_core24.ThemeIcon, { variant: "light", color: "primary", size: "xl", radius: "md", children: item.icon }),
1257
- /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_core24.Stack, { gap: "xs", style: { flex: 1 }, children: [
1258
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SdBadge.Primary, { children: item.category }),
1259
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SdTitle.Card, { children: item.title }),
1260
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SdText.Body, { children: item.description }),
1261
- item.href ? /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
1482
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { children: [
1483
+ i > 0 && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core24.Divider, {}),
1484
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_core24.Group, { align: "flex-start", py: "lg", gap: "lg", children: [
1485
+ item.icon && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core24.ThemeIcon, { variant: "light", color: "primary", size: "xl", radius: "md", children: item.icon }),
1486
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_core24.Stack, { gap: "xs", style: { flex: 1 }, children: [
1487
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SdBadge.Primary, { children: item.category }),
1488
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SdTitle.Card, { children: item.title }),
1489
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SdText.Body, { children: item.description }),
1490
+ item.href ? /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
1262
1491
  import_core24.Button,
1263
1492
  {
1264
1493
  variant: "subtle",
@@ -1271,7 +1500,7 @@ function List({ items, onSelect }) {
1271
1500
  " \u2192"
1272
1501
  ]
1273
1502
  }
1274
- ) : /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
1503
+ ) : /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
1275
1504
  SdButton.Ghost,
1276
1505
  {
1277
1506
  onClick: () => onSelect == null ? void 0 : onSelect(item),
@@ -1298,7 +1527,7 @@ var SdSolutionList = SdSolution.List;
1298
1527
 
1299
1528
  // ui/molecule/Clients.tsx
1300
1529
  var import_core25 = require("@mantine/core");
1301
- var import_jsx_runtime26 = require("react/jsx-runtime");
1530
+ var import_jsx_runtime27 = require("react/jsx-runtime");
1302
1531
  var grayStyle = {
1303
1532
  filter: "grayscale(1) opacity(0.5)",
1304
1533
  transition: "filter 0.25s"
@@ -1307,12 +1536,18 @@ var colorStyle = {
1307
1536
  filter: "grayscale(0) opacity(1)"
1308
1537
  };
1309
1538
  function LogoImage({ client, height }) {
1310
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.Tooltip, { label: client.name, withArrow: true, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.Anchor, { href: client.url, target: "_blank", rel: "noopener noreferrer", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1539
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core25.Tooltip, { label: client.name, withArrow: true, children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core25.Anchor, { href: client.url, target: "_blank", rel: "noopener noreferrer", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
1311
1540
  "img",
1312
1541
  {
1313
1542
  src: client.logo,
1314
1543
  alt: client.name,
1315
- style: __spreadValues({ height, width: "auto", objectFit: "contain", display: "block" }, grayStyle),
1544
+ style: __spreadValues({
1545
+ height,
1546
+ width: "auto",
1547
+ maxWidth: "100%",
1548
+ objectFit: "contain",
1549
+ display: "block"
1550
+ }, grayStyle),
1316
1551
  onMouseEnter: (e) => Object.assign(e.currentTarget.style, colorStyle),
1317
1552
  onMouseLeave: (e) => Object.assign(e.currentTarget.style, grayStyle)
1318
1553
  }
@@ -1323,16 +1558,19 @@ function Grid4({
1323
1558
  cols = { base: 2, sm: 3, md: 4, lg: 6 },
1324
1559
  logoHeight = 40
1325
1560
  }) {
1326
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.SimpleGrid, { cols, spacing: "xl", children: items.map((client, i) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1561
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core25.SimpleGrid, { cols, spacing: "xl", children: items.map((client, i) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
1327
1562
  import_core25.Box,
1328
1563
  {
1329
1564
  style: {
1330
1565
  display: "flex",
1331
1566
  alignItems: "center",
1332
1567
  justifyContent: "center",
1333
- padding: "12px 8px"
1568
+ padding: "12px 8px",
1569
+ minWidth: 0,
1570
+ // 그리드 트랙이 이미지 intrinsic width로 밀려 깨지는 것 방지
1571
+ overflow: "hidden"
1334
1572
  },
1335
- children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(LogoImage, { client, height: logoHeight })
1573
+ children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(LogoImage, { client, height: logoHeight })
1336
1574
  },
1337
1575
  i
1338
1576
  )) });
@@ -1340,9 +1578,9 @@ function Grid4({
1340
1578
  var KEYFRAME = `@keyframes sd-clients-marquee { from { transform: translateX(0) } to { transform: translateX(-50%) } }`;
1341
1579
  function Marquee({ items, speed = 40, logoHeight = 36, gap = 64 }) {
1342
1580
  const doubled = [...items, ...items];
1343
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_core25.Box, { style: { overflow: "hidden" }, children: [
1344
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("style", { children: KEYFRAME }),
1345
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1581
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_core25.Box, { style: { overflow: "hidden" }, children: [
1582
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("style", { children: KEYFRAME }),
1583
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
1346
1584
  import_core25.Box,
1347
1585
  {
1348
1586
  style: {
@@ -1360,7 +1598,7 @@ function Marquee({ items, speed = 40, logoHeight = 36, gap = 64 }) {
1360
1598
  ;
1361
1599
  e.currentTarget.style.animationPlayState = "running";
1362
1600
  },
1363
- children: doubled.map((client, i) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(LogoImage, { client, height: logoHeight }, i))
1601
+ children: doubled.map((client, i) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(LogoImage, { client, height: logoHeight }, i))
1364
1602
  }
1365
1603
  )
1366
1604
  ] });
@@ -1375,12 +1613,12 @@ var SdClientsGrid = Grid4;
1375
1613
  var SdClientsMarquee = Marquee;
1376
1614
 
1377
1615
  // ui/molecule/Map.tsx
1378
- var import_react2 = require("react");
1616
+ var import_react3 = require("react");
1379
1617
  var import_core26 = require("@mantine/core");
1380
- var import_jsx_runtime27 = require("react/jsx-runtime");
1618
+ var import_jsx_runtime28 = require("react/jsx-runtime");
1381
1619
  function MapFrame({ address, height }) {
1382
- return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_core26.Stack, { gap: "xs", children: [
1383
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core26.Box, { style: { borderRadius: "var(--mantine-radius-md)", overflow: "hidden", height }, children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
1620
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_core26.Stack, { gap: "xs", children: [
1621
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core26.Box, { style: { borderRadius: "var(--mantine-radius-md)", overflow: "hidden", height }, children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1384
1622
  "iframe",
1385
1623
  {
1386
1624
  src: address.embbedUrl,
@@ -1393,7 +1631,7 @@ function MapFrame({ address, height }) {
1393
1631
  title: address.label
1394
1632
  }
1395
1633
  ) }),
1396
- /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(SdText.Sub, { children: [
1634
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(SdText.Sub, { children: [
1397
1635
  "[",
1398
1636
  address.label,
1399
1637
  "] ",
@@ -1404,18 +1642,18 @@ function MapFrame({ address, height }) {
1404
1642
  function Single(_a4) {
1405
1643
  var _b = _a4, { address, height = 400 } = _b, boxProps = __objRest(_b, ["address", "height"]);
1406
1644
  if (!address.embbedUrl) return null;
1407
- return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core26.Box, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(MapFrame, { address, height }) }));
1645
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core26.Box, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(MapFrame, { address, height }) }));
1408
1646
  }
1409
1647
  function Tabs2({ addresses, height = 400 }) {
1410
1648
  var _a4, _b, _c;
1411
1649
  const mapped = addresses.filter((a) => a.embbedUrl);
1412
- const [active, setActive] = (0, import_react2.useState)((_b = (_a4 = mapped[0]) == null ? void 0 : _a4.label) != null ? _b : "");
1650
+ const [active, setActive] = (0, import_react3.useState)((_b = (_a4 = mapped[0]) == null ? void 0 : _a4.label) != null ? _b : "");
1413
1651
  if (mapped.length === 0) return null;
1414
- if (mapped.length === 1) return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(MapFrame, { address: mapped[0], height });
1652
+ if (mapped.length === 1) return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(MapFrame, { address: mapped[0], height });
1415
1653
  const current = (_c = mapped.find((a) => a.label === active)) != null ? _c : mapped[0];
1416
- return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_core26.Stack, { gap: "md", children: [
1417
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(SdTabs.Pills, { value: active, onChange: (v) => setActive(v != null ? v : mapped[0].label), children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(SdTabs.Pills.List, { children: mapped.map((addr) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(SdTabs.Pills.Tab, { value: addr.label, children: addr.label }, addr.label)) }) }),
1418
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(MapFrame, { address: current, height })
1654
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_core26.Stack, { gap: "md", children: [
1655
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(SdTabs.Pills, { value: active, onChange: (v) => setActive(v != null ? v : mapped[0].label), children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(SdTabs.Pills.List, { children: mapped.map((addr) => /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(SdTabs.Pills.Tab, { value: addr.label, children: addr.label }, addr.label)) }) }),
1656
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(MapFrame, { address: current, height })
1419
1657
  ] });
1420
1658
  }
1421
1659
  var SdMap = {
@@ -1427,11 +1665,78 @@ var SdMap = {
1427
1665
  var SdMapSingle = Single;
1428
1666
  var SdMapTabs = Tabs2;
1429
1667
 
1668
+ // ui/molecule/Breadcrumb.tsx
1669
+ var import_core27 = require("@mantine/core");
1670
+ var import_navigation = require("next/navigation");
1671
+ var import_icons_react5 = require("@tabler/icons-react");
1672
+ var import_jsx_runtime29 = require("react/jsx-runtime");
1673
+ function normalizePath(href) {
1674
+ if (!href) return "";
1675
+ const trimmed = href.replace(/\/+$/, "");
1676
+ return trimmed === "" ? "/" : trimmed;
1677
+ }
1678
+ function buildTrail(navItems, currentHref) {
1679
+ const target = normalizePath(currentHref);
1680
+ const byId = new Map(navItems.map((item) => [item.id, item]));
1681
+ let current = navItems.find((item) => normalizePath(item.href) === target);
1682
+ if (!current) {
1683
+ current = navItems.filter((item) => item.href && target.startsWith(normalizePath(item.href) + "/")).sort((a, b) => normalizePath(b.href).length - normalizePath(a.href).length)[0];
1684
+ }
1685
+ if (!current) return [];
1686
+ const trail = [];
1687
+ const seen = /* @__PURE__ */ new Set();
1688
+ let node = current;
1689
+ while (node && !seen.has(node.id)) {
1690
+ seen.add(node.id);
1691
+ trail.unshift(node);
1692
+ node = node.parentId != null ? byId.get(node.parentId) : void 0;
1693
+ }
1694
+ return trail;
1695
+ }
1696
+ function SdBreadcrumb(_a4) {
1697
+ var _b = _a4, {
1698
+ navItems,
1699
+ currentHref,
1700
+ homeHref = "/",
1701
+ homeLabel = "\uD648"
1702
+ } = _b, boxProps = __objRest(_b, [
1703
+ "navItems",
1704
+ "currentHref",
1705
+ "homeHref",
1706
+ "homeLabel"
1707
+ ]);
1708
+ var _a5;
1709
+ const pathname = (0, import_navigation.usePathname)();
1710
+ const trail = buildTrail(navItems, (_a5 = currentHref != null ? currentHref : pathname) != null ? _a5 : "");
1711
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core27.Box, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
1712
+ import_core27.Breadcrumbs,
1713
+ {
1714
+ separator: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_icons_react5.IconChevronRight, { size: 14, stroke: 2, color: "var(--mantine-color-slate-4)" }),
1715
+ separatorMargin: "xs",
1716
+ children: [
1717
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1718
+ SdLink.Sub,
1719
+ {
1720
+ href: homeHref,
1721
+ "aria-label": homeLabel,
1722
+ style: { display: "inline-flex", alignItems: "center" },
1723
+ children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_icons_react5.IconHome, { size: 16, stroke: 2 })
1724
+ }
1725
+ ),
1726
+ trail.map((item, i) => {
1727
+ const isLast = i === trail.length - 1;
1728
+ return isLast ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdLink.Body, { children: item.label }, item.id) : /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdLink.Sub, { href: item.href, children: item.label }, item.id);
1729
+ })
1730
+ ]
1731
+ }
1732
+ ) }));
1733
+ }
1734
+
1430
1735
  // ui/organism/HeroCarousel.tsx
1431
1736
  var import_carousel = require("@mantine/carousel");
1432
- var import_core27 = require("@mantine/core");
1433
- var import_icons_react4 = require("@tabler/icons-react");
1434
- var import_jsx_runtime28 = require("react/jsx-runtime");
1737
+ var import_core28 = require("@mantine/core");
1738
+ var import_icons_react6 = require("@tabler/icons-react");
1739
+ var import_jsx_runtime30 = require("react/jsx-runtime");
1435
1740
  var variantMap = {
1436
1741
  primary: SdButton.Primary,
1437
1742
  secondary: SdButton.Secondary,
@@ -1441,25 +1746,25 @@ var variantMap = {
1441
1746
  function CtaButton({ cta }) {
1442
1747
  var _a4;
1443
1748
  const Button3 = variantMap[(_a4 = cta.variant) != null ? _a4 : "primary"];
1444
- return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core27.Anchor, { href: cta.href, underline: "never", children: cta.icon ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Button3, { size: "md", rightSection: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_icons_react4.IconArrowNarrowRight, {}), children: cta.label }) : /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Button3, { size: "md", children: cta.label }) });
1749
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Anchor, { href: cta.href, underline: "never", children: cta.icon ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Button3, { size: "md", rightSection: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_icons_react6.IconArrowNarrowRight, {}), children: cta.label }) : /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Button3, { size: "md", children: cta.label }) });
1445
1750
  }
1446
1751
  function HeroCarousel({ slides, children }) {
1447
- if (children) return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_jsx_runtime28.Fragment, { children });
1752
+ if (children) return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_jsx_runtime30.Fragment, { children });
1448
1753
  const filterdSlides = filterAndSort(slides);
1449
- return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_carousel.Carousel, { withIndicators: true, height: "60svh", children: filterdSlides.map((slide, i) => /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_carousel.Carousel.Slide, { children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1450
- import_core27.Box,
1754
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_carousel.Carousel, { withIndicators: true, height: "60svh", children: filterdSlides.map((slide, i) => /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_carousel.Carousel.Slide, { children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
1755
+ import_core28.Box,
1451
1756
  {
1452
1757
  style: {
1453
1758
  height: "100%",
1454
- backgroundImage: `url(${slide.image})`,
1759
+ backgroundImage: `linear-gradient(rgba(0, 0, 0, 0.45), rgba(0, 0, 0, 0.45)), url(${slide.image})`,
1455
1760
  backgroundSize: "cover",
1456
1761
  backgroundPosition: "center",
1457
1762
  display: "flex",
1458
1763
  alignItems: "center",
1459
1764
  justifyContent: "center"
1460
1765
  },
1461
- children: /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_core27.Stack, { align: "center", style: { textAlign: "center", maxWidth: 780 }, px: "xl", children: [
1462
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1766
+ children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core28.Stack, { align: "center", style: { textAlign: "center", maxWidth: 780 }, px: "xl", children: [
1767
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
1463
1768
  SdTextBox.Hero,
1464
1769
  {
1465
1770
  title: slide.title,
@@ -1468,30 +1773,77 @@ function HeroCarousel({ slides, children }) {
1468
1773
  align: "center"
1469
1774
  }
1470
1775
  ),
1471
- slide.ctas && slide.ctas.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core27.Group, { gap: "sm", mt: "md", children: slide.ctas.map((cta, i2) => /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(CtaButton, { cta }, cta.href)) })
1776
+ slide.ctas && slide.ctas.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Group, { gap: "sm", mt: "md", children: slide.ctas.map((cta, i2) => /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(CtaButton, { cta }, cta.href)) })
1472
1777
  ] })
1473
1778
  }
1474
1779
  ) }, i)) });
1475
1780
  }
1476
1781
 
1477
1782
  // ui/organism/Header.tsx
1478
- var import_core28 = require("@mantine/core");
1783
+ var import_core29 = require("@mantine/core");
1784
+ var import_icons_react7 = require("@tabler/icons-react");
1479
1785
  var import_hooks = require("@mantine/hooks");
1480
- var import_jsx_runtime29 = require("react/jsx-runtime");
1786
+ var import_jsx_runtime31 = require("react/jsx-runtime");
1481
1787
  var BAR_HEIGHT = 60;
1482
- function SdHeader({ navItems, loginFlag }) {
1483
- const [opened, { toggle, close }] = (0, import_hooks.useDisclosure)();
1788
+ var MAX_DEPTH = 3;
1789
+ var NAV_LINK_STYLES = {
1790
+ label: {
1791
+ fontWeight: textStyles.Body.fw,
1792
+ fontSize: `var(--mantine-font-size-${textStyles.Body.fz})`,
1793
+ color: toCssColor(textStyles.Body.c),
1794
+ lineHeight: textStyles.Body.lh
1795
+ }
1796
+ };
1797
+ function useNavTree(navItems) {
1484
1798
  const visibleItems = filterAndSort(navItems);
1485
- const topItems = visibleItems.filter((item) => !item.parentId);
1486
- const childrenOf = (parentId) => visibleItems.filter((item) => item.parentId === parentId);
1487
- const hasAnyChildren = visibleItems.some((item) => item.parentId);
1799
+ return {
1800
+ topItems: visibleItems.filter((item) => !item.parentId),
1801
+ childrenOf: (parentId) => visibleItems.filter((item) => item.parentId === parentId),
1802
+ hasAnyChildren: visibleItems.some((item) => item.parentId)
1803
+ };
1804
+ }
1805
+ function MobileNavNode({ item, depth, childrenOf, close }) {
1806
+ const kids = depth < MAX_DEPTH ? childrenOf(item.id) : [];
1807
+ if (kids.length === 0) {
1808
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Box, { px: "sm", py: 8, children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdLink.Body, { href: item.href, onClick: close, children: item.label }) });
1809
+ }
1810
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
1811
+ import_core29.NavLink,
1812
+ {
1813
+ label: item.label,
1814
+ styles: NAV_LINK_STYLES,
1815
+ component: item.href ? "a" : "button",
1816
+ href: item.href,
1817
+ childrenOffset: 28,
1818
+ children: kids.map((kid) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
1819
+ MobileNavNode,
1820
+ {
1821
+ item: kid,
1822
+ depth: depth + 1,
1823
+ childrenOf,
1824
+ close
1825
+ },
1826
+ kid.id
1827
+ ))
1828
+ }
1829
+ );
1830
+ }
1831
+ function MobileNav({ opened, close, topItems, childrenOf, loginFlag }) {
1832
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Drawer, { opened, onClose: close, hiddenFrom: "sm", size: "xs", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Stack, { gap: 0, children: [
1833
+ topItems.map((item) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(MobileNavNode, { item, depth: 1, childrenOf, close }, item.id)),
1834
+ loginFlag && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Stack, { gap: "xs", mt: "md", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
1835
+ ] }) });
1836
+ }
1837
+ function MegaHeader({ navItems, loginFlag }) {
1838
+ const [opened, { toggle, close }] = (0, import_hooks.useDisclosure)();
1839
+ const { topItems, childrenOf, hasAnyChildren } = useNavTree(navItems);
1488
1840
  const { hovered, ref: hoverRef } = (0, import_hooks.useHover)();
1489
1841
  const { focused, ref: focusRef } = (0, import_hooks.useFocusWithin)();
1490
1842
  const rootRef = (0, import_hooks.useMergedRef)(hoverRef, focusRef);
1491
1843
  const expanded = hasAnyChildren && (hovered || focused);
1492
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_jsx_runtime29.Fragment, { children: [
1493
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1494
- import_core28.Box,
1844
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_jsx_runtime31.Fragment, { children: [
1845
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
1846
+ import_core29.Box,
1495
1847
  {
1496
1848
  ref: rootRef,
1497
1849
  pos: "relative",
@@ -1501,12 +1853,12 @@ function SdHeader({ navItems, loginFlag }) {
1501
1853
  borderBottom: expanded ? "1px solid var(--mantine-color-slate-2)" : void 0,
1502
1854
  transition: "box-shadow 0.15s"
1503
1855
  },
1504
- children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core28.Group, { justify: "space-between", align: "flex-start", wrap: "nowrap", children: [
1505
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Group, { h: BAR_HEIGHT, align: "center", children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(Logo, {}) }),
1506
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Group, { gap: "xl", align: "flex-start", wrap: "nowrap", visibleFrom: "sm", children: topItems.map((item) => {
1856
+ children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Group, { justify: "space-between", align: "flex-start", wrap: "nowrap", children: [
1857
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Group, { h: BAR_HEIGHT, align: "center", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Logo, {}) }),
1858
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Group, { gap: "xl", align: "flex-start", wrap: "nowrap", visibleFrom: "sm", children: topItems.map((item) => {
1507
1859
  const kids = childrenOf(item.id);
1508
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core28.Stack, { gap: 0, align: "center", children: [
1509
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Group, { h: BAR_HEIGHT, align: "center", children: item.href ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdLink.Body, { href: item.href, children: item.label }) : /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdText.Strong, { children: item.label }) }),
1860
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Stack, { gap: 0, align: "center", children: [
1861
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Group, { h: BAR_HEIGHT, align: "center", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdLink.Body, { href: item.href, children: item.label }) }),
1510
1862
  kids.length > 0 && /*
1511
1863
  Mantine Collapse를 쓰지 않는다 — 접힐 때 display:none이 되어
1512
1864
  하위 링크가 폭 계산에서 빠졌다가 펼칠 때 다시 들어오면서
@@ -1514,8 +1866,8 @@ function SdHeader({ navItems, loginFlag }) {
1514
1866
  height 0 + overflow hidden은 폭 기여를 유지하므로 간격이 고정된다.
1515
1867
  visibility:hidden이 접힌 상태의 링크를 탭 순서에서도 빼준다.
1516
1868
  */
1517
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1518
- import_core28.Box,
1869
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
1870
+ import_core29.Box,
1519
1871
  {
1520
1872
  "aria-hidden": !expanded,
1521
1873
  style: {
@@ -1525,72 +1877,207 @@ function SdHeader({ navItems, loginFlag }) {
1525
1877
  visibility: expanded ? "visible" : "hidden",
1526
1878
  transition: "opacity 0.15s ease"
1527
1879
  },
1528
- children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Stack, { gap: "xs", pt: 4, pb: "lg", align: "center", children: kids.map((kid) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdLink.Sub, { href: kid.href, children: kid.label }, kid.id)) })
1880
+ children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Stack, { gap: "xs", pt: 4, pb: "lg", align: "center", children: kids.map((kid) => {
1881
+ const grandkids = childrenOf(kid.id);
1882
+ if (grandkids.length === 0) {
1883
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdLink.Body, { href: kid.href, children: kid.label }, kid.id);
1884
+ }
1885
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Stack, { gap: 2, align: "center", children: [
1886
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdLink.Body, { href: kid.href, children: kid.label }),
1887
+ grandkids.map((gk) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdLink.Sub, { href: gk.href, children: gk.label }, gk.id))
1888
+ ] }, kid.id);
1889
+ }) })
1529
1890
  }
1530
1891
  )
1531
1892
  ] }, item.id);
1532
1893
  }) }),
1533
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core28.Group, { h: BAR_HEIGHT, align: "center", gap: "sm", wrap: "nowrap", children: [
1534
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Burger, { hiddenFrom: "sm", opened, onClick: toggle }),
1535
- loginFlag && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Group, { gap: "sm", visibleFrom: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
1894
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Group, { h: BAR_HEIGHT, align: "center", gap: "sm", wrap: "nowrap", children: [
1895
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Burger, { hiddenFrom: "sm", opened, onClick: toggle }),
1896
+ loginFlag && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Group, { gap: "sm", visibleFrom: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
1536
1897
  ] })
1537
1898
  ] }) })
1538
1899
  }
1539
1900
  ),
1540
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Drawer, { opened, onClose: close, hiddenFrom: "sm", size: "xs", children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core28.Stack, { gap: 0, children: [
1541
- topItems.map((item) => {
1901
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
1902
+ MobileNav,
1903
+ {
1904
+ opened,
1905
+ close,
1906
+ topItems,
1907
+ childrenOf,
1908
+ loginFlag
1909
+ }
1910
+ )
1911
+ ] });
1912
+ }
1913
+ function renderMenuLeaf(item) {
1914
+ return item.href ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Menu.Item, { component: "a", href: item.href, children: item.label }, item.id) : /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Menu.Label, { children: item.label }, item.id);
1915
+ }
1916
+ function SimpleHeader({ navItems, loginFlag }) {
1917
+ const [opened, { toggle, close }] = (0, import_hooks.useDisclosure)();
1918
+ const { topItems, childrenOf } = useNavTree(navItems);
1919
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_jsx_runtime31.Fragment, { children: [
1920
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Box, { bg: "var(--mantine-color-body)", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Group, { h: BAR_HEIGHT, justify: "space-between", align: "center", wrap: "nowrap", children: [
1921
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Logo, {}),
1922
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Group, { gap: "xl", align: "center", wrap: "nowrap", visibleFrom: "sm", children: topItems.map((item) => {
1542
1923
  const kids = childrenOf(item.id);
1543
1924
  if (kids.length === 0) {
1544
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Box, { px: "sm", py: 8, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdLink.Body, { href: item.href, onClick: close, children: item.label }) }, item.id);
1925
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdLink.Body, { href: item.href, children: item.label }, item.id);
1545
1926
  }
1546
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1547
- import_core28.NavLink,
1927
+ return (
1928
+ /*
1929
+ trigger="click-hover" — 마우스는 hover로, 키보드/터치는 click으로 연다.
1930
+ Menu.Target은 ref를 받을 수 있는 단일 엘리먼트여야 하므로
1931
+ SdLink/SdText가 아니라 Box를 타깃으로 두고 라벨을 그 안에 넣는다.
1932
+ */
1933
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
1934
+ import_core29.Menu,
1935
+ {
1936
+ trigger: "click-hover",
1937
+ openDelay: 50,
1938
+ closeDelay: 120,
1939
+ position: "bottom",
1940
+ offset: 12,
1941
+ shadow: "md",
1942
+ radius: "md",
1943
+ withinPortal: true,
1944
+ children: [
1945
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Menu.Target, { children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Box, { style: { cursor: "pointer" }, children: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Group, { gap: 4, align: "center", wrap: "nowrap", children: [
1946
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdLink.Body, { href: item.href, children: item.label }),
1947
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_icons_react7.IconChevronDown, { size: 14, stroke: 2 })
1948
+ ] }) }) }),
1949
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Menu.Dropdown, { children: kids.map((kid) => {
1950
+ const grandkids = childrenOf(kid.id);
1951
+ if (grandkids.length > 0) {
1952
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Menu.Sub, { children: [
1953
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Menu.Sub.Target, { children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Menu.Sub.Item, { children: kid.label }) }),
1954
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Menu.Sub.Dropdown, { children: grandkids.map(renderMenuLeaf) })
1955
+ ] }, kid.id);
1956
+ }
1957
+ return renderMenuLeaf(kid);
1958
+ }) })
1959
+ ]
1960
+ },
1961
+ item.id
1962
+ )
1963
+ );
1964
+ }) }),
1965
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Group, { align: "center", gap: "sm", wrap: "nowrap", children: [
1966
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Burger, { hiddenFrom: "sm", opened, onClick: toggle }),
1967
+ loginFlag && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Group, { gap: "sm", visibleFrom: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
1968
+ ] })
1969
+ ] }) }) }),
1970
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
1971
+ MobileNav,
1972
+ {
1973
+ opened,
1974
+ close,
1975
+ topItems,
1976
+ childrenOf,
1977
+ loginFlag
1978
+ }
1979
+ )
1980
+ ] });
1981
+ }
1982
+ function PanelHeader({ navItems, loginFlag }) {
1983
+ const [opened, { toggle, close }] = (0, import_hooks.useDisclosure)();
1984
+ const { topItems, childrenOf } = useNavTree(navItems);
1985
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_jsx_runtime31.Fragment, { children: [
1986
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Box, { bg: "var(--mantine-color-body)", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Group, { h: BAR_HEIGHT, justify: "space-between", align: "center", wrap: "nowrap", children: [
1987
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Logo, {}),
1988
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Group, { gap: "xl", align: "center", wrap: "nowrap", visibleFrom: "sm", children: topItems.map((item) => {
1989
+ const kids = childrenOf(item.id);
1990
+ if (kids.length === 0) {
1991
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdLink.Body, { href: item.href, children: item.label }, item.id);
1992
+ }
1993
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
1994
+ import_core29.Menu,
1548
1995
  {
1549
- label: item.label,
1550
- href: item.href,
1551
- childrenOffset: 28,
1552
- onClick: kids.length > 0 ? void 0 : close,
1553
- children: kids.map((kid) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.NavLink, { label: kid.label, href: kid.href, onClick: close }, kid.id))
1996
+ trigger: "click-hover",
1997
+ openDelay: 50,
1998
+ closeDelay: 120,
1999
+ position: "bottom",
2000
+ offset: 12,
2001
+ shadow: "md",
2002
+ radius: "md",
2003
+ withinPortal: true,
2004
+ children: [
2005
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Menu.Target, { children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Box, { style: { cursor: "pointer" }, children: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Group, { gap: 4, align: "center", wrap: "nowrap", children: [
2006
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdLink.Body, { href: item.href, children: item.label }),
2007
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_icons_react7.IconChevronDown, { size: 14, stroke: 2 })
2008
+ ] }) }) }),
2009
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Menu.Dropdown, { children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Stack, { gap: "xs", p: "xs", children: kids.map((kid) => {
2010
+ const grandkids = childrenOf(kid.id);
2011
+ if (grandkids.length === 0) {
2012
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdLink.Body, { href: kid.href, children: kid.label }, kid.id);
2013
+ }
2014
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Stack, { gap: 2, children: [
2015
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdLink.Body, { href: kid.href, children: kid.label }),
2016
+ grandkids.map((gk) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdLink.Sub, { href: gk.href, pl: "sm", children: gk.label }, gk.id))
2017
+ ] }, kid.id);
2018
+ }) }) })
2019
+ ]
1554
2020
  },
1555
2021
  item.id
1556
2022
  );
1557
- }),
1558
- loginFlag && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Stack, { gap: "xs", mt: "md", children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
1559
- ] }) })
2023
+ }) }),
2024
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Group, { align: "center", gap: "sm", wrap: "nowrap", children: [
2025
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Burger, { hiddenFrom: "sm", opened, onClick: toggle }),
2026
+ loginFlag && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Group, { gap: "sm", visibleFrom: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
2027
+ ] })
2028
+ ] }) }) }),
2029
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
2030
+ MobileNav,
2031
+ {
2032
+ opened,
2033
+ close,
2034
+ topItems,
2035
+ childrenOf,
2036
+ loginFlag
2037
+ }
2038
+ )
1560
2039
  ] });
1561
2040
  }
2041
+ var SdHeader = Object.assign(MegaHeader, {
2042
+ Mega: MegaHeader,
2043
+ Simple: SimpleHeader,
2044
+ Panel: PanelHeader
2045
+ });
2046
+ var SdHeaderMega = MegaHeader;
2047
+ var SdHeaderSimple = SimpleHeader;
2048
+ var SdHeaderPanel = PanelHeader;
1562
2049
 
1563
2050
  // ui/organism/Footer.tsx
1564
- var import_core29 = require("@mantine/core");
1565
- var import_icons_react5 = require("@tabler/icons-react");
1566
- var import_jsx_runtime30 = require("react/jsx-runtime");
2051
+ var import_core30 = require("@mantine/core");
2052
+ var import_icons_react8 = require("@tabler/icons-react");
2053
+ var import_jsx_runtime32 = require("react/jsx-runtime");
1567
2054
  function FooterNavColumns({ items }) {
1568
2055
  const topLevel = items.filter((item) => !item.parentId);
1569
2056
  const getChildren = (parentId) => items.filter((item) => item.parentId === parentId);
1570
2057
  const CHILD_THRESH = 4;
1571
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_jsx_runtime30.Fragment, { children: topLevel.map((group) => /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Grid.Col, { span: { base: 6, sm: 4, md: "auto" }, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.Stack, { gap: "xs", children: [
1572
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdText.Sub, { children: group.label }),
2058
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_jsx_runtime32.Fragment, { children: topLevel.map((group) => /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Grid.Col, { span: { base: 6, sm: 4, md: "auto" }, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core30.Stack, { gap: "xs", children: [
2059
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdLink.Sub, { href: group.href, children: group.label }, group.id),
1573
2060
  getChildren(group.id).map((link, id) => {
1574
2061
  if (id >= CHILD_THRESH) return;
1575
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdLink.Hint, { href: link.href, children: link.label }, link.id);
2062
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdLink.Hint, { href: link.href, children: link.label }, link.id);
1576
2063
  })
1577
2064
  ] }) }, group.id)) });
1578
2065
  }
1579
2066
  var SOCIAL_ICONS = {
1580
- x: import_icons_react5.IconBrandX,
1581
- youtube: import_icons_react5.IconBrandYoutube,
1582
- instagram: import_icons_react5.IconBrandInstagram,
1583
- facebook: import_icons_react5.IconBrandFacebook,
1584
- linkedin: import_icons_react5.IconBrandLinkedin,
1585
- github: import_icons_react5.IconBrandGithub,
1586
- blog: import_icons_react5.IconWorld
2067
+ x: import_icons_react8.IconBrandX,
2068
+ youtube: import_icons_react8.IconBrandYoutube,
2069
+ instagram: import_icons_react8.IconBrandInstagram,
2070
+ facebook: import_icons_react8.IconBrandFacebook,
2071
+ linkedin: import_icons_react8.IconBrandLinkedin,
2072
+ github: import_icons_react8.IconBrandGithub,
2073
+ blog: import_icons_react8.IconWorld
1587
2074
  };
1588
2075
  function FooterSocials({ items }) {
1589
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Group, { gap: 0, wrap: "nowrap", children: items.map((item) => {
2076
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Group, { gap: 0, wrap: "nowrap", children: items.map((item) => {
1590
2077
  var _a4, _b;
1591
- const Icon = (_a4 = SOCIAL_ICONS[item.platform]) != null ? _a4 : import_icons_react5.IconWorld;
1592
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
1593
- import_core29.ActionIcon,
2078
+ const Icon = (_a4 = SOCIAL_ICONS[item.platform]) != null ? _a4 : import_icons_react8.IconWorld;
2079
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
2080
+ import_core30.ActionIcon,
1594
2081
  {
1595
2082
  component: "a",
1596
2083
  href: item.url,
@@ -1600,62 +2087,62 @@ function FooterSocials({ items }) {
1600
2087
  color: "gray",
1601
2088
  variant: "subtle",
1602
2089
  "aria-label": (_b = item.label) != null ? _b : item.platform,
1603
- children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Icon, { size: 18, stroke: 1.5 })
2090
+ children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Icon, { size: 18, stroke: 1.5 })
1604
2091
  },
1605
2092
  item.url
1606
2093
  );
1607
2094
  }) });
1608
2095
  }
1609
2096
  function InfoCell({ label, children }) {
1610
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.Group, { gap: 6, wrap: "nowrap", align: "baseline", children: [
1611
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdText.Sub, { c: "slate.4", style: { whiteSpace: "nowrap" }, children: label }),
1612
- typeof children === "string" ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdText.Sub, { children }) : children
2097
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core30.Group, { gap: 6, wrap: "nowrap", align: "baseline", children: [
2098
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdText.Sub, { c: "slate.4", style: { whiteSpace: "nowrap" }, children: label }),
2099
+ typeof children === "string" ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdText.Sub, { children }) : children
1613
2100
  ] });
1614
2101
  }
1615
2102
  function FooterCompanyInfo({ company }) {
1616
2103
  const sortedAddresses = [...company.addresses].sort((a, b) => a.order - b.order);
1617
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.SimpleGrid, { cols: { base: 2, sm: 2, md: 1 }, spacing: "md", verticalSpacing: 0, children: [
1618
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(InfoCell, { label: "\uC0C1\uD638", children: company.name }),
1619
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(InfoCell, { label: "\uC0AC\uC5C5\uC790\uB4F1\uB85D\uBC88\uD638", children: company.registrationNumber }),
1620
- sortedAddresses.map((addr) => /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(InfoCell, { label: addr.label, children: addr.address }, addr.label)),
1621
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(InfoCell, { label: "Tel", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdLink.Sub, { href: `tel:${company.tel}`, children: company.tel }) }),
1622
- company.fax && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(InfoCell, { label: "Fax", children: company.fax }),
1623
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(InfoCell, { label: "Email", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdLink.Sub, { href: `mailto:${company.email}`, children: company.email }) })
2104
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core30.SimpleGrid, { cols: { base: 2, sm: 2, md: 1 }, spacing: "md", verticalSpacing: 0, children: [
2105
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(InfoCell, { label: "\uC0C1\uD638", children: company.name }),
2106
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(InfoCell, { label: "\uC0AC\uC5C5\uC790\uB4F1\uB85D\uBC88\uD638", children: company.registrationNumber }),
2107
+ sortedAddresses.map((addr) => /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(InfoCell, { label: addr.label, children: addr.address }, addr.label)),
2108
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(InfoCell, { label: "Tel", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdLink.Sub, { href: `tel:${company.tel}`, children: company.tel }) }),
2109
+ company.fax && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(InfoCell, { label: "Fax", children: company.fax }),
2110
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(InfoCell, { label: "Email", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdLink.Sub, { href: `mailto:${company.email}`, children: company.email }) })
1624
2111
  ] });
1625
2112
  }
1626
2113
  function SdFooter({ company, navItems, policyLinks, description }) {
1627
2114
  const visibleNav = filterAndSort(navItems);
1628
2115
  const visiblePolicy = filterAndSort(policyLinks);
1629
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Box, { component: "footer", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.Stack, { children: [
1630
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Logo, { size: "sm" }),
1631
- description && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdText.Sub, { children: description }),
1632
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.Flex, { direction: { base: "column", md: "row" }, gap: 48, align: "flex-start", children: [
1633
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Box, { flex: { base: "0 0 auto", md: "1 1 0" }, w: { base: "100%", md: "auto" }, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(FooterCompanyInfo, { company }) }),
1634
- visibleNav.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Box, { flex: { base: "0 0 auto", md: "2 1 0" }, w: { base: "100%", md: "auto" }, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Grid, { style: { "--grid-gutter": "24px" }, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(FooterNavColumns, { items: visibleNav }) }) })
2116
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Box, { component: "footer", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdContainer, { py: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core30.Stack, { children: [
2117
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Logo, { size: "sm" }),
2118
+ description && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdText.Sub, { children: description }),
2119
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core30.Flex, { direction: { base: "column", md: "row" }, gap: 48, align: "flex-start", children: [
2120
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Box, { flex: { base: "0 0 auto", md: "1 1 0" }, w: { base: "100%", md: "auto" }, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(FooterCompanyInfo, { company }) }),
2121
+ visibleNav.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Box, { flex: { base: "0 0 auto", md: "2 1 0" }, w: { base: "100%", md: "auto" }, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Grid, { style: { "--grid-gutter": "24px" }, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(FooterNavColumns, { items: visibleNav }) }) })
1635
2122
  ] }),
1636
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Divider, {}),
1637
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.Group, { justify: "space-between", wrap: "wrap", gap: "xs", children: [
1638
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(SdText.Sub, { children: [
2123
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Divider, {}),
2124
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core30.Group, { justify: "space-between", wrap: "wrap", gap: "xs", children: [
2125
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(SdText.Sub, { children: [
1639
2126
  "\xA9 ",
1640
2127
  company.copyrightYear,
1641
2128
  " ",
1642
- company.name,
2129
+ t(company.name),
1643
2130
  ". All rights reserved."
1644
2131
  ] }),
1645
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.Group, { gap: "lg", wrap: "wrap", children: [
1646
- visiblePolicy.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Group, { gap: "lg", children: visiblePolicy.map((item) => {
1647
- const Link4 = item.highlight ? SdLink.Strong : SdLink.Sub;
1648
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Link4, { href: item.href, children: item.label }, item.id);
2132
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core30.Group, { gap: "lg", wrap: "wrap", children: [
2133
+ visiblePolicy.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Group, { gap: "lg", children: visiblePolicy.map((item) => {
2134
+ const Link4 = item.highlight ? SdLink.Body : SdLink.Sub;
2135
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Link4, { href: item.href, children: item.label }, item.id);
1649
2136
  }) }),
1650
- company.socials && company.socials.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(FooterSocials, { items: company.socials })
2137
+ company.socials && company.socials.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(FooterSocials, { items: company.socials })
1651
2138
  ] })
1652
2139
  ] })
1653
2140
  ] }) }) });
1654
2141
  }
1655
2142
 
1656
2143
  // ui/organism/FeatureSection.tsx
1657
- var import_core30 = require("@mantine/core");
1658
- var import_jsx_runtime31 = require("react/jsx-runtime");
2144
+ var import_core31 = require("@mantine/core");
2145
+ var import_jsx_runtime33 = require("react/jsx-runtime");
1659
2146
  function SdFeatureSection(_a4) {
1660
2147
  var _b = _a4, {
1661
2148
  label,
@@ -1672,8 +2159,8 @@ function SdFeatureSection(_a4) {
1672
2159
  "cols",
1673
2160
  "py"
1674
2161
  ]);
1675
- return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdContainer, __spreadProps(__spreadValues({ py }, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core30.Stack, { gap: "xl", children: [
1676
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
2162
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdContainer, __spreadProps(__spreadValues({ py }, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core31.Stack, { gap: "xl", children: [
2163
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
1677
2164
  SdTextBox.Section,
1678
2165
  {
1679
2166
  label,
@@ -1684,13 +2171,13 @@ function SdFeatureSection(_a4) {
1684
2171
  align: "center"
1685
2172
  }
1686
2173
  ),
1687
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdFeatures, { items, cols })
2174
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdFeatures, { items, cols })
1688
2175
  ] }) }));
1689
2176
  }
1690
2177
 
1691
2178
  // ui/organism/TimelineSection.tsx
1692
- var import_core31 = require("@mantine/core");
1693
- var import_jsx_runtime32 = require("react/jsx-runtime");
2179
+ var import_core32 = require("@mantine/core");
2180
+ var import_jsx_runtime34 = require("react/jsx-runtime");
1694
2181
  function SdTimelineSection(_a4) {
1695
2182
  var _b = _a4, {
1696
2183
  label,
@@ -1705,15 +2192,15 @@ function SdTimelineSection(_a4) {
1705
2192
  "items",
1706
2193
  "py"
1707
2194
  ]);
1708
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core31.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core31.Stack, __spreadProps(__spreadValues({ py, gap: "md" }, boxProps), { children: [
1709
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdTextBox.Section, { label, title, description }),
1710
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core31.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdTimeline, { items }) })
2195
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core32.Stack, __spreadProps(__spreadValues({ py, gap: "md" }, boxProps), { children: [
2196
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdTextBox.Section, { label, title, description }),
2197
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdTimeline, { items }) })
1711
2198
  ] })) });
1712
2199
  }
1713
2200
 
1714
2201
  // ui/organism/StepsSection.tsx
1715
- var import_core32 = require("@mantine/core");
1716
- var import_jsx_runtime33 = require("react/jsx-runtime");
2202
+ var import_core33 = require("@mantine/core");
2203
+ var import_jsx_runtime35 = require("react/jsx-runtime");
1717
2204
  function SdStepsSection(_a4) {
1718
2205
  var _b = _a4, {
1719
2206
  label,
@@ -1728,18 +2215,18 @@ function SdStepsSection(_a4) {
1728
2215
  "items",
1729
2216
  "py"
1730
2217
  ]);
1731
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdContainer, __spreadProps(__spreadValues({ py }, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core32.Stack, { gap: "xl", children: [
1732
- (label || title || description) && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdTextBox.Section, { label, title, description }),
1733
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdSteps.Bubble, { items })
2218
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdContainer, __spreadProps(__spreadValues({ py }, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core33.Stack, { gap: "xl", children: [
2219
+ (label || title || description) && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdTextBox.Section, { label, title, description }),
2220
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdSteps.Bubble, { items })
1734
2221
  ] }) }));
1735
2222
  }
1736
2223
 
1737
2224
  // ui/organism/ErrorView.tsx
1738
- var import_core33 = require("@mantine/core");
1739
- var import_jsx_runtime34 = require("react/jsx-runtime");
2225
+ var import_core34 = require("@mantine/core");
2226
+ var import_jsx_runtime36 = require("react/jsx-runtime");
1740
2227
  function StatusCode({ code }) {
1741
- return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
1742
- import_core33.Text,
2228
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
2229
+ import_core34.Text,
1743
2230
  {
1744
2231
  fz: 160,
1745
2232
  fw: 900,
@@ -1752,15 +2239,15 @@ function StatusCode({ code }) {
1752
2239
  );
1753
2240
  }
1754
2241
  function Page({ error, onReset, onHome }) {
1755
- return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core33.Center, { mih: "60vh", children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core33.Stack, { align: "center", gap: "lg", ta: "center", children: [
1756
- /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(StatusCode, { code: "500" }),
1757
- /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core33.Stack, { gap: "sm", align: "center", children: [
1758
- /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdTitle.Section, { children: "\uC11C\uBC84\uC5D0\uC11C \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4" }),
1759
- /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdText.Body, { maw: 480, children: "\uC608\uAE30\uCE58 \uC54A\uC740 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694." })
2242
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Center, { mih: "60vh", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.Stack, { align: "center", gap: "lg", ta: "center", children: [
2243
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(StatusCode, { code: "500" }),
2244
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.Stack, { gap: "sm", align: "center", children: [
2245
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdTitle.Section, { children: "\uC11C\uBC84\uC5D0\uC11C \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4" }),
2246
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdText.Body, { maw: 480, children: "\uC608\uAE30\uCE58 \uC54A\uC740 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694." })
1760
2247
  ] }),
1761
- /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core33.Group, { gap: "sm", justify: "center", children: [
1762
- /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdButton.Primary, { onClick: onReset, children: "\uB2E4\uC2DC \uC2DC\uB3C4" }),
1763
- onHome && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdButton.Ghost, { onClick: onHome, children: "\uD648\uC73C\uB85C" })
2248
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.Group, { gap: "sm", justify: "center", children: [
2249
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdButton.Primary, { onClick: onReset, children: "\uB2E4\uC2DC \uC2DC\uB3C4" }),
2250
+ onHome && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdButton.Ghost, { onClick: onHome, children: "\uD648\uC73C\uB85C" })
1764
2251
  ] })
1765
2252
  ] }) }) });
1766
2253
  }
@@ -1772,15 +2259,15 @@ function NotFound({
1772
2259
  },
1773
2260
  onBack = () => window.history.back()
1774
2261
  }) {
1775
- return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core33.Center, { mih: "60vh", children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core33.Stack, { align: "center", gap: "lg", ta: "center", children: [
1776
- /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(StatusCode, { code: "404" }),
1777
- /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core33.Stack, { gap: "sm", align: "center", children: [
1778
- /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdTitle.Section, { children: title }),
1779
- /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdText.Body, { maw: 480, children: description })
2262
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Center, { mih: "60vh", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.Stack, { align: "center", gap: "lg", ta: "center", children: [
2263
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(StatusCode, { code: "404" }),
2264
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.Stack, { gap: "sm", align: "center", children: [
2265
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdTitle.Section, { children: title }),
2266
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdText.Body, { maw: 480, children: description })
1780
2267
  ] }),
1781
- /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core33.Group, { gap: "sm", justify: "center", children: [
1782
- onHome && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdButton.Primary, { onClick: onHome, children: "\uD648\uC73C\uB85C" }),
1783
- onBack && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdButton.Ghost, { onClick: onBack, children: "\uB4A4\uB85C \uAC00\uAE30" })
2268
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.Group, { gap: "sm", justify: "center", children: [
2269
+ onHome && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdButton.Primary, { onClick: onHome, children: "\uD648\uC73C\uB85C" }),
2270
+ onBack && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdButton.Ghost, { onClick: onBack, children: "\uB4A4\uB85C \uAC00\uAE30" })
1784
2271
  ] })
1785
2272
  ] }) }) });
1786
2273
  }
@@ -1793,178 +2280,414 @@ var SdErrorView = {
1793
2280
  var SdErrorViewPage = SdErrorView.Page;
1794
2281
  var SdErrorViewNotFound = SdErrorView.NotFound;
1795
2282
 
2283
+ // ui/organism/LoginView.tsx
2284
+ var import_core35 = require("@mantine/core");
2285
+ var import_icons_react9 = require("@tabler/icons-react");
2286
+
2287
+ // ui/surface.ts
2288
+ var brandSurface = {
2289
+ background: `
2290
+ radial-gradient(90% 120% at 12% 0%, var(--mantine-color-primary-7) 0%, transparent 58%),
2291
+ radial-gradient(70% 100% at 100% 100%, var(--mantine-color-primary-9) 0%, transparent 55%),
2292
+ var(--mantine-color-slate-9)`
2293
+ };
2294
+ var brandDotTexture = {
2295
+ backgroundImage: "radial-gradient(rgba(255,255,255,0.10) 1px, transparent 1px)",
2296
+ backgroundSize: "18px 18px",
2297
+ maskImage: "linear-gradient(180deg, rgba(0,0,0,0.9) 0%, transparent 70%)",
2298
+ WebkitMaskImage: "linear-gradient(180deg, rgba(0,0,0,0.9) 0%, transparent 70%)",
2299
+ pointerEvents: "none"
2300
+ };
2301
+
2302
+ // ui/organism/LoginView.tsx
2303
+ var import_jsx_runtime37 = require("react/jsx-runtime");
2304
+ var SOCIAL_META = {
2305
+ google: { Icon: import_icons_react9.IconBrandGoogle, label: "\uAD6C\uAE00\uB85C \uB85C\uADF8\uC778" },
2306
+ kakao: { Icon: import_icons_react9.IconBrandKakaoTalk, label: "\uCE74\uCE74\uC624\uB85C \uB85C\uADF8\uC778" },
2307
+ naver: { Icon: import_icons_react9.IconCircleLetterN, label: "\uB124\uC774\uBC84\uB85C \uB85C\uADF8\uC778" },
2308
+ apple: { Icon: import_icons_react9.IconBrandApple, label: "\uC560\uD50C\uB85C \uB85C\uADF8\uC778" },
2309
+ github: { Icon: import_icons_react9.IconBrandGithub, label: "\uAE43\uD5C8\uBE0C\uB85C \uB85C\uADF8\uC778" }
2310
+ };
2311
+ function LoginForm({
2312
+ onSubmit,
2313
+ loading,
2314
+ error,
2315
+ submitLabel = "\uB85C\uADF8\uC778",
2316
+ withRemember = true,
2317
+ findPasswordHref,
2318
+ signUpHref,
2319
+ socials,
2320
+ children
2321
+ }) {
2322
+ function handleSubmit(event) {
2323
+ var _a4, _b;
2324
+ event.preventDefault();
2325
+ const data = new FormData(event.currentTarget);
2326
+ onSubmit == null ? void 0 : onSubmit({
2327
+ email: String((_a4 = data.get("email")) != null ? _a4 : ""),
2328
+ password: String((_b = data.get("password")) != null ? _b : ""),
2329
+ remember: data.get("remember") === "on"
2330
+ });
2331
+ }
2332
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("form", { onSubmit: handleSubmit, noValidate: true, children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Stack, { gap: "md", children: [
2333
+ error && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(SdText.Error, { children: error }),
2334
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
2335
+ SdInput.Email,
2336
+ {
2337
+ name: "email",
2338
+ label: "\uC774\uBA54\uC77C",
2339
+ placeholder: "name@example.com",
2340
+ autoComplete: "email",
2341
+ required: true
2342
+ }
2343
+ ),
2344
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
2345
+ SdInput.Password,
2346
+ {
2347
+ name: "password",
2348
+ label: "\uBE44\uBC00\uBC88\uD638",
2349
+ placeholder: "\uBE44\uBC00\uBC88\uD638\uB97C \uC785\uB825\uD558\uC138\uC694",
2350
+ autoComplete: "current-password",
2351
+ required: true
2352
+ }
2353
+ ),
2354
+ (withRemember || findPasswordHref) && /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Group, { justify: "space-between", align: "center", wrap: "nowrap", children: [
2355
+ withRemember ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Checkbox, { name: "remember", size: "xs", label: "\uC790\uB3D9 \uB85C\uADF8\uC778" }) : /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", {}),
2356
+ findPasswordHref && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(SdLink.Sub, { href: findPasswordHref, children: "\uBE44\uBC00\uBC88\uD638\uB97C \uC78A\uC73C\uC168\uB098\uC694?" })
2357
+ ] }),
2358
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
2359
+ SdButton.Primary,
2360
+ {
2361
+ type: "submit",
2362
+ fullWidth: true,
2363
+ loading,
2364
+ leftSection: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_icons_react9.IconLogin2, { size: 16 }),
2365
+ children: submitLabel
2366
+ }
2367
+ ),
2368
+ socials && socials.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_jsx_runtime37.Fragment, { children: [
2369
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Divider, { label: "\uB610\uB294", labelPosition: "center" }),
2370
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Stack, { gap: "xs", children: socials.map((social) => {
2371
+ var _a4;
2372
+ const { Icon, label } = SOCIAL_META[social.provider];
2373
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
2374
+ SdButton.Outline,
2375
+ {
2376
+ color: "slate",
2377
+ fullWidth: true,
2378
+ type: "button",
2379
+ onClick: social.onClick,
2380
+ leftSection: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(Icon, { size: 16 }),
2381
+ children: (_a4 = social.label) != null ? _a4 : label
2382
+ },
2383
+ social.provider
2384
+ );
2385
+ }) })
2386
+ ] }),
2387
+ signUpHref && /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Group, { gap: 6, justify: "center", children: [
2388
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(SdText.Sub, { children: "\uC544\uC9C1 \uACC4\uC815\uC774 \uC5C6\uC73C\uC2E0\uAC00\uC694?" }),
2389
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(SdLink.Sub, { href: signUpHref, c: "primary.6", children: "\uD68C\uC6D0\uAC00\uC785" })
2390
+ ] }),
2391
+ children
2392
+ ] }) });
2393
+ }
2394
+ function FormHeader({ title, description }) {
2395
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Stack, { gap: "lg", children: [
2396
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(Logo, { size: "sm" }),
2397
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(SdTextBox.Card, { title, description: description != null ? description : "" })
2398
+ ] });
2399
+ }
2400
+ function Card7(_a4) {
2401
+ var _b = _a4, {
2402
+ title = "\uB85C\uADF8\uC778",
2403
+ description = "%c \uC11C\uBE44\uC2A4\uB97C \uC774\uC6A9\uD558\uB824\uBA74 \uB85C\uADF8\uC778\uD574 \uC8FC\uC138\uC694.",
2404
+ mih = "100svh"
2405
+ } = _b, formProps = __objRest(_b, [
2406
+ "title",
2407
+ "description",
2408
+ "mih"
2409
+ ]);
2410
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Center, { mih, bg: "slate.0", p: "md", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Paper, { w: "100%", maw: 420, p: { base: "lg", sm: "xl" }, radius: "lg", withBorder: true, shadow: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Stack, { gap: "xl", children: [
2411
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(FormHeader, { title, description }),
2412
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(LoginForm, __spreadValues({}, formProps))
2413
+ ] }) }) });
2414
+ }
2415
+ function Split(_a4) {
2416
+ var _b = _a4, {
2417
+ title = "\uB85C\uADF8\uC778",
2418
+ description = "\uACC4\uC815 \uC815\uBCF4\uB97C \uC785\uB825\uD574 \uC8FC\uC138\uC694.",
2419
+ brandTitle = "%c",
2420
+ brandDescription = "\uD558\uB098\uC758 \uACC4\uC815\uC73C\uB85C \uBAA8\uB4E0 \uC11C\uBE44\uC2A4\uB97C \uC774\uC6A9\uD558\uC138\uC694.",
2421
+ mih = "100svh"
2422
+ } = _b, formProps = __objRest(_b, [
2423
+ "title",
2424
+ "description",
2425
+ "brandTitle",
2426
+ "brandDescription",
2427
+ "mih"
2428
+ ]);
2429
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.SimpleGrid, { cols: { base: 1, md: 2 }, spacing: 0, mih, children: [
2430
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(
2431
+ import_core35.Box,
2432
+ {
2433
+ visibleFrom: "md",
2434
+ pos: "relative",
2435
+ style: __spreadValues({ overflow: "hidden", display: "flex", alignItems: "flex-end" }, brandSurface),
2436
+ children: [
2437
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Box, { "aria-hidden": true, pos: "absolute", inset: 0, style: brandDotTexture }),
2438
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Box, { pos: "relative", p: 48, style: { zIndex: 1, width: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
2439
+ SdTextBox.Hero,
2440
+ {
2441
+ title: brandTitle,
2442
+ description: brandDescription,
2443
+ gap: "sm",
2444
+ maxDescWidth: 420,
2445
+ ta: "left",
2446
+ align: "flex-start"
2447
+ }
2448
+ ) })
2449
+ ]
2450
+ }
2451
+ ),
2452
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Center, { p: { base: "md", sm: "xl" }, bg: "white", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Stack, { gap: "xl", w: "100%", maw: 400, children: [
2453
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(FormHeader, { title, description }),
2454
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(LoginForm, __spreadValues({}, formProps))
2455
+ ] }) })
2456
+ ] });
2457
+ }
2458
+ var SdLoginView = {
2459
+ /** 중앙 정렬 카드 — 기본 로그인 화면 */
2460
+ Card: Card7,
2461
+ /** 좌측 브랜드 패널 + 우측 폼 — 넓은 화면용 */
2462
+ Split
2463
+ };
2464
+ var SdLoginViewCard = SdLoginView.Card;
2465
+ var SdLoginViewSplit = SdLoginView.Split;
2466
+
2467
+ // ui/organism/Result.tsx
2468
+ var import_core36 = require("@mantine/core");
2469
+ var import_icons_react10 = require("@tabler/icons-react");
2470
+ var import_jsx_runtime38 = require("react/jsx-runtime");
2471
+ function ResultIcon({ color, Icon }) {
2472
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Center, { w: 88, h: 88, bg: `${color}.0`, style: { borderRadius: "50%" }, "aria-hidden": true, children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(Icon, { size: 48, stroke: 1.5, color: `var(--mantine-color-${color}-6)` }) });
2473
+ }
2474
+ function createResult(defaults) {
2475
+ return function SdResult2({
2476
+ title = defaults.title,
2477
+ description,
2478
+ primaryAction,
2479
+ secondaryAction,
2480
+ children,
2481
+ mih = "60vh"
2482
+ }) {
2483
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Center, { mih, children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core36.Stack, { align: "center", gap: "lg", ta: "center", children: [
2484
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(ResultIcon, { color: defaults.color, Icon: defaults.Icon }),
2485
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core36.Stack, { gap: "sm", align: "center", children: [
2486
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(SdTitle.Section, { children: title }),
2487
+ description && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(SdText.Body, { maw: 480, children: description })
2488
+ ] }),
2489
+ children && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Box, { children }),
2490
+ (primaryAction || secondaryAction) && /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core36.Group, { gap: "sm", justify: "center", children: [
2491
+ primaryAction && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(SdButton.Primary, { onClick: primaryAction.onClick, children: primaryAction.label }),
2492
+ secondaryAction && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(SdButton.Ghost, { onClick: secondaryAction.onClick, children: secondaryAction.label })
2493
+ ] })
2494
+ ] }) }) });
2495
+ };
2496
+ }
2497
+ var SdResult = {
2498
+ /** 성공 — 가입 완료·결제 완료 등 */
2499
+ Success: createResult({
2500
+ color: "green",
2501
+ Icon: import_icons_react10.IconCircleCheck,
2502
+ title: "\uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4"
2503
+ }),
2504
+ /** 실패 — 결제 실패·처리 중 오류 등. 서버 오류·404는 SdErrorView를 쓴다. */
2505
+ Error: createResult({
2506
+ color: "red",
2507
+ Icon: import_icons_react10.IconCircleX,
2508
+ title: "\uBB38\uC81C\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4"
2509
+ })
2510
+ };
2511
+ var SdResultSuccess = SdResult.Success;
2512
+ var SdResultError = SdResult.Error;
2513
+
1796
2514
  // ui/template/MainLayout.tsx
1797
- var import_core34 = require("@mantine/core");
1798
- var import_jsx_runtime35 = require("react/jsx-runtime");
2515
+ var import_core37 = require("@mantine/core");
2516
+ var import_jsx_runtime39 = require("react/jsx-runtime");
2517
+ var headers = {
2518
+ mega: SdHeader.Mega,
2519
+ simple: SdHeader.Simple,
2520
+ panel: SdHeader.Panel
2521
+ };
1799
2522
  function MainLayout({
1800
2523
  children,
1801
2524
  navItems,
1802
2525
  companyInfo,
1803
- loginFlag
2526
+ loginFlag,
2527
+ headerVariant = "mega"
1804
2528
  }) {
1805
- return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core34.AppShell, { header: { height: 60 }, children: [
1806
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core34.AppShell.Header, { children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdHeader, { navItems, loginFlag }) }),
1807
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core34.AppShell.Main, { children }),
1808
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdFooter, { company: companyInfo, navItems })
2529
+ const Header = headers[headerVariant];
2530
+ return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_core37.AppShell, { header: { height: 60 }, children: [
2531
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.AppShell.Header, { children: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(Header, { navItems, loginFlag }) }),
2532
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.AppShell.Main, { children }),
2533
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(SdFooter, { company: companyInfo, navItems })
1809
2534
  ] });
1810
2535
  }
1811
2536
 
1812
2537
  // ui/template/PageLayout.tsx
1813
- var import_core35 = require("@mantine/core");
1814
- var import_jsx_runtime36 = require("react/jsx-runtime");
1815
- function Content({ children }) {
1816
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdContainer, { py: "xl", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core35.Stack, { gap: "xl", children }) });
2538
+ var import_core38 = require("@mantine/core");
2539
+ var import_jsx_runtime40 = require("react/jsx-runtime");
2540
+ var HERO_MIN_H = "38svh";
2541
+ var HERO_PY = { base: 56, sm: 88 };
2542
+ var HERO_MAW = 680;
2543
+ function Content({
2544
+ children,
2545
+ navItems,
2546
+ breadcrumb = true,
2547
+ currentHref
2548
+ }) {
2549
+ const showBreadcrumb = breadcrumb && !!navItems && navItems.length > 0;
2550
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(SdContainer, { py: "xl", children: [
2551
+ showBreadcrumb && /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(SdBreadcrumb, { navItems, currentHref, mb: "lg" }),
2552
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Stack, { gap: "xl", children })
2553
+ ] });
1817
2554
  }
1818
2555
  function LayoutGap() {
1819
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core35.Space, { h: 48 });
2556
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Space, {});
1820
2557
  }
1821
- function Minimal({ label, title, description, children }) {
1822
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_jsx_runtime36.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(Plain2, { children: [
1823
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdTextBox.Section, { label, title, description: description != null ? description : "" }),
1824
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core35.Divider, {}),
2558
+ function Minimal({
2559
+ label,
2560
+ title,
2561
+ description,
2562
+ children,
2563
+ navItems,
2564
+ breadcrumb,
2565
+ currentHref
2566
+ }) {
2567
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(Plain2, { navItems, breadcrumb, currentHref, children: [
2568
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(LayoutGap, {}),
2569
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(SdTextBox.Section, { label, title, description: description != null ? description : "" }),
2570
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Divider, {}),
1825
2571
  children
1826
- ] }) });
2572
+ ] });
1827
2573
  }
1828
- function Plain2({ children }) {
1829
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_jsx_runtime36.Fragment, { children: [
1830
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(LayoutGap, {}),
1831
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Content, { children })
2574
+ function Plain2({
2575
+ children,
2576
+ navItems,
2577
+ breadcrumb,
2578
+ currentHref
2579
+ }) {
2580
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_jsx_runtime40.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(Content, { navItems, breadcrumb, currentHref, children }) });
2581
+ }
2582
+ function HeroCopy({ label, title, description }) {
2583
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_core38.Stack, { gap: "md", maw: HERO_MAW, children: [
2584
+ label && /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_core38.Group, { gap: "sm", align: "center", wrap: "nowrap", children: [
2585
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Box, { w: 28, h: 2, bg: "primary.3", style: { borderRadius: 2 } }),
2586
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(SdText.Eyebrow, { c: "primary.1", children: label })
2587
+ ] }),
2588
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
2589
+ SdTextBox.Hero,
2590
+ {
2591
+ title,
2592
+ description,
2593
+ gap: "sm",
2594
+ maxDescWidth: 560,
2595
+ ta: "left",
2596
+ align: "flex-start"
2597
+ }
2598
+ )
1832
2599
  ] });
1833
2600
  }
1834
- function Image2({ image, label, title, description, children }) {
1835
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_jsx_runtime36.Fragment, { children: [
1836
- /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
1837
- import_core35.Box,
2601
+ function Image2({
2602
+ image,
2603
+ label,
2604
+ title,
2605
+ description,
2606
+ children,
2607
+ navItems,
2608
+ breadcrumb,
2609
+ currentHref
2610
+ }) {
2611
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_jsx_runtime40.Fragment, { children: [
2612
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(
2613
+ import_core38.Box,
1838
2614
  {
2615
+ pos: "relative",
1839
2616
  style: {
1840
- position: "relative",
1841
- minHeight: "30svh",
2617
+ minHeight: HERO_MIN_H,
1842
2618
  display: "flex",
1843
- alignItems: "center",
2619
+ alignItems: "flex-end",
1844
2620
  backgroundImage: image ? `url(${image})` : void 0,
1845
2621
  backgroundSize: "cover",
1846
2622
  backgroundPosition: "center",
1847
2623
  backgroundColor: "var(--mantine-color-slate-9)"
1848
2624
  },
1849
2625
  children: [
1850
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
1851
- import_core35.Box,
2626
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
2627
+ import_core38.Box,
1852
2628
  {
2629
+ "aria-hidden": true,
2630
+ pos: "absolute",
2631
+ inset: 0,
1853
2632
  style: {
1854
- position: "absolute",
1855
- inset: 0,
1856
- background: "rgba(0, 0, 0, 0.55)"
2633
+ background: "linear-gradient(180deg, rgba(15,23,42,0.25) 0%, rgba(15,23,42,0.72) 62%, rgba(15,23,42,0.94) 100%)"
1857
2634
  }
1858
2635
  }
1859
2636
  ),
1860
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdContainer, { style: { position: "relative", zIndex: 1, width: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
1861
- import_core35.Box,
1862
- {
1863
- py: 48,
1864
- px: 40,
1865
- maw: 420,
1866
- style: {
1867
- backdropFilter: "blur(24px)",
1868
- WebkitBackdropFilter: "blur(24px)",
1869
- background: "rgba(255,255,255,0.10)",
1870
- borderRadius: "var(--mantine-radius-md)",
1871
- border: "1px solid rgba(255,255,255,0.18)"
1872
- },
1873
- children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
1874
- SdTextBox.Hero,
1875
- {
1876
- label,
1877
- title,
1878
- description,
1879
- ta: "left",
1880
- align: "flex-start"
1881
- }
1882
- )
1883
- }
1884
- ) })
2637
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(SdContainer, { pos: "relative", py: HERO_PY, style: { zIndex: 1, width: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(HeroCopy, { label, title, description }) })
1885
2638
  ]
1886
2639
  }
1887
2640
  ),
1888
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Content, { children })
2641
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(Content, { navItems, breadcrumb, currentHref, children })
1889
2642
  ] });
1890
2643
  }
1891
- function Brand({ label, title, description, children }) {
1892
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_jsx_runtime36.Fragment, { children: [
1893
- /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
1894
- import_core35.Box,
2644
+ function Brand({
2645
+ label,
2646
+ title,
2647
+ description,
2648
+ children,
2649
+ navItems,
2650
+ breadcrumb,
2651
+ currentHref
2652
+ }) {
2653
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_jsx_runtime40.Fragment, { children: [
2654
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(
2655
+ import_core38.Box,
1895
2656
  {
1896
- style: {
1897
- position: "relative",
1898
- minHeight: "40svh",
2657
+ pos: "relative",
2658
+ style: __spreadValues({
2659
+ minHeight: HERO_MIN_H,
1899
2660
  display: "flex",
1900
- alignItems: "center",
2661
+ alignItems: "flex-end",
1901
2662
  overflow: "hidden",
1902
- background: "linear-gradient(135deg, var(--mantine-color-primary-8) 0%, var(--mantine-color-primary-6) 50%, var(--mantine-color-primary-4) 100%)"
1903
- },
2663
+ borderBottom: "1px solid var(--mantine-color-slate-8)"
2664
+ }, brandSurface),
1904
2665
  children: [
1905
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
1906
- import_core35.Box,
1907
- {
1908
- style: {
1909
- position: "absolute",
1910
- top: -80,
1911
- right: -80,
1912
- width: 360,
1913
- height: 360,
1914
- borderRadius: "50%",
1915
- background: "rgba(255,255,255,0.06)",
1916
- pointerEvents: "none"
1917
- }
1918
- }
1919
- ),
1920
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
1921
- import_core35.Box,
1922
- {
1923
- style: {
1924
- position: "absolute",
1925
- bottom: -60,
1926
- left: -60,
1927
- width: 240,
1928
- height: 240,
1929
- borderRadius: "50%",
1930
- background: "rgba(255,255,255,0.04)",
1931
- pointerEvents: "none"
1932
- }
1933
- }
1934
- ),
1935
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdContainer, { style: { position: "relative", zIndex: 1, width: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
1936
- SdTextBox.Hero,
1937
- {
1938
- label,
1939
- title,
1940
- description,
1941
- ta: "center",
1942
- align: "center",
1943
- maw: 640,
1944
- mx: "auto",
1945
- pt: 80,
1946
- pb: 64
1947
- }
1948
- ) })
2666
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Box, { "aria-hidden": true, pos: "absolute", inset: 0, style: brandDotTexture }),
2667
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(SdContainer, { pos: "relative", py: HERO_PY, style: { zIndex: 1, width: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(HeroCopy, { label, title, description }) })
1949
2668
  ]
1950
2669
  }
1951
2670
  ),
1952
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Content, { children })
2671
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(Content, { navItems, breadcrumb, currentHref, children })
1953
2672
  ] });
1954
2673
  }
1955
2674
  var PageLayout = {
1956
- /** 이미지 배경 + 대각선 그라디언트 + 좌하단 텍스트 */
2675
+ /** 사진 배경 + 하단 스크림 + 좌측 정렬 텍스트 */
1957
2676
  Image: Image2,
1958
2677
  /** SdTextBox.Section 타이틀 + Plain 컨테이너 */
1959
2678
  Minimal,
1960
- /** primary 그라디언트 배경 + 중앙 텍스트 */
2679
+ /** slate 바탕 + primary 라이트 + 도트 텍스처 */
1961
2680
  Brand,
1962
2681
  /** 히어로 없이 SdContainer + py="xl" 만 */
1963
2682
  Plain: Plain2
1964
2683
  };
2684
+ var PageLayoutImage = PageLayout.Image;
2685
+ var PageLayoutMinimal = PageLayout.Minimal;
2686
+ var PageLayoutBrand = PageLayout.Brand;
2687
+ var PageLayoutPlain = PageLayout.Plain;
1965
2688
 
1966
2689
  // ui/theme.ts
1967
- var import_core36 = require("@mantine/core");
2690
+ var import_core39 = require("@mantine/core");
1968
2691
  var primary = [
1969
2692
  "#e7f0fb",
1970
2693
  "#c8dcf4",
@@ -2058,9 +2781,31 @@ var green = [
2058
2781
  "#14532d"
2059
2782
  // 9 green-900
2060
2783
  ];
2061
- var theme = (0, import_core36.createTheme)({
2784
+ var amber = [
2785
+ "#fffbeb",
2786
+ // 0 amber-50
2787
+ "#fef3c7",
2788
+ // 1 amber-100
2789
+ "#fde68a",
2790
+ // 2 amber-200
2791
+ "#fcd34d",
2792
+ // 3 amber-300
2793
+ "#fbbf24",
2794
+ // 4 amber-400
2795
+ "#f59e0b",
2796
+ // 5 amber-500
2797
+ "#d97706",
2798
+ // 6 amber-600
2799
+ "#b45309",
2800
+ // 7 amber-700
2801
+ "#92400e",
2802
+ // 8 amber-800
2803
+ "#78350f"
2804
+ // 9 amber-900
2805
+ ];
2806
+ var theme = (0, import_core39.createTheme)({
2062
2807
  /* ---- Color ---- */
2063
- colors: { primary, secondary, slate, red, green, dark: slate },
2808
+ colors: { primary, secondary, slate, red, green, amber, dark: slate },
2064
2809
  primaryColor: "primary",
2065
2810
  primaryShade: { light: 6, dark: 5 },
2066
2811
  /* ---- Type ---- */
@@ -2070,20 +2815,20 @@ var theme = (0, import_core36.createTheme)({
2070
2815
  fontFamily: "'Noto Sans KR', ui-sans-serif, system-ui, sans-serif",
2071
2816
  fontWeight: "700",
2072
2817
  sizes: {
2073
- h1: { fontSize: (0, import_core36.rem)(48), lineHeight: "1.1", fontWeight: "900" },
2074
- h2: { fontSize: (0, import_core36.rem)(36), lineHeight: "1.1", fontWeight: "900" },
2075
- h3: { fontSize: (0, import_core36.rem)(28), lineHeight: "1.15", fontWeight: "700" },
2076
- h4: { fontSize: (0, import_core36.rem)(20), lineHeight: "1.3", fontWeight: "700" },
2077
- h5: { fontSize: (0, import_core36.rem)(16), lineHeight: "1.4", fontWeight: "700" },
2078
- h6: { fontSize: (0, import_core36.rem)(14), lineHeight: "1.4", fontWeight: "700" }
2818
+ h1: { fontSize: (0, import_core39.rem)(48), lineHeight: "1.1", fontWeight: "900" },
2819
+ h2: { fontSize: (0, import_core39.rem)(36), lineHeight: "1.1", fontWeight: "900" },
2820
+ h3: { fontSize: (0, import_core39.rem)(28), lineHeight: "1.15", fontWeight: "700" },
2821
+ h4: { fontSize: (0, import_core39.rem)(20), lineHeight: "1.3", fontWeight: "700" },
2822
+ h5: { fontSize: (0, import_core39.rem)(16), lineHeight: "1.4", fontWeight: "700" },
2823
+ h6: { fontSize: (0, import_core39.rem)(14), lineHeight: "1.4", fontWeight: "700" }
2079
2824
  }
2080
2825
  },
2081
2826
  fontSizes: {
2082
- xs: (0, import_core36.rem)(14),
2083
- sm: (0, import_core36.rem)(16),
2084
- md: (0, import_core36.rem)(18),
2085
- lg: (0, import_core36.rem)(20),
2086
- xl: (0, import_core36.rem)(22)
2827
+ xs: (0, import_core39.rem)(14),
2828
+ sm: (0, import_core39.rem)(16),
2829
+ md: (0, import_core39.rem)(18),
2830
+ lg: (0, import_core39.rem)(20),
2831
+ xl: (0, import_core39.rem)(22)
2087
2832
  },
2088
2833
  lineHeights: {
2089
2834
  xs: "1.4",
@@ -2094,18 +2839,18 @@ var theme = (0, import_core36.createTheme)({
2094
2839
  },
2095
2840
  defaultRadius: "md",
2096
2841
  radius: {
2097
- xs: (0, import_core36.rem)(6),
2098
- sm: (0, import_core36.rem)(8),
2099
- md: (0, import_core36.rem)(10),
2100
- lg: (0, import_core36.rem)(14),
2101
- xl: (0, import_core36.rem)(18)
2842
+ xs: (0, import_core39.rem)(6),
2843
+ sm: (0, import_core39.rem)(8),
2844
+ md: (0, import_core39.rem)(10),
2845
+ lg: (0, import_core39.rem)(14),
2846
+ xl: (0, import_core39.rem)(18)
2102
2847
  },
2103
2848
  spacing: {
2104
- xs: (0, import_core36.rem)(8),
2105
- sm: (0, import_core36.rem)(12),
2106
- md: (0, import_core36.rem)(16),
2107
- lg: (0, import_core36.rem)(24),
2108
- xl: (0, import_core36.rem)(32)
2849
+ xs: (0, import_core39.rem)(8),
2850
+ sm: (0, import_core39.rem)(12),
2851
+ md: (0, import_core39.rem)(16),
2852
+ lg: (0, import_core39.rem)(24),
2853
+ xl: (0, import_core39.rem)(32)
2109
2854
  },
2110
2855
  shadows: {
2111
2856
  xs: "0 1px 2px 0 rgb(0 0 0 / 0.05)",
@@ -2185,7 +2930,6 @@ var theme = (0, import_core36.createTheme)({
2185
2930
  Anchor: {
2186
2931
  defaultProps: { c: "slate.5", fz: "sm", underline: "never" }
2187
2932
  },
2188
- // SdHeader 모바일 드로어의 2단 아코디언 타이포를 SdLink와 맞춘다.
2189
2933
  NavLink: {
2190
2934
  defaultProps: { c: "slate.7", fz: "sm" }
2191
2935
  },
@@ -2205,11 +2949,16 @@ var theme = (0, import_core36.createTheme)({
2205
2949
  Logo,
2206
2950
  MainLayout,
2207
2951
  PageLayout,
2952
+ PageLayoutBrand,
2953
+ PageLayoutImage,
2954
+ PageLayoutMinimal,
2955
+ PageLayoutPlain,
2208
2956
  SdBadge,
2209
2957
  SdBadgeDefault,
2210
2958
  SdBadgePrimary,
2211
2959
  SdBadgeSuccess,
2212
2960
  SdBadgeWarning,
2961
+ SdBreadcrumb,
2213
2962
  SdButton,
2214
2963
  SdButtonCancel,
2215
2964
  SdButtonDelete,
@@ -2240,17 +2989,41 @@ var theme = (0, import_core36.createTheme)({
2240
2989
  SdFeatures,
2241
2990
  SdFooter,
2242
2991
  SdHeader,
2992
+ SdHeaderMega,
2993
+ SdHeaderPanel,
2994
+ SdHeaderSimple,
2243
2995
  SdInput,
2996
+ SdInputAutocomplete,
2997
+ SdInputCheckbox,
2998
+ SdInputColor,
2999
+ SdInputDate,
3000
+ SdInputDateRange,
2244
3001
  SdInputEmail,
3002
+ SdInputFile,
3003
+ SdInputJson,
3004
+ SdInputMultiSelect,
3005
+ SdInputNativeSelect,
3006
+ SdInputNumber,
2245
3007
  SdInputPassword,
3008
+ SdInputPinCode,
3009
+ SdInputRadioGroup,
3010
+ SdInputRating,
3011
+ SdInputSegmented,
2246
3012
  SdInputSelect,
3013
+ SdInputSlider,
3014
+ SdInputSwitch,
3015
+ SdInputTags,
2247
3016
  SdInputText,
2248
3017
  SdInputTextarea,
3018
+ SdInputTime,
2249
3019
  SdLink,
2250
3020
  SdLinkBody,
2251
3021
  SdLinkHint,
2252
3022
  SdLinkStrong,
2253
3023
  SdLinkSub,
3024
+ SdLoginView,
3025
+ SdLoginViewCard,
3026
+ SdLoginViewSplit,
2254
3027
  SdMap,
2255
3028
  SdMapSingle,
2256
3029
  SdMapTabs,
@@ -2263,6 +3036,9 @@ var theme = (0, import_core36.createTheme)({
2263
3036
  SdQuote,
2264
3037
  SdQuoteCard,
2265
3038
  SdQuotePlain,
3039
+ SdResult,
3040
+ SdResultError,
3041
+ SdResultSuccess,
2266
3042
  SdSkeleton,
2267
3043
  SdSkeletonAvatar,
2268
3044
  SdSkeletonCard,
@@ -2310,5 +3086,15 @@ var theme = (0, import_core36.createTheme)({
2310
3086
  SdTitleDisplay,
2311
3087
  SdTitleSection,
2312
3088
  SdTitleSub,
3089
+ SdToast,
3090
+ SdToastClean,
3091
+ SdToastError,
3092
+ SdToastHide,
3093
+ SdToastInfo,
3094
+ SdToastLoading,
3095
+ SdToastProvider,
3096
+ SdToastSuccess,
3097
+ SdToastUpdate,
3098
+ SdToastWarning,
2313
3099
  theme
2314
3100
  });