@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.mjs CHANGED
@@ -68,6 +68,7 @@ function Logo(_props) {
68
68
  }
69
69
 
70
70
  // ui/atom/Tabs.tsx
71
+ import { useEffect, useState } from "react";
71
72
  import { Box, Tabs } from "@mantine/core";
72
73
 
73
74
  // ui/atom/Container.tsx
@@ -89,8 +90,30 @@ function SdScrollableList(_a4) {
89
90
  return /* @__PURE__ */ jsx3(Box, { style: { overflowX: "auto", width: "100%" }, children: /* @__PURE__ */ jsx3(Tabs.List, __spreadProps(__spreadValues({}, props), { children })) });
90
91
  }
91
92
  function createTabs(defaults, scrollable = false) {
92
- function SdTabsRoot(props) {
93
- return /* @__PURE__ */ jsx3(Tabs, __spreadValues(__spreadValues({}, defaults), props));
93
+ function SdTabsRoot(_a4) {
94
+ var _b = _a4, { syncHash, value, onChange } = _b, props = __objRest(_b, ["syncHash", "value", "onChange"]);
95
+ const [hashValue, setHashValue] = useState(null);
96
+ useEffect(() => {
97
+ if (!syncHash) return;
98
+ const apply = () => {
99
+ const id = decodeURIComponent(window.location.hash.slice(1));
100
+ if (id) setHashValue(id);
101
+ };
102
+ apply();
103
+ window.addEventListener("hashchange", apply);
104
+ return () => window.removeEventListener("hashchange", apply);
105
+ }, [syncHash]);
106
+ if (!syncHash) {
107
+ return /* @__PURE__ */ jsx3(Tabs, __spreadProps(__spreadValues(__spreadValues({}, defaults), props), { value, onChange }));
108
+ }
109
+ const handleChange = (next) => {
110
+ if (next) {
111
+ window.history.replaceState(null, "", `#${next}`);
112
+ setHashValue(next);
113
+ }
114
+ onChange == null ? void 0 : onChange(next);
115
+ };
116
+ return /* @__PURE__ */ jsx3(Tabs, __spreadProps(__spreadValues(__spreadValues({}, defaults), props), { value: value != null ? value : hashValue, onChange: handleChange }));
94
117
  }
95
118
  SdTabsRoot.List = scrollable ? SdScrollableList : Tabs.List;
96
119
  SdTabsRoot.Tab = Tabs.Tab;
@@ -854,7 +877,7 @@ function BubbleStep({ item, index, isLast }) {
854
877
  {
855
878
  style: { display: "flex", flexDirection: "column", alignItems: "center", flexShrink: 0 },
856
879
  children: [
857
- /* @__PURE__ */ jsx19(SdNumberIcon, { value: String(index + 1).padStart(2, "0") }),
880
+ /* @__PURE__ */ jsx19(SdNumberIcon, { value: String(index + 1).padStart(2, "0"), color: "primary" }),
858
881
  !isLast && /* @__PURE__ */ jsx19(
859
882
  Box4,
860
883
  {
@@ -1263,7 +1286,7 @@ var SdCtaSubtle = SdCta.Subtle;
1263
1286
  var SdCtaInline = SdCta.Inline;
1264
1287
 
1265
1288
  // ui/molecule/Solution.tsx
1266
- import { useState } from "react";
1289
+ import { useState as useState2 } from "react";
1267
1290
  import { Button as Button2, Divider as Divider2, Group as Group8, Stack as Stack13, ThemeIcon as ThemeIcon4 } from "@mantine/core";
1268
1291
  import Link3 from "next/link";
1269
1292
 
@@ -1304,7 +1327,7 @@ var SdSolutionCardGrid = SdSolutionCard.Grid;
1304
1327
  import { jsx as jsx25, jsxs as jsxs12 } from "react/jsx-runtime";
1305
1328
  function Filtered({ items, allLabel = "\uC804\uCCB4", cols, onSelect }) {
1306
1329
  const categories = ["all", ...Array.from(new Set(items.map((i) => i.category)))];
1307
- const [active, setActive] = useState("all");
1330
+ const [active, setActive] = useState2("all");
1308
1331
  const filtered = active === "all" ? items : items.filter((i) => i.category === active);
1309
1332
  return /* @__PURE__ */ jsxs12(Stack13, { gap: "xl", children: [
1310
1333
  /* @__PURE__ */ jsx25(SdTabs.Pills, { value: active, onChange: (v) => setActive(v != null ? v : "all"), children: /* @__PURE__ */ jsx25(SdTabs.Pills.List, { children: categories.map((cat) => /* @__PURE__ */ jsx25(SdTabs.Pills.Tab, { value: cat, children: cat === "all" ? allLabel : cat }, cat)) }) }),
@@ -1376,7 +1399,13 @@ function LogoImage({ client, height }) {
1376
1399
  {
1377
1400
  src: client.logo,
1378
1401
  alt: client.name,
1379
- style: __spreadValues({ height, width: "auto", objectFit: "contain", display: "block" }, grayStyle),
1402
+ style: __spreadValues({
1403
+ height,
1404
+ width: "auto",
1405
+ maxWidth: "100%",
1406
+ objectFit: "contain",
1407
+ display: "block"
1408
+ }, grayStyle),
1380
1409
  onMouseEnter: (e) => Object.assign(e.currentTarget.style, colorStyle),
1381
1410
  onMouseLeave: (e) => Object.assign(e.currentTarget.style, grayStyle)
1382
1411
  }
@@ -1394,7 +1423,10 @@ function Grid4({
1394
1423
  display: "flex",
1395
1424
  alignItems: "center",
1396
1425
  justifyContent: "center",
1397
- padding: "12px 8px"
1426
+ padding: "12px 8px",
1427
+ minWidth: 0,
1428
+ // 그리드 트랙이 이미지 intrinsic width로 밀려 깨지는 것 방지
1429
+ overflow: "hidden"
1398
1430
  },
1399
1431
  children: /* @__PURE__ */ jsx26(LogoImage, { client, height: logoHeight })
1400
1432
  },
@@ -1439,7 +1471,7 @@ var SdClientsGrid = Grid4;
1439
1471
  var SdClientsMarquee = Marquee;
1440
1472
 
1441
1473
  // ui/molecule/Map.tsx
1442
- import { useState as useState2 } from "react";
1474
+ import { useState as useState3 } from "react";
1443
1475
  import { Box as Box10, Stack as Stack14 } from "@mantine/core";
1444
1476
  import { jsx as jsx27, jsxs as jsxs14 } from "react/jsx-runtime";
1445
1477
  function MapFrame({ address, height }) {
@@ -1473,7 +1505,7 @@ function Single(_a4) {
1473
1505
  function Tabs2({ addresses, height = 400 }) {
1474
1506
  var _a4, _b, _c;
1475
1507
  const mapped = addresses.filter((a) => a.embbedUrl);
1476
- const [active, setActive] = useState2((_b = (_a4 = mapped[0]) == null ? void 0 : _a4.label) != null ? _b : "");
1508
+ const [active, setActive] = useState3((_b = (_a4 = mapped[0]) == null ? void 0 : _a4.label) != null ? _b : "");
1477
1509
  if (mapped.length === 0) return null;
1478
1510
  if (mapped.length === 1) return /* @__PURE__ */ jsx27(MapFrame, { address: mapped[0], height });
1479
1511
  const current = (_c = mapped.find((a) => a.label === active)) != null ? _c : mapped[0];
@@ -1491,11 +1523,78 @@ var SdMap = {
1491
1523
  var SdMapSingle = Single;
1492
1524
  var SdMapTabs = Tabs2;
1493
1525
 
1526
+ // ui/molecule/Breadcrumb.tsx
1527
+ import { Box as Box11, Breadcrumbs } from "@mantine/core";
1528
+ import { usePathname } from "next/navigation";
1529
+ import { IconChevronRight, IconHome } from "@tabler/icons-react";
1530
+ import { jsx as jsx28, jsxs as jsxs15 } from "react/jsx-runtime";
1531
+ function normalizePath(href) {
1532
+ if (!href) return "";
1533
+ const trimmed = href.replace(/\/+$/, "");
1534
+ return trimmed === "" ? "/" : trimmed;
1535
+ }
1536
+ function buildTrail(navItems, currentHref) {
1537
+ const target = normalizePath(currentHref);
1538
+ const byId = new Map(navItems.map((item) => [item.id, item]));
1539
+ let current = navItems.find((item) => normalizePath(item.href) === target);
1540
+ if (!current) {
1541
+ current = navItems.filter((item) => item.href && target.startsWith(normalizePath(item.href) + "/")).sort((a, b) => normalizePath(b.href).length - normalizePath(a.href).length)[0];
1542
+ }
1543
+ if (!current) return [];
1544
+ const trail = [];
1545
+ const seen = /* @__PURE__ */ new Set();
1546
+ let node = current;
1547
+ while (node && !seen.has(node.id)) {
1548
+ seen.add(node.id);
1549
+ trail.unshift(node);
1550
+ node = node.parentId != null ? byId.get(node.parentId) : void 0;
1551
+ }
1552
+ return trail;
1553
+ }
1554
+ function SdBreadcrumb(_a4) {
1555
+ var _b = _a4, {
1556
+ navItems,
1557
+ currentHref,
1558
+ homeHref = "/",
1559
+ homeLabel = "\uD648"
1560
+ } = _b, boxProps = __objRest(_b, [
1561
+ "navItems",
1562
+ "currentHref",
1563
+ "homeHref",
1564
+ "homeLabel"
1565
+ ]);
1566
+ var _a5;
1567
+ const pathname = usePathname();
1568
+ const trail = buildTrail(navItems, (_a5 = currentHref != null ? currentHref : pathname) != null ? _a5 : "");
1569
+ return /* @__PURE__ */ jsx28(Box11, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ jsxs15(
1570
+ Breadcrumbs,
1571
+ {
1572
+ separator: /* @__PURE__ */ jsx28(IconChevronRight, { size: 14, stroke: 2, color: "var(--mantine-color-slate-4)" }),
1573
+ separatorMargin: "xs",
1574
+ children: [
1575
+ /* @__PURE__ */ jsx28(
1576
+ SdLink.Sub,
1577
+ {
1578
+ href: homeHref,
1579
+ "aria-label": homeLabel,
1580
+ style: { display: "inline-flex", alignItems: "center" },
1581
+ children: /* @__PURE__ */ jsx28(IconHome, { size: 16, stroke: 2 })
1582
+ }
1583
+ ),
1584
+ trail.map((item, i) => {
1585
+ const isLast = i === trail.length - 1;
1586
+ return isLast ? /* @__PURE__ */ jsx28(SdLink.Body, { children: item.label }, item.id) : /* @__PURE__ */ jsx28(SdLink.Sub, { href: item.href, children: item.label }, item.id);
1587
+ })
1588
+ ]
1589
+ }
1590
+ ) }));
1591
+ }
1592
+
1494
1593
  // ui/organism/HeroCarousel.tsx
1495
1594
  import { Carousel } from "@mantine/carousel";
1496
- import { Anchor as Anchor2, Box as Box11, Group as Group9, Stack as Stack15 } from "@mantine/core";
1595
+ import { Anchor as Anchor2, Box as Box12, Group as Group9, Stack as Stack15 } from "@mantine/core";
1497
1596
  import { IconArrowNarrowRight } from "@tabler/icons-react";
1498
- import { Fragment as Fragment3, jsx as jsx28, jsxs as jsxs15 } from "react/jsx-runtime";
1597
+ import { Fragment as Fragment3, jsx as jsx29, jsxs as jsxs16 } from "react/jsx-runtime";
1499
1598
  var variantMap = {
1500
1599
  primary: SdButton.Primary,
1501
1600
  secondary: SdButton.Secondary,
@@ -1505,13 +1604,13 @@ var variantMap = {
1505
1604
  function CtaButton({ cta }) {
1506
1605
  var _a4;
1507
1606
  const Button3 = variantMap[(_a4 = cta.variant) != null ? _a4 : "primary"];
1508
- return /* @__PURE__ */ jsx28(Anchor2, { href: cta.href, underline: "never", children: cta.icon ? /* @__PURE__ */ jsx28(Button3, { size: "md", rightSection: /* @__PURE__ */ jsx28(IconArrowNarrowRight, {}), children: cta.label }) : /* @__PURE__ */ jsx28(Button3, { size: "md", children: cta.label }) });
1607
+ return /* @__PURE__ */ jsx29(Anchor2, { href: cta.href, underline: "never", children: cta.icon ? /* @__PURE__ */ jsx29(Button3, { size: "md", rightSection: /* @__PURE__ */ jsx29(IconArrowNarrowRight, {}), children: cta.label }) : /* @__PURE__ */ jsx29(Button3, { size: "md", children: cta.label }) });
1509
1608
  }
1510
1609
  function HeroCarousel({ slides, children }) {
1511
- if (children) return /* @__PURE__ */ jsx28(Fragment3, { children });
1610
+ if (children) return /* @__PURE__ */ jsx29(Fragment3, { children });
1512
1611
  const filterdSlides = filterAndSort(slides);
1513
- return /* @__PURE__ */ jsx28(Carousel, { withIndicators: true, height: "60svh", children: filterdSlides.map((slide, i) => /* @__PURE__ */ jsx28(Carousel.Slide, { children: /* @__PURE__ */ jsx28(
1514
- Box11,
1612
+ return /* @__PURE__ */ jsx29(Carousel, { withIndicators: true, height: "60svh", children: filterdSlides.map((slide, i) => /* @__PURE__ */ jsx29(Carousel.Slide, { children: /* @__PURE__ */ jsx29(
1613
+ Box12,
1515
1614
  {
1516
1615
  style: {
1517
1616
  height: "100%",
@@ -1522,8 +1621,8 @@ function HeroCarousel({ slides, children }) {
1522
1621
  alignItems: "center",
1523
1622
  justifyContent: "center"
1524
1623
  },
1525
- children: /* @__PURE__ */ jsxs15(Stack15, { align: "center", style: { textAlign: "center", maxWidth: 780 }, px: "xl", children: [
1526
- /* @__PURE__ */ jsx28(
1624
+ children: /* @__PURE__ */ jsxs16(Stack15, { align: "center", style: { textAlign: "center", maxWidth: 780 }, px: "xl", children: [
1625
+ /* @__PURE__ */ jsx29(
1527
1626
  SdTextBox.Hero,
1528
1627
  {
1529
1628
  title: slide.title,
@@ -1532,18 +1631,27 @@ function HeroCarousel({ slides, children }) {
1532
1631
  align: "center"
1533
1632
  }
1534
1633
  ),
1535
- slide.ctas && slide.ctas.length > 0 && /* @__PURE__ */ jsx28(Group9, { gap: "sm", mt: "md", children: slide.ctas.map((cta, i2) => /* @__PURE__ */ jsx28(CtaButton, { cta }, cta.href)) })
1634
+ slide.ctas && slide.ctas.length > 0 && /* @__PURE__ */ jsx29(Group9, { gap: "sm", mt: "md", children: slide.ctas.map((cta, i2) => /* @__PURE__ */ jsx29(CtaButton, { cta }, cta.href)) })
1536
1635
  ] })
1537
1636
  }
1538
1637
  ) }, i)) });
1539
1638
  }
1540
1639
 
1541
1640
  // ui/organism/Header.tsx
1542
- import { Box as Box12, Burger, Drawer, Group as Group10, Menu, NavLink, Stack as Stack16 } from "@mantine/core";
1641
+ import { Box as Box13, Burger, Drawer, Group as Group10, Menu, NavLink, Stack as Stack16 } from "@mantine/core";
1543
1642
  import { IconChevronDown } from "@tabler/icons-react";
1544
1643
  import { useDisclosure, useFocusWithin, useHover, useMergedRef } from "@mantine/hooks";
1545
- import { Fragment as Fragment4, jsx as jsx29, jsxs as jsxs16 } from "react/jsx-runtime";
1644
+ import { Fragment as Fragment4, jsx as jsx30, jsxs as jsxs17 } from "react/jsx-runtime";
1546
1645
  var BAR_HEIGHT = 60;
1646
+ var MAX_DEPTH = 3;
1647
+ var NAV_LINK_STYLES = {
1648
+ label: {
1649
+ fontWeight: textStyles.Body.fw,
1650
+ fontSize: `var(--mantine-font-size-${textStyles.Body.fz})`,
1651
+ color: toCssColor(textStyles.Body.c),
1652
+ lineHeight: textStyles.Body.lh
1653
+ }
1654
+ };
1547
1655
  function useNavTree(navItems) {
1548
1656
  const visibleItems = filterAndSort(navItems);
1549
1657
  return {
@@ -1552,27 +1660,36 @@ function useNavTree(navItems) {
1552
1660
  hasAnyChildren: visibleItems.some((item) => item.parentId)
1553
1661
  };
1554
1662
  }
1555
- function MobileNav({ opened, close, topItems, childrenOf, loginFlag }) {
1556
- return /* @__PURE__ */ jsx29(Drawer, { opened, onClose: close, hiddenFrom: "sm", size: "xs", children: /* @__PURE__ */ jsxs16(Stack16, { gap: 0, children: [
1557
- topItems.map((item) => {
1558
- const kids = childrenOf(item.id);
1559
- if (kids.length === 0) {
1560
- return /* @__PURE__ */ jsx29(Box12, { px: "sm", py: 8, children: /* @__PURE__ */ jsx29(SdLink.Body, { href: item.href, onClick: close, children: item.label }) }, item.id);
1561
- }
1562
- return /* @__PURE__ */ jsx29(
1563
- NavLink,
1663
+ function MobileNavNode({ item, depth, childrenOf, close }) {
1664
+ const kids = depth < MAX_DEPTH ? childrenOf(item.id) : [];
1665
+ if (kids.length === 0) {
1666
+ return /* @__PURE__ */ jsx30(Box13, { px: "sm", py: 8, children: /* @__PURE__ */ jsx30(SdLink.Body, { href: item.href, onClick: close, children: item.label }) });
1667
+ }
1668
+ return /* @__PURE__ */ jsx30(
1669
+ NavLink,
1670
+ {
1671
+ label: item.label,
1672
+ styles: NAV_LINK_STYLES,
1673
+ component: item.href ? "a" : "button",
1674
+ href: item.href,
1675
+ childrenOffset: 28,
1676
+ children: kids.map((kid) => /* @__PURE__ */ jsx30(
1677
+ MobileNavNode,
1564
1678
  {
1565
- label: item.label,
1566
- component: item.href ? "a" : "button",
1567
- href: item.href,
1568
- childrenOffset: 28,
1569
- onClick: kids.length > 0 ? void 0 : close,
1570
- children: kids.map((kid) => /* @__PURE__ */ jsx29(NavLink, { label: kid.label, href: kid.href, onClick: close }, kid.id))
1679
+ item: kid,
1680
+ depth: depth + 1,
1681
+ childrenOf,
1682
+ close
1571
1683
  },
1572
- item.id
1573
- );
1574
- }),
1575
- loginFlag && /* @__PURE__ */ jsx29(Stack16, { gap: "xs", mt: "md", children: /* @__PURE__ */ jsx29(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
1684
+ kid.id
1685
+ ))
1686
+ }
1687
+ );
1688
+ }
1689
+ function MobileNav({ opened, close, topItems, childrenOf, loginFlag }) {
1690
+ return /* @__PURE__ */ jsx30(Drawer, { opened, onClose: close, hiddenFrom: "sm", size: "xs", children: /* @__PURE__ */ jsxs17(Stack16, { gap: 0, children: [
1691
+ topItems.map((item) => /* @__PURE__ */ jsx30(MobileNavNode, { item, depth: 1, childrenOf, close }, item.id)),
1692
+ loginFlag && /* @__PURE__ */ jsx30(Stack16, { gap: "xs", mt: "md", children: /* @__PURE__ */ jsx30(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
1576
1693
  ] }) });
1577
1694
  }
1578
1695
  function MegaHeader({ navItems, loginFlag }) {
@@ -1582,9 +1699,9 @@ function MegaHeader({ navItems, loginFlag }) {
1582
1699
  const { focused, ref: focusRef } = useFocusWithin();
1583
1700
  const rootRef = useMergedRef(hoverRef, focusRef);
1584
1701
  const expanded = hasAnyChildren && (hovered || focused);
1585
- return /* @__PURE__ */ jsxs16(Fragment4, { children: [
1586
- /* @__PURE__ */ jsx29(
1587
- Box12,
1702
+ return /* @__PURE__ */ jsxs17(Fragment4, { children: [
1703
+ /* @__PURE__ */ jsx30(
1704
+ Box13,
1588
1705
  {
1589
1706
  ref: rootRef,
1590
1707
  pos: "relative",
@@ -1594,12 +1711,12 @@ function MegaHeader({ navItems, loginFlag }) {
1594
1711
  borderBottom: expanded ? "1px solid var(--mantine-color-slate-2)" : void 0,
1595
1712
  transition: "box-shadow 0.15s"
1596
1713
  },
1597
- children: /* @__PURE__ */ jsx29(SdContainer, { children: /* @__PURE__ */ jsxs16(Group10, { justify: "space-between", align: "flex-start", wrap: "nowrap", children: [
1598
- /* @__PURE__ */ jsx29(Group10, { h: BAR_HEIGHT, align: "center", children: /* @__PURE__ */ jsx29(Logo, {}) }),
1599
- /* @__PURE__ */ jsx29(Group10, { gap: "xl", align: "flex-start", wrap: "nowrap", visibleFrom: "sm", children: topItems.map((item) => {
1714
+ children: /* @__PURE__ */ jsx30(SdContainer, { children: /* @__PURE__ */ jsxs17(Group10, { justify: "space-between", align: "flex-start", wrap: "nowrap", children: [
1715
+ /* @__PURE__ */ jsx30(Group10, { h: BAR_HEIGHT, align: "center", children: /* @__PURE__ */ jsx30(Logo, {}) }),
1716
+ /* @__PURE__ */ jsx30(Group10, { gap: "xl", align: "flex-start", wrap: "nowrap", visibleFrom: "sm", children: topItems.map((item) => {
1600
1717
  const kids = childrenOf(item.id);
1601
- return /* @__PURE__ */ jsxs16(Stack16, { gap: 0, align: "center", children: [
1602
- /* @__PURE__ */ jsx29(Group10, { h: BAR_HEIGHT, align: "center", children: /* @__PURE__ */ jsx29(SdLink.Body, { href: item.href, children: item.label }) }),
1718
+ return /* @__PURE__ */ jsxs17(Stack16, { gap: 0, align: "center", children: [
1719
+ /* @__PURE__ */ jsx30(Group10, { h: BAR_HEIGHT, align: "center", children: /* @__PURE__ */ jsx30(SdLink.Body, { href: item.href, children: item.label }) }),
1603
1720
  kids.length > 0 && /*
1604
1721
  Mantine Collapse를 쓰지 않는다 — 접힐 때 display:none이 되어
1605
1722
  하위 링크가 폭 계산에서 빠졌다가 펼칠 때 다시 들어오면서
@@ -1607,8 +1724,8 @@ function MegaHeader({ navItems, loginFlag }) {
1607
1724
  height 0 + overflow hidden은 폭 기여를 유지하므로 간격이 고정된다.
1608
1725
  visibility:hidden이 접힌 상태의 링크를 탭 순서에서도 빼준다.
1609
1726
  */
1610
- /* @__PURE__ */ jsx29(
1611
- Box12,
1727
+ /* @__PURE__ */ jsx30(
1728
+ Box13,
1612
1729
  {
1613
1730
  "aria-hidden": !expanded,
1614
1731
  style: {
@@ -1618,19 +1735,28 @@ function MegaHeader({ navItems, loginFlag }) {
1618
1735
  visibility: expanded ? "visible" : "hidden",
1619
1736
  transition: "opacity 0.15s ease"
1620
1737
  },
1621
- children: /* @__PURE__ */ jsx29(Stack16, { gap: "xs", pt: 4, pb: "lg", align: "center", children: kids.map((kid) => /* @__PURE__ */ jsx29(SdLink.Sub, { href: kid.href, children: kid.label }, kid.id)) })
1738
+ children: /* @__PURE__ */ jsx30(Stack16, { gap: "xs", pt: 4, pb: "lg", align: "center", children: kids.map((kid) => {
1739
+ const grandkids = childrenOf(kid.id);
1740
+ if (grandkids.length === 0) {
1741
+ return /* @__PURE__ */ jsx30(SdLink.Body, { href: kid.href, children: kid.label }, kid.id);
1742
+ }
1743
+ return /* @__PURE__ */ jsxs17(Stack16, { gap: 2, align: "center", children: [
1744
+ /* @__PURE__ */ jsx30(SdLink.Body, { href: kid.href, children: kid.label }),
1745
+ grandkids.map((gk) => /* @__PURE__ */ jsx30(SdLink.Sub, { href: gk.href, children: gk.label }, gk.id))
1746
+ ] }, kid.id);
1747
+ }) })
1622
1748
  }
1623
1749
  )
1624
1750
  ] }, item.id);
1625
1751
  }) }),
1626
- /* @__PURE__ */ jsxs16(Group10, { h: BAR_HEIGHT, align: "center", gap: "sm", wrap: "nowrap", children: [
1627
- /* @__PURE__ */ jsx29(Burger, { hiddenFrom: "sm", opened, onClick: toggle }),
1628
- loginFlag && /* @__PURE__ */ jsx29(Group10, { gap: "sm", visibleFrom: "sm", children: /* @__PURE__ */ jsx29(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
1752
+ /* @__PURE__ */ jsxs17(Group10, { h: BAR_HEIGHT, align: "center", gap: "sm", wrap: "nowrap", children: [
1753
+ /* @__PURE__ */ jsx30(Burger, { hiddenFrom: "sm", opened, onClick: toggle }),
1754
+ loginFlag && /* @__PURE__ */ jsx30(Group10, { gap: "sm", visibleFrom: "sm", children: /* @__PURE__ */ jsx30(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
1629
1755
  ] })
1630
1756
  ] }) })
1631
1757
  }
1632
1758
  ),
1633
- /* @__PURE__ */ jsx29(
1759
+ /* @__PURE__ */ jsx30(
1634
1760
  MobileNav,
1635
1761
  {
1636
1762
  opened,
@@ -1642,16 +1768,19 @@ function MegaHeader({ navItems, loginFlag }) {
1642
1768
  )
1643
1769
  ] });
1644
1770
  }
1771
+ function renderMenuLeaf(item) {
1772
+ return item.href ? /* @__PURE__ */ jsx30(Menu.Item, { component: "a", href: item.href, children: item.label }, item.id) : /* @__PURE__ */ jsx30(Menu.Label, { children: item.label }, item.id);
1773
+ }
1645
1774
  function SimpleHeader({ navItems, loginFlag }) {
1646
1775
  const [opened, { toggle, close }] = useDisclosure();
1647
1776
  const { topItems, childrenOf } = useNavTree(navItems);
1648
- return /* @__PURE__ */ jsxs16(Fragment4, { children: [
1649
- /* @__PURE__ */ jsx29(Box12, { bg: "var(--mantine-color-body)", children: /* @__PURE__ */ jsx29(SdContainer, { children: /* @__PURE__ */ jsxs16(Group10, { h: BAR_HEIGHT, justify: "space-between", align: "center", wrap: "nowrap", children: [
1650
- /* @__PURE__ */ jsx29(Logo, {}),
1651
- /* @__PURE__ */ jsx29(Group10, { gap: "xl", align: "center", wrap: "nowrap", visibleFrom: "sm", children: topItems.map((item) => {
1777
+ return /* @__PURE__ */ jsxs17(Fragment4, { children: [
1778
+ /* @__PURE__ */ jsx30(Box13, { bg: "var(--mantine-color-body)", children: /* @__PURE__ */ jsx30(SdContainer, { children: /* @__PURE__ */ jsxs17(Group10, { h: BAR_HEIGHT, justify: "space-between", align: "center", wrap: "nowrap", children: [
1779
+ /* @__PURE__ */ jsx30(Logo, {}),
1780
+ /* @__PURE__ */ jsx30(Group10, { gap: "xl", align: "center", wrap: "nowrap", visibleFrom: "sm", children: topItems.map((item) => {
1652
1781
  const kids = childrenOf(item.id);
1653
1782
  if (kids.length === 0) {
1654
- return /* @__PURE__ */ jsx29(SdLink.Body, { href: item.href, children: item.label }, item.id);
1783
+ return /* @__PURE__ */ jsx30(SdLink.Body, { href: item.href, children: item.label }, item.id);
1655
1784
  }
1656
1785
  return (
1657
1786
  /*
@@ -1659,7 +1788,7 @@ function SimpleHeader({ navItems, loginFlag }) {
1659
1788
  Menu.Target은 ref를 받을 수 있는 단일 엘리먼트여야 하므로
1660
1789
  SdLink/SdText가 아니라 Box를 타깃으로 두고 라벨을 그 안에 넣는다.
1661
1790
  */
1662
- /* @__PURE__ */ jsxs16(
1791
+ /* @__PURE__ */ jsxs17(
1663
1792
  Menu,
1664
1793
  {
1665
1794
  trigger: "click-hover",
@@ -1671,25 +1800,91 @@ function SimpleHeader({ navItems, loginFlag }) {
1671
1800
  radius: "md",
1672
1801
  withinPortal: true,
1673
1802
  children: [
1674
- /* @__PURE__ */ jsx29(Menu.Target, { children: /* @__PURE__ */ jsx29(Box12, { style: { cursor: "pointer" }, children: /* @__PURE__ */ jsxs16(Group10, { gap: 4, align: "center", wrap: "nowrap", children: [
1675
- /* @__PURE__ */ jsx29(SdLink.Body, { href: item.href, children: item.label }),
1676
- /* @__PURE__ */ jsx29(IconChevronDown, { size: 14, stroke: 2 })
1803
+ /* @__PURE__ */ jsx30(Menu.Target, { children: /* @__PURE__ */ jsx30(Box13, { style: { cursor: "pointer" }, children: /* @__PURE__ */ jsxs17(Group10, { gap: 4, align: "center", wrap: "nowrap", children: [
1804
+ /* @__PURE__ */ jsx30(SdLink.Body, { href: item.href, children: item.label }),
1805
+ /* @__PURE__ */ jsx30(IconChevronDown, { size: 14, stroke: 2 })
1677
1806
  ] }) }) }),
1678
- /* @__PURE__ */ jsx29(Menu.Dropdown, { children: kids.map(
1679
- (kid) => kid.href ? /* @__PURE__ */ jsx29(Menu.Item, { component: "a", href: kid.href, children: kid.label }, kid.id) : /* @__PURE__ */ jsx29(Menu.Label, { children: kid.label }, kid.id)
1680
- ) })
1807
+ /* @__PURE__ */ jsx30(Menu.Dropdown, { children: kids.map((kid) => {
1808
+ const grandkids = childrenOf(kid.id);
1809
+ if (grandkids.length > 0) {
1810
+ return /* @__PURE__ */ jsxs17(Menu.Sub, { children: [
1811
+ /* @__PURE__ */ jsx30(Menu.Sub.Target, { children: /* @__PURE__ */ jsx30(Menu.Sub.Item, { children: kid.label }) }),
1812
+ /* @__PURE__ */ jsx30(Menu.Sub.Dropdown, { children: grandkids.map(renderMenuLeaf) })
1813
+ ] }, kid.id);
1814
+ }
1815
+ return renderMenuLeaf(kid);
1816
+ }) })
1681
1817
  ]
1682
1818
  },
1683
1819
  item.id
1684
1820
  )
1685
1821
  );
1686
1822
  }) }),
1687
- /* @__PURE__ */ jsxs16(Group10, { align: "center", gap: "sm", wrap: "nowrap", children: [
1688
- /* @__PURE__ */ jsx29(Burger, { hiddenFrom: "sm", opened, onClick: toggle }),
1689
- loginFlag && /* @__PURE__ */ jsx29(Group10, { gap: "sm", visibleFrom: "sm", children: /* @__PURE__ */ jsx29(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
1823
+ /* @__PURE__ */ jsxs17(Group10, { align: "center", gap: "sm", wrap: "nowrap", children: [
1824
+ /* @__PURE__ */ jsx30(Burger, { hiddenFrom: "sm", opened, onClick: toggle }),
1825
+ loginFlag && /* @__PURE__ */ jsx30(Group10, { gap: "sm", visibleFrom: "sm", children: /* @__PURE__ */ jsx30(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
1826
+ ] })
1827
+ ] }) }) }),
1828
+ /* @__PURE__ */ jsx30(
1829
+ MobileNav,
1830
+ {
1831
+ opened,
1832
+ close,
1833
+ topItems,
1834
+ childrenOf,
1835
+ loginFlag
1836
+ }
1837
+ )
1838
+ ] });
1839
+ }
1840
+ function PanelHeader({ navItems, loginFlag }) {
1841
+ const [opened, { toggle, close }] = useDisclosure();
1842
+ const { topItems, childrenOf } = useNavTree(navItems);
1843
+ return /* @__PURE__ */ jsxs17(Fragment4, { children: [
1844
+ /* @__PURE__ */ jsx30(Box13, { bg: "var(--mantine-color-body)", children: /* @__PURE__ */ jsx30(SdContainer, { children: /* @__PURE__ */ jsxs17(Group10, { h: BAR_HEIGHT, justify: "space-between", align: "center", wrap: "nowrap", children: [
1845
+ /* @__PURE__ */ jsx30(Logo, {}),
1846
+ /* @__PURE__ */ jsx30(Group10, { gap: "xl", align: "center", wrap: "nowrap", visibleFrom: "sm", children: topItems.map((item) => {
1847
+ const kids = childrenOf(item.id);
1848
+ if (kids.length === 0) {
1849
+ return /* @__PURE__ */ jsx30(SdLink.Body, { href: item.href, children: item.label }, item.id);
1850
+ }
1851
+ return /* @__PURE__ */ jsxs17(
1852
+ Menu,
1853
+ {
1854
+ trigger: "click-hover",
1855
+ openDelay: 50,
1856
+ closeDelay: 120,
1857
+ position: "bottom",
1858
+ offset: 12,
1859
+ shadow: "md",
1860
+ radius: "md",
1861
+ withinPortal: true,
1862
+ children: [
1863
+ /* @__PURE__ */ jsx30(Menu.Target, { children: /* @__PURE__ */ jsx30(Box13, { style: { cursor: "pointer" }, children: /* @__PURE__ */ jsxs17(Group10, { gap: 4, align: "center", wrap: "nowrap", children: [
1864
+ /* @__PURE__ */ jsx30(SdLink.Body, { href: item.href, children: item.label }),
1865
+ /* @__PURE__ */ jsx30(IconChevronDown, { size: 14, stroke: 2 })
1866
+ ] }) }) }),
1867
+ /* @__PURE__ */ jsx30(Menu.Dropdown, { children: /* @__PURE__ */ jsx30(Stack16, { gap: "xs", p: "xs", children: kids.map((kid) => {
1868
+ const grandkids = childrenOf(kid.id);
1869
+ if (grandkids.length === 0) {
1870
+ return /* @__PURE__ */ jsx30(SdLink.Body, { href: kid.href, children: kid.label }, kid.id);
1871
+ }
1872
+ return /* @__PURE__ */ jsxs17(Stack16, { gap: 2, children: [
1873
+ /* @__PURE__ */ jsx30(SdLink.Body, { href: kid.href, children: kid.label }),
1874
+ grandkids.map((gk) => /* @__PURE__ */ jsx30(SdLink.Sub, { href: gk.href, pl: "sm", children: gk.label }, gk.id))
1875
+ ] }, kid.id);
1876
+ }) }) })
1877
+ ]
1878
+ },
1879
+ item.id
1880
+ );
1881
+ }) }),
1882
+ /* @__PURE__ */ jsxs17(Group10, { align: "center", gap: "sm", wrap: "nowrap", children: [
1883
+ /* @__PURE__ */ jsx30(Burger, { hiddenFrom: "sm", opened, onClick: toggle }),
1884
+ loginFlag && /* @__PURE__ */ jsx30(Group10, { gap: "sm", visibleFrom: "sm", children: /* @__PURE__ */ jsx30(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
1690
1885
  ] })
1691
1886
  ] }) }) }),
1692
- /* @__PURE__ */ jsx29(
1887
+ /* @__PURE__ */ jsx30(
1693
1888
  MobileNav,
1694
1889
  {
1695
1890
  opened,
@@ -1701,12 +1896,17 @@ function SimpleHeader({ navItems, loginFlag }) {
1701
1896
  )
1702
1897
  ] });
1703
1898
  }
1704
- var SdHeader = Object.assign(MegaHeader, { Mega: MegaHeader, Simple: SimpleHeader });
1899
+ var SdHeader = Object.assign(MegaHeader, {
1900
+ Mega: MegaHeader,
1901
+ Simple: SimpleHeader,
1902
+ Panel: PanelHeader
1903
+ });
1705
1904
  var SdHeaderMega = MegaHeader;
1706
1905
  var SdHeaderSimple = SimpleHeader;
1906
+ var SdHeaderPanel = PanelHeader;
1707
1907
 
1708
1908
  // ui/organism/Footer.tsx
1709
- import { ActionIcon, Box as Box13, Divider as Divider3, Flex, Grid as Grid5, Group as Group11, SimpleGrid as SimpleGrid6, Stack as Stack17 } from "@mantine/core";
1909
+ import { ActionIcon, Box as Box14, Divider as Divider3, Flex, Grid as Grid5, Group as Group11, SimpleGrid as SimpleGrid6, Stack as Stack17 } from "@mantine/core";
1710
1910
  import {
1711
1911
  IconBrandFacebook,
1712
1912
  IconBrandGithub,
@@ -1716,16 +1916,16 @@ import {
1716
1916
  IconBrandYoutube,
1717
1917
  IconWorld
1718
1918
  } from "@tabler/icons-react";
1719
- import { Fragment as Fragment5, jsx as jsx30, jsxs as jsxs17 } from "react/jsx-runtime";
1919
+ import { Fragment as Fragment5, jsx as jsx31, jsxs as jsxs18 } from "react/jsx-runtime";
1720
1920
  function FooterNavColumns({ items }) {
1721
1921
  const topLevel = items.filter((item) => !item.parentId);
1722
1922
  const getChildren = (parentId) => items.filter((item) => item.parentId === parentId);
1723
1923
  const CHILD_THRESH = 4;
1724
- return /* @__PURE__ */ jsx30(Fragment5, { children: topLevel.map((group) => /* @__PURE__ */ jsx30(Grid5.Col, { span: { base: 6, sm: 4, md: "auto" }, children: /* @__PURE__ */ jsxs17(Stack17, { gap: "xs", children: [
1725
- /* @__PURE__ */ jsx30(SdLink.Sub, { href: group.href, children: group.label }, group.id),
1924
+ return /* @__PURE__ */ jsx31(Fragment5, { children: topLevel.map((group) => /* @__PURE__ */ jsx31(Grid5.Col, { span: { base: 6, sm: 4, md: "auto" }, children: /* @__PURE__ */ jsxs18(Stack17, { gap: "xs", children: [
1925
+ /* @__PURE__ */ jsx31(SdLink.Sub, { href: group.href, children: group.label }, group.id),
1726
1926
  getChildren(group.id).map((link, id) => {
1727
1927
  if (id >= CHILD_THRESH) return;
1728
- return /* @__PURE__ */ jsx30(SdLink.Hint, { href: link.href, children: link.label }, link.id);
1928
+ return /* @__PURE__ */ jsx31(SdLink.Hint, { href: link.href, children: link.label }, link.id);
1729
1929
  })
1730
1930
  ] }) }, group.id)) });
1731
1931
  }
@@ -1739,10 +1939,10 @@ var SOCIAL_ICONS = {
1739
1939
  blog: IconWorld
1740
1940
  };
1741
1941
  function FooterSocials({ items }) {
1742
- return /* @__PURE__ */ jsx30(Group11, { gap: 0, wrap: "nowrap", children: items.map((item) => {
1942
+ return /* @__PURE__ */ jsx31(Group11, { gap: 0, wrap: "nowrap", children: items.map((item) => {
1743
1943
  var _a4, _b;
1744
1944
  const Icon = (_a4 = SOCIAL_ICONS[item.platform]) != null ? _a4 : IconWorld;
1745
- return /* @__PURE__ */ jsx30(
1945
+ return /* @__PURE__ */ jsx31(
1746
1946
  ActionIcon,
1747
1947
  {
1748
1948
  component: "a",
@@ -1753,54 +1953,54 @@ function FooterSocials({ items }) {
1753
1953
  color: "gray",
1754
1954
  variant: "subtle",
1755
1955
  "aria-label": (_b = item.label) != null ? _b : item.platform,
1756
- children: /* @__PURE__ */ jsx30(Icon, { size: 18, stroke: 1.5 })
1956
+ children: /* @__PURE__ */ jsx31(Icon, { size: 18, stroke: 1.5 })
1757
1957
  },
1758
1958
  item.url
1759
1959
  );
1760
1960
  }) });
1761
1961
  }
1762
1962
  function InfoCell({ label, children }) {
1763
- return /* @__PURE__ */ jsxs17(Group11, { gap: 6, wrap: "nowrap", align: "baseline", children: [
1764
- /* @__PURE__ */ jsx30(SdText.Sub, { c: "slate.4", style: { whiteSpace: "nowrap" }, children: label }),
1765
- typeof children === "string" ? /* @__PURE__ */ jsx30(SdText.Sub, { children }) : children
1963
+ return /* @__PURE__ */ jsxs18(Group11, { gap: 6, wrap: "nowrap", align: "baseline", children: [
1964
+ /* @__PURE__ */ jsx31(SdText.Sub, { c: "slate.4", style: { whiteSpace: "nowrap" }, children: label }),
1965
+ typeof children === "string" ? /* @__PURE__ */ jsx31(SdText.Sub, { children }) : children
1766
1966
  ] });
1767
1967
  }
1768
1968
  function FooterCompanyInfo({ company }) {
1769
1969
  const sortedAddresses = [...company.addresses].sort((a, b) => a.order - b.order);
1770
- return /* @__PURE__ */ jsxs17(SimpleGrid6, { cols: { base: 2, sm: 2, md: 1 }, spacing: "md", verticalSpacing: 0, children: [
1771
- /* @__PURE__ */ jsx30(InfoCell, { label: "\uC0C1\uD638", children: company.name }),
1772
- /* @__PURE__ */ jsx30(InfoCell, { label: "\uC0AC\uC5C5\uC790\uB4F1\uB85D\uBC88\uD638", children: company.registrationNumber }),
1773
- sortedAddresses.map((addr) => /* @__PURE__ */ jsx30(InfoCell, { label: addr.label, children: addr.address }, addr.label)),
1774
- /* @__PURE__ */ jsx30(InfoCell, { label: "Tel", children: /* @__PURE__ */ jsx30(SdLink.Sub, { href: `tel:${company.tel}`, children: company.tel }) }),
1775
- company.fax && /* @__PURE__ */ jsx30(InfoCell, { label: "Fax", children: company.fax }),
1776
- /* @__PURE__ */ jsx30(InfoCell, { label: "Email", children: /* @__PURE__ */ jsx30(SdLink.Sub, { href: `mailto:${company.email}`, children: company.email }) })
1970
+ return /* @__PURE__ */ jsxs18(SimpleGrid6, { cols: { base: 2, sm: 2, md: 1 }, spacing: "md", verticalSpacing: 0, children: [
1971
+ /* @__PURE__ */ jsx31(InfoCell, { label: "\uC0C1\uD638", children: company.name }),
1972
+ /* @__PURE__ */ jsx31(InfoCell, { label: "\uC0AC\uC5C5\uC790\uB4F1\uB85D\uBC88\uD638", children: company.registrationNumber }),
1973
+ sortedAddresses.map((addr) => /* @__PURE__ */ jsx31(InfoCell, { label: addr.label, children: addr.address }, addr.label)),
1974
+ /* @__PURE__ */ jsx31(InfoCell, { label: "Tel", children: /* @__PURE__ */ jsx31(SdLink.Sub, { href: `tel:${company.tel}`, children: company.tel }) }),
1975
+ company.fax && /* @__PURE__ */ jsx31(InfoCell, { label: "Fax", children: company.fax }),
1976
+ /* @__PURE__ */ jsx31(InfoCell, { label: "Email", children: /* @__PURE__ */ jsx31(SdLink.Sub, { href: `mailto:${company.email}`, children: company.email }) })
1777
1977
  ] });
1778
1978
  }
1779
1979
  function SdFooter({ company, navItems, policyLinks, description }) {
1780
1980
  const visibleNav = filterAndSort(navItems);
1781
1981
  const visiblePolicy = filterAndSort(policyLinks);
1782
- return /* @__PURE__ */ jsx30(Box13, { component: "footer", children: /* @__PURE__ */ jsx30(SdContainer, { py: "lg", children: /* @__PURE__ */ jsxs17(Stack17, { children: [
1783
- /* @__PURE__ */ jsx30(Logo, { size: "sm" }),
1784
- description && /* @__PURE__ */ jsx30(SdText.Sub, { children: description }),
1785
- /* @__PURE__ */ jsxs17(Flex, { direction: { base: "column", md: "row" }, gap: 48, align: "flex-start", children: [
1786
- /* @__PURE__ */ jsx30(Box13, { flex: { base: "0 0 auto", md: "1 1 0" }, w: { base: "100%", md: "auto" }, children: /* @__PURE__ */ jsx30(FooterCompanyInfo, { company }) }),
1787
- visibleNav.length > 0 && /* @__PURE__ */ jsx30(Box13, { flex: { base: "0 0 auto", md: "2 1 0" }, w: { base: "100%", md: "auto" }, children: /* @__PURE__ */ jsx30(Grid5, { style: { "--grid-gutter": "24px" }, children: /* @__PURE__ */ jsx30(FooterNavColumns, { items: visibleNav }) }) })
1982
+ return /* @__PURE__ */ jsx31(Box14, { component: "footer", children: /* @__PURE__ */ jsx31(SdContainer, { py: "lg", children: /* @__PURE__ */ jsxs18(Stack17, { children: [
1983
+ /* @__PURE__ */ jsx31(Logo, { size: "sm" }),
1984
+ description && /* @__PURE__ */ jsx31(SdText.Sub, { children: description }),
1985
+ /* @__PURE__ */ jsxs18(Flex, { direction: { base: "column", md: "row" }, gap: 48, align: "flex-start", children: [
1986
+ /* @__PURE__ */ jsx31(Box14, { flex: { base: "0 0 auto", md: "1 1 0" }, w: { base: "100%", md: "auto" }, children: /* @__PURE__ */ jsx31(FooterCompanyInfo, { company }) }),
1987
+ visibleNav.length > 0 && /* @__PURE__ */ jsx31(Box14, { flex: { base: "0 0 auto", md: "2 1 0" }, w: { base: "100%", md: "auto" }, children: /* @__PURE__ */ jsx31(Grid5, { style: { "--grid-gutter": "24px" }, children: /* @__PURE__ */ jsx31(FooterNavColumns, { items: visibleNav }) }) })
1788
1988
  ] }),
1789
- /* @__PURE__ */ jsx30(Divider3, {}),
1790
- /* @__PURE__ */ jsxs17(Group11, { justify: "space-between", wrap: "wrap", gap: "xs", children: [
1791
- /* @__PURE__ */ jsxs17(SdText.Sub, { children: [
1989
+ /* @__PURE__ */ jsx31(Divider3, {}),
1990
+ /* @__PURE__ */ jsxs18(Group11, { justify: "space-between", wrap: "wrap", gap: "xs", children: [
1991
+ /* @__PURE__ */ jsxs18(SdText.Sub, { children: [
1792
1992
  "\xA9 ",
1793
1993
  company.copyrightYear,
1794
1994
  " ",
1795
1995
  t(company.name),
1796
1996
  ". All rights reserved."
1797
1997
  ] }),
1798
- /* @__PURE__ */ jsxs17(Group11, { gap: "lg", wrap: "wrap", children: [
1799
- visiblePolicy.length > 0 && /* @__PURE__ */ jsx30(Group11, { gap: "lg", children: visiblePolicy.map((item) => {
1998
+ /* @__PURE__ */ jsxs18(Group11, { gap: "lg", wrap: "wrap", children: [
1999
+ visiblePolicy.length > 0 && /* @__PURE__ */ jsx31(Group11, { gap: "lg", children: visiblePolicy.map((item) => {
1800
2000
  const Link4 = item.highlight ? SdLink.Body : SdLink.Sub;
1801
- return /* @__PURE__ */ jsx30(Link4, { href: item.href, children: item.label }, item.id);
2001
+ return /* @__PURE__ */ jsx31(Link4, { href: item.href, children: item.label }, item.id);
1802
2002
  }) }),
1803
- company.socials && company.socials.length > 0 && /* @__PURE__ */ jsx30(FooterSocials, { items: company.socials })
2003
+ company.socials && company.socials.length > 0 && /* @__PURE__ */ jsx31(FooterSocials, { items: company.socials })
1804
2004
  ] })
1805
2005
  ] })
1806
2006
  ] }) }) });
@@ -1808,7 +2008,7 @@ function SdFooter({ company, navItems, policyLinks, description }) {
1808
2008
 
1809
2009
  // ui/organism/FeatureSection.tsx
1810
2010
  import { Stack as Stack18 } from "@mantine/core";
1811
- import { jsx as jsx31, jsxs as jsxs18 } from "react/jsx-runtime";
2011
+ import { jsx as jsx32, jsxs as jsxs19 } from "react/jsx-runtime";
1812
2012
  function SdFeatureSection(_a4) {
1813
2013
  var _b = _a4, {
1814
2014
  label,
@@ -1825,8 +2025,8 @@ function SdFeatureSection(_a4) {
1825
2025
  "cols",
1826
2026
  "py"
1827
2027
  ]);
1828
- return /* @__PURE__ */ jsx31(SdContainer, __spreadProps(__spreadValues({ py }, boxProps), { children: /* @__PURE__ */ jsxs18(Stack18, { gap: "xl", children: [
1829
- /* @__PURE__ */ jsx31(
2028
+ return /* @__PURE__ */ jsx32(SdContainer, __spreadProps(__spreadValues({ py }, boxProps), { children: /* @__PURE__ */ jsxs19(Stack18, { gap: "xl", children: [
2029
+ /* @__PURE__ */ jsx32(
1830
2030
  SdTextBox.Section,
1831
2031
  {
1832
2032
  label,
@@ -1837,13 +2037,13 @@ function SdFeatureSection(_a4) {
1837
2037
  align: "center"
1838
2038
  }
1839
2039
  ),
1840
- /* @__PURE__ */ jsx31(SdFeatures, { items, cols })
2040
+ /* @__PURE__ */ jsx32(SdFeatures, { items, cols })
1841
2041
  ] }) }));
1842
2042
  }
1843
2043
 
1844
2044
  // ui/organism/TimelineSection.tsx
1845
2045
  import { Center as Center3, Stack as Stack19 } from "@mantine/core";
1846
- import { jsx as jsx32, jsxs as jsxs19 } from "react/jsx-runtime";
2046
+ import { jsx as jsx33, jsxs as jsxs20 } from "react/jsx-runtime";
1847
2047
  function SdTimelineSection(_a4) {
1848
2048
  var _b = _a4, {
1849
2049
  label,
@@ -1858,15 +2058,15 @@ function SdTimelineSection(_a4) {
1858
2058
  "items",
1859
2059
  "py"
1860
2060
  ]);
1861
- return /* @__PURE__ */ jsx32(Center3, { children: /* @__PURE__ */ jsxs19(Stack19, __spreadProps(__spreadValues({ py, gap: "md" }, boxProps), { children: [
1862
- /* @__PURE__ */ jsx32(SdTextBox.Section, { label, title, description }),
1863
- /* @__PURE__ */ jsx32(Center3, { children: /* @__PURE__ */ jsx32(SdTimeline, { items }) })
2061
+ return /* @__PURE__ */ jsx33(Center3, { children: /* @__PURE__ */ jsxs20(Stack19, __spreadProps(__spreadValues({ py, gap: "md" }, boxProps), { children: [
2062
+ /* @__PURE__ */ jsx33(SdTextBox.Section, { label, title, description }),
2063
+ /* @__PURE__ */ jsx33(Center3, { children: /* @__PURE__ */ jsx33(SdTimeline, { items }) })
1864
2064
  ] })) });
1865
2065
  }
1866
2066
 
1867
2067
  // ui/organism/StepsSection.tsx
1868
2068
  import { Stack as Stack20 } from "@mantine/core";
1869
- import { jsx as jsx33, jsxs as jsxs20 } from "react/jsx-runtime";
2069
+ import { jsx as jsx34, jsxs as jsxs21 } from "react/jsx-runtime";
1870
2070
  function SdStepsSection(_a4) {
1871
2071
  var _b = _a4, {
1872
2072
  label,
@@ -1881,17 +2081,17 @@ function SdStepsSection(_a4) {
1881
2081
  "items",
1882
2082
  "py"
1883
2083
  ]);
1884
- return /* @__PURE__ */ jsx33(SdContainer, __spreadProps(__spreadValues({ py }, boxProps), { children: /* @__PURE__ */ jsxs20(Stack20, { gap: "xl", children: [
1885
- (label || title || description) && /* @__PURE__ */ jsx33(SdTextBox.Section, { label, title, description }),
1886
- /* @__PURE__ */ jsx33(SdSteps.Bubble, { items })
2084
+ return /* @__PURE__ */ jsx34(SdContainer, __spreadProps(__spreadValues({ py }, boxProps), { children: /* @__PURE__ */ jsxs21(Stack20, { gap: "xl", children: [
2085
+ (label || title || description) && /* @__PURE__ */ jsx34(SdTextBox.Section, { label, title, description }),
2086
+ /* @__PURE__ */ jsx34(SdSteps.Bubble, { items })
1887
2087
  ] }) }));
1888
2088
  }
1889
2089
 
1890
2090
  // ui/organism/ErrorView.tsx
1891
2091
  import { Center as Center4, Group as Group12, Stack as Stack21, Text as Text2 } from "@mantine/core";
1892
- import { jsx as jsx34, jsxs as jsxs21 } from "react/jsx-runtime";
2092
+ import { jsx as jsx35, jsxs as jsxs22 } from "react/jsx-runtime";
1893
2093
  function StatusCode({ code }) {
1894
- return /* @__PURE__ */ jsx34(
2094
+ return /* @__PURE__ */ jsx35(
1895
2095
  Text2,
1896
2096
  {
1897
2097
  fz: 160,
@@ -1905,15 +2105,15 @@ function StatusCode({ code }) {
1905
2105
  );
1906
2106
  }
1907
2107
  function Page({ error, onReset, onHome }) {
1908
- return /* @__PURE__ */ jsx34(Center4, { mih: "60vh", children: /* @__PURE__ */ jsx34(SdContainer, { children: /* @__PURE__ */ jsxs21(Stack21, { align: "center", gap: "lg", ta: "center", children: [
1909
- /* @__PURE__ */ jsx34(StatusCode, { code: "500" }),
1910
- /* @__PURE__ */ jsxs21(Stack21, { gap: "sm", align: "center", children: [
1911
- /* @__PURE__ */ jsx34(SdTitle.Section, { children: "\uC11C\uBC84\uC5D0\uC11C \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4" }),
1912
- /* @__PURE__ */ jsx34(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." })
2108
+ return /* @__PURE__ */ jsx35(Center4, { mih: "60vh", children: /* @__PURE__ */ jsx35(SdContainer, { children: /* @__PURE__ */ jsxs22(Stack21, { align: "center", gap: "lg", ta: "center", children: [
2109
+ /* @__PURE__ */ jsx35(StatusCode, { code: "500" }),
2110
+ /* @__PURE__ */ jsxs22(Stack21, { gap: "sm", align: "center", children: [
2111
+ /* @__PURE__ */ jsx35(SdTitle.Section, { children: "\uC11C\uBC84\uC5D0\uC11C \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4" }),
2112
+ /* @__PURE__ */ jsx35(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." })
1913
2113
  ] }),
1914
- /* @__PURE__ */ jsxs21(Group12, { gap: "sm", justify: "center", children: [
1915
- /* @__PURE__ */ jsx34(SdButton.Primary, { onClick: onReset, children: "\uB2E4\uC2DC \uC2DC\uB3C4" }),
1916
- onHome && /* @__PURE__ */ jsx34(SdButton.Ghost, { onClick: onHome, children: "\uD648\uC73C\uB85C" })
2114
+ /* @__PURE__ */ jsxs22(Group12, { gap: "sm", justify: "center", children: [
2115
+ /* @__PURE__ */ jsx35(SdButton.Primary, { onClick: onReset, children: "\uB2E4\uC2DC \uC2DC\uB3C4" }),
2116
+ onHome && /* @__PURE__ */ jsx35(SdButton.Ghost, { onClick: onHome, children: "\uD648\uC73C\uB85C" })
1917
2117
  ] })
1918
2118
  ] }) }) });
1919
2119
  }
@@ -1925,15 +2125,15 @@ function NotFound({
1925
2125
  },
1926
2126
  onBack = () => window.history.back()
1927
2127
  }) {
1928
- return /* @__PURE__ */ jsx34(Center4, { mih: "60vh", children: /* @__PURE__ */ jsx34(SdContainer, { children: /* @__PURE__ */ jsxs21(Stack21, { align: "center", gap: "lg", ta: "center", children: [
1929
- /* @__PURE__ */ jsx34(StatusCode, { code: "404" }),
1930
- /* @__PURE__ */ jsxs21(Stack21, { gap: "sm", align: "center", children: [
1931
- /* @__PURE__ */ jsx34(SdTitle.Section, { children: title }),
1932
- /* @__PURE__ */ jsx34(SdText.Body, { maw: 480, children: description })
2128
+ return /* @__PURE__ */ jsx35(Center4, { mih: "60vh", children: /* @__PURE__ */ jsx35(SdContainer, { children: /* @__PURE__ */ jsxs22(Stack21, { align: "center", gap: "lg", ta: "center", children: [
2129
+ /* @__PURE__ */ jsx35(StatusCode, { code: "404" }),
2130
+ /* @__PURE__ */ jsxs22(Stack21, { gap: "sm", align: "center", children: [
2131
+ /* @__PURE__ */ jsx35(SdTitle.Section, { children: title }),
2132
+ /* @__PURE__ */ jsx35(SdText.Body, { maw: 480, children: description })
1933
2133
  ] }),
1934
- /* @__PURE__ */ jsxs21(Group12, { gap: "sm", justify: "center", children: [
1935
- onHome && /* @__PURE__ */ jsx34(SdButton.Primary, { onClick: onHome, children: "\uD648\uC73C\uB85C" }),
1936
- onBack && /* @__PURE__ */ jsx34(SdButton.Ghost, { onClick: onBack, children: "\uB4A4\uB85C \uAC00\uAE30" })
2134
+ /* @__PURE__ */ jsxs22(Group12, { gap: "sm", justify: "center", children: [
2135
+ onHome && /* @__PURE__ */ jsx35(SdButton.Primary, { onClick: onHome, children: "\uD648\uC73C\uB85C" }),
2136
+ onBack && /* @__PURE__ */ jsx35(SdButton.Ghost, { onClick: onBack, children: "\uB4A4\uB85C \uAC00\uAE30" })
1937
2137
  ] })
1938
2138
  ] }) }) });
1939
2139
  }
@@ -1947,7 +2147,7 @@ var SdErrorViewPage = SdErrorView.Page;
1947
2147
  var SdErrorViewNotFound = SdErrorView.NotFound;
1948
2148
 
1949
2149
  // ui/organism/LoginView.tsx
1950
- import { Box as Box15, Center as Center5, Checkbox as Checkbox2, Divider as Divider4, Group as Group13, Paper, SimpleGrid as SimpleGrid7, Stack as Stack22 } from "@mantine/core";
2150
+ import { Box as Box16, Center as Center5, Checkbox as Checkbox2, Divider as Divider4, Group as Group13, Paper, SimpleGrid as SimpleGrid7, Stack as Stack22 } from "@mantine/core";
1951
2151
  import {
1952
2152
  IconBrandApple,
1953
2153
  IconBrandGithub as IconBrandGithub2,
@@ -1973,7 +2173,7 @@ var brandDotTexture = {
1973
2173
  };
1974
2174
 
1975
2175
  // ui/organism/LoginView.tsx
1976
- import { Fragment as Fragment6, jsx as jsx35, jsxs as jsxs22 } from "react/jsx-runtime";
2176
+ import { Fragment as Fragment6, jsx as jsx36, jsxs as jsxs23 } from "react/jsx-runtime";
1977
2177
  var SOCIAL_META = {
1978
2178
  google: { Icon: IconBrandGoogle, label: "\uAD6C\uAE00\uB85C \uB85C\uADF8\uC778" },
1979
2179
  kakao: { Icon: IconBrandKakaoTalk, label: "\uCE74\uCE74\uC624\uB85C \uB85C\uADF8\uC778" },
@@ -2002,9 +2202,9 @@ function LoginForm({
2002
2202
  remember: data.get("remember") === "on"
2003
2203
  });
2004
2204
  }
2005
- return /* @__PURE__ */ jsx35("form", { onSubmit: handleSubmit, noValidate: true, children: /* @__PURE__ */ jsxs22(Stack22, { gap: "md", children: [
2006
- error && /* @__PURE__ */ jsx35(SdText.Error, { children: error }),
2007
- /* @__PURE__ */ jsx35(
2205
+ return /* @__PURE__ */ jsx36("form", { onSubmit: handleSubmit, noValidate: true, children: /* @__PURE__ */ jsxs23(Stack22, { gap: "md", children: [
2206
+ error && /* @__PURE__ */ jsx36(SdText.Error, { children: error }),
2207
+ /* @__PURE__ */ jsx36(
2008
2208
  SdInput.Email,
2009
2209
  {
2010
2210
  name: "email",
@@ -2014,7 +2214,7 @@ function LoginForm({
2014
2214
  required: true
2015
2215
  }
2016
2216
  ),
2017
- /* @__PURE__ */ jsx35(
2217
+ /* @__PURE__ */ jsx36(
2018
2218
  SdInput.Password,
2019
2219
  {
2020
2220
  name: "password",
@@ -2024,50 +2224,50 @@ function LoginForm({
2024
2224
  required: true
2025
2225
  }
2026
2226
  ),
2027
- (withRemember || findPasswordHref) && /* @__PURE__ */ jsxs22(Group13, { justify: "space-between", align: "center", wrap: "nowrap", children: [
2028
- withRemember ? /* @__PURE__ */ jsx35(Checkbox2, { name: "remember", size: "xs", label: "\uC790\uB3D9 \uB85C\uADF8\uC778" }) : /* @__PURE__ */ jsx35("span", {}),
2029
- findPasswordHref && /* @__PURE__ */ jsx35(SdLink.Sub, { href: findPasswordHref, children: "\uBE44\uBC00\uBC88\uD638\uB97C \uC78A\uC73C\uC168\uB098\uC694?" })
2227
+ (withRemember || findPasswordHref) && /* @__PURE__ */ jsxs23(Group13, { justify: "space-between", align: "center", wrap: "nowrap", children: [
2228
+ withRemember ? /* @__PURE__ */ jsx36(Checkbox2, { name: "remember", size: "xs", label: "\uC790\uB3D9 \uB85C\uADF8\uC778" }) : /* @__PURE__ */ jsx36("span", {}),
2229
+ findPasswordHref && /* @__PURE__ */ jsx36(SdLink.Sub, { href: findPasswordHref, children: "\uBE44\uBC00\uBC88\uD638\uB97C \uC78A\uC73C\uC168\uB098\uC694?" })
2030
2230
  ] }),
2031
- /* @__PURE__ */ jsx35(
2231
+ /* @__PURE__ */ jsx36(
2032
2232
  SdButton.Primary,
2033
2233
  {
2034
2234
  type: "submit",
2035
2235
  fullWidth: true,
2036
2236
  loading,
2037
- leftSection: /* @__PURE__ */ jsx35(IconLogin2, { size: 16 }),
2237
+ leftSection: /* @__PURE__ */ jsx36(IconLogin2, { size: 16 }),
2038
2238
  children: submitLabel
2039
2239
  }
2040
2240
  ),
2041
- socials && socials.length > 0 && /* @__PURE__ */ jsxs22(Fragment6, { children: [
2042
- /* @__PURE__ */ jsx35(Divider4, { label: "\uB610\uB294", labelPosition: "center" }),
2043
- /* @__PURE__ */ jsx35(Stack22, { gap: "xs", children: socials.map((social) => {
2241
+ socials && socials.length > 0 && /* @__PURE__ */ jsxs23(Fragment6, { children: [
2242
+ /* @__PURE__ */ jsx36(Divider4, { label: "\uB610\uB294", labelPosition: "center" }),
2243
+ /* @__PURE__ */ jsx36(Stack22, { gap: "xs", children: socials.map((social) => {
2044
2244
  var _a4;
2045
2245
  const { Icon, label } = SOCIAL_META[social.provider];
2046
- return /* @__PURE__ */ jsx35(
2246
+ return /* @__PURE__ */ jsx36(
2047
2247
  SdButton.Outline,
2048
2248
  {
2049
2249
  color: "slate",
2050
2250
  fullWidth: true,
2051
2251
  type: "button",
2052
2252
  onClick: social.onClick,
2053
- leftSection: /* @__PURE__ */ jsx35(Icon, { size: 16 }),
2253
+ leftSection: /* @__PURE__ */ jsx36(Icon, { size: 16 }),
2054
2254
  children: (_a4 = social.label) != null ? _a4 : label
2055
2255
  },
2056
2256
  social.provider
2057
2257
  );
2058
2258
  }) })
2059
2259
  ] }),
2060
- signUpHref && /* @__PURE__ */ jsxs22(Group13, { gap: 6, justify: "center", children: [
2061
- /* @__PURE__ */ jsx35(SdText.Sub, { children: "\uC544\uC9C1 \uACC4\uC815\uC774 \uC5C6\uC73C\uC2E0\uAC00\uC694?" }),
2062
- /* @__PURE__ */ jsx35(SdLink.Sub, { href: signUpHref, c: "primary.6", children: "\uD68C\uC6D0\uAC00\uC785" })
2260
+ signUpHref && /* @__PURE__ */ jsxs23(Group13, { gap: 6, justify: "center", children: [
2261
+ /* @__PURE__ */ jsx36(SdText.Sub, { children: "\uC544\uC9C1 \uACC4\uC815\uC774 \uC5C6\uC73C\uC2E0\uAC00\uC694?" }),
2262
+ /* @__PURE__ */ jsx36(SdLink.Sub, { href: signUpHref, c: "primary.6", children: "\uD68C\uC6D0\uAC00\uC785" })
2063
2263
  ] }),
2064
2264
  children
2065
2265
  ] }) });
2066
2266
  }
2067
2267
  function FormHeader({ title, description }) {
2068
- return /* @__PURE__ */ jsxs22(Stack22, { gap: "lg", children: [
2069
- /* @__PURE__ */ jsx35(Logo, { size: "sm" }),
2070
- /* @__PURE__ */ jsx35(SdTextBox.Card, { title, description: description != null ? description : "" })
2268
+ return /* @__PURE__ */ jsxs23(Stack22, { gap: "lg", children: [
2269
+ /* @__PURE__ */ jsx36(Logo, { size: "sm" }),
2270
+ /* @__PURE__ */ jsx36(SdTextBox.Card, { title, description: description != null ? description : "" })
2071
2271
  ] });
2072
2272
  }
2073
2273
  function Card7(_a4) {
@@ -2080,9 +2280,9 @@ function Card7(_a4) {
2080
2280
  "description",
2081
2281
  "mih"
2082
2282
  ]);
2083
- return /* @__PURE__ */ jsx35(Center5, { mih, bg: "slate.0", p: "md", children: /* @__PURE__ */ jsx35(Paper, { w: "100%", maw: 420, p: { base: "lg", sm: "xl" }, radius: "lg", withBorder: true, shadow: "sm", children: /* @__PURE__ */ jsxs22(Stack22, { gap: "xl", children: [
2084
- /* @__PURE__ */ jsx35(FormHeader, { title, description }),
2085
- /* @__PURE__ */ jsx35(LoginForm, __spreadValues({}, formProps))
2283
+ return /* @__PURE__ */ jsx36(Center5, { mih, bg: "slate.0", p: "md", children: /* @__PURE__ */ jsx36(Paper, { w: "100%", maw: 420, p: { base: "lg", sm: "xl" }, radius: "lg", withBorder: true, shadow: "sm", children: /* @__PURE__ */ jsxs23(Stack22, { gap: "xl", children: [
2284
+ /* @__PURE__ */ jsx36(FormHeader, { title, description }),
2285
+ /* @__PURE__ */ jsx36(LoginForm, __spreadValues({}, formProps))
2086
2286
  ] }) }) });
2087
2287
  }
2088
2288
  function Split(_a4) {
@@ -2099,16 +2299,16 @@ function Split(_a4) {
2099
2299
  "brandDescription",
2100
2300
  "mih"
2101
2301
  ]);
2102
- return /* @__PURE__ */ jsxs22(SimpleGrid7, { cols: { base: 1, md: 2 }, spacing: 0, mih, children: [
2103
- /* @__PURE__ */ jsxs22(
2104
- Box15,
2302
+ return /* @__PURE__ */ jsxs23(SimpleGrid7, { cols: { base: 1, md: 2 }, spacing: 0, mih, children: [
2303
+ /* @__PURE__ */ jsxs23(
2304
+ Box16,
2105
2305
  {
2106
2306
  visibleFrom: "md",
2107
2307
  pos: "relative",
2108
2308
  style: __spreadValues({ overflow: "hidden", display: "flex", alignItems: "flex-end" }, brandSurface),
2109
2309
  children: [
2110
- /* @__PURE__ */ jsx35(Box15, { "aria-hidden": true, pos: "absolute", inset: 0, style: brandDotTexture }),
2111
- /* @__PURE__ */ jsx35(Box15, { pos: "relative", p: 48, style: { zIndex: 1, width: "100%" }, children: /* @__PURE__ */ jsx35(
2310
+ /* @__PURE__ */ jsx36(Box16, { "aria-hidden": true, pos: "absolute", inset: 0, style: brandDotTexture }),
2311
+ /* @__PURE__ */ jsx36(Box16, { pos: "relative", p: 48, style: { zIndex: 1, width: "100%" }, children: /* @__PURE__ */ jsx36(
2112
2312
  SdTextBox.Hero,
2113
2313
  {
2114
2314
  title: brandTitle,
@@ -2122,9 +2322,9 @@ function Split(_a4) {
2122
2322
  ]
2123
2323
  }
2124
2324
  ),
2125
- /* @__PURE__ */ jsx35(Center5, { p: { base: "md", sm: "xl" }, bg: "white", children: /* @__PURE__ */ jsxs22(Stack22, { gap: "xl", w: "100%", maw: 400, children: [
2126
- /* @__PURE__ */ jsx35(FormHeader, { title, description }),
2127
- /* @__PURE__ */ jsx35(LoginForm, __spreadValues({}, formProps))
2325
+ /* @__PURE__ */ jsx36(Center5, { p: { base: "md", sm: "xl" }, bg: "white", children: /* @__PURE__ */ jsxs23(Stack22, { gap: "xl", w: "100%", maw: 400, children: [
2326
+ /* @__PURE__ */ jsx36(FormHeader, { title, description }),
2327
+ /* @__PURE__ */ jsx36(LoginForm, __spreadValues({}, formProps))
2128
2328
  ] }) })
2129
2329
  ] });
2130
2330
  }
@@ -2138,11 +2338,11 @@ var SdLoginViewCard = SdLoginView.Card;
2138
2338
  var SdLoginViewSplit = SdLoginView.Split;
2139
2339
 
2140
2340
  // ui/organism/Result.tsx
2141
- import { Box as Box16, Center as Center6, Group as Group14, Stack as Stack23 } from "@mantine/core";
2341
+ import { Box as Box17, Center as Center6, Group as Group14, Stack as Stack23 } from "@mantine/core";
2142
2342
  import { IconCircleCheck, IconCircleX } from "@tabler/icons-react";
2143
- import { jsx as jsx36, jsxs as jsxs23 } from "react/jsx-runtime";
2343
+ import { jsx as jsx37, jsxs as jsxs24 } from "react/jsx-runtime";
2144
2344
  function ResultIcon({ color, Icon }) {
2145
- return /* @__PURE__ */ jsx36(Center6, { w: 88, h: 88, bg: `${color}.0`, style: { borderRadius: "50%" }, "aria-hidden": true, children: /* @__PURE__ */ jsx36(Icon, { size: 48, stroke: 1.5, color: `var(--mantine-color-${color}-6)` }) });
2345
+ return /* @__PURE__ */ jsx37(Center6, { w: 88, h: 88, bg: `${color}.0`, style: { borderRadius: "50%" }, "aria-hidden": true, children: /* @__PURE__ */ jsx37(Icon, { size: 48, stroke: 1.5, color: `var(--mantine-color-${color}-6)` }) });
2146
2346
  }
2147
2347
  function createResult(defaults) {
2148
2348
  return function SdResult2({
@@ -2153,16 +2353,16 @@ function createResult(defaults) {
2153
2353
  children,
2154
2354
  mih = "60vh"
2155
2355
  }) {
2156
- return /* @__PURE__ */ jsx36(Center6, { mih, children: /* @__PURE__ */ jsx36(SdContainer, { children: /* @__PURE__ */ jsxs23(Stack23, { align: "center", gap: "lg", ta: "center", children: [
2157
- /* @__PURE__ */ jsx36(ResultIcon, { color: defaults.color, Icon: defaults.Icon }),
2158
- /* @__PURE__ */ jsxs23(Stack23, { gap: "sm", align: "center", children: [
2159
- /* @__PURE__ */ jsx36(SdTitle.Section, { children: title }),
2160
- description && /* @__PURE__ */ jsx36(SdText.Body, { maw: 480, children: description })
2356
+ return /* @__PURE__ */ jsx37(Center6, { mih, children: /* @__PURE__ */ jsx37(SdContainer, { children: /* @__PURE__ */ jsxs24(Stack23, { align: "center", gap: "lg", ta: "center", children: [
2357
+ /* @__PURE__ */ jsx37(ResultIcon, { color: defaults.color, Icon: defaults.Icon }),
2358
+ /* @__PURE__ */ jsxs24(Stack23, { gap: "sm", align: "center", children: [
2359
+ /* @__PURE__ */ jsx37(SdTitle.Section, { children: title }),
2360
+ description && /* @__PURE__ */ jsx37(SdText.Body, { maw: 480, children: description })
2161
2361
  ] }),
2162
- children && /* @__PURE__ */ jsx36(Box16, { children }),
2163
- (primaryAction || secondaryAction) && /* @__PURE__ */ jsxs23(Group14, { gap: "sm", justify: "center", children: [
2164
- primaryAction && /* @__PURE__ */ jsx36(SdButton.Primary, { onClick: primaryAction.onClick, children: primaryAction.label }),
2165
- secondaryAction && /* @__PURE__ */ jsx36(SdButton.Ghost, { onClick: secondaryAction.onClick, children: secondaryAction.label })
2362
+ children && /* @__PURE__ */ jsx37(Box17, { children }),
2363
+ (primaryAction || secondaryAction) && /* @__PURE__ */ jsxs24(Group14, { gap: "sm", justify: "center", children: [
2364
+ primaryAction && /* @__PURE__ */ jsx37(SdButton.Primary, { onClick: primaryAction.onClick, children: primaryAction.label }),
2365
+ secondaryAction && /* @__PURE__ */ jsx37(SdButton.Ghost, { onClick: secondaryAction.onClick, children: secondaryAction.label })
2166
2366
  ] })
2167
2367
  ] }) }) });
2168
2368
  };
@@ -2186,10 +2386,11 @@ var SdResultError = SdResult.Error;
2186
2386
 
2187
2387
  // ui/template/MainLayout.tsx
2188
2388
  import { AppShell } from "@mantine/core";
2189
- import { jsx as jsx37, jsxs as jsxs24 } from "react/jsx-runtime";
2389
+ import { jsx as jsx38, jsxs as jsxs25 } from "react/jsx-runtime";
2190
2390
  var headers = {
2191
2391
  mega: SdHeader.Mega,
2192
- simple: SdHeader.Simple
2392
+ simple: SdHeader.Simple,
2393
+ panel: SdHeader.Panel
2193
2394
  };
2194
2395
  function MainLayout({
2195
2396
  children,
@@ -2199,45 +2400,65 @@ function MainLayout({
2199
2400
  headerVariant = "mega"
2200
2401
  }) {
2201
2402
  const Header = headers[headerVariant];
2202
- return /* @__PURE__ */ jsxs24(AppShell, { header: { height: 60 }, children: [
2203
- /* @__PURE__ */ jsx37(AppShell.Header, { children: /* @__PURE__ */ jsx37(Header, { navItems, loginFlag }) }),
2204
- /* @__PURE__ */ jsx37(AppShell.Main, { children }),
2205
- /* @__PURE__ */ jsx37(SdFooter, { company: companyInfo, navItems })
2403
+ return /* @__PURE__ */ jsxs25(AppShell, { header: { height: 60 }, children: [
2404
+ /* @__PURE__ */ jsx38(AppShell.Header, { children: /* @__PURE__ */ jsx38(Header, { navItems, loginFlag }) }),
2405
+ /* @__PURE__ */ jsx38(AppShell.Main, { children }),
2406
+ /* @__PURE__ */ jsx38(SdFooter, { company: companyInfo, navItems })
2206
2407
  ] });
2207
2408
  }
2208
2409
 
2209
2410
  // ui/template/PageLayout.tsx
2210
- import { Box as Box17, Divider as Divider5, Group as Group15, Space, Stack as Stack24 } from "@mantine/core";
2211
- import { Fragment as Fragment7, jsx as jsx38, jsxs as jsxs25 } from "react/jsx-runtime";
2411
+ import { Box as Box18, Divider as Divider5, Group as Group15, Space, Stack as Stack24 } from "@mantine/core";
2412
+ import { Fragment as Fragment7, jsx as jsx39, jsxs as jsxs26 } from "react/jsx-runtime";
2212
2413
  var HERO_MIN_H = "38svh";
2213
2414
  var HERO_PY = { base: 56, sm: 88 };
2214
2415
  var HERO_MAW = 680;
2215
- function Content({ children }) {
2216
- return /* @__PURE__ */ jsx38(SdContainer, { py: "xl", children: /* @__PURE__ */ jsx38(Stack24, { gap: "xl", children }) });
2416
+ function Content({
2417
+ children,
2418
+ navItems,
2419
+ breadcrumb = true,
2420
+ currentHref
2421
+ }) {
2422
+ const showBreadcrumb = breadcrumb && !!navItems && navItems.length > 0;
2423
+ return /* @__PURE__ */ jsxs26(SdContainer, { py: "xl", children: [
2424
+ showBreadcrumb && /* @__PURE__ */ jsx39(SdBreadcrumb, { navItems, currentHref, mb: "lg" }),
2425
+ /* @__PURE__ */ jsx39(Stack24, { gap: "xl", children })
2426
+ ] });
2217
2427
  }
2218
2428
  function LayoutGap() {
2219
- return /* @__PURE__ */ jsx38(Space, { h: 48 });
2429
+ return /* @__PURE__ */ jsx39(Space, {});
2220
2430
  }
2221
- function Minimal({ label, title, description, children }) {
2222
- return /* @__PURE__ */ jsxs25(Plain2, { children: [
2223
- /* @__PURE__ */ jsx38(SdTextBox.Section, { label, title, description: description != null ? description : "" }),
2224
- /* @__PURE__ */ jsx38(Divider5, {}),
2431
+ function Minimal({
2432
+ label,
2433
+ title,
2434
+ description,
2435
+ children,
2436
+ navItems,
2437
+ breadcrumb,
2438
+ currentHref
2439
+ }) {
2440
+ return /* @__PURE__ */ jsxs26(Plain2, { navItems, breadcrumb, currentHref, children: [
2441
+ /* @__PURE__ */ jsx39(LayoutGap, {}),
2442
+ /* @__PURE__ */ jsx39(SdTextBox.Section, { label, title, description: description != null ? description : "" }),
2443
+ /* @__PURE__ */ jsx39(Divider5, {}),
2225
2444
  children
2226
2445
  ] });
2227
2446
  }
2228
- function Plain2({ children }) {
2229
- return /* @__PURE__ */ jsxs25(Fragment7, { children: [
2230
- /* @__PURE__ */ jsx38(LayoutGap, {}),
2231
- /* @__PURE__ */ jsx38(Content, { children })
2232
- ] });
2447
+ function Plain2({
2448
+ children,
2449
+ navItems,
2450
+ breadcrumb,
2451
+ currentHref
2452
+ }) {
2453
+ return /* @__PURE__ */ jsx39(Fragment7, { children: /* @__PURE__ */ jsx39(Content, { navItems, breadcrumb, currentHref, children }) });
2233
2454
  }
2234
2455
  function HeroCopy({ label, title, description }) {
2235
- return /* @__PURE__ */ jsxs25(Stack24, { gap: "md", maw: HERO_MAW, children: [
2236
- label && /* @__PURE__ */ jsxs25(Group15, { gap: "sm", align: "center", wrap: "nowrap", children: [
2237
- /* @__PURE__ */ jsx38(Box17, { w: 28, h: 2, bg: "primary.3", style: { borderRadius: 2 } }),
2238
- /* @__PURE__ */ jsx38(SdText.Eyebrow, { c: "primary.1", children: label })
2456
+ return /* @__PURE__ */ jsxs26(Stack24, { gap: "md", maw: HERO_MAW, children: [
2457
+ label && /* @__PURE__ */ jsxs26(Group15, { gap: "sm", align: "center", wrap: "nowrap", children: [
2458
+ /* @__PURE__ */ jsx39(Box18, { w: 28, h: 2, bg: "primary.3", style: { borderRadius: 2 } }),
2459
+ /* @__PURE__ */ jsx39(SdText.Eyebrow, { c: "primary.1", children: label })
2239
2460
  ] }),
2240
- /* @__PURE__ */ jsx38(
2461
+ /* @__PURE__ */ jsx39(
2241
2462
  SdTextBox.Hero,
2242
2463
  {
2243
2464
  title,
@@ -2250,10 +2471,19 @@ function HeroCopy({ label, title, description }) {
2250
2471
  )
2251
2472
  ] });
2252
2473
  }
2253
- function Image2({ image, label, title, description, children }) {
2254
- return /* @__PURE__ */ jsxs25(Fragment7, { children: [
2255
- /* @__PURE__ */ jsxs25(
2256
- Box17,
2474
+ function Image2({
2475
+ image,
2476
+ label,
2477
+ title,
2478
+ description,
2479
+ children,
2480
+ navItems,
2481
+ breadcrumb,
2482
+ currentHref
2483
+ }) {
2484
+ return /* @__PURE__ */ jsxs26(Fragment7, { children: [
2485
+ /* @__PURE__ */ jsxs26(
2486
+ Box18,
2257
2487
  {
2258
2488
  pos: "relative",
2259
2489
  style: {
@@ -2266,8 +2496,8 @@ function Image2({ image, label, title, description, children }) {
2266
2496
  backgroundColor: "var(--mantine-color-slate-9)"
2267
2497
  },
2268
2498
  children: [
2269
- /* @__PURE__ */ jsx38(
2270
- Box17,
2499
+ /* @__PURE__ */ jsx39(
2500
+ Box18,
2271
2501
  {
2272
2502
  "aria-hidden": true,
2273
2503
  pos: "absolute",
@@ -2277,17 +2507,25 @@ function Image2({ image, label, title, description, children }) {
2277
2507
  }
2278
2508
  }
2279
2509
  ),
2280
- /* @__PURE__ */ jsx38(SdContainer, { pos: "relative", py: HERO_PY, style: { zIndex: 1, width: "100%" }, children: /* @__PURE__ */ jsx38(HeroCopy, { label, title, description }) })
2510
+ /* @__PURE__ */ jsx39(SdContainer, { pos: "relative", py: HERO_PY, style: { zIndex: 1, width: "100%" }, children: /* @__PURE__ */ jsx39(HeroCopy, { label, title, description }) })
2281
2511
  ]
2282
2512
  }
2283
2513
  ),
2284
- /* @__PURE__ */ jsx38(Content, { children })
2514
+ /* @__PURE__ */ jsx39(Content, { navItems, breadcrumb, currentHref, children })
2285
2515
  ] });
2286
2516
  }
2287
- function Brand({ label, title, description, children }) {
2288
- return /* @__PURE__ */ jsxs25(Fragment7, { children: [
2289
- /* @__PURE__ */ jsxs25(
2290
- Box17,
2517
+ function Brand({
2518
+ label,
2519
+ title,
2520
+ description,
2521
+ children,
2522
+ navItems,
2523
+ breadcrumb,
2524
+ currentHref
2525
+ }) {
2526
+ return /* @__PURE__ */ jsxs26(Fragment7, { children: [
2527
+ /* @__PURE__ */ jsxs26(
2528
+ Box18,
2291
2529
  {
2292
2530
  pos: "relative",
2293
2531
  style: __spreadValues({
@@ -2298,12 +2536,12 @@ function Brand({ label, title, description, children }) {
2298
2536
  borderBottom: "1px solid var(--mantine-color-slate-8)"
2299
2537
  }, brandSurface),
2300
2538
  children: [
2301
- /* @__PURE__ */ jsx38(Box17, { "aria-hidden": true, pos: "absolute", inset: 0, style: brandDotTexture }),
2302
- /* @__PURE__ */ jsx38(SdContainer, { pos: "relative", py: HERO_PY, style: { zIndex: 1, width: "100%" }, children: /* @__PURE__ */ jsx38(HeroCopy, { label, title, description }) })
2539
+ /* @__PURE__ */ jsx39(Box18, { "aria-hidden": true, pos: "absolute", inset: 0, style: brandDotTexture }),
2540
+ /* @__PURE__ */ jsx39(SdContainer, { pos: "relative", py: HERO_PY, style: { zIndex: 1, width: "100%" }, children: /* @__PURE__ */ jsx39(HeroCopy, { label, title, description }) })
2303
2541
  ]
2304
2542
  }
2305
2543
  ),
2306
- /* @__PURE__ */ jsx38(Content, { children })
2544
+ /* @__PURE__ */ jsx39(Content, { navItems, breadcrumb, currentHref, children })
2307
2545
  ] });
2308
2546
  }
2309
2547
  var PageLayout = {
@@ -2565,7 +2803,6 @@ var theme = createTheme({
2565
2803
  Anchor: {
2566
2804
  defaultProps: { c: "slate.5", fz: "sm", underline: "never" }
2567
2805
  },
2568
- // SdHeader 모바일 드로어의 2단 아코디언 타이포를 SdLink와 맞춘다.
2569
2806
  NavLink: {
2570
2807
  defaultProps: { c: "slate.7", fz: "sm" }
2571
2808
  },
@@ -2593,6 +2830,7 @@ export {
2593
2830
  SdBadgePrimary,
2594
2831
  SdBadgeSuccess,
2595
2832
  SdBadgeWarning,
2833
+ SdBreadcrumb,
2596
2834
  SdButton,
2597
2835
  SdButtonCancel,
2598
2836
  SdButtonDelete,
@@ -2624,6 +2862,7 @@ export {
2624
2862
  SdFooter,
2625
2863
  SdHeader,
2626
2864
  SdHeaderMega,
2865
+ SdHeaderPanel,
2627
2866
  SdHeaderSimple,
2628
2867
  SdInput,
2629
2868
  SdInputAutocomplete,