@yeongseoksong/framework 1.4.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/ui/index.cjs CHANGED
@@ -63,6 +63,7 @@ __export(ui_exports, {
63
63
  HeroCarousel: () => HeroCarousel,
64
64
  Logo: () => Logo,
65
65
  MainLayout: () => MainLayout,
66
+ NavProvider: () => NavProvider,
66
67
  PageLayout: () => PageLayout,
67
68
  PageLayoutBrand: () => PageLayoutBrand,
68
69
  PageLayoutImage: () => PageLayoutImage,
@@ -73,6 +74,7 @@ __export(ui_exports, {
73
74
  SdBadgePrimary: () => SdBadgePrimary,
74
75
  SdBadgeSuccess: () => SdBadgeSuccess,
75
76
  SdBadgeWarning: () => SdBadgeWarning,
77
+ SdBreadcrumb: () => SdBreadcrumb,
76
78
  SdButton: () => SdButton,
77
79
  SdButtonCancel: () => SdButtonCancel,
78
80
  SdButtonDelete: () => SdButtonDelete,
@@ -104,6 +106,7 @@ __export(ui_exports, {
104
106
  SdFooter: () => SdFooter,
105
107
  SdHeader: () => SdHeader,
106
108
  SdHeaderMega: () => SdHeaderMega,
109
+ SdHeaderPanel: () => SdHeaderPanel,
107
110
  SdHeaderSimple: () => SdHeaderSimple,
108
111
  SdInput: () => SdInput,
109
112
  SdInputAutocomplete: () => SdInputAutocomplete,
@@ -146,6 +149,7 @@ __export(ui_exports, {
146
149
  SdPricingCardDefault: () => SdPricingCardDefault,
147
150
  SdPricingCardFeatured: () => SdPricingCardFeatured,
148
151
  SdPricingCardGrid: () => SdPricingCardGrid,
152
+ SdProvider: () => SdProvider,
149
153
  SdQuote: () => SdQuote,
150
154
  SdQuoteCard: () => SdQuoteCard,
151
155
  SdQuotePlain: () => SdQuotePlain,
@@ -209,7 +213,8 @@ __export(ui_exports, {
209
213
  SdToastSuccess: () => SdToastSuccess,
210
214
  SdToastUpdate: () => SdToastUpdate,
211
215
  SdToastWarning: () => SdToastWarning,
212
- theme: () => theme
216
+ theme: () => theme,
217
+ useNav: () => useNav
213
218
  });
214
219
  module.exports = __toCommonJS(ui_exports);
215
220
 
@@ -250,6 +255,7 @@ function Logo(_props) {
250
255
  }
251
256
 
252
257
  // ui/atom/Tabs.tsx
258
+ var import_react = require("react");
253
259
  var import_core3 = require("@mantine/core");
254
260
 
255
261
  // ui/atom/Container.tsx
@@ -271,8 +277,30 @@ function SdScrollableList(_a4) {
271
277
  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 })) });
272
278
  }
273
279
  function createTabs(defaults, scrollable = false) {
274
- function SdTabsRoot(props) {
275
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_core3.Tabs, __spreadValues(__spreadValues({}, defaults), props));
280
+ function SdTabsRoot(_a4) {
281
+ var _b = _a4, { syncHash, value, onChange } = _b, props = __objRest(_b, ["syncHash", "value", "onChange"]);
282
+ const [hashValue, setHashValue] = (0, import_react.useState)(null);
283
+ (0, import_react.useEffect)(() => {
284
+ if (!syncHash) return;
285
+ const apply = () => {
286
+ const id = decodeURIComponent(window.location.hash.slice(1));
287
+ if (id) setHashValue(id);
288
+ };
289
+ apply();
290
+ window.addEventListener("hashchange", apply);
291
+ return () => window.removeEventListener("hashchange", apply);
292
+ }, [syncHash]);
293
+ if (!syncHash) {
294
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_core3.Tabs, __spreadProps(__spreadValues(__spreadValues({}, defaults), props), { value, onChange }));
295
+ }
296
+ const handleChange = (next) => {
297
+ if (next) {
298
+ window.history.replaceState(null, "", `#${next}`);
299
+ setHashValue(next);
300
+ }
301
+ onChange == null ? void 0 : onChange(next);
302
+ };
303
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_core3.Tabs, __spreadProps(__spreadValues(__spreadValues({}, defaults), props), { value: value != null ? value : hashValue, onChange: handleChange }));
276
304
  }
277
305
  SdTabsRoot.List = scrollable ? SdScrollableList : import_core3.Tabs.List;
278
306
  SdTabsRoot.Tab = import_core3.Tabs.Tab;
@@ -1009,7 +1037,7 @@ function BubbleStep({ item, index, isLast }) {
1009
1037
  {
1010
1038
  style: { display: "flex", flexDirection: "column", alignItems: "center", flexShrink: 0 },
1011
1039
  children: [
1012
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdNumberIcon, { value: String(index + 1).padStart(2, "0") }),
1040
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SdNumberIcon, { value: String(index + 1).padStart(2, "0"), color: "primary" }),
1013
1041
  !isLast && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1014
1042
  import_core18.Box,
1015
1043
  {
@@ -1403,7 +1431,7 @@ var SdCtaSubtle = SdCta.Subtle;
1403
1431
  var SdCtaInline = SdCta.Inline;
1404
1432
 
1405
1433
  // ui/molecule/Solution.tsx
1406
- var import_react = require("react");
1434
+ var import_react2 = require("react");
1407
1435
  var import_core24 = require("@mantine/core");
1408
1436
  var import_link3 = __toESM(require("next/link"));
1409
1437
 
@@ -1444,7 +1472,7 @@ var SdSolutionCardGrid = SdSolutionCard.Grid;
1444
1472
  var import_jsx_runtime26 = require("react/jsx-runtime");
1445
1473
  function Filtered({ items, allLabel = "\uC804\uCCB4", cols, onSelect }) {
1446
1474
  const categories = ["all", ...Array.from(new Set(items.map((i) => i.category)))];
1447
- const [active, setActive] = (0, import_react.useState)("all");
1475
+ const [active, setActive] = (0, import_react2.useState)("all");
1448
1476
  const filtered = active === "all" ? items : items.filter((i) => i.category === active);
1449
1477
  return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_core24.Stack, { gap: "xl", children: [
1450
1478
  /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SdTabs.Pills, { value: active, onChange: (v) => setActive(v != null ? v : "all"), children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SdTabs.Pills.List, { children: categories.map((cat) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SdTabs.Pills.Tab, { value: cat, children: cat === "all" ? allLabel : cat }, cat)) }) }),
@@ -1516,7 +1544,13 @@ function LogoImage({ client, height }) {
1516
1544
  {
1517
1545
  src: client.logo,
1518
1546
  alt: client.name,
1519
- style: __spreadValues({ height, width: "auto", objectFit: "contain", display: "block" }, grayStyle),
1547
+ style: __spreadValues({
1548
+ height,
1549
+ width: "auto",
1550
+ maxWidth: "100%",
1551
+ objectFit: "contain",
1552
+ display: "block"
1553
+ }, grayStyle),
1520
1554
  onMouseEnter: (e) => Object.assign(e.currentTarget.style, colorStyle),
1521
1555
  onMouseLeave: (e) => Object.assign(e.currentTarget.style, grayStyle)
1522
1556
  }
@@ -1534,7 +1568,10 @@ function Grid4({
1534
1568
  display: "flex",
1535
1569
  alignItems: "center",
1536
1570
  justifyContent: "center",
1537
- padding: "12px 8px"
1571
+ padding: "12px 8px",
1572
+ minWidth: 0,
1573
+ // 그리드 트랙이 이미지 intrinsic width로 밀려 깨지는 것 방지
1574
+ overflow: "hidden"
1538
1575
  },
1539
1576
  children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(LogoImage, { client, height: logoHeight })
1540
1577
  },
@@ -1579,7 +1616,7 @@ var SdClientsGrid = Grid4;
1579
1616
  var SdClientsMarquee = Marquee;
1580
1617
 
1581
1618
  // ui/molecule/Map.tsx
1582
- var import_react2 = require("react");
1619
+ var import_react3 = require("react");
1583
1620
  var import_core26 = require("@mantine/core");
1584
1621
  var import_jsx_runtime28 = require("react/jsx-runtime");
1585
1622
  function MapFrame({ address, height }) {
@@ -1613,7 +1650,7 @@ function Single(_a4) {
1613
1650
  function Tabs2({ addresses, height = 400 }) {
1614
1651
  var _a4, _b, _c;
1615
1652
  const mapped = addresses.filter((a) => a.embbedUrl);
1616
- const [active, setActive] = (0, import_react2.useState)((_b = (_a4 = mapped[0]) == null ? void 0 : _a4.label) != null ? _b : "");
1653
+ const [active, setActive] = (0, import_react3.useState)((_b = (_a4 = mapped[0]) == null ? void 0 : _a4.label) != null ? _b : "");
1617
1654
  if (mapped.length === 0) return null;
1618
1655
  if (mapped.length === 1) return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(MapFrame, { address: mapped[0], height });
1619
1656
  const current = (_c = mapped.find((a) => a.label === active)) != null ? _c : mapped[0];
@@ -1631,11 +1668,96 @@ var SdMap = {
1631
1668
  var SdMapSingle = Single;
1632
1669
  var SdMapTabs = Tabs2;
1633
1670
 
1634
- // ui/organism/HeroCarousel.tsx
1635
- var import_carousel = require("@mantine/carousel");
1671
+ // ui/molecule/Breadcrumb.tsx
1636
1672
  var import_core27 = require("@mantine/core");
1673
+ var import_navigation = require("next/navigation");
1637
1674
  var import_icons_react5 = require("@tabler/icons-react");
1675
+
1676
+ // ui/template/NavProvider.tsx
1677
+ var import_react4 = require("react");
1638
1678
  var import_jsx_runtime29 = require("react/jsx-runtime");
1679
+ var NavContext = (0, import_react4.createContext)([]);
1680
+ function NavProvider({
1681
+ children,
1682
+ navItems
1683
+ }) {
1684
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(NavContext.Provider, { value: navItems, children });
1685
+ }
1686
+ function useNav() {
1687
+ return (0, import_react4.useContext)(NavContext);
1688
+ }
1689
+
1690
+ // ui/molecule/Breadcrumb.tsx
1691
+ var import_jsx_runtime30 = require("react/jsx-runtime");
1692
+ function normalizePath(href) {
1693
+ if (!href) return "";
1694
+ const trimmed = href.replace(/\/+$/, "");
1695
+ return trimmed === "" ? "/" : trimmed;
1696
+ }
1697
+ function buildTrail(navItems, currentHref) {
1698
+ const target = normalizePath(currentHref);
1699
+ const byId = new Map(navItems.map((item) => [item.id, item]));
1700
+ let current = navItems.find((item) => normalizePath(item.href) === target);
1701
+ if (!current) {
1702
+ current = navItems.filter((item) => item.href && target.startsWith(normalizePath(item.href) + "/")).sort((a, b) => normalizePath(b.href).length - normalizePath(a.href).length)[0];
1703
+ }
1704
+ if (!current) return [];
1705
+ const trail = [];
1706
+ const seen = /* @__PURE__ */ new Set();
1707
+ let node = current;
1708
+ while (node && !seen.has(node.id)) {
1709
+ seen.add(node.id);
1710
+ trail.unshift(node);
1711
+ node = node.parentId != null ? byId.get(node.parentId) : void 0;
1712
+ }
1713
+ return trail;
1714
+ }
1715
+ function SdBreadcrumb(_a4) {
1716
+ var _b = _a4, {
1717
+ navItems: navItemsProp,
1718
+ currentHref,
1719
+ homeHref = "/",
1720
+ homeLabel = "\uD648"
1721
+ } = _b, boxProps = __objRest(_b, [
1722
+ "navItems",
1723
+ "currentHref",
1724
+ "homeHref",
1725
+ "homeLabel"
1726
+ ]);
1727
+ var _a5;
1728
+ const navFromContext = useNav();
1729
+ const navItems = navItemsProp != null ? navItemsProp : navFromContext;
1730
+ const pathname = (0, import_navigation.usePathname)();
1731
+ const trail = buildTrail(navItems, (_a5 = currentHref != null ? currentHref : pathname) != null ? _a5 : "");
1732
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core27.Box, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
1733
+ import_core27.Breadcrumbs,
1734
+ {
1735
+ separator: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_icons_react5.IconChevronRight, { size: 14, stroke: 2, color: "var(--mantine-color-slate-4)" }),
1736
+ separatorMargin: "xs",
1737
+ children: [
1738
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
1739
+ SdLink.Sub,
1740
+ {
1741
+ href: homeHref,
1742
+ "aria-label": homeLabel,
1743
+ style: { display: "inline-flex", alignItems: "center" },
1744
+ children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_icons_react5.IconHome, { size: 16, stroke: 2 })
1745
+ }
1746
+ ),
1747
+ trail.map((item, i) => {
1748
+ const isLast = i === trail.length - 1;
1749
+ return isLast ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdLink.Body, { children: item.label }, item.id) : /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdLink.Sub, { href: item.href, children: item.label }, item.id);
1750
+ })
1751
+ ]
1752
+ }
1753
+ ) }));
1754
+ }
1755
+
1756
+ // ui/organism/HeroCarousel.tsx
1757
+ var import_carousel = require("@mantine/carousel");
1758
+ var import_core28 = require("@mantine/core");
1759
+ var import_icons_react6 = require("@tabler/icons-react");
1760
+ var import_jsx_runtime31 = require("react/jsx-runtime");
1639
1761
  var variantMap = {
1640
1762
  primary: SdButton.Primary,
1641
1763
  secondary: SdButton.Secondary,
@@ -1645,13 +1767,13 @@ var variantMap = {
1645
1767
  function CtaButton({ cta }) {
1646
1768
  var _a4;
1647
1769
  const Button3 = variantMap[(_a4 = cta.variant) != null ? _a4 : "primary"];
1648
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core27.Anchor, { href: cta.href, underline: "never", children: cta.icon ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(Button3, { size: "md", rightSection: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_icons_react5.IconArrowNarrowRight, {}), children: cta.label }) : /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(Button3, { size: "md", children: cta.label }) });
1770
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core28.Anchor, { href: cta.href, underline: "never", children: cta.icon ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Button3, { size: "md", rightSection: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_icons_react6.IconArrowNarrowRight, {}), children: cta.label }) : /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Button3, { size: "md", children: cta.label }) });
1649
1771
  }
1650
1772
  function HeroCarousel({ slides, children }) {
1651
- if (children) return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_jsx_runtime29.Fragment, { children });
1773
+ if (children) return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_jsx_runtime31.Fragment, { children });
1652
1774
  const filterdSlides = filterAndSort(slides);
1653
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_carousel.Carousel, { withIndicators: true, height: "60svh", children: filterdSlides.map((slide, i) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_carousel.Carousel.Slide, { children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1654
- import_core27.Box,
1775
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_carousel.Carousel, { withIndicators: true, height: "60svh", children: filterdSlides.map((slide, i) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_carousel.Carousel.Slide, { children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
1776
+ import_core28.Box,
1655
1777
  {
1656
1778
  style: {
1657
1779
  height: "100%",
@@ -1662,8 +1784,8 @@ function HeroCarousel({ slides, children }) {
1662
1784
  alignItems: "center",
1663
1785
  justifyContent: "center"
1664
1786
  },
1665
- children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core27.Stack, { align: "center", style: { textAlign: "center", maxWidth: 780 }, px: "xl", children: [
1666
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1787
+ children: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core28.Stack, { align: "center", style: { textAlign: "center", maxWidth: 780 }, px: "xl", children: [
1788
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
1667
1789
  SdTextBox.Hero,
1668
1790
  {
1669
1791
  title: slide.title,
@@ -1672,18 +1794,27 @@ function HeroCarousel({ slides, children }) {
1672
1794
  align: "center"
1673
1795
  }
1674
1796
  ),
1675
- slide.ctas && slide.ctas.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core27.Group, { gap: "sm", mt: "md", children: slide.ctas.map((cta, i2) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(CtaButton, { cta }, cta.href)) })
1797
+ slide.ctas && slide.ctas.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core28.Group, { gap: "sm", mt: "md", children: slide.ctas.map((cta, i2) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(CtaButton, { cta }, cta.href)) })
1676
1798
  ] })
1677
1799
  }
1678
1800
  ) }, i)) });
1679
1801
  }
1680
1802
 
1681
1803
  // ui/organism/Header.tsx
1682
- var import_core28 = require("@mantine/core");
1683
- var import_icons_react6 = require("@tabler/icons-react");
1804
+ var import_core29 = require("@mantine/core");
1805
+ var import_icons_react7 = require("@tabler/icons-react");
1684
1806
  var import_hooks = require("@mantine/hooks");
1685
- var import_jsx_runtime30 = require("react/jsx-runtime");
1807
+ var import_jsx_runtime32 = require("react/jsx-runtime");
1686
1808
  var BAR_HEIGHT = 60;
1809
+ var MAX_DEPTH = 3;
1810
+ var NAV_LINK_STYLES = {
1811
+ label: {
1812
+ fontWeight: textStyles.Body.fw,
1813
+ fontSize: `var(--mantine-font-size-${textStyles.Body.fz})`,
1814
+ color: toCssColor(textStyles.Body.c),
1815
+ lineHeight: textStyles.Body.lh
1816
+ }
1817
+ };
1687
1818
  function useNavTree(navItems) {
1688
1819
  const visibleItems = filterAndSort(navItems);
1689
1820
  return {
@@ -1692,27 +1823,36 @@ function useNavTree(navItems) {
1692
1823
  hasAnyChildren: visibleItems.some((item) => item.parentId)
1693
1824
  };
1694
1825
  }
1695
- function MobileNav({ opened, close, topItems, childrenOf, loginFlag }) {
1696
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Drawer, { opened, onClose: close, hiddenFrom: "sm", size: "xs", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core28.Stack, { gap: 0, children: [
1697
- topItems.map((item) => {
1698
- const kids = childrenOf(item.id);
1699
- if (kids.length === 0) {
1700
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Box, { px: "sm", py: 8, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdLink.Body, { href: item.href, onClick: close, children: item.label }) }, item.id);
1701
- }
1702
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
1703
- import_core28.NavLink,
1826
+ function MobileNavNode({ item, depth, childrenOf, close }) {
1827
+ const kids = depth < MAX_DEPTH ? childrenOf(item.id) : [];
1828
+ if (kids.length === 0) {
1829
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Box, { px: "sm", py: 8, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdLink.Body, { href: item.href, onClick: close, children: item.label }) });
1830
+ }
1831
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
1832
+ import_core29.NavLink,
1833
+ {
1834
+ label: item.label,
1835
+ styles: NAV_LINK_STYLES,
1836
+ component: item.href ? "a" : "button",
1837
+ href: item.href,
1838
+ childrenOffset: 28,
1839
+ children: kids.map((kid) => /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
1840
+ MobileNavNode,
1704
1841
  {
1705
- label: item.label,
1706
- component: item.href ? "a" : "button",
1707
- href: item.href,
1708
- childrenOffset: 28,
1709
- onClick: kids.length > 0 ? void 0 : close,
1710
- children: kids.map((kid) => /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.NavLink, { label: kid.label, href: kid.href, onClick: close }, kid.id))
1842
+ item: kid,
1843
+ depth: depth + 1,
1844
+ childrenOf,
1845
+ close
1711
1846
  },
1712
- item.id
1713
- );
1714
- }),
1715
- loginFlag && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Stack, { gap: "xs", mt: "md", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
1847
+ kid.id
1848
+ ))
1849
+ }
1850
+ );
1851
+ }
1852
+ function MobileNav({ opened, close, topItems, childrenOf, loginFlag }) {
1853
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Drawer, { opened, onClose: close, hiddenFrom: "sm", size: "xs", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core29.Stack, { gap: 0, children: [
1854
+ topItems.map((item) => /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(MobileNavNode, { item, depth: 1, childrenOf, close }, item.id)),
1855
+ loginFlag && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Stack, { gap: "xs", mt: "md", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
1716
1856
  ] }) });
1717
1857
  }
1718
1858
  function MegaHeader({ navItems, loginFlag }) {
@@ -1722,9 +1862,9 @@ function MegaHeader({ navItems, loginFlag }) {
1722
1862
  const { focused, ref: focusRef } = (0, import_hooks.useFocusWithin)();
1723
1863
  const rootRef = (0, import_hooks.useMergedRef)(hoverRef, focusRef);
1724
1864
  const expanded = hasAnyChildren && (hovered || focused);
1725
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_jsx_runtime30.Fragment, { children: [
1726
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
1727
- import_core28.Box,
1865
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_jsx_runtime32.Fragment, { children: [
1866
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
1867
+ import_core29.Box,
1728
1868
  {
1729
1869
  ref: rootRef,
1730
1870
  pos: "relative",
@@ -1734,12 +1874,12 @@ function MegaHeader({ navItems, loginFlag }) {
1734
1874
  borderBottom: expanded ? "1px solid var(--mantine-color-slate-2)" : void 0,
1735
1875
  transition: "box-shadow 0.15s"
1736
1876
  },
1737
- children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core28.Group, { justify: "space-between", align: "flex-start", wrap: "nowrap", children: [
1738
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Group, { h: BAR_HEIGHT, align: "center", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Logo, {}) }),
1739
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Group, { gap: "xl", align: "flex-start", wrap: "nowrap", visibleFrom: "sm", children: topItems.map((item) => {
1877
+ children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core29.Group, { justify: "space-between", align: "flex-start", wrap: "nowrap", children: [
1878
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Group, { h: BAR_HEIGHT, align: "center", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Logo, {}) }),
1879
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Group, { gap: "xl", align: "flex-start", wrap: "nowrap", visibleFrom: "sm", children: topItems.map((item) => {
1740
1880
  const kids = childrenOf(item.id);
1741
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core28.Stack, { gap: 0, align: "center", children: [
1742
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Group, { h: BAR_HEIGHT, align: "center", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdLink.Body, { href: item.href, children: item.label }) }),
1881
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core29.Stack, { gap: 0, align: "center", children: [
1882
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Group, { h: BAR_HEIGHT, align: "center", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdLink.Body, { href: item.href, children: item.label }) }),
1743
1883
  kids.length > 0 && /*
1744
1884
  Mantine Collapse를 쓰지 않는다 — 접힐 때 display:none이 되어
1745
1885
  하위 링크가 폭 계산에서 빠졌다가 펼칠 때 다시 들어오면서
@@ -1747,8 +1887,8 @@ function MegaHeader({ navItems, loginFlag }) {
1747
1887
  height 0 + overflow hidden은 폭 기여를 유지하므로 간격이 고정된다.
1748
1888
  visibility:hidden이 접힌 상태의 링크를 탭 순서에서도 빼준다.
1749
1889
  */
1750
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
1751
- import_core28.Box,
1890
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
1891
+ import_core29.Box,
1752
1892
  {
1753
1893
  "aria-hidden": !expanded,
1754
1894
  style: {
@@ -1758,19 +1898,28 @@ function MegaHeader({ navItems, loginFlag }) {
1758
1898
  visibility: expanded ? "visible" : "hidden",
1759
1899
  transition: "opacity 0.15s ease"
1760
1900
  },
1761
- children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Stack, { gap: "xs", pt: 4, pb: "lg", align: "center", children: kids.map((kid) => /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdLink.Sub, { href: kid.href, children: kid.label }, kid.id)) })
1901
+ children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Stack, { gap: "xs", pt: 4, pb: "lg", align: "center", children: kids.map((kid) => {
1902
+ const grandkids = childrenOf(kid.id);
1903
+ if (grandkids.length === 0) {
1904
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdLink.Body, { href: kid.href, children: kid.label }, kid.id);
1905
+ }
1906
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core29.Stack, { gap: 2, align: "center", children: [
1907
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdLink.Body, { href: kid.href, children: kid.label }),
1908
+ grandkids.map((gk) => /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdLink.Sub, { href: gk.href, children: gk.label }, gk.id))
1909
+ ] }, kid.id);
1910
+ }) })
1762
1911
  }
1763
1912
  )
1764
1913
  ] }, item.id);
1765
1914
  }) }),
1766
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core28.Group, { h: BAR_HEIGHT, align: "center", gap: "sm", wrap: "nowrap", children: [
1767
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Burger, { hiddenFrom: "sm", opened, onClick: toggle }),
1768
- loginFlag && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Group, { gap: "sm", visibleFrom: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
1915
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core29.Group, { h: BAR_HEIGHT, align: "center", gap: "sm", wrap: "nowrap", children: [
1916
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Burger, { hiddenFrom: "sm", opened, onClick: toggle }),
1917
+ loginFlag && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Group, { gap: "sm", visibleFrom: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
1769
1918
  ] })
1770
1919
  ] }) })
1771
1920
  }
1772
1921
  ),
1773
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
1922
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
1774
1923
  MobileNav,
1775
1924
  {
1776
1925
  opened,
@@ -1782,16 +1931,19 @@ function MegaHeader({ navItems, loginFlag }) {
1782
1931
  )
1783
1932
  ] });
1784
1933
  }
1934
+ function renderMenuLeaf(item) {
1935
+ return item.href ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Menu.Item, { component: "a", href: item.href, children: item.label }, item.id) : /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Menu.Label, { children: item.label }, item.id);
1936
+ }
1785
1937
  function SimpleHeader({ navItems, loginFlag }) {
1786
1938
  const [opened, { toggle, close }] = (0, import_hooks.useDisclosure)();
1787
1939
  const { topItems, childrenOf } = useNavTree(navItems);
1788
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_jsx_runtime30.Fragment, { children: [
1789
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Box, { bg: "var(--mantine-color-body)", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core28.Group, { h: BAR_HEIGHT, justify: "space-between", align: "center", wrap: "nowrap", children: [
1790
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Logo, {}),
1791
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Group, { gap: "xl", align: "center", wrap: "nowrap", visibleFrom: "sm", children: topItems.map((item) => {
1940
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_jsx_runtime32.Fragment, { children: [
1941
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Box, { bg: "var(--mantine-color-body)", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core29.Group, { h: BAR_HEIGHT, justify: "space-between", align: "center", wrap: "nowrap", children: [
1942
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Logo, {}),
1943
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Group, { gap: "xl", align: "center", wrap: "nowrap", visibleFrom: "sm", children: topItems.map((item) => {
1792
1944
  const kids = childrenOf(item.id);
1793
1945
  if (kids.length === 0) {
1794
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdLink.Body, { href: item.href, children: item.label }, item.id);
1946
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdLink.Body, { href: item.href, children: item.label }, item.id);
1795
1947
  }
1796
1948
  return (
1797
1949
  /*
@@ -1799,8 +1951,8 @@ function SimpleHeader({ navItems, loginFlag }) {
1799
1951
  Menu.Target은 ref를 받을 수 있는 단일 엘리먼트여야 하므로
1800
1952
  SdLink/SdText가 아니라 Box를 타깃으로 두고 라벨을 그 안에 넣는다.
1801
1953
  */
1802
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
1803
- import_core28.Menu,
1954
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
1955
+ import_core29.Menu,
1804
1956
  {
1805
1957
  trigger: "click-hover",
1806
1958
  openDelay: 50,
@@ -1811,25 +1963,91 @@ function SimpleHeader({ navItems, loginFlag }) {
1811
1963
  radius: "md",
1812
1964
  withinPortal: true,
1813
1965
  children: [
1814
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Menu.Target, { children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Box, { style: { cursor: "pointer" }, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core28.Group, { gap: 4, align: "center", wrap: "nowrap", children: [
1815
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdLink.Body, { href: item.href, children: item.label }),
1816
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_icons_react6.IconChevronDown, { size: 14, stroke: 2 })
1966
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Menu.Target, { children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Box, { style: { cursor: "pointer" }, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core29.Group, { gap: 4, align: "center", wrap: "nowrap", children: [
1967
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdLink.Body, { href: item.href, children: item.label }),
1968
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_icons_react7.IconChevronDown, { size: 14, stroke: 2 })
1817
1969
  ] }) }) }),
1818
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Menu.Dropdown, { children: kids.map(
1819
- (kid) => kid.href ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Menu.Item, { component: "a", href: kid.href, children: kid.label }, kid.id) : /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Menu.Label, { children: kid.label }, kid.id)
1820
- ) })
1970
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Menu.Dropdown, { children: kids.map((kid) => {
1971
+ const grandkids = childrenOf(kid.id);
1972
+ if (grandkids.length > 0) {
1973
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core29.Menu.Sub, { children: [
1974
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Menu.Sub.Target, { children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Menu.Sub.Item, { children: kid.label }) }),
1975
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Menu.Sub.Dropdown, { children: grandkids.map(renderMenuLeaf) })
1976
+ ] }, kid.id);
1977
+ }
1978
+ return renderMenuLeaf(kid);
1979
+ }) })
1821
1980
  ]
1822
1981
  },
1823
1982
  item.id
1824
1983
  )
1825
1984
  );
1826
1985
  }) }),
1827
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core28.Group, { align: "center", gap: "sm", wrap: "nowrap", children: [
1828
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Burger, { hiddenFrom: "sm", opened, onClick: toggle }),
1829
- loginFlag && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Group, { gap: "sm", visibleFrom: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
1986
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core29.Group, { align: "center", gap: "sm", wrap: "nowrap", children: [
1987
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Burger, { hiddenFrom: "sm", opened, onClick: toggle }),
1988
+ loginFlag && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Group, { gap: "sm", visibleFrom: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
1989
+ ] })
1990
+ ] }) }) }),
1991
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
1992
+ MobileNav,
1993
+ {
1994
+ opened,
1995
+ close,
1996
+ topItems,
1997
+ childrenOf,
1998
+ loginFlag
1999
+ }
2000
+ )
2001
+ ] });
2002
+ }
2003
+ function PanelHeader({ navItems, loginFlag }) {
2004
+ const [opened, { toggle, close }] = (0, import_hooks.useDisclosure)();
2005
+ const { topItems, childrenOf } = useNavTree(navItems);
2006
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_jsx_runtime32.Fragment, { children: [
2007
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Box, { bg: "var(--mantine-color-body)", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core29.Group, { h: BAR_HEIGHT, justify: "space-between", align: "center", wrap: "nowrap", children: [
2008
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Logo, {}),
2009
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Group, { gap: "xl", align: "center", wrap: "nowrap", visibleFrom: "sm", children: topItems.map((item) => {
2010
+ const kids = childrenOf(item.id);
2011
+ if (kids.length === 0) {
2012
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdLink.Body, { href: item.href, children: item.label }, item.id);
2013
+ }
2014
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
2015
+ import_core29.Menu,
2016
+ {
2017
+ trigger: "click-hover",
2018
+ openDelay: 50,
2019
+ closeDelay: 120,
2020
+ position: "bottom",
2021
+ offset: 12,
2022
+ shadow: "md",
2023
+ radius: "md",
2024
+ withinPortal: true,
2025
+ children: [
2026
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Menu.Target, { children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Box, { style: { cursor: "pointer" }, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core29.Group, { gap: 4, align: "center", wrap: "nowrap", children: [
2027
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdLink.Body, { href: item.href, children: item.label }),
2028
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_icons_react7.IconChevronDown, { size: 14, stroke: 2 })
2029
+ ] }) }) }),
2030
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Menu.Dropdown, { children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Stack, { gap: "xs", p: "xs", children: kids.map((kid) => {
2031
+ const grandkids = childrenOf(kid.id);
2032
+ if (grandkids.length === 0) {
2033
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdLink.Body, { href: kid.href, children: kid.label }, kid.id);
2034
+ }
2035
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core29.Stack, { gap: 2, children: [
2036
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdLink.Body, { href: kid.href, children: kid.label }),
2037
+ grandkids.map((gk) => /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdLink.Sub, { href: gk.href, pl: "sm", children: gk.label }, gk.id))
2038
+ ] }, kid.id);
2039
+ }) }) })
2040
+ ]
2041
+ },
2042
+ item.id
2043
+ );
2044
+ }) }),
2045
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core29.Group, { align: "center", gap: "sm", wrap: "nowrap", children: [
2046
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Burger, { hiddenFrom: "sm", opened, onClick: toggle }),
2047
+ loginFlag && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core29.Group, { gap: "sm", visibleFrom: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
1830
2048
  ] })
1831
2049
  ] }) }) }),
1832
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
2050
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
1833
2051
  MobileNav,
1834
2052
  {
1835
2053
  opened,
@@ -1841,41 +2059,46 @@ function SimpleHeader({ navItems, loginFlag }) {
1841
2059
  )
1842
2060
  ] });
1843
2061
  }
1844
- var SdHeader = Object.assign(MegaHeader, { Mega: MegaHeader, Simple: SimpleHeader });
2062
+ var SdHeader = Object.assign(MegaHeader, {
2063
+ Mega: MegaHeader,
2064
+ Simple: SimpleHeader,
2065
+ Panel: PanelHeader
2066
+ });
1845
2067
  var SdHeaderMega = MegaHeader;
1846
2068
  var SdHeaderSimple = SimpleHeader;
2069
+ var SdHeaderPanel = PanelHeader;
1847
2070
 
1848
2071
  // ui/organism/Footer.tsx
1849
- var import_core29 = require("@mantine/core");
1850
- var import_icons_react7 = require("@tabler/icons-react");
1851
- var import_jsx_runtime31 = require("react/jsx-runtime");
2072
+ var import_core30 = require("@mantine/core");
2073
+ var import_icons_react8 = require("@tabler/icons-react");
2074
+ var import_jsx_runtime33 = require("react/jsx-runtime");
1852
2075
  function FooterNavColumns({ items }) {
1853
2076
  const topLevel = items.filter((item) => !item.parentId);
1854
2077
  const getChildren = (parentId) => items.filter((item) => item.parentId === parentId);
1855
2078
  const CHILD_THRESH = 4;
1856
- return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_jsx_runtime31.Fragment, { children: topLevel.map((group) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Grid.Col, { span: { base: 6, sm: 4, md: "auto" }, children: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Stack, { gap: "xs", children: [
1857
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdLink.Sub, { href: group.href, children: group.label }, group.id),
2079
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_jsx_runtime33.Fragment, { children: topLevel.map((group) => /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core30.Grid.Col, { span: { base: 6, sm: 4, md: "auto" }, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core30.Stack, { gap: "xs", children: [
2080
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdLink.Sub, { href: group.href, children: group.label }, group.id),
1858
2081
  getChildren(group.id).map((link, id) => {
1859
2082
  if (id >= CHILD_THRESH) return;
1860
- return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdLink.Hint, { href: link.href, children: link.label }, link.id);
2083
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdLink.Hint, { href: link.href, children: link.label }, link.id);
1861
2084
  })
1862
2085
  ] }) }, group.id)) });
1863
2086
  }
1864
2087
  var SOCIAL_ICONS = {
1865
- x: import_icons_react7.IconBrandX,
1866
- youtube: import_icons_react7.IconBrandYoutube,
1867
- instagram: import_icons_react7.IconBrandInstagram,
1868
- facebook: import_icons_react7.IconBrandFacebook,
1869
- linkedin: import_icons_react7.IconBrandLinkedin,
1870
- github: import_icons_react7.IconBrandGithub,
1871
- blog: import_icons_react7.IconWorld
2088
+ x: import_icons_react8.IconBrandX,
2089
+ youtube: import_icons_react8.IconBrandYoutube,
2090
+ instagram: import_icons_react8.IconBrandInstagram,
2091
+ facebook: import_icons_react8.IconBrandFacebook,
2092
+ linkedin: import_icons_react8.IconBrandLinkedin,
2093
+ github: import_icons_react8.IconBrandGithub,
2094
+ blog: import_icons_react8.IconWorld
1872
2095
  };
1873
2096
  function FooterSocials({ items }) {
1874
- return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Group, { gap: 0, wrap: "nowrap", children: items.map((item) => {
2097
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core30.Group, { gap: 0, wrap: "nowrap", children: items.map((item) => {
1875
2098
  var _a4, _b;
1876
- const Icon = (_a4 = SOCIAL_ICONS[item.platform]) != null ? _a4 : import_icons_react7.IconWorld;
1877
- return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
1878
- import_core29.ActionIcon,
2099
+ const Icon = (_a4 = SOCIAL_ICONS[item.platform]) != null ? _a4 : import_icons_react8.IconWorld;
2100
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
2101
+ import_core30.ActionIcon,
1879
2102
  {
1880
2103
  component: "a",
1881
2104
  href: item.url,
@@ -1885,62 +2108,62 @@ function FooterSocials({ items }) {
1885
2108
  color: "gray",
1886
2109
  variant: "subtle",
1887
2110
  "aria-label": (_b = item.label) != null ? _b : item.platform,
1888
- children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Icon, { size: 18, stroke: 1.5 })
2111
+ children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Icon, { size: 18, stroke: 1.5 })
1889
2112
  },
1890
2113
  item.url
1891
2114
  );
1892
2115
  }) });
1893
2116
  }
1894
2117
  function InfoCell({ label, children }) {
1895
- return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Group, { gap: 6, wrap: "nowrap", align: "baseline", children: [
1896
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdText.Sub, { c: "slate.4", style: { whiteSpace: "nowrap" }, children: label }),
1897
- typeof children === "string" ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdText.Sub, { children }) : children
2118
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core30.Group, { gap: 6, wrap: "nowrap", align: "baseline", children: [
2119
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdText.Sub, { c: "slate.4", style: { whiteSpace: "nowrap" }, children: label }),
2120
+ typeof children === "string" ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdText.Sub, { children }) : children
1898
2121
  ] });
1899
2122
  }
1900
2123
  function FooterCompanyInfo({ company }) {
1901
2124
  const sortedAddresses = [...company.addresses].sort((a, b) => a.order - b.order);
1902
- return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.SimpleGrid, { cols: { base: 2, sm: 2, md: 1 }, spacing: "md", verticalSpacing: 0, children: [
1903
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(InfoCell, { label: "\uC0C1\uD638", children: company.name }),
1904
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(InfoCell, { label: "\uC0AC\uC5C5\uC790\uB4F1\uB85D\uBC88\uD638", children: company.registrationNumber }),
1905
- sortedAddresses.map((addr) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(InfoCell, { label: addr.label, children: addr.address }, addr.label)),
1906
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(InfoCell, { label: "Tel", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdLink.Sub, { href: `tel:${company.tel}`, children: company.tel }) }),
1907
- company.fax && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(InfoCell, { label: "Fax", children: company.fax }),
1908
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(InfoCell, { label: "Email", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdLink.Sub, { href: `mailto:${company.email}`, children: company.email }) })
2125
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core30.SimpleGrid, { cols: { base: 2, sm: 2, md: 1 }, spacing: "md", verticalSpacing: 0, children: [
2126
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(InfoCell, { label: "\uC0C1\uD638", children: company.name }),
2127
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(InfoCell, { label: "\uC0AC\uC5C5\uC790\uB4F1\uB85D\uBC88\uD638", children: company.registrationNumber }),
2128
+ sortedAddresses.map((addr) => /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(InfoCell, { label: addr.label, children: addr.address }, addr.label)),
2129
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(InfoCell, { label: "Tel", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdLink.Sub, { href: `tel:${company.tel}`, children: company.tel }) }),
2130
+ company.fax && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(InfoCell, { label: "Fax", children: company.fax }),
2131
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(InfoCell, { label: "Email", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdLink.Sub, { href: `mailto:${company.email}`, children: company.email }) })
1909
2132
  ] });
1910
2133
  }
1911
2134
  function SdFooter({ company, navItems, policyLinks, description }) {
1912
2135
  const visibleNav = filterAndSort(navItems);
1913
2136
  const visiblePolicy = filterAndSort(policyLinks);
1914
- return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Box, { component: "footer", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdContainer, { py: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Stack, { children: [
1915
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Logo, { size: "sm" }),
1916
- description && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SdText.Sub, { children: description }),
1917
- /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Flex, { direction: { base: "column", md: "row" }, gap: 48, align: "flex-start", children: [
1918
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Box, { flex: { base: "0 0 auto", md: "1 1 0" }, w: { base: "100%", md: "auto" }, children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(FooterCompanyInfo, { company }) }),
1919
- visibleNav.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Box, { flex: { base: "0 0 auto", md: "2 1 0" }, w: { base: "100%", md: "auto" }, children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Grid, { style: { "--grid-gutter": "24px" }, children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(FooterNavColumns, { items: visibleNav }) }) })
2137
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core30.Box, { component: "footer", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdContainer, { py: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core30.Stack, { children: [
2138
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Logo, { size: "sm" }),
2139
+ description && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdText.Sub, { children: description }),
2140
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core30.Flex, { direction: { base: "column", md: "row" }, gap: 48, align: "flex-start", children: [
2141
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core30.Box, { flex: { base: "0 0 auto", md: "1 1 0" }, w: { base: "100%", md: "auto" }, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FooterCompanyInfo, { company }) }),
2142
+ visibleNav.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core30.Box, { flex: { base: "0 0 auto", md: "2 1 0" }, w: { base: "100%", md: "auto" }, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core30.Grid, { style: { "--grid-gutter": "24px" }, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FooterNavColumns, { items: visibleNav }) }) })
1920
2143
  ] }),
1921
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Divider, {}),
1922
- /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Group, { justify: "space-between", wrap: "wrap", gap: "xs", children: [
1923
- /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(SdText.Sub, { children: [
2144
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core30.Divider, {}),
2145
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core30.Group, { justify: "space-between", wrap: "wrap", gap: "xs", children: [
2146
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(SdText.Sub, { children: [
1924
2147
  "\xA9 ",
1925
2148
  company.copyrightYear,
1926
2149
  " ",
1927
2150
  t(company.name),
1928
2151
  ". All rights reserved."
1929
2152
  ] }),
1930
- /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Group, { gap: "lg", wrap: "wrap", children: [
1931
- visiblePolicy.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Group, { gap: "lg", children: visiblePolicy.map((item) => {
2153
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core30.Group, { gap: "lg", wrap: "wrap", children: [
2154
+ visiblePolicy.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core30.Group, { gap: "lg", children: visiblePolicy.map((item) => {
1932
2155
  const Link4 = item.highlight ? SdLink.Body : SdLink.Sub;
1933
- return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Link4, { href: item.href, children: item.label }, item.id);
2156
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Link4, { href: item.href, children: item.label }, item.id);
1934
2157
  }) }),
1935
- company.socials && company.socials.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(FooterSocials, { items: company.socials })
2158
+ company.socials && company.socials.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FooterSocials, { items: company.socials })
1936
2159
  ] })
1937
2160
  ] })
1938
2161
  ] }) }) });
1939
2162
  }
1940
2163
 
1941
2164
  // ui/organism/FeatureSection.tsx
1942
- var import_core30 = require("@mantine/core");
1943
- var import_jsx_runtime32 = require("react/jsx-runtime");
2165
+ var import_core31 = require("@mantine/core");
2166
+ var import_jsx_runtime34 = require("react/jsx-runtime");
1944
2167
  function SdFeatureSection(_a4) {
1945
2168
  var _b = _a4, {
1946
2169
  label,
@@ -1957,8 +2180,8 @@ function SdFeatureSection(_a4) {
1957
2180
  "cols",
1958
2181
  "py"
1959
2182
  ]);
1960
- 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: [
1961
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
2183
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdContainer, __spreadProps(__spreadValues({ py }, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core31.Stack, { gap: "xl", children: [
2184
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
1962
2185
  SdTextBox.Section,
1963
2186
  {
1964
2187
  label,
@@ -1969,13 +2192,13 @@ function SdFeatureSection(_a4) {
1969
2192
  align: "center"
1970
2193
  }
1971
2194
  ),
1972
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SdFeatures, { items, cols })
2195
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdFeatures, { items, cols })
1973
2196
  ] }) }));
1974
2197
  }
1975
2198
 
1976
2199
  // ui/organism/TimelineSection.tsx
1977
- var import_core31 = require("@mantine/core");
1978
- var import_jsx_runtime33 = require("react/jsx-runtime");
2200
+ var import_core32 = require("@mantine/core");
2201
+ var import_jsx_runtime35 = require("react/jsx-runtime");
1979
2202
  function SdTimelineSection(_a4) {
1980
2203
  var _b = _a4, {
1981
2204
  label,
@@ -1990,15 +2213,15 @@ function SdTimelineSection(_a4) {
1990
2213
  "items",
1991
2214
  "py"
1992
2215
  ]);
1993
- 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: [
1994
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdTextBox.Section, { label, title, description }),
1995
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SdTimeline, { items }) })
2216
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core32.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core32.Stack, __spreadProps(__spreadValues({ py, gap: "md" }, boxProps), { children: [
2217
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdTextBox.Section, { label, title, description }),
2218
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core32.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdTimeline, { items }) })
1996
2219
  ] })) });
1997
2220
  }
1998
2221
 
1999
2222
  // ui/organism/StepsSection.tsx
2000
- var import_core32 = require("@mantine/core");
2001
- var import_jsx_runtime34 = require("react/jsx-runtime");
2223
+ var import_core33 = require("@mantine/core");
2224
+ var import_jsx_runtime36 = require("react/jsx-runtime");
2002
2225
  function SdStepsSection(_a4) {
2003
2226
  var _b = _a4, {
2004
2227
  label,
@@ -2013,18 +2236,18 @@ function SdStepsSection(_a4) {
2013
2236
  "items",
2014
2237
  "py"
2015
2238
  ]);
2016
- 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: [
2017
- (label || title || description) && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdTextBox.Section, { label, title, description }),
2018
- /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(SdSteps.Bubble, { items })
2239
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdContainer, __spreadProps(__spreadValues({ py }, boxProps), { children: /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core33.Stack, { gap: "xl", children: [
2240
+ (label || title || description) && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdTextBox.Section, { label, title, description }),
2241
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdSteps.Bubble, { items })
2019
2242
  ] }) }));
2020
2243
  }
2021
2244
 
2022
2245
  // ui/organism/ErrorView.tsx
2023
- var import_core33 = require("@mantine/core");
2024
- var import_jsx_runtime35 = require("react/jsx-runtime");
2246
+ var import_core34 = require("@mantine/core");
2247
+ var import_jsx_runtime37 = require("react/jsx-runtime");
2025
2248
  function StatusCode({ code }) {
2026
- return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
2027
- import_core33.Text,
2249
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
2250
+ import_core34.Text,
2028
2251
  {
2029
2252
  fz: 160,
2030
2253
  fw: 900,
@@ -2037,15 +2260,15 @@ function StatusCode({ code }) {
2037
2260
  );
2038
2261
  }
2039
2262
  function Page({ error, onReset, onHome }) {
2040
- 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: [
2041
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(StatusCode, { code: "500" }),
2042
- /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core33.Stack, { gap: "sm", align: "center", children: [
2043
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdTitle.Section, { children: "\uC11C\uBC84\uC5D0\uC11C \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4" }),
2044
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdText.Body, { maw: 480, children: "\uC608\uAE30\uCE58 \uC54A\uC740 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694." })
2263
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core34.Center, { mih: "60vh", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core34.Stack, { align: "center", gap: "lg", ta: "center", children: [
2264
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(StatusCode, { code: "500" }),
2265
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core34.Stack, { gap: "sm", align: "center", children: [
2266
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(SdTitle.Section, { children: "\uC11C\uBC84\uC5D0\uC11C \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4" }),
2267
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(SdText.Body, { maw: 480, children: "\uC608\uAE30\uCE58 \uC54A\uC740 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694." })
2045
2268
  ] }),
2046
- /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core33.Group, { gap: "sm", justify: "center", children: [
2047
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdButton.Primary, { onClick: onReset, children: "\uB2E4\uC2DC \uC2DC\uB3C4" }),
2048
- onHome && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdButton.Ghost, { onClick: onHome, children: "\uD648\uC73C\uB85C" })
2269
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core34.Group, { gap: "sm", justify: "center", children: [
2270
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(SdButton.Primary, { onClick: onReset, children: "\uB2E4\uC2DC \uC2DC\uB3C4" }),
2271
+ onHome && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(SdButton.Ghost, { onClick: onHome, children: "\uD648\uC73C\uB85C" })
2049
2272
  ] })
2050
2273
  ] }) }) });
2051
2274
  }
@@ -2057,15 +2280,15 @@ function NotFound({
2057
2280
  },
2058
2281
  onBack = () => window.history.back()
2059
2282
  }) {
2060
- 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: [
2061
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(StatusCode, { code: "404" }),
2062
- /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core33.Stack, { gap: "sm", align: "center", children: [
2063
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdTitle.Section, { children: title }),
2064
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdText.Body, { maw: 480, children: description })
2283
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core34.Center, { mih: "60vh", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core34.Stack, { align: "center", gap: "lg", ta: "center", children: [
2284
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(StatusCode, { code: "404" }),
2285
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core34.Stack, { gap: "sm", align: "center", children: [
2286
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(SdTitle.Section, { children: title }),
2287
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(SdText.Body, { maw: 480, children: description })
2065
2288
  ] }),
2066
- /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core33.Group, { gap: "sm", justify: "center", children: [
2067
- onHome && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdButton.Primary, { onClick: onHome, children: "\uD648\uC73C\uB85C" }),
2068
- onBack && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SdButton.Ghost, { onClick: onBack, children: "\uB4A4\uB85C \uAC00\uAE30" })
2289
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core34.Group, { gap: "sm", justify: "center", children: [
2290
+ onHome && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(SdButton.Primary, { onClick: onHome, children: "\uD648\uC73C\uB85C" }),
2291
+ onBack && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(SdButton.Ghost, { onClick: onBack, children: "\uB4A4\uB85C \uAC00\uAE30" })
2069
2292
  ] })
2070
2293
  ] }) }) });
2071
2294
  }
@@ -2079,8 +2302,8 @@ var SdErrorViewPage = SdErrorView.Page;
2079
2302
  var SdErrorViewNotFound = SdErrorView.NotFound;
2080
2303
 
2081
2304
  // ui/organism/LoginView.tsx
2082
- var import_core34 = require("@mantine/core");
2083
- var import_icons_react8 = require("@tabler/icons-react");
2305
+ var import_core35 = require("@mantine/core");
2306
+ var import_icons_react9 = require("@tabler/icons-react");
2084
2307
 
2085
2308
  // ui/surface.ts
2086
2309
  var brandSurface = {
@@ -2098,13 +2321,13 @@ var brandDotTexture = {
2098
2321
  };
2099
2322
 
2100
2323
  // ui/organism/LoginView.tsx
2101
- var import_jsx_runtime36 = require("react/jsx-runtime");
2324
+ var import_jsx_runtime38 = require("react/jsx-runtime");
2102
2325
  var SOCIAL_META = {
2103
- google: { Icon: import_icons_react8.IconBrandGoogle, label: "\uAD6C\uAE00\uB85C \uB85C\uADF8\uC778" },
2104
- kakao: { Icon: import_icons_react8.IconBrandKakaoTalk, label: "\uCE74\uCE74\uC624\uB85C \uB85C\uADF8\uC778" },
2105
- naver: { Icon: import_icons_react8.IconCircleLetterN, label: "\uB124\uC774\uBC84\uB85C \uB85C\uADF8\uC778" },
2106
- apple: { Icon: import_icons_react8.IconBrandApple, label: "\uC560\uD50C\uB85C \uB85C\uADF8\uC778" },
2107
- github: { Icon: import_icons_react8.IconBrandGithub, label: "\uAE43\uD5C8\uBE0C\uB85C \uB85C\uADF8\uC778" }
2326
+ google: { Icon: import_icons_react9.IconBrandGoogle, label: "\uAD6C\uAE00\uB85C \uB85C\uADF8\uC778" },
2327
+ kakao: { Icon: import_icons_react9.IconBrandKakaoTalk, label: "\uCE74\uCE74\uC624\uB85C \uB85C\uADF8\uC778" },
2328
+ naver: { Icon: import_icons_react9.IconCircleLetterN, label: "\uB124\uC774\uBC84\uB85C \uB85C\uADF8\uC778" },
2329
+ apple: { Icon: import_icons_react9.IconBrandApple, label: "\uC560\uD50C\uB85C \uB85C\uADF8\uC778" },
2330
+ github: { Icon: import_icons_react9.IconBrandGithub, label: "\uAE43\uD5C8\uBE0C\uB85C \uB85C\uADF8\uC778" }
2108
2331
  };
2109
2332
  function LoginForm({
2110
2333
  onSubmit,
@@ -2127,9 +2350,9 @@ function LoginForm({
2127
2350
  remember: data.get("remember") === "on"
2128
2351
  });
2129
2352
  }
2130
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("form", { onSubmit: handleSubmit, noValidate: true, children: /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.Stack, { gap: "md", children: [
2131
- error && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdText.Error, { children: error }),
2132
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
2353
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("form", { onSubmit: handleSubmit, noValidate: true, children: /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core35.Stack, { gap: "md", children: [
2354
+ error && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(SdText.Error, { children: error }),
2355
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
2133
2356
  SdInput.Email,
2134
2357
  {
2135
2358
  name: "email",
@@ -2139,7 +2362,7 @@ function LoginForm({
2139
2362
  required: true
2140
2363
  }
2141
2364
  ),
2142
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
2365
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
2143
2366
  SdInput.Password,
2144
2367
  {
2145
2368
  name: "password",
@@ -2149,50 +2372,50 @@ function LoginForm({
2149
2372
  required: true
2150
2373
  }
2151
2374
  ),
2152
- (withRemember || findPasswordHref) && /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.Group, { justify: "space-between", align: "center", wrap: "nowrap", children: [
2153
- withRemember ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Checkbox, { name: "remember", size: "xs", label: "\uC790\uB3D9 \uB85C\uADF8\uC778" }) : /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", {}),
2154
- findPasswordHref && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdLink.Sub, { href: findPasswordHref, children: "\uBE44\uBC00\uBC88\uD638\uB97C \uC78A\uC73C\uC168\uB098\uC694?" })
2375
+ (withRemember || findPasswordHref) && /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core35.Group, { justify: "space-between", align: "center", wrap: "nowrap", children: [
2376
+ withRemember ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core35.Checkbox, { name: "remember", size: "xs", label: "\uC790\uB3D9 \uB85C\uADF8\uC778" }) : /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("span", {}),
2377
+ findPasswordHref && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(SdLink.Sub, { href: findPasswordHref, children: "\uBE44\uBC00\uBC88\uD638\uB97C \uC78A\uC73C\uC168\uB098\uC694?" })
2155
2378
  ] }),
2156
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
2379
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
2157
2380
  SdButton.Primary,
2158
2381
  {
2159
2382
  type: "submit",
2160
2383
  fullWidth: true,
2161
2384
  loading,
2162
- leftSection: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_icons_react8.IconLogin2, { size: 16 }),
2385
+ leftSection: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_icons_react9.IconLogin2, { size: 16 }),
2163
2386
  children: submitLabel
2164
2387
  }
2165
2388
  ),
2166
- socials && socials.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_jsx_runtime36.Fragment, { children: [
2167
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Divider, { label: "\uB610\uB294", labelPosition: "center" }),
2168
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Stack, { gap: "xs", children: socials.map((social) => {
2389
+ socials && socials.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_jsx_runtime38.Fragment, { children: [
2390
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core35.Divider, { label: "\uB610\uB294", labelPosition: "center" }),
2391
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core35.Stack, { gap: "xs", children: socials.map((social) => {
2169
2392
  var _a4;
2170
2393
  const { Icon, label } = SOCIAL_META[social.provider];
2171
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
2394
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
2172
2395
  SdButton.Outline,
2173
2396
  {
2174
2397
  color: "slate",
2175
2398
  fullWidth: true,
2176
2399
  type: "button",
2177
2400
  onClick: social.onClick,
2178
- leftSection: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Icon, { size: 16 }),
2401
+ leftSection: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(Icon, { size: 16 }),
2179
2402
  children: (_a4 = social.label) != null ? _a4 : label
2180
2403
  },
2181
2404
  social.provider
2182
2405
  );
2183
2406
  }) })
2184
2407
  ] }),
2185
- signUpHref && /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.Group, { gap: 6, justify: "center", children: [
2186
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdText.Sub, { children: "\uC544\uC9C1 \uACC4\uC815\uC774 \uC5C6\uC73C\uC2E0\uAC00\uC694?" }),
2187
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdLink.Sub, { href: signUpHref, c: "primary.6", children: "\uD68C\uC6D0\uAC00\uC785" })
2408
+ signUpHref && /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core35.Group, { gap: 6, justify: "center", children: [
2409
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(SdText.Sub, { children: "\uC544\uC9C1 \uACC4\uC815\uC774 \uC5C6\uC73C\uC2E0\uAC00\uC694?" }),
2410
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(SdLink.Sub, { href: signUpHref, c: "primary.6", children: "\uD68C\uC6D0\uAC00\uC785" })
2188
2411
  ] }),
2189
2412
  children
2190
2413
  ] }) });
2191
2414
  }
2192
2415
  function FormHeader({ title, description }) {
2193
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.Stack, { gap: "lg", children: [
2194
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Logo, { size: "sm" }),
2195
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(SdTextBox.Card, { title, description: description != null ? description : "" })
2416
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core35.Stack, { gap: "lg", children: [
2417
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(Logo, { size: "sm" }),
2418
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(SdTextBox.Card, { title, description: description != null ? description : "" })
2196
2419
  ] });
2197
2420
  }
2198
2421
  function Card7(_a4) {
@@ -2205,9 +2428,9 @@ function Card7(_a4) {
2205
2428
  "description",
2206
2429
  "mih"
2207
2430
  ]);
2208
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Center, { mih, bg: "slate.0", p: "md", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Paper, { w: "100%", maw: 420, p: { base: "lg", sm: "xl" }, radius: "lg", withBorder: true, shadow: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.Stack, { gap: "xl", children: [
2209
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(FormHeader, { title, description }),
2210
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(LoginForm, __spreadValues({}, formProps))
2431
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core35.Center, { mih, bg: "slate.0", p: "md", children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core35.Paper, { w: "100%", maw: 420, p: { base: "lg", sm: "xl" }, radius: "lg", withBorder: true, shadow: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core35.Stack, { gap: "xl", children: [
2432
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(FormHeader, { title, description }),
2433
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(LoginForm, __spreadValues({}, formProps))
2211
2434
  ] }) }) });
2212
2435
  }
2213
2436
  function Split(_a4) {
@@ -2224,16 +2447,16 @@ function Split(_a4) {
2224
2447
  "brandDescription",
2225
2448
  "mih"
2226
2449
  ]);
2227
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.SimpleGrid, { cols: { base: 1, md: 2 }, spacing: 0, mih, children: [
2228
- /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
2229
- import_core34.Box,
2450
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core35.SimpleGrid, { cols: { base: 1, md: 2 }, spacing: 0, mih, children: [
2451
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(
2452
+ import_core35.Box,
2230
2453
  {
2231
2454
  visibleFrom: "md",
2232
2455
  pos: "relative",
2233
2456
  style: __spreadValues({ overflow: "hidden", display: "flex", alignItems: "flex-end" }, brandSurface),
2234
2457
  children: [
2235
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Box, { "aria-hidden": true, pos: "absolute", inset: 0, style: brandDotTexture }),
2236
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Box, { pos: "relative", p: 48, style: { zIndex: 1, width: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
2458
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core35.Box, { "aria-hidden": true, pos: "absolute", inset: 0, style: brandDotTexture }),
2459
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core35.Box, { pos: "relative", p: 48, style: { zIndex: 1, width: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
2237
2460
  SdTextBox.Hero,
2238
2461
  {
2239
2462
  title: brandTitle,
@@ -2247,9 +2470,9 @@ function Split(_a4) {
2247
2470
  ]
2248
2471
  }
2249
2472
  ),
2250
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Center, { p: { base: "md", sm: "xl" }, bg: "white", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.Stack, { gap: "xl", w: "100%", maw: 400, children: [
2251
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(FormHeader, { title, description }),
2252
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(LoginForm, __spreadValues({}, formProps))
2473
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core35.Center, { p: { base: "md", sm: "xl" }, bg: "white", children: /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core35.Stack, { gap: "xl", w: "100%", maw: 400, children: [
2474
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(FormHeader, { title, description }),
2475
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(LoginForm, __spreadValues({}, formProps))
2253
2476
  ] }) })
2254
2477
  ] });
2255
2478
  }
@@ -2263,11 +2486,11 @@ var SdLoginViewCard = SdLoginView.Card;
2263
2486
  var SdLoginViewSplit = SdLoginView.Split;
2264
2487
 
2265
2488
  // ui/organism/Result.tsx
2266
- var import_core35 = require("@mantine/core");
2267
- var import_icons_react9 = require("@tabler/icons-react");
2268
- var import_jsx_runtime37 = require("react/jsx-runtime");
2489
+ var import_core36 = require("@mantine/core");
2490
+ var import_icons_react10 = require("@tabler/icons-react");
2491
+ var import_jsx_runtime39 = require("react/jsx-runtime");
2269
2492
  function ResultIcon({ color, Icon }) {
2270
- return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Center, { w: 88, h: 88, bg: `${color}.0`, style: { borderRadius: "50%" }, "aria-hidden": true, children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(Icon, { size: 48, stroke: 1.5, color: `var(--mantine-color-${color}-6)` }) });
2493
+ return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core36.Center, { w: 88, h: 88, bg: `${color}.0`, style: { borderRadius: "50%" }, "aria-hidden": true, children: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(Icon, { size: 48, stroke: 1.5, color: `var(--mantine-color-${color}-6)` }) });
2271
2494
  }
2272
2495
  function createResult(defaults) {
2273
2496
  return function SdResult2({
@@ -2278,16 +2501,16 @@ function createResult(defaults) {
2278
2501
  children,
2279
2502
  mih = "60vh"
2280
2503
  }) {
2281
- return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Center, { mih, children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Stack, { align: "center", gap: "lg", ta: "center", children: [
2282
- /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(ResultIcon, { color: defaults.color, Icon: defaults.Icon }),
2283
- /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Stack, { gap: "sm", align: "center", children: [
2284
- /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(SdTitle.Section, { children: title }),
2285
- description && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(SdText.Body, { maw: 480, children: description })
2504
+ return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core36.Center, { mih, children: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(SdContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_core36.Stack, { align: "center", gap: "lg", ta: "center", children: [
2505
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(ResultIcon, { color: defaults.color, Icon: defaults.Icon }),
2506
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_core36.Stack, { gap: "sm", align: "center", children: [
2507
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(SdTitle.Section, { children: title }),
2508
+ description && /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(SdText.Body, { maw: 480, children: description })
2286
2509
  ] }),
2287
- children && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Box, { children }),
2288
- (primaryAction || secondaryAction) && /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Group, { gap: "sm", justify: "center", children: [
2289
- primaryAction && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(SdButton.Primary, { onClick: primaryAction.onClick, children: primaryAction.label }),
2290
- secondaryAction && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(SdButton.Ghost, { onClick: secondaryAction.onClick, children: secondaryAction.label })
2510
+ children && /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core36.Box, { children }),
2511
+ (primaryAction || secondaryAction) && /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_core36.Group, { gap: "sm", justify: "center", children: [
2512
+ primaryAction && /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(SdButton.Primary, { onClick: primaryAction.onClick, children: primaryAction.label }),
2513
+ secondaryAction && /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(SdButton.Ghost, { onClick: secondaryAction.onClick, children: secondaryAction.label })
2291
2514
  ] })
2292
2515
  ] }) }) });
2293
2516
  };
@@ -2296,13 +2519,13 @@ var SdResult = {
2296
2519
  /** 성공 — 가입 완료·결제 완료 등 */
2297
2520
  Success: createResult({
2298
2521
  color: "green",
2299
- Icon: import_icons_react9.IconCircleCheck,
2522
+ Icon: import_icons_react10.IconCircleCheck,
2300
2523
  title: "\uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4"
2301
2524
  }),
2302
2525
  /** 실패 — 결제 실패·처리 중 오류 등. 서버 오류·404는 SdErrorView를 쓴다. */
2303
2526
  Error: createResult({
2304
2527
  color: "red",
2305
- Icon: import_icons_react9.IconCircleX,
2528
+ Icon: import_icons_react10.IconCircleX,
2306
2529
  title: "\uBB38\uC81C\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4"
2307
2530
  })
2308
2531
  };
@@ -2310,11 +2533,12 @@ var SdResultSuccess = SdResult.Success;
2310
2533
  var SdResultError = SdResult.Error;
2311
2534
 
2312
2535
  // ui/template/MainLayout.tsx
2313
- var import_core36 = require("@mantine/core");
2314
- var import_jsx_runtime38 = require("react/jsx-runtime");
2536
+ var import_core37 = require("@mantine/core");
2537
+ var import_jsx_runtime40 = require("react/jsx-runtime");
2315
2538
  var headers = {
2316
2539
  mega: SdHeader.Mega,
2317
- simple: SdHeader.Simple
2540
+ simple: SdHeader.Simple,
2541
+ panel: SdHeader.Panel
2318
2542
  };
2319
2543
  function MainLayout({
2320
2544
  children,
@@ -2324,45 +2548,65 @@ function MainLayout({
2324
2548
  headerVariant = "mega"
2325
2549
  }) {
2326
2550
  const Header = headers[headerVariant];
2327
- return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core36.AppShell, { header: { height: 60 }, children: [
2328
- /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.AppShell.Header, { children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(Header, { navItems, loginFlag }) }),
2329
- /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.AppShell.Main, { children }),
2330
- /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(SdFooter, { company: companyInfo, navItems })
2551
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_core37.AppShell, { header: { height: 60 }, children: [
2552
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core37.AppShell.Header, { children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(Header, { navItems, loginFlag }) }),
2553
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core37.AppShell.Main, { children }),
2554
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(SdFooter, { company: companyInfo, navItems })
2331
2555
  ] });
2332
2556
  }
2333
2557
 
2334
2558
  // ui/template/PageLayout.tsx
2335
- var import_core37 = require("@mantine/core");
2336
- var import_jsx_runtime39 = require("react/jsx-runtime");
2559
+ var import_core38 = require("@mantine/core");
2560
+ var import_jsx_runtime41 = require("react/jsx-runtime");
2337
2561
  var HERO_MIN_H = "38svh";
2338
2562
  var HERO_PY = { base: 56, sm: 88 };
2339
2563
  var HERO_MAW = 680;
2340
- function Content({ children }) {
2341
- return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(SdContainer, { py: "xl", children: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.Stack, { gap: "xl", children }) });
2564
+ function Content({
2565
+ children,
2566
+ navItems,
2567
+ breadcrumb = true,
2568
+ currentHref
2569
+ }) {
2570
+ const showBreadcrumb = breadcrumb && !!navItems && navItems.length > 0;
2571
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(SdContainer, { py: "xl", children: [
2572
+ showBreadcrumb && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(SdBreadcrumb, { navItems, currentHref, mb: "lg" }),
2573
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core38.Stack, { gap: "xl", children })
2574
+ ] });
2342
2575
  }
2343
2576
  function LayoutGap() {
2344
- return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.Space, { h: 48 });
2577
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core38.Space, {});
2345
2578
  }
2346
- function Minimal({ label, title, description, children }) {
2347
- return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(Plain2, { children: [
2348
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(SdTextBox.Section, { label, title, description: description != null ? description : "" }),
2349
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.Divider, {}),
2579
+ function Minimal({
2580
+ label,
2581
+ title,
2582
+ description,
2583
+ children,
2584
+ navItems,
2585
+ breadcrumb,
2586
+ currentHref
2587
+ }) {
2588
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(Plain2, { navItems, breadcrumb, currentHref, children: [
2589
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(LayoutGap, {}),
2590
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(SdTextBox.Section, { label, title, description: description != null ? description : "" }),
2591
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core38.Divider, {}),
2350
2592
  children
2351
2593
  ] });
2352
2594
  }
2353
- function Plain2({ children }) {
2354
- return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_jsx_runtime39.Fragment, { children: [
2355
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(LayoutGap, {}),
2356
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(Content, { children })
2357
- ] });
2595
+ function Plain2({
2596
+ children,
2597
+ navItems,
2598
+ breadcrumb,
2599
+ currentHref
2600
+ }) {
2601
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_jsx_runtime41.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(Content, { navItems, breadcrumb, currentHref, children }) });
2358
2602
  }
2359
2603
  function HeroCopy({ label, title, description }) {
2360
- return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_core37.Stack, { gap: "md", maw: HERO_MAW, children: [
2361
- label && /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_core37.Group, { gap: "sm", align: "center", wrap: "nowrap", children: [
2362
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.Box, { w: 28, h: 2, bg: "primary.3", style: { borderRadius: 2 } }),
2363
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(SdText.Eyebrow, { c: "primary.1", children: label })
2604
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_core38.Stack, { gap: "md", maw: HERO_MAW, children: [
2605
+ label && /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_core38.Group, { gap: "sm", align: "center", wrap: "nowrap", children: [
2606
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core38.Box, { w: 28, h: 2, bg: "primary.3", style: { borderRadius: 2 } }),
2607
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(SdText.Eyebrow, { c: "primary.1", children: label })
2364
2608
  ] }),
2365
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
2609
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
2366
2610
  SdTextBox.Hero,
2367
2611
  {
2368
2612
  title,
@@ -2375,10 +2619,19 @@ function HeroCopy({ label, title, description }) {
2375
2619
  )
2376
2620
  ] });
2377
2621
  }
2378
- function Image2({ image, label, title, description, children }) {
2379
- return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_jsx_runtime39.Fragment, { children: [
2380
- /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(
2381
- import_core37.Box,
2622
+ function Image2({
2623
+ image,
2624
+ label,
2625
+ title,
2626
+ description,
2627
+ children,
2628
+ navItems,
2629
+ breadcrumb,
2630
+ currentHref
2631
+ }) {
2632
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_jsx_runtime41.Fragment, { children: [
2633
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(
2634
+ import_core38.Box,
2382
2635
  {
2383
2636
  pos: "relative",
2384
2637
  style: {
@@ -2391,8 +2644,8 @@ function Image2({ image, label, title, description, children }) {
2391
2644
  backgroundColor: "var(--mantine-color-slate-9)"
2392
2645
  },
2393
2646
  children: [
2394
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
2395
- import_core37.Box,
2647
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
2648
+ import_core38.Box,
2396
2649
  {
2397
2650
  "aria-hidden": true,
2398
2651
  pos: "absolute",
@@ -2402,17 +2655,25 @@ function Image2({ image, label, title, description, children }) {
2402
2655
  }
2403
2656
  }
2404
2657
  ),
2405
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(SdContainer, { pos: "relative", py: HERO_PY, style: { zIndex: 1, width: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(HeroCopy, { label, title, description }) })
2658
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(SdContainer, { pos: "relative", py: HERO_PY, style: { zIndex: 1, width: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(HeroCopy, { label, title, description }) })
2406
2659
  ]
2407
2660
  }
2408
2661
  ),
2409
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(Content, { children })
2662
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(Content, { navItems, breadcrumb, currentHref, children })
2410
2663
  ] });
2411
2664
  }
2412
- function Brand({ label, title, description, children }) {
2413
- return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_jsx_runtime39.Fragment, { children: [
2414
- /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(
2415
- import_core37.Box,
2665
+ function Brand({
2666
+ label,
2667
+ title,
2668
+ description,
2669
+ children,
2670
+ navItems,
2671
+ breadcrumb,
2672
+ currentHref
2673
+ }) {
2674
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_jsx_runtime41.Fragment, { children: [
2675
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(
2676
+ import_core38.Box,
2416
2677
  {
2417
2678
  pos: "relative",
2418
2679
  style: __spreadValues({
@@ -2423,12 +2684,12 @@ function Brand({ label, title, description, children }) {
2423
2684
  borderBottom: "1px solid var(--mantine-color-slate-8)"
2424
2685
  }, brandSurface),
2425
2686
  children: [
2426
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.Box, { "aria-hidden": true, pos: "absolute", inset: 0, style: brandDotTexture }),
2427
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(SdContainer, { pos: "relative", py: HERO_PY, style: { zIndex: 1, width: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(HeroCopy, { label, title, description }) })
2687
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core38.Box, { "aria-hidden": true, pos: "absolute", inset: 0, style: brandDotTexture }),
2688
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(SdContainer, { pos: "relative", py: HERO_PY, style: { zIndex: 1, width: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(HeroCopy, { label, title, description }) })
2428
2689
  ]
2429
2690
  }
2430
2691
  ),
2431
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(Content, { children })
2692
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(Content, { navItems, breadcrumb, currentHref, children })
2432
2693
  ] });
2433
2694
  }
2434
2695
  var PageLayout = {
@@ -2446,8 +2707,11 @@ var PageLayoutMinimal = PageLayout.Minimal;
2446
2707
  var PageLayoutBrand = PageLayout.Brand;
2447
2708
  var PageLayoutPlain = PageLayout.Plain;
2448
2709
 
2710
+ // ui/template/SdProvider.tsx
2711
+ var import_core40 = require("@mantine/core");
2712
+
2449
2713
  // ui/theme.ts
2450
- var import_core38 = require("@mantine/core");
2714
+ var import_core39 = require("@mantine/core");
2451
2715
  var primary = [
2452
2716
  "#e7f0fb",
2453
2717
  "#c8dcf4",
@@ -2563,7 +2827,7 @@ var amber = [
2563
2827
  "#78350f"
2564
2828
  // 9 amber-900
2565
2829
  ];
2566
- var theme = (0, import_core38.createTheme)({
2830
+ var theme = (0, import_core39.createTheme)({
2567
2831
  /* ---- Color ---- */
2568
2832
  colors: { primary, secondary, slate, red, green, amber, dark: slate },
2569
2833
  primaryColor: "primary",
@@ -2575,20 +2839,20 @@ var theme = (0, import_core38.createTheme)({
2575
2839
  fontFamily: "'Noto Sans KR', ui-sans-serif, system-ui, sans-serif",
2576
2840
  fontWeight: "700",
2577
2841
  sizes: {
2578
- h1: { fontSize: (0, import_core38.rem)(48), lineHeight: "1.1", fontWeight: "900" },
2579
- h2: { fontSize: (0, import_core38.rem)(36), lineHeight: "1.1", fontWeight: "900" },
2580
- h3: { fontSize: (0, import_core38.rem)(28), lineHeight: "1.15", fontWeight: "700" },
2581
- h4: { fontSize: (0, import_core38.rem)(20), lineHeight: "1.3", fontWeight: "700" },
2582
- h5: { fontSize: (0, import_core38.rem)(16), lineHeight: "1.4", fontWeight: "700" },
2583
- h6: { fontSize: (0, import_core38.rem)(14), lineHeight: "1.4", fontWeight: "700" }
2842
+ h1: { fontSize: (0, import_core39.rem)(48), lineHeight: "1.1", fontWeight: "900" },
2843
+ h2: { fontSize: (0, import_core39.rem)(36), lineHeight: "1.1", fontWeight: "900" },
2844
+ h3: { fontSize: (0, import_core39.rem)(28), lineHeight: "1.15", fontWeight: "700" },
2845
+ h4: { fontSize: (0, import_core39.rem)(20), lineHeight: "1.3", fontWeight: "700" },
2846
+ h5: { fontSize: (0, import_core39.rem)(16), lineHeight: "1.4", fontWeight: "700" },
2847
+ h6: { fontSize: (0, import_core39.rem)(14), lineHeight: "1.4", fontWeight: "700" }
2584
2848
  }
2585
2849
  },
2586
2850
  fontSizes: {
2587
- xs: (0, import_core38.rem)(14),
2588
- sm: (0, import_core38.rem)(16),
2589
- md: (0, import_core38.rem)(18),
2590
- lg: (0, import_core38.rem)(20),
2591
- xl: (0, import_core38.rem)(22)
2851
+ xs: (0, import_core39.rem)(14),
2852
+ sm: (0, import_core39.rem)(16),
2853
+ md: (0, import_core39.rem)(18),
2854
+ lg: (0, import_core39.rem)(20),
2855
+ xl: (0, import_core39.rem)(22)
2592
2856
  },
2593
2857
  lineHeights: {
2594
2858
  xs: "1.4",
@@ -2599,18 +2863,18 @@ var theme = (0, import_core38.createTheme)({
2599
2863
  },
2600
2864
  defaultRadius: "md",
2601
2865
  radius: {
2602
- xs: (0, import_core38.rem)(6),
2603
- sm: (0, import_core38.rem)(8),
2604
- md: (0, import_core38.rem)(10),
2605
- lg: (0, import_core38.rem)(14),
2606
- xl: (0, import_core38.rem)(18)
2866
+ xs: (0, import_core39.rem)(6),
2867
+ sm: (0, import_core39.rem)(8),
2868
+ md: (0, import_core39.rem)(10),
2869
+ lg: (0, import_core39.rem)(14),
2870
+ xl: (0, import_core39.rem)(18)
2607
2871
  },
2608
2872
  spacing: {
2609
- xs: (0, import_core38.rem)(8),
2610
- sm: (0, import_core38.rem)(12),
2611
- md: (0, import_core38.rem)(16),
2612
- lg: (0, import_core38.rem)(24),
2613
- xl: (0, import_core38.rem)(32)
2873
+ xs: (0, import_core39.rem)(8),
2874
+ sm: (0, import_core39.rem)(12),
2875
+ md: (0, import_core39.rem)(16),
2876
+ lg: (0, import_core39.rem)(24),
2877
+ xl: (0, import_core39.rem)(32)
2614
2878
  },
2615
2879
  shadows: {
2616
2880
  xs: "0 1px 2px 0 rgb(0 0 0 / 0.05)",
@@ -2690,7 +2954,6 @@ var theme = (0, import_core38.createTheme)({
2690
2954
  Anchor: {
2691
2955
  defaultProps: { c: "slate.5", fz: "sm", underline: "never" }
2692
2956
  },
2693
- // SdHeader 모바일 드로어의 2단 아코디언 타이포를 SdLink와 맞춘다.
2694
2957
  NavLink: {
2695
2958
  defaultProps: { c: "slate.7", fz: "sm" }
2696
2959
  },
@@ -2704,11 +2967,26 @@ var theme = (0, import_core38.createTheme)({
2704
2967
  }
2705
2968
  }
2706
2969
  });
2970
+
2971
+ // ui/template/SdProvider.tsx
2972
+ var import_jsx_runtime42 = require("react/jsx-runtime");
2973
+ function SdProvider({
2974
+ children,
2975
+ theme: theme2 = theme,
2976
+ navItems,
2977
+ defaultColorScheme = "light"
2978
+ }) {
2979
+ return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_core40.MantineProvider, { theme: theme2, defaultColorScheme, children: [
2980
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(SdToastProvider, {}),
2981
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(NavProvider, { navItems, children })
2982
+ ] });
2983
+ }
2707
2984
  // Annotate the CommonJS export names for ESM import in node:
2708
2985
  0 && (module.exports = {
2709
2986
  HeroCarousel,
2710
2987
  Logo,
2711
2988
  MainLayout,
2989
+ NavProvider,
2712
2990
  PageLayout,
2713
2991
  PageLayoutBrand,
2714
2992
  PageLayoutImage,
@@ -2719,6 +2997,7 @@ var theme = (0, import_core38.createTheme)({
2719
2997
  SdBadgePrimary,
2720
2998
  SdBadgeSuccess,
2721
2999
  SdBadgeWarning,
3000
+ SdBreadcrumb,
2722
3001
  SdButton,
2723
3002
  SdButtonCancel,
2724
3003
  SdButtonDelete,
@@ -2750,6 +3029,7 @@ var theme = (0, import_core38.createTheme)({
2750
3029
  SdFooter,
2751
3030
  SdHeader,
2752
3031
  SdHeaderMega,
3032
+ SdHeaderPanel,
2753
3033
  SdHeaderSimple,
2754
3034
  SdInput,
2755
3035
  SdInputAutocomplete,
@@ -2792,6 +3072,7 @@ var theme = (0, import_core38.createTheme)({
2792
3072
  SdPricingCardDefault,
2793
3073
  SdPricingCardFeatured,
2794
3074
  SdPricingCardGrid,
3075
+ SdProvider,
2795
3076
  SdQuote,
2796
3077
  SdQuoteCard,
2797
3078
  SdQuotePlain,
@@ -2855,5 +3136,6 @@ var theme = (0, import_core38.createTheme)({
2855
3136
  SdToastSuccess,
2856
3137
  SdToastUpdate,
2857
3138
  SdToastWarning,
2858
- theme
3139
+ theme,
3140
+ useNav
2859
3141
  });