@yeongseoksong/framework 0.1.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.
@@ -0,0 +1,1835 @@
1
+ "use client";
2
+ "use strict";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __defProps = Object.defineProperties;
6
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
8
+ var __getOwnPropNames = Object.getOwnPropertyNames;
9
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
10
+ var __getProtoOf = Object.getPrototypeOf;
11
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
12
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
13
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
14
+ var __spreadValues = (a, b) => {
15
+ for (var prop in b || (b = {}))
16
+ if (__hasOwnProp.call(b, prop))
17
+ __defNormalProp(a, prop, b[prop]);
18
+ if (__getOwnPropSymbols)
19
+ for (var prop of __getOwnPropSymbols(b)) {
20
+ if (__propIsEnum.call(b, prop))
21
+ __defNormalProp(a, prop, b[prop]);
22
+ }
23
+ return a;
24
+ };
25
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
26
+ var __objRest = (source, exclude) => {
27
+ var target = {};
28
+ for (var prop in source)
29
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
30
+ target[prop] = source[prop];
31
+ if (source != null && __getOwnPropSymbols)
32
+ for (var prop of __getOwnPropSymbols(source)) {
33
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
34
+ target[prop] = source[prop];
35
+ }
36
+ return target;
37
+ };
38
+ var __export = (target, all) => {
39
+ for (var name in all)
40
+ __defProp(target, name, { get: all[name], enumerable: true });
41
+ };
42
+ var __copyProps = (to, from, except, desc) => {
43
+ if (from && typeof from === "object" || typeof from === "function") {
44
+ for (let key of __getOwnPropNames(from))
45
+ if (!__hasOwnProp.call(to, key) && key !== except)
46
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
47
+ }
48
+ return to;
49
+ };
50
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
51
+ // If the importer is in node compatibility mode or this is not an ESM
52
+ // file that has been converted to a CommonJS file using a Babel-
53
+ // compatible transform (i.e. "__esModule" has not been set), then set
54
+ // "default" to the CommonJS "module.exports" for node compatibility.
55
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
56
+ mod
57
+ ));
58
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
59
+
60
+ // ui/index.tsx
61
+ var ui_exports = {};
62
+ __export(ui_exports, {
63
+ HeroCarousel: () => HeroCarousel,
64
+ Logo: () => Logo,
65
+ MainLayout: () => MainLayout,
66
+ PageLayout: () => PageLayout,
67
+ SdBadge: () => SdBadge,
68
+ SdButton: () => SdButton,
69
+ SdClients: () => SdClients,
70
+ SdContainer: () => SdContainer,
71
+ SdCta: () => SdCta,
72
+ SdErrorView: () => SdErrorView,
73
+ SdFaq: () => SdFaq,
74
+ SdFeatureSection: () => SdFeatureSection,
75
+ SdFeatures: () => SdFeatures,
76
+ SdFooter: () => SdFooter,
77
+ SdHeader: () => SdHeader,
78
+ SdInput: () => SdInput,
79
+ SdMap: () => SdMap,
80
+ SdModal: () => SdModal,
81
+ SdNumberIcon: () => SdNumberIcon,
82
+ SdPricingCard: () => SdPricingCard,
83
+ SdQuote: () => SdQuote,
84
+ SdSolution: () => SdSolution,
85
+ SdSolutionCard: () => SdSolutionCard,
86
+ SdSteps: () => SdSteps,
87
+ SdStepsSection: () => SdStepsSection,
88
+ SdTable: () => SdTable,
89
+ SdTabs: () => SdTabs,
90
+ SdTestimonial: () => SdTestimonial,
91
+ SdText: () => SdText,
92
+ SdTextBox: () => SdTextBox,
93
+ SdTimeline: () => SdTimeline,
94
+ SdTimelineSection: () => SdTimelineSection,
95
+ SdTitle: () => SdTitle,
96
+ theme: () => theme
97
+ });
98
+ module.exports = __toCommonJS(ui_exports);
99
+
100
+ // ui/atom/Logo.tsx
101
+ var import_image = __toESM(require("next/image"));
102
+ var import_link = __toESM(require("next/link"));
103
+ var import_core = require("@mantine/core");
104
+ var import_jsx_runtime = require("react/jsx-runtime");
105
+ function Logo(_props) {
106
+ const { size } = (0, import_core.useProps)("Logo", { size: "md" }, _props);
107
+ const theme2 = (0, import_core.useMantineTheme)();
108
+ const resolved = theme2.other.logoSizes[size];
109
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: "/", style: { display: "inline-flex", alignItems: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
110
+ import_image.default,
111
+ {
112
+ src: "/logo.svg",
113
+ alt: "\uB85C\uACE0",
114
+ width: resolved.width,
115
+ height: resolved.height,
116
+ style: {
117
+ width: (0, import_core.rem)(resolved.width),
118
+ height: "auto",
119
+ objectFit: "contain"
120
+ },
121
+ priority: true
122
+ }
123
+ ) });
124
+ }
125
+
126
+ // ui/atom/Tabs.tsx
127
+ var import_core3 = require("@mantine/core");
128
+
129
+ // ui/atom/Container.tsx
130
+ var import_core2 = require("@mantine/core");
131
+ var import_jsx_runtime2 = require("react/jsx-runtime");
132
+ function SdContainer(_a) {
133
+ var _b = _a, { children } = _b, props = __objRest(_b, ["children"]);
134
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_core2.Container, __spreadProps(__spreadValues({ px: { base: "md", sm: "xl" } }, props), { children }));
135
+ }
136
+
137
+ // ui/atom/Tabs.tsx
138
+ var import_jsx_runtime3 = require("react/jsx-runtime");
139
+ function SdPanel(_a) {
140
+ var _b = _a, { children } = _b, props = __objRest(_b, ["children"]);
141
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_core3.Tabs.Panel, __spreadProps(__spreadValues({}, props), { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SdContainer, { py: "xl", children }) }));
142
+ }
143
+ function SdScrollableList(_a) {
144
+ var _b = _a, { children } = _b, props = __objRest(_b, ["children"]);
145
+ 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 })) });
146
+ }
147
+ function createTabs(defaults, scrollable = false) {
148
+ function SdTabsRoot(props) {
149
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_core3.Tabs, __spreadValues(__spreadValues({}, defaults), props));
150
+ }
151
+ SdTabsRoot.List = scrollable ? SdScrollableList : import_core3.Tabs.List;
152
+ SdTabsRoot.Tab = import_core3.Tabs.Tab;
153
+ SdTabsRoot.Panel = SdPanel;
154
+ return SdTabsRoot;
155
+ }
156
+ var SdTabs = {
157
+ Pills: createTabs({
158
+ variant: "pills",
159
+ color: "primary",
160
+ radius: "xl",
161
+ styles: {
162
+ list: {
163
+ background: "var(--mantine-color-slate-1)",
164
+ padding: "var(--mantine-spacing-xs)",
165
+ gap: "var(--mantine-spacing-xs)",
166
+ borderRadius: "var(--mantine-radius-xl)",
167
+ width: "fit-content",
168
+ maxWidth: "100%",
169
+ margin: "0 auto",
170
+ flexWrap: "wrap",
171
+ justifyContent: "center"
172
+ },
173
+ tab: { fontWeight: "500", fontSize: "var(--mantine-h5-font-size)", paddingInline: "var(--mantine-spacing-lg)" }
174
+ }
175
+ }),
176
+ Underline: createTabs({
177
+ variant: "default",
178
+ color: "primary",
179
+ styles: {
180
+ list: { width: "fit-content", margin: "0 auto", gap: "var(--mantine-spacing-sm)" },
181
+ tab: { fontWeight: "500", fontSize: "var(--mantine-h5-font-size)", paddingInline: "var(--mantine-spacing-lg)" }
182
+ }
183
+ }),
184
+ Outline: createTabs({
185
+ variant: "outline",
186
+ color: "primary",
187
+ radius: "md",
188
+ styles: {
189
+ list: { width: "fit-content", margin: "0 auto", gap: "var(--mantine-spacing-sm)" },
190
+ tab: { fontWeight: "500", fontSize: "var(--mantine-h5-font-size)", paddingInline: "var(--mantine-spacing-lg)" }
191
+ }
192
+ })
193
+ };
194
+
195
+ // ui/atom/Title.tsx
196
+ var import_core4 = require("@mantine/core");
197
+
198
+ // util/text.util.ts
199
+ var COMPANY_TOKEN = "%c";
200
+ var companyName = "UKNOWN";
201
+ function t(text) {
202
+ return text.replaceAll(COMPANY_TOKEN, companyName);
203
+ }
204
+
205
+ // ui/atom/Title.tsx
206
+ var import_jsx_runtime4 = require("react/jsx-runtime");
207
+ function createTitle(defaults) {
208
+ return function SdTitle2(_a) {
209
+ var _b = _a, { children } = _b, props = __objRest(_b, ["children"]);
210
+ const resolved = typeof children === "string" ? t(children) : children;
211
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_core4.Title, __spreadProps(__spreadValues(__spreadValues({}, defaults), props), { children: resolved }));
212
+ };
213
+ }
214
+ var SdTitle = {
215
+ /** 히어로 대제목 — h1, clamp 폰트 */
216
+ Display: createTitle({ order: 2 }),
217
+ /** 섹션 제목 */
218
+ Section: createTitle({ order: 3 }),
219
+ /** 카드·모달 제목 — */
220
+ Card: createTitle({ order: 4 }),
221
+ /** 소제목 */
222
+ Sub: createTitle({ order: 5 })
223
+ };
224
+
225
+ // ui/atom/Text.tsx
226
+ var import_core5 = require("@mantine/core");
227
+ var import_jsx_runtime5 = require("react/jsx-runtime");
228
+ function createText(defaults) {
229
+ return function SdText2(_a) {
230
+ var _b = _a, { children } = _b, props = __objRest(_b, ["children"]);
231
+ const resolved = typeof children === "string" ? t(children) : children;
232
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_core5.Text, __spreadProps(__spreadValues(__spreadValues({}, defaults), props), { children: resolved }));
233
+ };
234
+ }
235
+ var SdText = {
236
+ Strong: createText({ fw: 700, c: "slate.9", fz: "md", style: { letterSpacing: "-0.04em" } }),
237
+ Body: createText({ fw: 400, c: "slate.7", fz: "md", lh: 1.7 }),
238
+ Sub: createText({ fw: 400, c: "slate.5", fz: "xs", lh: 1.6 }),
239
+ Eyebrow: createText({ fw: 700, c: "primary.6", fz: "xs", style: { letterSpacing: "0.12em", textTransform: "uppercase" } }),
240
+ Error: createText({ fw: 400, c: "red.6", fz: "sm" }),
241
+ Hint: createText({ fw: 400, c: "slate.4", fz: "xs", lh: 1.5 }),
242
+ Numeric: createText({ fw: 700, c: "slate.8", fz: "md", style: { fontVariantNumeric: "tabular-nums", letterSpacing: "-0.02em" } })
243
+ };
244
+
245
+ // ui/atom/Button.tsx
246
+ var import_core6 = require("@mantine/core");
247
+ var import_icons_react = require("@tabler/icons-react");
248
+ var import_jsx_runtime6 = require("react/jsx-runtime");
249
+ function createButton(defaults) {
250
+ return function SdButton2(_a) {
251
+ var _b = _a, { children } = _b, props = __objRest(_b, ["children"]);
252
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_core6.Button, __spreadProps(__spreadValues(__spreadValues({}, defaults), props), { children }));
253
+ };
254
+ }
255
+ var SdButton = {
256
+ /** 주요 액션 — filled primary */
257
+ Primary: createButton({ color: "primary" }),
258
+ /** 보조 액션 — outline */
259
+ Outline: createButton({ variant: "outline", color: "primary" }),
260
+ /** 텍스트 수준 — subtle */
261
+ Ghost: createButton({ variant: "subtle", color: "slate" }),
262
+ /** 다크 배경 위 — white */
263
+ White: createButton({ variant: "white" }),
264
+ /** 삭제 — filled red + 휴지통 아이콘 */
265
+ Delete: createButton({ color: "red", leftSection: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_icons_react.IconTrash, { size: 16 }) }),
266
+ /** 취소 — outline slate + X 아이콘 */
267
+ Cancel: createButton({ variant: "outline", color: "slate", leftSection: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_icons_react.IconX, { size: 16 }) })
268
+ };
269
+
270
+ // ui/atom/Quote.tsx
271
+ var import_core7 = require("@mantine/core");
272
+ var import_jsx_runtime7 = require("react/jsx-runtime");
273
+ function QuoteInner({ lines, name, role }) {
274
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_core7.Stack, { gap: "lg", children: [
275
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_core7.Stack, { gap: 0, children: [
276
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(SdTitle.Display, { c: "primary.6", lh: 0.8, "aria-hidden": true, children: "\u201C" }),
277
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_core7.Stack, { gap: "sm", mt: "md", children: lines.map((line, i) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(SdText.Body, { children: line }, i)) })
278
+ ] }),
279
+ (name || role) && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_core7.Group, { gap: "xs", align: "baseline", children: [
280
+ name && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(SdText.Strong, { children: name }),
281
+ role && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(SdText.Sub, { children: role })
282
+ ] })
283
+ ] });
284
+ }
285
+ function Plain(_a) {
286
+ var _b = _a, { lines, name, role } = _b, boxProps = __objRest(_b, ["lines", "name", "role"]);
287
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_core7.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_core7.Box, __spreadProps(__spreadValues({ w: "fit-content" }, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(QuoteInner, { lines, name, role }) })) });
288
+ }
289
+ function CardQuote(_a) {
290
+ var _b = _a, { lines, name, role } = _b, boxProps = __objRest(_b, ["lines", "name", "role"]);
291
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_core7.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_core7.Card, __spreadProps(__spreadValues({ w: "fit-content" }, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(QuoteInner, { lines, name, role }) })) });
292
+ }
293
+ var SdQuote = {
294
+ Plain,
295
+ Card: CardQuote
296
+ };
297
+
298
+ // ui/atom/Table.tsx
299
+ var import_core8 = require("@mantine/core");
300
+ var import_jsx_runtime8 = require("react/jsx-runtime");
301
+ function createTable(defaults) {
302
+ function SdTableRoot(props) {
303
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_core8.Table, __spreadValues(__spreadValues({}, defaults), props));
304
+ }
305
+ SdTableRoot.Thead = import_core8.Table.Thead;
306
+ SdTableRoot.Tbody = import_core8.Table.Tbody;
307
+ SdTableRoot.Tr = import_core8.Table.Tr;
308
+ SdTableRoot.Th = import_core8.Table.Th;
309
+ SdTableRoot.Td = import_core8.Table.Td;
310
+ SdTableRoot.Caption = import_core8.Table.Caption;
311
+ return SdTableRoot;
312
+ }
313
+ var base = {
314
+ striped: true,
315
+ highlightOnHover: true,
316
+ withTableBorder: true,
317
+ withColumnBorders: false,
318
+ verticalSpacing: "sm",
319
+ horizontalSpacing: "md"
320
+ };
321
+ function SpecTh(_a) {
322
+ var _b = _a, { children } = _b, props = __objRest(_b, ["children"]);
323
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_core8.Table.Th, __spreadProps(__spreadValues({}, props), { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(SdText.Strong, { c: "white", children }) }));
324
+ }
325
+ function SpecTd(_a) {
326
+ var _b = _a, { children } = _b, props = __objRest(_b, ["children"]);
327
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_core8.Table.Td, __spreadProps(__spreadValues({}, props), { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(SdText.Body, { children }) }));
328
+ }
329
+ var Spec = createTable(__spreadProps(__spreadValues({}, base), {
330
+ withColumnBorders: true,
331
+ verticalSpacing: "md",
332
+ horizontalSpacing: "lg",
333
+ styles: {
334
+ table: { borderRadius: "var(--mantine-radius-md)", overflow: "hidden" },
335
+ th: {
336
+ background: "var(--mantine-color-primary-6)",
337
+ letterSpacing: "0.01em"
338
+ }
339
+ }
340
+ }));
341
+ Spec.Th = SpecTh;
342
+ Spec.Td = SpecTd;
343
+ var SdTable = Object.assign(createTable(base), { Spec });
344
+
345
+ // ui/atom/Modal.tsx
346
+ var import_core9 = require("@mantine/core");
347
+ var import_jsx_runtime9 = require("react/jsx-runtime");
348
+ function createModal(defaults) {
349
+ function SdModalRoot(props) {
350
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_core9.Modal, __spreadValues(__spreadValues({}, defaults), props));
351
+ }
352
+ SdModalRoot.Header = import_core9.Modal.Header;
353
+ SdModalRoot.Title = import_core9.Modal.Title;
354
+ SdModalRoot.Body = import_core9.Modal.Body;
355
+ SdModalRoot.CloseButton = import_core9.Modal.CloseButton;
356
+ return SdModalRoot;
357
+ }
358
+ var SdModal = createModal({
359
+ size: "md",
360
+ overlayProps: { backgroundOpacity: 0.4, blur: 4 }
361
+ });
362
+
363
+ // ui/atom/NumberIcon.tsx
364
+ var import_core10 = require("@mantine/core");
365
+ var import_jsx_runtime10 = require("react/jsx-runtime");
366
+ function SdNumberIcon(_a) {
367
+ var _b = _a, { value, size = 48, radius = "xl", color = "primary" } = _b, props = __objRest(_b, ["value", "size", "radius", "color"]);
368
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_core10.ThemeIcon, __spreadProps(__spreadValues({ size, radius, color }, props), { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SdText.Strong, { c: "white", children: value }) }));
369
+ }
370
+
371
+ // ui/atom/Badge.tsx
372
+ var import_core11 = require("@mantine/core");
373
+ var import_jsx_runtime11 = require("react/jsx-runtime");
374
+ function createBadge(defaults) {
375
+ return function SdBadge2(_a) {
376
+ var _b = _a, { children } = _b, props = __objRest(_b, ["children"]);
377
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_core11.Badge, __spreadProps(__spreadValues(__spreadValues({}, defaults), props), { children }));
378
+ };
379
+ }
380
+ var SdBadge = {
381
+ /** 기본 — outline slate */
382
+ Default: createBadge({ variant: "outline", color: "slate" }),
383
+ /** 브랜드 강조 — light primary */
384
+ Primary: createBadge({ variant: "light", color: "primary" }),
385
+ /** 성공/완료 */
386
+ Success: createBadge({ variant: "light", color: "green" }),
387
+ /** 주의/경고 */
388
+ Warning: createBadge({ variant: "light", color: "orange" })
389
+ };
390
+
391
+ // ui/atom/Input.tsx
392
+ var import_core12 = require("@mantine/core");
393
+ var import_jsx_runtime12 = require("react/jsx-runtime");
394
+ function createTextInput(defaults) {
395
+ return function SdInput2(_a) {
396
+ var props = __objRest(_a, []);
397
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_core12.TextInput, __spreadValues(__spreadValues({}, defaults), props));
398
+ };
399
+ }
400
+ function createTextarea(defaults) {
401
+ return function SdInputTextarea(_a) {
402
+ var props = __objRest(_a, []);
403
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_core12.Textarea, __spreadValues(__spreadValues({}, defaults), props));
404
+ };
405
+ }
406
+ function createPasswordInput(defaults) {
407
+ return function SdInputPassword(_a) {
408
+ var props = __objRest(_a, []);
409
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_core12.PasswordInput, __spreadValues(__spreadValues({}, defaults), props));
410
+ };
411
+ }
412
+ function createSelect(defaults) {
413
+ return function SdInputSelect(_a) {
414
+ var props = __objRest(_a, []);
415
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_core12.Select, __spreadValues(__spreadValues({}, defaults), props));
416
+ };
417
+ }
418
+ var SdInput = {
419
+ /** 일반 텍스트 — 이름, 회사명 등 */
420
+ Text: createTextInput({}),
421
+ /** 이메일 입력 */
422
+ Email: createTextInput({ type: "email" }),
423
+ /** 비밀번호 입력 — 마스킹 토글 포함 */
424
+ Password: createPasswordInput({}),
425
+ /** 멀티라인 텍스트 — 문의 메시지 등 */
426
+ Textarea: createTextarea({ autosize: true, minRows: 3 }),
427
+ /** 드롭다운 선택 */
428
+ Select: createSelect({})
429
+ };
430
+
431
+ // ui/molecule/TextBox.tsx
432
+ var import_core13 = require("@mantine/core");
433
+ var import_jsx_runtime13 = require("react/jsx-runtime");
434
+ function createTextBox(titleVariant, defaultGap = "xs", descVariant = "Body", color_ = void 0) {
435
+ return function SdTextBox2(_a) {
436
+ var _b = _a, {
437
+ label,
438
+ title,
439
+ description,
440
+ titleVariant: variantOverride,
441
+ maxDescWidth,
442
+ children,
443
+ color
444
+ } = _b, stackProps = __objRest(_b, [
445
+ "label",
446
+ "title",
447
+ "description",
448
+ "titleVariant",
449
+ "maxDescWidth",
450
+ "children",
451
+ "color"
452
+ ]);
453
+ const colorRes = color != null ? color : color_;
454
+ const variant = variantOverride != null ? variantOverride : titleVariant;
455
+ const TitleComponent = SdTitle[variant];
456
+ const DescComponent = SdText[descVariant];
457
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_core13.Stack, __spreadProps(__spreadValues({ gap: defaultGap }, stackProps), { children: [
458
+ label && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SdText.Eyebrow, { children: label }),
459
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(TitleComponent, { c: colorRes, children: title }),
460
+ description && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(DescComponent, { c: colorRes, maw: maxDescWidth, mt: 4, children: description }),
461
+ children
462
+ ] }));
463
+ };
464
+ }
465
+ var SdTextBox = {
466
+ Hero: createTextBox("Display", "lg", "Body", "slate.0"),
467
+ Section: createTextBox("Section", "xs", "Body"),
468
+ Card: createTextBox("Card", "xs", "Body"),
469
+ Sub: createTextBox("Sub", "xs", "Sub")
470
+ };
471
+
472
+ // ui/molecule/Features.tsx
473
+ var import_core14 = require("@mantine/core");
474
+
475
+ // util/sort.util.ts
476
+ function filterAndSort(items) {
477
+ return (items != null ? items : []).filter((item) => item.isShow).sort((a, b) => a.order - b.order);
478
+ }
479
+
480
+ // ui/molecule/Features.tsx
481
+ var import_jsx_runtime14 = require("react/jsx-runtime");
482
+ function SdFeatures({ items, cols = { base: 1, sm: 2, md: 3 } }) {
483
+ const visible = filterAndSort(items);
484
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core14.SimpleGrid, { cols, spacing: "xl", children: visible.map((item) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core14.Card, { children: /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_core14.Stack, { gap: "sm", children: [
485
+ item.icon,
486
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
487
+ SdTextBox.Card,
488
+ {
489
+ label: item.label,
490
+ title: item.title,
491
+ description: item.description
492
+ }
493
+ )
494
+ ] }, item.id) })) });
495
+ }
496
+
497
+ // ui/molecule/Timeline.tsx
498
+ var import_core15 = require("@mantine/core");
499
+ var import_jsx_runtime15 = require("react/jsx-runtime");
500
+ function SdTimeline({ items }) {
501
+ const grouped = items.filter((item) => item.isShow).sort((a, b) => b.year - a.year || b.month - a.month).reduce((acc, item) => {
502
+ var _a, _b;
503
+ ((_b = acc[_a = item.year]) != null ? _b : acc[_a] = []).push(item);
504
+ return acc;
505
+ }, {});
506
+ const years = Object.keys(grouped).map(Number).sort((a, b) => b - a);
507
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core15.Timeline, { active: items.length, bulletSize: 24, lineWidth: 2, children: years.map((year) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
508
+ import_core15.Timeline.Item,
509
+ {
510
+ title: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(SdTitle.Sub, { children: [
511
+ year,
512
+ "\uB144"
513
+ ] }),
514
+ children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core15.Stack, { gap: 6, mt: "xs", children: grouped[year].map((event) => /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core15.Group, { gap: "md", align: "center", wrap: "nowrap", children: [
515
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(SdText.Eyebrow, { miw: 28, children: [
516
+ event.month,
517
+ "\uC6D4"
518
+ ] }),
519
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(SdText.Sub, { style: { flex: 1 }, children: event.description })
520
+ ] }, event.id)) })
521
+ },
522
+ year
523
+ )) });
524
+ }
525
+
526
+ // ui/molecule/Steps.tsx
527
+ var import_core16 = require("@mantine/core");
528
+ var import_icons_react2 = require("@tabler/icons-react");
529
+ var import_jsx_runtime16 = require("react/jsx-runtime");
530
+ var import_jsx_runtime17 = require("react/jsx-runtime");
531
+ function BubbleStep({ item, index, isLast }) {
532
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_core16.Group, { align: "flex-start", gap: "lg", wrap: "nowrap", children: [
533
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_core16.Box, { style: { display: "flex", flexDirection: "column", alignItems: "center", flexShrink: 0 }, children: [
534
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(SdNumberIcon, { value: String(index + 1).padStart(2, "0") }),
535
+ !isLast && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Box, { style: { width: 2, flex: 1, minHeight: 32, marginTop: 8, background: "var(--mantine-color-primary-2)" } })
536
+ ] }),
537
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(SdTextBox.Card, { title: item.title, description: item.description, pb: !isLast ? "xl" : 0, pt: 4 })
538
+ ] });
539
+ }
540
+ function Bubble({ items }) {
541
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Box, { children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(BubbleStep, { item, index: i, isLast: i === items.length - 1 }, i)) });
542
+ }
543
+ function CardStep({ item, index }) {
544
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_core16.Card, { withBorder: true, radius: "md", p: 0, style: { height: "100%", overflow: "hidden" }, children: [
545
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
546
+ import_core16.Box,
547
+ {
548
+ py: "lg",
549
+ style: {
550
+ display: "flex",
551
+ justifyContent: "center",
552
+ background: "var(--mantine-color-primary-0)"
553
+ },
554
+ children: /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(SdText.Eyebrow, { children: [
555
+ "STEP ",
556
+ String(index + 1).padStart(2, "0")
557
+ ] })
558
+ }
559
+ ),
560
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Box, { p: "lg", style: { textAlign: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(SdTextBox.Card, { title: item.title, description: item.description }) })
561
+ ] });
562
+ }
563
+ function CardArrow({ direction }) {
564
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.ThemeIcon, { size: 36, radius: "xl", variant: "light", color: "primary", children: direction === "right" ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_icons_react2.IconArrowRight, { size: 20, stroke: 2.5 }) : /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_icons_react2.IconArrowDown, { size: 20, stroke: 2.5 }) });
565
+ }
566
+ function CardVariant({ items }) {
567
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_jsx_runtime17.Fragment, { children: [
568
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Stack, { gap: "sm", hiddenFrom: "sm", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_jsx_runtime16.Fragment, { children: [
569
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(CardStep, { item, index: i }),
570
+ i < items.length - 1 && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Box, { style: { display: "flex", justifyContent: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(CardArrow, { direction: "down" }) })
571
+ ] }, i)) }),
572
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Group, { wrap: "nowrap", align: "stretch", gap: 0, visibleFrom: "sm", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_jsx_runtime16.Fragment, { children: [
573
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Box, { style: { flex: 1, minWidth: 0 }, children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(CardStep, { item, index: i }) }),
574
+ i < items.length - 1 && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Box, { style: { display: "flex", alignItems: "center", padding: "0 8px" }, children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(CardArrow, { direction: "right" }) })
575
+ ] }, i)) })
576
+ ] });
577
+ }
578
+ function StripStep({ item, index }) {
579
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Box, { pl: "md", style: { borderLeft: "3px solid var(--mantine-color-primary-6)" }, children: /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_core16.Stack, { gap: 4, children: [
580
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(SdText.Eyebrow, { children: [
581
+ "STEP ",
582
+ String(index + 1).padStart(2, "0")
583
+ ] }),
584
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(SdTextBox.Card, { title: item.title, description: item.description })
585
+ ] }) });
586
+ }
587
+ function Strip({ items }) {
588
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Stack, { gap: "xl", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(StripStep, { item, index: i }, i)) });
589
+ }
590
+ var SdSteps = { Bubble, Card: CardVariant, Strip };
591
+
592
+ // ui/molecule/Testimonial.tsx
593
+ var import_core17 = require("@mantine/core");
594
+ var import_jsx_runtime18 = require("react/jsx-runtime");
595
+ function AuthorRow({ item }) {
596
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.Group, { gap: "sm", wrap: "nowrap", children: [
597
+ item.avatar && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Avatar, { src: item.avatar, size: "md", radius: "xl" }),
598
+ !item.avatar && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Avatar, { size: "md", radius: "xl", color: "primary", children: item.name.charAt(0) }),
599
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.Stack, { gap: 0, children: [
600
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SdText.Strong, { fz: "sm", children: item.name }),
601
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(SdText.Sub, { children: [
602
+ item.role,
603
+ item.company ? ` \xB7 ${item.company}` : ""
604
+ ] })
605
+ ] })
606
+ ] });
607
+ }
608
+ function CardTestimonial(_a) {
609
+ var _b = _a, { item } = _b, boxProps = __objRest(_b, ["item"]);
610
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Card, __spreadProps(__spreadValues({ h: "100%" }, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.Stack, { gap: "md", h: "100%", children: [
611
+ item.rating && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Rating, { value: item.rating, readOnly: true, size: "sm", color: "primary" }),
612
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.Stack, { gap: "xs", style: { flex: 1 }, children: [
613
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SdTitle.Display, { c: "primary.6", lh: 0.8, "aria-hidden": true, children: "\u201C" }),
614
+ item.lines.map((line, i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SdText.Body, { children: line }, i))
615
+ ] }),
616
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(AuthorRow, { item })
617
+ ] }) }));
618
+ }
619
+ function Strip2(_a) {
620
+ var _b = _a, { item } = _b, boxProps = __objRest(_b, ["item"]);
621
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Box, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.Stack, { gap: "md", children: [
622
+ item.rating && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Rating, { value: item.rating, readOnly: true, size: "sm", color: "primary" }),
623
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.Group, { gap: 4, align: "flex-start", children: [
624
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SdTitle.Display, { c: "primary.6", lh: 0.8, "aria-hidden": true, children: "\u201C" }),
625
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Stack, { gap: "xs", style: { flex: 1 }, children: item.lines.map((line, i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SdText.Body, { children: line }, i)) })
626
+ ] }),
627
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(AuthorRow, { item })
628
+ ] }) }));
629
+ }
630
+ function Grid({ items, cols = { base: 1, sm: 2, md: 3 } }) {
631
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.SimpleGrid, { cols, spacing: "xl", style: { alignItems: "stretch" }, children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(CardTestimonial, { item }, i)) });
632
+ }
633
+ var SdTestimonial = {
634
+ /** 카드형 — 그리드 배치용 */
635
+ Card: CardTestimonial,
636
+ /** 스트립형 — 단일 강조 후기 */
637
+ Strip: Strip2,
638
+ /** 카드 그리드 — 여러 후기 목록 */
639
+ Grid
640
+ };
641
+
642
+ // ui/molecule/PricingCard.tsx
643
+ var import_core18 = require("@mantine/core");
644
+ var import_icons_react3 = require("@tabler/icons-react");
645
+ var import_jsx_runtime19 = require("react/jsx-runtime");
646
+ function Default(_a) {
647
+ var _b = _a, { item, onSelect } = _b, cardProps = __objRest(_b, ["item", "onSelect"]);
648
+ var _a2;
649
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
650
+ import_core18.Card,
651
+ __spreadProps(__spreadValues({
652
+ withBorder: true,
653
+ style: { position: "relative" }
654
+ }, cardProps), {
655
+ children: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Stack, { gap: "xl", children: [
656
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Stack, { gap: "xs", children: [
657
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Group, { justify: "space-between", align: "flex-start", children: [
658
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SdTitle.Card, { children: item.name }),
659
+ item.isPopular && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SdBadge.Primary, { children: "\uCD94\uCC9C" })
660
+ ] }),
661
+ item.description && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SdText.Sub, { children: item.description })
662
+ ] }),
663
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Group, { gap: 4, align: "baseline", children: [
664
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SdTitle.Display, { children: item.price }),
665
+ item.period && /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(SdText.Sub, { children: [
666
+ "/ ",
667
+ item.period
668
+ ] })
669
+ ] }),
670
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Divider, {}),
671
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Stack, { gap: "sm", children: item.features.map((f, i) => /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Group, { gap: "sm", wrap: "nowrap", children: [
672
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
673
+ import_core18.ThemeIcon,
674
+ {
675
+ size: "xs",
676
+ radius: "xl",
677
+ color: f.included ? "primary" : "slate",
678
+ variant: f.included ? "filled" : "subtle",
679
+ children: f.included ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_icons_react3.IconCheck, { size: 12 }) : /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_icons_react3.IconX, { size: 12 })
680
+ }
681
+ ),
682
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
683
+ SdText.Body,
684
+ {
685
+ fz: "sm",
686
+ c: f.included ? "slate.7" : "slate.4",
687
+ children: f.text
688
+ }
689
+ )
690
+ ] }, i)) }),
691
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SdButton.Outline, { fullWidth: true, onClick: () => onSelect == null ? void 0 : onSelect(item), children: (_a2 = item.ctaLabel) != null ? _a2 : "\uC2DC\uC791\uD558\uAE30" })
692
+ ] })
693
+ })
694
+ );
695
+ }
696
+ function Featured(_a) {
697
+ var _b = _a, { item, onSelect } = _b, cardProps = __objRest(_b, ["item", "onSelect"]);
698
+ var _a2;
699
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
700
+ import_core18.Card,
701
+ __spreadProps(__spreadValues({
702
+ bg: "primary.6",
703
+ style: { position: "relative" }
704
+ }, cardProps), {
705
+ children: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Stack, { gap: "xl", children: [
706
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Stack, { gap: "xs", children: [
707
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Group, { justify: "space-between", align: "flex-start", children: [
708
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SdTitle.Card, { c: "white", children: item.name }),
709
+ item.isPopular && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SdBadge.Default, { c: "white", style: { borderColor: "rgba(255,255,255,0.5)" }, children: "\uCD94\uCC9C" })
710
+ ] }),
711
+ item.description && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SdText.Body, { c: "primary.1", children: item.description })
712
+ ] }),
713
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Group, { gap: 4, align: "baseline", children: [
714
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SdTitle.Display, { c: "white", children: item.price }),
715
+ item.period && /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(SdText.Body, { c: "primary.2", children: [
716
+ "/ ",
717
+ item.period
718
+ ] })
719
+ ] }),
720
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Divider, { color: "primary.4" }),
721
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Stack, { gap: "sm", children: item.features.map((f, i) => /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Group, { gap: "sm", wrap: "nowrap", children: [
722
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
723
+ import_core18.ThemeIcon,
724
+ {
725
+ size: "xs",
726
+ radius: "xl",
727
+ color: "white",
728
+ variant: f.included ? "filled" : "subtle",
729
+ children: f.included ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_icons_react3.IconCheck, { size: 12, color: "var(--mantine-color-primary-6)" }) : /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_icons_react3.IconX, { size: 12, color: "rgba(255,255,255,0.4)" })
730
+ }
731
+ ),
732
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
733
+ SdText.Body,
734
+ {
735
+ fz: "sm",
736
+ c: f.included ? "white" : "primary.3",
737
+ children: f.text
738
+ }
739
+ )
740
+ ] }, i)) }),
741
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SdButton.White, { fullWidth: true, onClick: () => onSelect == null ? void 0 : onSelect(item), children: (_a2 = item.ctaLabel) != null ? _a2 : "\uC2DC\uC791\uD558\uAE30" })
742
+ ] })
743
+ })
744
+ );
745
+ }
746
+ function Grid2({ items, cols = { base: 1, sm: 2, md: 3 }, onSelect }) {
747
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.SimpleGrid, { cols, spacing: "xl", style: { alignItems: "stretch" }, children: items.map(
748
+ (item, i) => item.isPopular ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Featured, { item, onSelect }, i) : /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Default, { item, onSelect }, i)
749
+ ) });
750
+ }
751
+ var SdPricingCard = {
752
+ /** 기본 outlined 카드 */
753
+ Default,
754
+ /** 강조 — primary 배경 */
755
+ Featured,
756
+ /** 가격 그리드 (isPopular 항목은 자동으로 Featured 처리) */
757
+ Grid: Grid2
758
+ };
759
+
760
+ // ui/molecule/Faq.tsx
761
+ var import_core19 = require("@mantine/core");
762
+ var import_jsx_runtime20 = require("react/jsx-runtime");
763
+ function Default2(_a) {
764
+ var _b = _a, { items } = _b, boxProps = __objRest(_b, ["items"]);
765
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Box, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Accordion, { variant: "separated", radius: "md", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Accordion.Item, { value: String(i), children: [
766
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Accordion.Control, { children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdText.Strong, { fz: "sm", children: item.question }) }),
767
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Accordion.Panel, { children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdText.Body, { fz: "sm", children: item.answer }) })
768
+ ] }, i)) }) }));
769
+ }
770
+ function Filled(_a) {
771
+ var _b = _a, { items } = _b, boxProps = __objRest(_b, ["items"]);
772
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Box, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Accordion, { variant: "filled", radius: "md", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Accordion.Item, { value: String(i), children: [
773
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Accordion.Control, { children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdText.Strong, { fz: "sm", children: item.question }) }),
774
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Accordion.Panel, { children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdText.Body, { fz: "sm", children: item.answer }) })
775
+ ] }, i)) }) }));
776
+ }
777
+ function WithHeader(_a) {
778
+ var _b = _a, { label, title, description, items } = _b, boxProps = __objRest(_b, ["label", "title", "description", "items"]);
779
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Stack, __spreadProps(__spreadValues({ gap: "xl" }, boxProps), { children: [
780
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Stack, { gap: "xs", children: [
781
+ label && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdText.Eyebrow, { children: label }),
782
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdTitle.Section, { children: title }),
783
+ description && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdText.Body, { children: description })
784
+ ] }),
785
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Default2, { items })
786
+ ] }));
787
+ }
788
+ var SdFaq = {
789
+ /** separated 스타일 아코디언 */
790
+ Default: Default2,
791
+ /** filled 배경 아코디언 */
792
+ Filled,
793
+ /** 헤더 + 아코디언 조합 */
794
+ WithHeader
795
+ };
796
+
797
+ // ui/molecule/Cta.tsx
798
+ var import_core20 = require("@mantine/core");
799
+ var import_jsx_runtime21 = require("react/jsx-runtime");
800
+ function Banner(_a) {
801
+ var _b = _a, {
802
+ label,
803
+ title,
804
+ description,
805
+ primaryLabel = "\uC2DC\uC791\uD558\uAE30",
806
+ secondaryLabel,
807
+ onPrimary,
808
+ onSecondary
809
+ } = _b, boxProps = __objRest(_b, [
810
+ "label",
811
+ "title",
812
+ "description",
813
+ "primaryLabel",
814
+ "secondaryLabel",
815
+ "onPrimary",
816
+ "onSecondary"
817
+ ]);
818
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
819
+ import_core20.Box,
820
+ __spreadProps(__spreadValues({
821
+ bg: "primary.7",
822
+ py: { base: "xl", md: 80 },
823
+ px: { base: "md", md: "xl" }
824
+ }, boxProps), {
825
+ children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Stack, { gap: "xl", align: "center", maw: 600, children: [
826
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Stack, { gap: "sm", align: "center", children: [
827
+ label && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdText.Eyebrow, { c: "primary.3", children: label }),
828
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdTitle.Section, { c: "white", ta: "center", children: title }),
829
+ description && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdText.Body, { c: "primary.2", ta: "center", children: description })
830
+ ] }),
831
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Group, { gap: "sm", children: [
832
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdButton.White, { size: "md", onClick: onPrimary, children: primaryLabel }),
833
+ secondaryLabel && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
834
+ SdButton.Ghost,
835
+ {
836
+ size: "md",
837
+ c: "primary.2",
838
+ onClick: onSecondary,
839
+ children: secondaryLabel
840
+ }
841
+ )
842
+ ] })
843
+ ] }) })
844
+ })
845
+ );
846
+ }
847
+ function Subtle(_a) {
848
+ var _b = _a, {
849
+ label,
850
+ title,
851
+ description,
852
+ primaryLabel = "\uC2DC\uC791\uD558\uAE30",
853
+ secondaryLabel,
854
+ onPrimary,
855
+ onSecondary
856
+ } = _b, boxProps = __objRest(_b, [
857
+ "label",
858
+ "title",
859
+ "description",
860
+ "primaryLabel",
861
+ "secondaryLabel",
862
+ "onPrimary",
863
+ "onSecondary"
864
+ ]);
865
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
866
+ import_core20.Box,
867
+ __spreadProps(__spreadValues({
868
+ bg: "primary.0",
869
+ py: { base: "xl", md: 60 },
870
+ px: { base: "md", md: "xl" },
871
+ style: { borderRadius: "var(--mantine-radius-lg)" }
872
+ }, boxProps), {
873
+ children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Stack, { gap: "lg", align: "center", maw: 560, children: [
874
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Stack, { gap: "sm", align: "center", children: [
875
+ label && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdText.Eyebrow, { children: label }),
876
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdTitle.Section, { ta: "center", children: title }),
877
+ description && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdText.Body, { ta: "center", children: description })
878
+ ] }),
879
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Group, { gap: "sm", children: [
880
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdButton.Primary, { size: "md", onClick: onPrimary, children: primaryLabel }),
881
+ secondaryLabel && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdButton.Outline, { size: "md", onClick: onSecondary, children: secondaryLabel })
882
+ ] })
883
+ ] }) })
884
+ })
885
+ );
886
+ }
887
+ function Inline(_a) {
888
+ var _b = _a, {
889
+ label,
890
+ title,
891
+ description,
892
+ primaryLabel = "\uC2DC\uC791\uD558\uAE30",
893
+ secondaryLabel,
894
+ onPrimary,
895
+ onSecondary
896
+ } = _b, boxProps = __objRest(_b, [
897
+ "label",
898
+ "title",
899
+ "description",
900
+ "primaryLabel",
901
+ "secondaryLabel",
902
+ "onPrimary",
903
+ "onSecondary"
904
+ ]);
905
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
906
+ import_core20.Box,
907
+ __spreadProps(__spreadValues({
908
+ py: { base: "xl", md: 48 },
909
+ px: { base: "md", md: "xl" },
910
+ style: {
911
+ borderTop: "1px solid var(--mantine-color-slate-2)",
912
+ borderBottom: "1px solid var(--mantine-color-slate-2)"
913
+ }
914
+ }, boxProps), {
915
+ children: /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Group, { justify: "space-between", align: "center", gap: "xl", children: [
916
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Stack, { gap: "xs", style: { flex: 1 }, children: [
917
+ label && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdText.Eyebrow, { children: label }),
918
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdTitle.Card, { children: title }),
919
+ description && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdText.Sub, { children: description })
920
+ ] }),
921
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Group, { gap: "sm", wrap: "nowrap", children: [
922
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdButton.Primary, { size: "md", onClick: onPrimary, children: primaryLabel }),
923
+ secondaryLabel && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SdButton.Outline, { size: "md", onClick: onSecondary, children: secondaryLabel })
924
+ ] })
925
+ ] })
926
+ })
927
+ );
928
+ }
929
+ var SdCta = {
930
+ /** 다크 배경 전체폭 CTA */
931
+ Banner,
932
+ /** 라이트 박스형 CTA */
933
+ Subtle,
934
+ /** 좌우 분할 인라인 CTA */
935
+ Inline
936
+ };
937
+
938
+ // ui/molecule/Solution.tsx
939
+ var import_react = require("react");
940
+ var import_core22 = require("@mantine/core");
941
+ var import_link3 = __toESM(require("next/link"));
942
+
943
+ // ui/molecule/SolutionCard.tsx
944
+ var import_core21 = require("@mantine/core");
945
+ var import_link2 = __toESM(require("next/link"));
946
+ var import_jsx_runtime22 = require("react/jsx-runtime");
947
+ function SolutionCardItem(_a) {
948
+ var _b = _a, { item, onSelect } = _b, cardProps = __objRest(_b, ["item", "onSelect"]);
949
+ var _a2, _b2;
950
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Card, __spreadProps(__spreadValues({ withBorder: true }, cardProps), { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Stack, { gap: "md", children: [
951
+ item.icon,
952
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdBadge.Primary, { children: item.category }),
953
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdTitle.Card, { children: item.title }),
954
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SdText.Body, { children: item.description }),
955
+ item.href ? /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Button, { variant: "subtle", color: "slate", component: import_link2.default, href: item.href, children: [
956
+ (_a2 = item.ctaLabel) != null ? _a2 : "\uC790\uC138\uD788 \uBCF4\uAE30",
957
+ " \u2192"
958
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(SdButton.Ghost, { onClick: () => onSelect == null ? void 0 : onSelect(item), children: [
959
+ (_b2 = item.ctaLabel) != null ? _b2 : "\uC790\uC138\uD788 \uBCF4\uAE30",
960
+ " \u2192"
961
+ ] })
962
+ ] }) }));
963
+ }
964
+ function Grid3({ items, cols = { base: 1, sm: 2, md: 3 }, onSelect }) {
965
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.SimpleGrid, { cols, spacing: "xl", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SolutionCardItem, { item, onSelect }, i)) });
966
+ }
967
+ var SdSolutionCard = {
968
+ /** 단일 compact 카드 */
969
+ Item: SolutionCardItem,
970
+ /** 카드 그리드 */
971
+ Grid: Grid3
972
+ };
973
+
974
+ // ui/molecule/Solution.tsx
975
+ var import_jsx_runtime23 = require("react/jsx-runtime");
976
+ function Filtered({ items, allLabel = "\uC804\uCCB4", cols, onSelect }) {
977
+ const categories = ["all", ...Array.from(new Set(items.map((i) => i.category)))];
978
+ const [active, setActive] = (0, import_react.useState)("all");
979
+ const filtered = active === "all" ? items : items.filter((i) => i.category === active);
980
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Stack, { gap: "xl", children: [
981
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdTabs.Pills, { value: active, onChange: (v) => setActive(v != null ? v : "all"), children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdTabs.Pills.List, { children: categories.map((cat) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdTabs.Pills.Tab, { value: cat, children: cat === "all" ? allLabel : cat }, cat)) }) }),
982
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdSolutionCard.Grid, { items: filtered, cols, onSelect })
983
+ ] });
984
+ }
985
+ function List({ items, onSelect }) {
986
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.Stack, { gap: 0, children: items.map((item, i) => {
987
+ var _a, _b;
988
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { children: [
989
+ i > 0 && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.Divider, {}),
990
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Group, { align: "flex-start", py: "lg", gap: "lg", children: [
991
+ item.icon && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.ThemeIcon, { variant: "light", color: "primary", size: "xl", radius: "md", children: item.icon }),
992
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Stack, { gap: "xs", style: { flex: 1 }, children: [
993
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdBadge.Primary, { children: item.category }),
994
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdTitle.Card, { children: item.title }),
995
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SdText.Body, { children: item.description }),
996
+ item.href ? /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
997
+ import_core22.Button,
998
+ {
999
+ variant: "subtle",
1000
+ color: "slate",
1001
+ component: import_link3.default,
1002
+ href: item.href,
1003
+ style: { alignSelf: "flex-start", paddingInline: 0 },
1004
+ children: [
1005
+ (_a = item.ctaLabel) != null ? _a : "\uC790\uC138\uD788 \uBCF4\uAE30",
1006
+ " \u2192"
1007
+ ]
1008
+ }
1009
+ ) : /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
1010
+ SdButton.Ghost,
1011
+ {
1012
+ onClick: () => onSelect == null ? void 0 : onSelect(item),
1013
+ style: { alignSelf: "flex-start" },
1014
+ children: [
1015
+ (_b = item.ctaLabel) != null ? _b : "\uC790\uC138\uD788 \uBCF4\uAE30",
1016
+ " \u2192"
1017
+ ]
1018
+ }
1019
+ )
1020
+ ] })
1021
+ ] })
1022
+ ] }, i);
1023
+ }) });
1024
+ }
1025
+ var SdSolution = {
1026
+ /** 카테고리 탭 필터 + 카드 그리드 (솔루션 페이지 메인) */
1027
+ Filtered,
1028
+ /** 수평 리스트 레이아웃 (상세 탐색용) */
1029
+ List
1030
+ };
1031
+
1032
+ // ui/molecule/Clients.tsx
1033
+ var import_core23 = require("@mantine/core");
1034
+ var import_jsx_runtime24 = require("react/jsx-runtime");
1035
+ var grayStyle = {
1036
+ filter: "grayscale(1) opacity(0.5)",
1037
+ transition: "filter 0.25s"
1038
+ };
1039
+ var colorStyle = {
1040
+ filter: "grayscale(0) opacity(1)"
1041
+ };
1042
+ function LogoImage({ client, height }) {
1043
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core23.Tooltip, { label: client.name, withArrow: true, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core23.Anchor, { href: client.url, target: "_blank", rel: "noopener noreferrer", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
1044
+ "img",
1045
+ {
1046
+ src: client.logo,
1047
+ alt: client.name,
1048
+ style: __spreadValues({ height, width: "auto", objectFit: "contain", display: "block" }, grayStyle),
1049
+ onMouseEnter: (e) => Object.assign(e.currentTarget.style, colorStyle),
1050
+ onMouseLeave: (e) => Object.assign(e.currentTarget.style, grayStyle)
1051
+ }
1052
+ ) }) });
1053
+ }
1054
+ function Grid4({
1055
+ items,
1056
+ cols = { base: 2, sm: 3, md: 4, lg: 6 },
1057
+ logoHeight = 40
1058
+ }) {
1059
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core23.SimpleGrid, { cols, spacing: "xl", children: items.map((client, i) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core23.Box, { style: { display: "flex", alignItems: "center", justifyContent: "center", padding: "12px 8px" }, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(LogoImage, { client, height: logoHeight }) }, i)) });
1060
+ }
1061
+ var KEYFRAME = `@keyframes sd-clients-marquee { from { transform: translateX(0) } to { transform: translateX(-50%) } }`;
1062
+ function Marquee({ items, speed = 40, logoHeight = 36, gap = 64 }) {
1063
+ const doubled = [...items, ...items];
1064
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_core23.Box, { style: { overflow: "hidden" }, children: [
1065
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("style", { children: KEYFRAME }),
1066
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
1067
+ import_core23.Box,
1068
+ {
1069
+ style: {
1070
+ display: "flex",
1071
+ alignItems: "center",
1072
+ gap,
1073
+ width: "max-content",
1074
+ animation: `sd-clients-marquee ${speed}s linear infinite`
1075
+ },
1076
+ onMouseEnter: (e) => {
1077
+ e.currentTarget.style.animationPlayState = "paused";
1078
+ },
1079
+ onMouseLeave: (e) => {
1080
+ e.currentTarget.style.animationPlayState = "running";
1081
+ },
1082
+ children: doubled.map((client, i) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(LogoImage, { client, height: logoHeight }, i))
1083
+ }
1084
+ )
1085
+ ] });
1086
+ }
1087
+ var SdClients = {
1088
+ /** 반응형 로고 그리드 */
1089
+ Grid: Grid4,
1090
+ /** 무한 수평 스크롤 띠 — 호버 시 일시정지 */
1091
+ Marquee
1092
+ };
1093
+
1094
+ // ui/molecule/Map.tsx
1095
+ var import_react2 = require("react");
1096
+ var import_core24 = require("@mantine/core");
1097
+ var import_jsx_runtime25 = require("react/jsx-runtime");
1098
+ function MapFrame({ address, height }) {
1099
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_core24.Stack, { gap: "xs", children: [
1100
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_core24.Box, { style: { borderRadius: "var(--mantine-radius-md)", overflow: "hidden", height }, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1101
+ "iframe",
1102
+ {
1103
+ src: address.embbedUrl,
1104
+ width: "100%",
1105
+ height: "100%",
1106
+ style: { border: 0, display: "block" },
1107
+ allowFullScreen: true,
1108
+ loading: "lazy",
1109
+ referrerPolicy: "no-referrer-when-downgrade",
1110
+ title: address.label
1111
+ }
1112
+ ) }),
1113
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(SdText.Sub, { children: [
1114
+ "[",
1115
+ address.label,
1116
+ "] ",
1117
+ address.address
1118
+ ] })
1119
+ ] });
1120
+ }
1121
+ function Single(_a) {
1122
+ var _b = _a, { address, height = 400 } = _b, boxProps = __objRest(_b, ["address", "height"]);
1123
+ if (!address.embbedUrl) return null;
1124
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_core24.Box, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(MapFrame, { address, height }) }));
1125
+ }
1126
+ function Tabs2({ addresses, height = 400 }) {
1127
+ var _a, _b, _c;
1128
+ const mapped = addresses.filter((a) => a.embbedUrl);
1129
+ const [active, setActive] = (0, import_react2.useState)((_b = (_a = mapped[0]) == null ? void 0 : _a.label) != null ? _b : "");
1130
+ if (mapped.length === 0) return null;
1131
+ if (mapped.length === 1) return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(MapFrame, { address: mapped[0], height });
1132
+ const current = (_c = mapped.find((a) => a.label === active)) != null ? _c : mapped[0];
1133
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_core24.Stack, { gap: "md", children: [
1134
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SdTabs.Pills, { value: active, onChange: (v) => setActive(v != null ? v : mapped[0].label), children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SdTabs.Pills.List, { children: mapped.map((addr) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SdTabs.Pills.Tab, { value: addr.label, children: addr.label }, addr.label)) }) }),
1135
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(MapFrame, { address: current, height })
1136
+ ] });
1137
+ }
1138
+ var SdMap = {
1139
+ /** 단일 주소 지도 — embbedUrl 없으면 null 반환 */
1140
+ Single,
1141
+ /** 여러 주소 탭 전환 지도 — embbedUrl 있는 항목만 표시 */
1142
+ Tabs: Tabs2
1143
+ };
1144
+
1145
+ // ui/organism/HeroCarousel.tsx
1146
+ var import_carousel = require("@mantine/carousel");
1147
+ var import_core25 = require("@mantine/core");
1148
+ var import_jsx_runtime26 = require("react/jsx-runtime");
1149
+ function HeroCarousel({ slides, children }) {
1150
+ if (children) return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_jsx_runtime26.Fragment, { children });
1151
+ const filterdSlides = filterAndSort(slides);
1152
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_carousel.Carousel, { withIndicators: true, height: "60svh", children: filterdSlides.map((slide, i) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_carousel.Carousel.Slide, { children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1153
+ import_core25.Box,
1154
+ {
1155
+ style: {
1156
+ height: "100%",
1157
+ backgroundImage: `url(${slide.image})`,
1158
+ backgroundSize: "cover",
1159
+ backgroundPosition: "center",
1160
+ display: "flex",
1161
+ alignItems: "center",
1162
+ justifyContent: "center"
1163
+ },
1164
+ children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.Stack, { align: "center", style: { textAlign: "center", maxWidth: 780 }, px: "xl", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1165
+ SdTextBox.Hero,
1166
+ {
1167
+ title: slide.title,
1168
+ description: slide.description,
1169
+ ta: "center",
1170
+ align: "center"
1171
+ }
1172
+ ) })
1173
+ }
1174
+ ) }, i)) });
1175
+ }
1176
+
1177
+ // ui/organism/Header.tsx
1178
+ var import_core26 = require("@mantine/core");
1179
+ var import_hooks = require("@mantine/hooks");
1180
+ var import_jsx_runtime27 = require("react/jsx-runtime");
1181
+ function SdHeader({ navItems, loginFlag, children }) {
1182
+ const [opened, { toggle, close }] = (0, import_hooks.useDisclosure)();
1183
+ const visibleTopItems = navItems.filter((item) => item.isShow && !item.parentId).sort((a, b) => a.order - b.order);
1184
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_jsx_runtime27.Fragment, { children: [
1185
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(SdContainer, { h: "100%", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_core26.Group, { justify: "space-between", h: "100%", children: [
1186
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Logo, {}),
1187
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core26.Group, { gap: "xl", visibleFrom: "sm", children: visibleTopItems.map((item) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core26.Anchor, { href: item.href, c: "slate.7", fw: 500, underline: "never", fz: 15, children: item.label }, item.id)) }),
1188
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core26.Burger, { hiddenFrom: "sm", opened, onClick: toggle }),
1189
+ loginFlag && /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_core26.Group, { gap: "sm", visibleFrom: "sm", children: [
1190
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(SdButton.Ghost, { size: "sm", children: "\uB85C\uADF8\uC778" }),
1191
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(SdButton.Primary, { size: "sm", children: "\uBB34\uB8CC \uC2DC\uC791" })
1192
+ ] }),
1193
+ children
1194
+ ] }) }),
1195
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core26.Drawer, { opened, onClose: close, hiddenFrom: "sm", size: "xs", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_core26.Stack, { children: [
1196
+ visibleTopItems.map((item) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core26.Anchor, { href: item.href, c: "slate.7", fw: 500, underline: "never", fz: 16, onClick: close, children: item.label }, item.id)),
1197
+ loginFlag && /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_core26.Stack, { gap: "xs", mt: "md", children: [
1198
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(SdButton.Ghost, { size: "sm", children: "\uB85C\uADF8\uC778" }),
1199
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(SdButton.Primary, { size: "sm", children: "\uBB34\uB8CC \uC2DC\uC791" })
1200
+ ] })
1201
+ ] }) })
1202
+ ] });
1203
+ }
1204
+
1205
+ // ui/organism/Footer/index.tsx
1206
+ var import_core29 = require("@mantine/core");
1207
+
1208
+ // ui/organism/Footer/FooterBrand.tsx
1209
+ var import_jsx_runtime28 = require("react/jsx-runtime");
1210
+ function FooterBrand() {
1211
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Logo, { size: "xs" });
1212
+ }
1213
+
1214
+ // ui/organism/Footer/FooterContact.tsx
1215
+ var import_core27 = require("@mantine/core");
1216
+ var import_jsx_runtime29 = require("react/jsx-runtime");
1217
+ function FooterContact({ company }) {
1218
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core27.Group, { gap: "lg", wrap: "wrap", children: [
1219
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdText.Sub, { c: "slate.5", children: company.name }),
1220
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(SdText.Sub, { c: "slate.5", children: [
1221
+ "\uC0AC\uC5C5\uC790\uB4F1\uB85D\uBC88\uD638 ",
1222
+ company.registrationNumber
1223
+ ] }),
1224
+ company.addresses.map((addr) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SdText.Sub, { c: "slate.5", children: addr.address }, addr.label)),
1225
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core27.Anchor, { href: `tel:${company.tel}`, fz: "xs", c: "slate.5", underline: "never", children: [
1226
+ "Tel ",
1227
+ company.tel
1228
+ ] }),
1229
+ company.fax && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(SdText.Sub, { c: "slate.5", children: [
1230
+ "Fax ",
1231
+ company.fax
1232
+ ] }),
1233
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core27.Anchor, { href: `mailto:${company.email}`, fz: "xs", c: "slate.5", underline: "never", children: company.email })
1234
+ ] });
1235
+ }
1236
+
1237
+ // ui/organism/Footer/FooterNav.tsx
1238
+ var import_core28 = require("@mantine/core");
1239
+ var import_jsx_runtime30 = require("react/jsx-runtime");
1240
+ function FooterNav({ items }) {
1241
+ const topLevel = items.filter((item) => !item.parentId);
1242
+ const getChildren = (parentId) => items.filter((item) => item.parentId === parentId);
1243
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Group, { gap: 48, align: "flex-start", wrap: "wrap", children: topLevel.map((item) => {
1244
+ const children = getChildren(item.id);
1245
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core28.Stack, { gap: "sm", children: [
1246
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdText.Eyebrow, { c: "slate.4", children: item.label }),
1247
+ children.map((child) => /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
1248
+ import_core28.Anchor,
1249
+ {
1250
+ href: child.href,
1251
+ fz: "xs",
1252
+ c: "slate.5",
1253
+ underline: "never",
1254
+ style: { transition: "color 0.15s" },
1255
+ onMouseEnter: (e) => {
1256
+ e.currentTarget.style.color = "var(--mantine-color-slate-1)";
1257
+ },
1258
+ onMouseLeave: (e) => {
1259
+ e.currentTarget.style.color = "";
1260
+ },
1261
+ children: child.label
1262
+ },
1263
+ child.id
1264
+ ))
1265
+ ] }, item.id);
1266
+ }) });
1267
+ }
1268
+
1269
+ // ui/organism/Footer/index.tsx
1270
+ var import_jsx_runtime31 = require("react/jsx-runtime");
1271
+ function SdFooter({ company, utilityLinks, policyLinks }) {
1272
+ const visibleUtility = filterAndSort(utilityLinks);
1273
+ const visiblePolicy = filterAndSort(policyLinks);
1274
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Box, { children: [
1275
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Grid, { style: { "--grid-gutter": "48px" }, align: "flex-start", children: [
1276
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Grid.Col, { span: { base: 12, md: 3 }, children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(FooterBrand, {}) }),
1277
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Grid.Col, { span: { base: 12, md: 9 }, children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(FooterNav, { items: visibleUtility != null ? visibleUtility : [] }) })
1278
+ ] }),
1279
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Divider, {}),
1280
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(FooterContact, { company }),
1281
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Divider, {}),
1282
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Group, { justify: "space-between", wrap: "wrap", gap: "xs", children: [
1283
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(SdText.Sub, { c: "slate.5", children: [
1284
+ "\xA9 ",
1285
+ company.copyrightYear,
1286
+ " ",
1287
+ company.name,
1288
+ ". All rights reserved."
1289
+ ] }),
1290
+ visiblePolicy.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Group, { gap: "lg", children: visiblePolicy.map((item) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
1291
+ import_core29.Anchor,
1292
+ {
1293
+ href: item.href,
1294
+ fz: "xs",
1295
+ c: item.highlight ? "primary.6" : "slate.5",
1296
+ underline: "never",
1297
+ children: item.label
1298
+ },
1299
+ item.id
1300
+ )) })
1301
+ ] })
1302
+ ] });
1303
+ }
1304
+
1305
+ // ui/organism/FeatureSection.tsx
1306
+ var import_core30 = require("@mantine/core");
1307
+ var import_jsx_runtime32 = require("react/jsx-runtime");
1308
+ function SdFeatureSection(_a) {
1309
+ var _b = _a, {
1310
+ label,
1311
+ title,
1312
+ description,
1313
+ items,
1314
+ cols,
1315
+ py = 0
1316
+ } = _b, boxProps = __objRest(_b, [
1317
+ "label",
1318
+ "title",
1319
+ "description",
1320
+ "items",
1321
+ "cols",
1322
+ "py"
1323
+ ]);
1324
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdContainer, __spreadProps(__spreadValues({ py }, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core30.Stack, { gap: "xl", children: [
1325
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
1326
+ SdTextBox.Section,
1327
+ {
1328
+ label,
1329
+ title,
1330
+ description,
1331
+ maxDescWidth: 520,
1332
+ ta: "center",
1333
+ align: "center"
1334
+ }
1335
+ ),
1336
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdFeatures, { items, cols })
1337
+ ] }) }));
1338
+ }
1339
+
1340
+ // ui/organism/TimelineSection.tsx
1341
+ var import_core31 = require("@mantine/core");
1342
+ var import_jsx_runtime33 = require("react/jsx-runtime");
1343
+ function SdTimelineSection(_a) {
1344
+ var _b = _a, {
1345
+ label,
1346
+ title,
1347
+ description,
1348
+ items,
1349
+ py = 0
1350
+ } = _b, boxProps = __objRest(_b, [
1351
+ "label",
1352
+ "title",
1353
+ "description",
1354
+ "items",
1355
+ "py"
1356
+ ]);
1357
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core31.Stack, __spreadProps(__spreadValues({ py, gap: "md" }, boxProps), { children: [
1358
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
1359
+ SdTextBox.Section,
1360
+ {
1361
+ label,
1362
+ title,
1363
+ description
1364
+ }
1365
+ ),
1366
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdTimeline, { items }) })
1367
+ ] })) });
1368
+ }
1369
+
1370
+ // ui/organism/StepsSection.tsx
1371
+ var import_core32 = require("@mantine/core");
1372
+ var import_jsx_runtime34 = require("react/jsx-runtime");
1373
+ function SdStepsSection(_a) {
1374
+ var _b = _a, {
1375
+ label,
1376
+ title,
1377
+ description,
1378
+ items,
1379
+ py = 0
1380
+ } = _b, boxProps = __objRest(_b, [
1381
+ "label",
1382
+ "title",
1383
+ "description",
1384
+ "items",
1385
+ "py"
1386
+ ]);
1387
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdContainer, __spreadProps(__spreadValues({ py }, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core32.Stack, { gap: "xl", children: [
1388
+ (label || title || description) && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdTextBox.Section, { label, title, description }),
1389
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdSteps.Bubble, { items })
1390
+ ] }) }));
1391
+ }
1392
+
1393
+ // ui/organism/ErrorView.tsx
1394
+ var import_core33 = require("@mantine/core");
1395
+ var import_jsx_runtime35 = require("react/jsx-runtime");
1396
+ function StatusCode({ code }) {
1397
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
1398
+ import_core33.Text,
1399
+ {
1400
+ fz: 160,
1401
+ fw: 900,
1402
+ c: "slate.1",
1403
+ lh: 1,
1404
+ style: { userSelect: "none", letterSpacing: "-0.04em" },
1405
+ "aria-hidden": true,
1406
+ children: code
1407
+ }
1408
+ );
1409
+ }
1410
+ function Page({ error, onReset, onHome }) {
1411
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core33.Center, { mih: "60vh", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core33.Stack, { align: "center", gap: "lg", ta: "center", children: [
1412
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(StatusCode, { code: "500" }),
1413
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core33.Stack, { gap: "sm", align: "center", children: [
1414
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdTitle.Section, { children: "\uC11C\uBC84\uC5D0\uC11C \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4" }),
1415
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdText.Body, { maw: 480, children: error.message || "\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." }),
1416
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(SdText.Sub, { children: [
1417
+ "\uC624\uB958 \uCF54\uB4DC: ",
1418
+ error.digest
1419
+ ] })
1420
+ ] }),
1421
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core33.Group, { gap: "sm", justify: "center", children: [
1422
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdButton.Primary, { onClick: onReset, children: "\uB2E4\uC2DC \uC2DC\uB3C4" }),
1423
+ onHome && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdButton.Ghost, { onClick: onHome, children: "\uD648\uC73C\uB85C" })
1424
+ ] })
1425
+ ] }) }) });
1426
+ }
1427
+ function NotFound({
1428
+ title = "\uD398\uC774\uC9C0\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
1429
+ description = "\uC694\uCCAD\uD558\uC2E0 \uD398\uC774\uC9C0\uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uAC70\uB098 \uC774\uB3D9\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",
1430
+ onHome = () => {
1431
+ window.location.href = "/";
1432
+ },
1433
+ onBack = () => window.history.back()
1434
+ }) {
1435
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core33.Center, { mih: "60vh", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core33.Stack, { align: "center", gap: "lg", ta: "center", children: [
1436
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(StatusCode, { code: "404" }),
1437
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core33.Stack, { gap: "sm", align: "center", children: [
1438
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdTitle.Section, { children: title }),
1439
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdText.Body, { maw: 480, children: description })
1440
+ ] }),
1441
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core33.Group, { gap: "sm", justify: "center", children: [
1442
+ onHome && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdButton.Primary, { onClick: onHome, children: "\uD648\uC73C\uB85C" }),
1443
+ onBack && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdButton.Ghost, { onClick: onBack, children: "\uB4A4\uB85C \uAC00\uAE30" })
1444
+ ] })
1445
+ ] }) }) });
1446
+ }
1447
+ var SdErrorView = {
1448
+ /** app/error.tsx — 서버/렌더링 오류 + 재시도 버튼 */
1449
+ Page,
1450
+ /** app/not-found.tsx — 404 Not Found */
1451
+ NotFound
1452
+ };
1453
+
1454
+ // ui/template/MainLayout.tsx
1455
+ var import_core34 = require("@mantine/core");
1456
+ var import_jsx_runtime36 = require("react/jsx-runtime");
1457
+ function MainLayout({ children, navItems, companyInfo }) {
1458
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.AppShell, { header: { height: 60 }, children: [
1459
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.AppShell.Header, { children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdHeader, { navItems }) }),
1460
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.AppShell.Main, { children }),
1461
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdFooter, { company: companyInfo, utilityLinks: navItems })
1462
+ ] });
1463
+ }
1464
+
1465
+ // ui/template/PageLayout.tsx
1466
+ var import_core35 = require("@mantine/core");
1467
+ var import_jsx_runtime37 = require("react/jsx-runtime");
1468
+ function Content({ children }) {
1469
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(SdContainer, { py: "xl", children });
1470
+ }
1471
+ function LayoutGap() {
1472
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Space, { h: 48 });
1473
+ }
1474
+ function Minimal({ label, title, description, children }) {
1475
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_jsx_runtime37.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(Plain2, { children: [
1476
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
1477
+ SdTextBox.Section,
1478
+ {
1479
+ label,
1480
+ title,
1481
+ description: description != null ? description : "",
1482
+ mb: "xl"
1483
+ }
1484
+ ),
1485
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Divider, {}),
1486
+ children
1487
+ ] }) });
1488
+ }
1489
+ function Plain2({ children }) {
1490
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_jsx_runtime37.Fragment, { children: [
1491
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(LayoutGap, {}),
1492
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(Content, { children })
1493
+ ] });
1494
+ }
1495
+ function Image2({ image, label, title, description, children }) {
1496
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_jsx_runtime37.Fragment, { children: [
1497
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Box, { style: {
1498
+ position: "relative",
1499
+ minHeight: "30svh",
1500
+ display: "flex",
1501
+ alignItems: "center",
1502
+ backgroundImage: image ? `url(${image})` : void 0,
1503
+ backgroundSize: "cover",
1504
+ backgroundPosition: "center",
1505
+ backgroundColor: "var(--mantine-color-slate-9)"
1506
+ }, children: [
1507
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Box, { style: {
1508
+ position: "absolute",
1509
+ inset: 0,
1510
+ background: "rgba(0, 0, 0, 0.55)"
1511
+ } }),
1512
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(SdContainer, { style: { position: "relative", zIndex: 1, width: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
1513
+ import_core35.Box,
1514
+ {
1515
+ py: 48,
1516
+ px: 40,
1517
+ maw: 420,
1518
+ style: {
1519
+ backdropFilter: "blur(24px)",
1520
+ WebkitBackdropFilter: "blur(24px)",
1521
+ background: "rgba(255,255,255,0.10)",
1522
+ borderRadius: "var(--mantine-radius-md)",
1523
+ border: "1px solid rgba(255,255,255,0.18)"
1524
+ },
1525
+ children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
1526
+ SdTextBox.Hero,
1527
+ {
1528
+ label,
1529
+ title,
1530
+ description,
1531
+ ta: "left",
1532
+ align: "flex-start"
1533
+ }
1534
+ )
1535
+ }
1536
+ ) })
1537
+ ] }),
1538
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(Content, { children })
1539
+ ] });
1540
+ }
1541
+ function Brand({ label, title, description, children }) {
1542
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_jsx_runtime37.Fragment, { children: [
1543
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Box, { style: {
1544
+ position: "relative",
1545
+ minHeight: "40svh",
1546
+ display: "flex",
1547
+ alignItems: "center",
1548
+ overflow: "hidden",
1549
+ background: "linear-gradient(135deg, var(--mantine-color-primary-8) 0%, var(--mantine-color-primary-6) 50%, var(--mantine-color-primary-4) 100%)"
1550
+ }, children: [
1551
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Box, { style: {
1552
+ position: "absolute",
1553
+ top: -80,
1554
+ right: -80,
1555
+ width: 360,
1556
+ height: 360,
1557
+ borderRadius: "50%",
1558
+ background: "rgba(255,255,255,0.06)",
1559
+ pointerEvents: "none"
1560
+ } }),
1561
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Box, { style: {
1562
+ position: "absolute",
1563
+ bottom: -60,
1564
+ left: -60,
1565
+ width: 240,
1566
+ height: 240,
1567
+ borderRadius: "50%",
1568
+ background: "rgba(255,255,255,0.04)",
1569
+ pointerEvents: "none"
1570
+ } }),
1571
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(SdContainer, { style: { position: "relative", zIndex: 1, width: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(SdTextBox.Hero, { label, title, description, ta: "center", align: "center", maw: 640, mx: "auto", pt: 80, pb: 64 }) })
1572
+ ] }),
1573
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(Content, { children })
1574
+ ] });
1575
+ }
1576
+ var PageLayout = {
1577
+ /** 이미지 배경 + 대각선 그라디언트 + 좌하단 텍스트 */
1578
+ Image: Image2,
1579
+ /** SdTextBox.Section 타이틀 + Plain 컨테이너 */
1580
+ Minimal,
1581
+ /** primary 그라디언트 배경 + 중앙 텍스트 */
1582
+ Brand,
1583
+ /** 히어로 없이 SdContainer + py="xl" 만 */
1584
+ Plain: Plain2
1585
+ };
1586
+
1587
+ // ui/theme.ts
1588
+ var import_core36 = require("@mantine/core");
1589
+ var primary = [
1590
+ "#e7f0fb",
1591
+ "#c8dcf4",
1592
+ "#a3c3ec",
1593
+ "#7aa8e3",
1594
+ "#4f8ddb",
1595
+ "#2374d4",
1596
+ "#0b5ed7",
1597
+ // 6 ← brand anchor
1598
+ "#094db1",
1599
+ "#073d8c",
1600
+ "#052d68"
1601
+ ];
1602
+ var secondary = [
1603
+ "#fef6e7",
1604
+ "#fde9c4",
1605
+ "#fbd79a",
1606
+ "#fac470",
1607
+ "#f8ab47",
1608
+ "#f7931e",
1609
+ // 5
1610
+ "#de7c12",
1611
+ // 6
1612
+ "#b5640e",
1613
+ "#8a4c0b",
1614
+ "#5e3307"
1615
+ ];
1616
+ var slate = [
1617
+ "#f8fafc",
1618
+ // 0 slate-50
1619
+ "#f1f5f9",
1620
+ // 1 slate-100
1621
+ "#e2e8f0",
1622
+ // 2 slate-200
1623
+ "#cbd5e1",
1624
+ // 3 slate-300
1625
+ "#94a3b8",
1626
+ // 4 slate-400
1627
+ "#64748b",
1628
+ // 5 slate-500
1629
+ "#475569",
1630
+ // 6 slate-600
1631
+ "#334155",
1632
+ // 7 slate-700
1633
+ "#1e293b",
1634
+ // 8 slate-800
1635
+ "#0f172a"
1636
+ // 9 slate-900
1637
+ ];
1638
+ var cyan = [
1639
+ "#ecfeff",
1640
+ "#cffafe",
1641
+ "#a5f3fc",
1642
+ "#67e8f9",
1643
+ "#22d3ee",
1644
+ "#06b6d4",
1645
+ "#0891b2",
1646
+ "#0e7490",
1647
+ "#155e75",
1648
+ "#164e63"
1649
+ ];
1650
+ var indigo = [
1651
+ "#eef2ff",
1652
+ "#e0e7ff",
1653
+ "#c7d2fe",
1654
+ "#a5b4fc",
1655
+ "#818cf8",
1656
+ "#6366f1",
1657
+ "#4f46e5",
1658
+ "#4338ca",
1659
+ "#3730a3",
1660
+ "#312e81"
1661
+ ];
1662
+ var theme = (0, import_core36.createTheme)({
1663
+ /* ---- Color ---- */
1664
+ colors: { primary, secondary, slate, cyan, indigo, dark: slate },
1665
+ primaryColor: "primary",
1666
+ primaryShade: { light: 6, dark: 5 },
1667
+ /* ---- Type ---- */
1668
+ fontFamily: "'Noto Sans KR', ui-sans-serif, system-ui, -apple-system, sans-serif",
1669
+ fontFamilyMonospace: "'Noto Sans KR', ui-monospace, monospace",
1670
+ headings: {
1671
+ fontFamily: "'Noto Sans KR', ui-sans-serif, system-ui, sans-serif",
1672
+ fontWeight: "700",
1673
+ sizes: {
1674
+ h1: { fontSize: (0, import_core36.rem)(48), lineHeight: "1.1", fontWeight: "900" },
1675
+ h2: { fontSize: (0, import_core36.rem)(36), lineHeight: "1.1", fontWeight: "900" },
1676
+ h3: { fontSize: (0, import_core36.rem)(28), lineHeight: "1.15", fontWeight: "700" },
1677
+ h4: { fontSize: (0, import_core36.rem)(20), lineHeight: "1.3", fontWeight: "700" },
1678
+ h5: { fontSize: (0, import_core36.rem)(16), lineHeight: "1.4", fontWeight: "700" },
1679
+ h6: { fontSize: (0, import_core36.rem)(14), lineHeight: "1.4", fontWeight: "700" }
1680
+ }
1681
+ },
1682
+ fontSizes: {
1683
+ xs: (0, import_core36.rem)(14),
1684
+ sm: (0, import_core36.rem)(16),
1685
+ md: (0, import_core36.rem)(18),
1686
+ lg: (0, import_core36.rem)(20),
1687
+ xl: (0, import_core36.rem)(22)
1688
+ },
1689
+ lineHeights: {
1690
+ xs: "1.4",
1691
+ sm: "1.45",
1692
+ md: "1.5",
1693
+ lg: "1.55",
1694
+ xl: "1.6"
1695
+ },
1696
+ defaultRadius: "md",
1697
+ radius: {
1698
+ xs: (0, import_core36.rem)(6),
1699
+ sm: (0, import_core36.rem)(8),
1700
+ md: (0, import_core36.rem)(10),
1701
+ lg: (0, import_core36.rem)(14),
1702
+ xl: (0, import_core36.rem)(18)
1703
+ },
1704
+ spacing: {
1705
+ xs: (0, import_core36.rem)(8),
1706
+ sm: (0, import_core36.rem)(12),
1707
+ md: (0, import_core36.rem)(16),
1708
+ lg: (0, import_core36.rem)(24),
1709
+ xl: (0, import_core36.rem)(32)
1710
+ },
1711
+ shadows: {
1712
+ xs: "0 1px 2px 0 rgb(0 0 0 / 0.05)",
1713
+ sm: "0 1px 3px 0 rgb(0 0 0 / 0.06), 0 1px 2px -1px rgb(0 0 0 / 0.06)",
1714
+ md: "0 8px 32px rgb(0 0 0 / 0.08)",
1715
+ // glass nav
1716
+ lg: "0 30px 60px -15px rgb(0 0 0 / 0.05)",
1717
+ // card hover lift
1718
+ xl: "0 40px 80px -20px rgb(0 0 0 / 0.3)"
1719
+ // modal
1720
+ },
1721
+ breakpoints: {
1722
+ xs: "36em",
1723
+ sm: "48em",
1724
+ md: "62em",
1725
+ lg: "75em",
1726
+ xl: "88em"
1727
+ },
1728
+ other: {
1729
+ logoSizes: {
1730
+ xs: { width: 72, height: 22 },
1731
+ sm: { width: 96, height: 29 },
1732
+ md: { width: 120, height: 36 },
1733
+ lg: { width: 160, height: 48 },
1734
+ xl: { width: 200, height: 60 }
1735
+ },
1736
+ surfaceSubtle: "#f8fafc",
1737
+ surfaceDark: "#0f172a",
1738
+ surfaceDarker: "#020617",
1739
+ gradientHeroText: "linear-gradient(to right, #60a5fa, #22d3ee, #3b82f6)",
1740
+ gradientAsm: "linear-gradient(to bottom right, #2563eb, #06b6d4)",
1741
+ gradientPims: "linear-gradient(to bottom right, #4f46e5, #a855f7)",
1742
+ tracking: "-0.04em",
1743
+ trackingEyebrow: "0.25em"
1744
+ },
1745
+ /* ---- Component defaults (match the live site) ---- */
1746
+ defaultGradient: { from: "primary.6", to: "cyan.4", deg: 90 },
1747
+ components: {
1748
+ Container: {
1749
+ defaultProps: { size: "xl", h: "100%" }
1750
+ },
1751
+ Logo: {
1752
+ defaultProps: { size: "md" }
1753
+ },
1754
+ Button: {
1755
+ defaultProps: {
1756
+ radius: "xl",
1757
+ fw: 700
1758
+ }
1759
+ },
1760
+ Card: {
1761
+ defaultProps: {
1762
+ radius: "lg",
1763
+ shadow: "sm",
1764
+ withBorder: true,
1765
+ padding: "lg"
1766
+ }
1767
+ },
1768
+ Paper: {
1769
+ defaultProps: { radius: "lg" }
1770
+ },
1771
+ Badge: {
1772
+ defaultProps: { radius: "xl", variant: "light" }
1773
+ },
1774
+ Modal: {
1775
+ defaultProps: { radius: "lg", centered: true, shadow: "xl" }
1776
+ },
1777
+ Input: {
1778
+ defaultProps: { radius: "sm" }
1779
+ },
1780
+ TextInput: {
1781
+ defaultProps: { radius: "sm" }
1782
+ },
1783
+ Divider: {
1784
+ defaultProps: { c: "slate.5", pb: "xl" }
1785
+ },
1786
+ Anchor: {
1787
+ defaultProps: { c: "slate.5", fz: "sm", underline: "never" }
1788
+ },
1789
+ Table: {
1790
+ defaultProps: {
1791
+ captionSide: "bottom"
1792
+ },
1793
+ styles: {
1794
+ th: { color: "var(--mantine-color-slate-5)", fontWeight: "700" }
1795
+ }
1796
+ }
1797
+ }
1798
+ });
1799
+ // Annotate the CommonJS export names for ESM import in node:
1800
+ 0 && (module.exports = {
1801
+ HeroCarousel,
1802
+ Logo,
1803
+ MainLayout,
1804
+ PageLayout,
1805
+ SdBadge,
1806
+ SdButton,
1807
+ SdClients,
1808
+ SdContainer,
1809
+ SdCta,
1810
+ SdErrorView,
1811
+ SdFaq,
1812
+ SdFeatureSection,
1813
+ SdFeatures,
1814
+ SdFooter,
1815
+ SdHeader,
1816
+ SdInput,
1817
+ SdMap,
1818
+ SdModal,
1819
+ SdNumberIcon,
1820
+ SdPricingCard,
1821
+ SdQuote,
1822
+ SdSolution,
1823
+ SdSolutionCard,
1824
+ SdSteps,
1825
+ SdStepsSection,
1826
+ SdTable,
1827
+ SdTabs,
1828
+ SdTestimonial,
1829
+ SdText,
1830
+ SdTextBox,
1831
+ SdTimeline,
1832
+ SdTimelineSection,
1833
+ SdTitle,
1834
+ theme
1835
+ });