@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/README.md +330 -6
- package/dist/store/index.cjs +384 -0
- package/dist/store/index.d.mts +207 -0
- package/dist/store/index.d.ts +207 -0
- package/dist/store/index.mjs +355 -0
- package/dist/ui/index.cjs +1280 -494
- package/dist/ui/index.d.mts +311 -27
- package/dist/ui/index.d.ts +311 -27
- package/dist/ui/index.mjs +1232 -459
- package/dist/util/index.cjs +144 -20
- package/dist/util/index.d.mts +87 -12
- package/dist/util/index.d.ts +87 -12
- package/dist/util/index.mjs +139 -18
- package/package.json +15 -2
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(
|
|
235
|
-
|
|
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(
|
|
341
|
-
Body: createText(
|
|
342
|
-
Sub: createText(
|
|
343
|
-
Eyebrow: createText(
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
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: "
|
|
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
|
|
561
|
-
return function SdInput2(
|
|
562
|
-
|
|
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
|
|
573
|
-
return function
|
|
574
|
-
var
|
|
575
|
-
|
|
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
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
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:
|
|
687
|
+
Text: createInput(import_core12.TextInput),
|
|
587
688
|
/** 이메일 입력 */
|
|
588
|
-
Email:
|
|
689
|
+
Email: createInput(import_core12.TextInput, { type: "email" }),
|
|
589
690
|
/** 비밀번호 입력 — 마스킹 토글 포함 */
|
|
590
|
-
Password:
|
|
691
|
+
Password: createInput(import_core12.PasswordInput),
|
|
591
692
|
/** 멀티라인 텍스트 — 문의 메시지 등 */
|
|
592
|
-
Textarea:
|
|
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:
|
|
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
|
-
//
|
|
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(
|
|
869
|
+
Strong: createLink(linkStyle(textStyles.Strong), SdText.Strong),
|
|
698
870
|
/** 기본 — 본문·네비게이션 수준의 일반 링크 */
|
|
699
|
-
Body: createLink(
|
|
871
|
+
Body: createLink(linkStyle(textStyles.Body), SdText.Body),
|
|
700
872
|
/** 보조 — 연락처·정책 등 부가 정보 */
|
|
701
|
-
Sub: createLink(
|
|
873
|
+
Sub: createLink(linkStyle(textStyles.Sub), SdText.Sub),
|
|
702
874
|
/** 최소 강조 — 링크 목록처럼 밀도가 높고 톤을 낮춰야 하는 곳 */
|
|
703
|
-
Hint: createLink(
|
|
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
|
|
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,
|
|
737
|
-
label && /* @__PURE__ */ (0,
|
|
738
|
-
/* @__PURE__ */ (0,
|
|
739
|
-
description && /* @__PURE__ */ (0,
|
|
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
|
-
|
|
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
|
|
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,
|
|
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,
|
|
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
|
|
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,
|
|
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,
|
|
788
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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
|
|
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,
|
|
803
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
809
|
-
!isLast && /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
840
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
863
|
-
/* @__PURE__ */ (0,
|
|
864
|
-
/* @__PURE__ */ (0,
|
|
865
|
-
i < items.length - 1 && /* @__PURE__ */ (0,
|
|
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,
|
|
868
|
-
/* @__PURE__ */ (0,
|
|
869
|
-
i < items.length - 1 && /* @__PURE__ */ (0,
|
|
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,
|
|
875
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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
|
|
1121
|
+
var import_jsx_runtime21 = require("react/jsx-runtime");
|
|
893
1122
|
function AuthorRow({ item }) {
|
|
894
|
-
return /* @__PURE__ */ (0,
|
|
895
|
-
item.avatar && /* @__PURE__ */ (0,
|
|
896
|
-
!item.avatar && /* @__PURE__ */ (0,
|
|
897
|
-
/* @__PURE__ */ (0,
|
|
898
|
-
/* @__PURE__ */ (0,
|
|
899
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
909
|
-
item.rating && /* @__PURE__ */ (0,
|
|
910
|
-
/* @__PURE__ */ (0,
|
|
911
|
-
/* @__PURE__ */ (0,
|
|
912
|
-
item.lines.map((line, i) => /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
920
|
-
item.rating && /* @__PURE__ */ (0,
|
|
921
|
-
/* @__PURE__ */ (0,
|
|
922
|
-
/* @__PURE__ */ (0,
|
|
923
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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
|
|
946
|
-
var
|
|
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,
|
|
951
|
-
/* @__PURE__ */ (0,
|
|
952
|
-
/* @__PURE__ */ (0,
|
|
953
|
-
/* @__PURE__ */ (0,
|
|
954
|
-
item.isPopular && /* @__PURE__ */ (0,
|
|
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,
|
|
1185
|
+
item.description && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdText.Sub, { children: item.description })
|
|
957
1186
|
] }),
|
|
958
|
-
/* @__PURE__ */ (0,
|
|
959
|
-
/* @__PURE__ */ (0,
|
|
960
|
-
item.period && /* @__PURE__ */ (0,
|
|
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,
|
|
966
|
-
/* @__PURE__ */ (0,
|
|
967
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
986
|
-
/* @__PURE__ */ (0,
|
|
987
|
-
/* @__PURE__ */ (0,
|
|
988
|
-
/* @__PURE__ */ (0,
|
|
989
|
-
item.isPopular && /* @__PURE__ */ (0,
|
|
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,
|
|
1220
|
+
item.description && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdText.Body, { c: "primary.1", children: item.description })
|
|
992
1221
|
] }),
|
|
993
|
-
/* @__PURE__ */ (0,
|
|
994
|
-
/* @__PURE__ */ (0,
|
|
995
|
-
item.period && /* @__PURE__ */ (0,
|
|
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,
|
|
1001
|
-
/* @__PURE__ */ (0,
|
|
1002
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
1019
|
-
(item, i) => item.isPopular ? /* @__PURE__ */ (0,
|
|
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
|
|
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,
|
|
1040
|
-
/* @__PURE__ */ (0,
|
|
1041
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
1047
|
-
/* @__PURE__ */ (0,
|
|
1048
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
1054
|
-
/* @__PURE__ */ (0,
|
|
1055
|
-
label && /* @__PURE__ */ (0,
|
|
1056
|
-
/* @__PURE__ */ (0,
|
|
1057
|
-
description && /* @__PURE__ */ (0,
|
|
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,
|
|
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
|
|
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,
|
|
1096
|
-
/* @__PURE__ */ (0,
|
|
1097
|
-
label && /* @__PURE__ */ (0,
|
|
1098
|
-
/* @__PURE__ */ (0,
|
|
1099
|
-
description && /* @__PURE__ */ (0,
|
|
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,
|
|
1102
|
-
/* @__PURE__ */ (0,
|
|
1103
|
-
secondaryLabel && /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
1134
|
-
/* @__PURE__ */ (0,
|
|
1135
|
-
label && /* @__PURE__ */ (0,
|
|
1136
|
-
/* @__PURE__ */ (0,
|
|
1137
|
-
description && /* @__PURE__ */ (0,
|
|
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,
|
|
1140
|
-
/* @__PURE__ */ (0,
|
|
1141
|
-
secondaryLabel && /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
1176
|
-
/* @__PURE__ */ (0,
|
|
1177
|
-
label && /* @__PURE__ */ (0,
|
|
1178
|
-
/* @__PURE__ */ (0,
|
|
1179
|
-
description && /* @__PURE__ */ (0,
|
|
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,
|
|
1182
|
-
/* @__PURE__ */ (0,
|
|
1183
|
-
secondaryLabel && /* @__PURE__ */ (0,
|
|
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
|
|
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
|
|
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,
|
|
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,
|
|
1216
|
-
/* @__PURE__ */ (0,
|
|
1217
|
-
/* @__PURE__ */ (0,
|
|
1218
|
-
item.href ? /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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
|
|
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,
|
|
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,
|
|
1246
|
-
/* @__PURE__ */ (0,
|
|
1247
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
1254
|
-
i > 0 && /* @__PURE__ */ (0,
|
|
1255
|
-
/* @__PURE__ */ (0,
|
|
1256
|
-
item.icon && /* @__PURE__ */ (0,
|
|
1257
|
-
/* @__PURE__ */ (0,
|
|
1258
|
-
/* @__PURE__ */ (0,
|
|
1259
|
-
/* @__PURE__ */ (0,
|
|
1260
|
-
/* @__PURE__ */ (0,
|
|
1261
|
-
item.href ? /* @__PURE__ */ (0,
|
|
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,
|
|
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
|
|
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,
|
|
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({
|
|
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,
|
|
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,
|
|
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,
|
|
1344
|
-
/* @__PURE__ */ (0,
|
|
1345
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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
|
|
1616
|
+
var import_react3 = require("react");
|
|
1379
1617
|
var import_core26 = require("@mantine/core");
|
|
1380
|
-
var
|
|
1618
|
+
var import_jsx_runtime28 = require("react/jsx-runtime");
|
|
1381
1619
|
function MapFrame({ address, height }) {
|
|
1382
|
-
return /* @__PURE__ */ (0,
|
|
1383
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
1417
|
-
/* @__PURE__ */ (0,
|
|
1418
|
-
/* @__PURE__ */ (0,
|
|
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
|
|
1433
|
-
var
|
|
1434
|
-
var
|
|
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,
|
|
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,
|
|
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,
|
|
1450
|
-
|
|
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,
|
|
1462
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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
|
|
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
|
|
1786
|
+
var import_jsx_runtime31 = require("react/jsx-runtime");
|
|
1481
1787
|
var BAR_HEIGHT = 60;
|
|
1482
|
-
|
|
1483
|
-
|
|
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
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
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,
|
|
1493
|
-
/* @__PURE__ */ (0,
|
|
1494
|
-
|
|
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,
|
|
1505
|
-
/* @__PURE__ */ (0,
|
|
1506
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
1509
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
1518
|
-
|
|
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,
|
|
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,
|
|
1534
|
-
/* @__PURE__ */ (0,
|
|
1535
|
-
loginFlag && /* @__PURE__ */ (0,
|
|
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,
|
|
1541
|
-
|
|
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,
|
|
1925
|
+
return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdLink.Body, { href: item.href, children: item.label }, item.id);
|
|
1545
1926
|
}
|
|
1546
|
-
return
|
|
1547
|
-
|
|
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
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
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
|
-
|
|
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
|
|
1565
|
-
var
|
|
1566
|
-
var
|
|
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,
|
|
1572
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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:
|
|
1581
|
-
youtube:
|
|
1582
|
-
instagram:
|
|
1583
|
-
facebook:
|
|
1584
|
-
linkedin:
|
|
1585
|
-
github:
|
|
1586
|
-
blog:
|
|
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,
|
|
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 :
|
|
1592
|
-
return /* @__PURE__ */ (0,
|
|
1593
|
-
|
|
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,
|
|
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,
|
|
1611
|
-
/* @__PURE__ */ (0,
|
|
1612
|
-
typeof children === "string" ? /* @__PURE__ */ (0,
|
|
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,
|
|
1618
|
-
/* @__PURE__ */ (0,
|
|
1619
|
-
/* @__PURE__ */ (0,
|
|
1620
|
-
sortedAddresses.map((addr) => /* @__PURE__ */ (0,
|
|
1621
|
-
/* @__PURE__ */ (0,
|
|
1622
|
-
company.fax && /* @__PURE__ */ (0,
|
|
1623
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
1630
|
-
/* @__PURE__ */ (0,
|
|
1631
|
-
description && /* @__PURE__ */ (0,
|
|
1632
|
-
/* @__PURE__ */ (0,
|
|
1633
|
-
/* @__PURE__ */ (0,
|
|
1634
|
-
visibleNav.length > 0 && /* @__PURE__ */ (0,
|
|
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,
|
|
1637
|
-
/* @__PURE__ */ (0,
|
|
1638
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
1646
|
-
visiblePolicy.length > 0 && /* @__PURE__ */ (0,
|
|
1647
|
-
const Link4 = item.highlight ? SdLink.
|
|
1648
|
-
return /* @__PURE__ */ (0,
|
|
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,
|
|
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
|
|
1658
|
-
var
|
|
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,
|
|
1676
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
2174
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdFeatures, { items, cols })
|
|
1688
2175
|
] }) }));
|
|
1689
2176
|
}
|
|
1690
2177
|
|
|
1691
2178
|
// ui/organism/TimelineSection.tsx
|
|
1692
|
-
var
|
|
1693
|
-
var
|
|
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,
|
|
1709
|
-
/* @__PURE__ */ (0,
|
|
1710
|
-
/* @__PURE__ */ (0,
|
|
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
|
|
1716
|
-
var
|
|
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,
|
|
1732
|
-
(label || title || description) && /* @__PURE__ */ (0,
|
|
1733
|
-
/* @__PURE__ */ (0,
|
|
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
|
|
1739
|
-
var
|
|
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,
|
|
1742
|
-
|
|
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,
|
|
1756
|
-
/* @__PURE__ */ (0,
|
|
1757
|
-
/* @__PURE__ */ (0,
|
|
1758
|
-
/* @__PURE__ */ (0,
|
|
1759
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
1762
|
-
/* @__PURE__ */ (0,
|
|
1763
|
-
onHome && /* @__PURE__ */ (0,
|
|
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,
|
|
1776
|
-
/* @__PURE__ */ (0,
|
|
1777
|
-
/* @__PURE__ */ (0,
|
|
1778
|
-
/* @__PURE__ */ (0,
|
|
1779
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
1782
|
-
onHome && /* @__PURE__ */ (0,
|
|
1783
|
-
onBack && /* @__PURE__ */ (0,
|
|
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
|
|
1798
|
-
var
|
|
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
|
-
|
|
1806
|
-
|
|
1807
|
-
/* @__PURE__ */ (0,
|
|
1808
|
-
/* @__PURE__ */ (0,
|
|
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
|
|
1814
|
-
var
|
|
1815
|
-
|
|
1816
|
-
|
|
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,
|
|
2556
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Space, {});
|
|
1820
2557
|
}
|
|
1821
|
-
function Minimal({
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
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({
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
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({
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
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
|
-
|
|
1841
|
-
minHeight: "30svh",
|
|
2617
|
+
minHeight: HERO_MIN_H,
|
|
1842
2618
|
display: "flex",
|
|
1843
|
-
alignItems: "
|
|
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,
|
|
1851
|
-
|
|
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
|
-
|
|
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,
|
|
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,
|
|
2641
|
+
/* @__PURE__ */ (0, import_jsx_runtime40.jsx)(Content, { navItems, breadcrumb, currentHref, children })
|
|
1889
2642
|
] });
|
|
1890
2643
|
}
|
|
1891
|
-
function Brand({
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
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
|
-
|
|
1897
|
-
|
|
1898
|
-
minHeight:
|
|
2657
|
+
pos: "relative",
|
|
2658
|
+
style: __spreadValues({
|
|
2659
|
+
minHeight: HERO_MIN_H,
|
|
1899
2660
|
display: "flex",
|
|
1900
|
-
alignItems: "
|
|
2661
|
+
alignItems: "flex-end",
|
|
1901
2662
|
overflow: "hidden",
|
|
1902
|
-
|
|
1903
|
-
},
|
|
2663
|
+
borderBottom: "1px solid var(--mantine-color-slate-8)"
|
|
2664
|
+
}, brandSurface),
|
|
1904
2665
|
children: [
|
|
1905
|
-
/* @__PURE__ */ (0,
|
|
1906
|
-
|
|
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,
|
|
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
|
|
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
|
|
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,
|
|
2074
|
-
h2: { fontSize: (0,
|
|
2075
|
-
h3: { fontSize: (0,
|
|
2076
|
-
h4: { fontSize: (0,
|
|
2077
|
-
h5: { fontSize: (0,
|
|
2078
|
-
h6: { fontSize: (0,
|
|
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,
|
|
2083
|
-
sm: (0,
|
|
2084
|
-
md: (0,
|
|
2085
|
-
lg: (0,
|
|
2086
|
-
xl: (0,
|
|
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,
|
|
2098
|
-
sm: (0,
|
|
2099
|
-
md: (0,
|
|
2100
|
-
lg: (0,
|
|
2101
|
-
xl: (0,
|
|
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,
|
|
2105
|
-
sm: (0,
|
|
2106
|
-
md: (0,
|
|
2107
|
-
lg: (0,
|
|
2108
|
-
xl: (0,
|
|
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
|
});
|