@yeongseoksong/framework 1.4.0 → 1.5.0

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