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