@yeongseoksong/framework 1.4.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/ui/index.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,96 @@ 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
+
1531
+ // ui/template/NavProvider.tsx
1532
+ import { createContext, useContext } from "react";
1533
+ import { jsx as jsx28 } from "react/jsx-runtime";
1534
+ var NavContext = createContext([]);
1535
+ function NavProvider({
1536
+ children,
1537
+ navItems
1538
+ }) {
1539
+ return /* @__PURE__ */ jsx28(NavContext.Provider, { value: navItems, children });
1540
+ }
1541
+ function useNav() {
1542
+ return useContext(NavContext);
1543
+ }
1544
+
1545
+ // ui/molecule/Breadcrumb.tsx
1546
+ import { jsx as jsx29, jsxs as jsxs15 } from "react/jsx-runtime";
1547
+ function normalizePath(href) {
1548
+ if (!href) return "";
1549
+ const trimmed = href.replace(/\/+$/, "");
1550
+ return trimmed === "" ? "/" : trimmed;
1551
+ }
1552
+ function buildTrail(navItems, currentHref) {
1553
+ const target = normalizePath(currentHref);
1554
+ const byId = new Map(navItems.map((item) => [item.id, item]));
1555
+ let current = navItems.find((item) => normalizePath(item.href) === target);
1556
+ if (!current) {
1557
+ current = navItems.filter((item) => item.href && target.startsWith(normalizePath(item.href) + "/")).sort((a, b) => normalizePath(b.href).length - normalizePath(a.href).length)[0];
1558
+ }
1559
+ if (!current) return [];
1560
+ const trail = [];
1561
+ const seen = /* @__PURE__ */ new Set();
1562
+ let node = current;
1563
+ while (node && !seen.has(node.id)) {
1564
+ seen.add(node.id);
1565
+ trail.unshift(node);
1566
+ node = node.parentId != null ? byId.get(node.parentId) : void 0;
1567
+ }
1568
+ return trail;
1569
+ }
1570
+ function SdBreadcrumb(_a4) {
1571
+ var _b = _a4, {
1572
+ navItems: navItemsProp,
1573
+ currentHref,
1574
+ homeHref = "/",
1575
+ homeLabel = "\uD648"
1576
+ } = _b, boxProps = __objRest(_b, [
1577
+ "navItems",
1578
+ "currentHref",
1579
+ "homeHref",
1580
+ "homeLabel"
1581
+ ]);
1582
+ var _a5;
1583
+ const navFromContext = useNav();
1584
+ const navItems = navItemsProp != null ? navItemsProp : navFromContext;
1585
+ const pathname = usePathname();
1586
+ const trail = buildTrail(navItems, (_a5 = currentHref != null ? currentHref : pathname) != null ? _a5 : "");
1587
+ return /* @__PURE__ */ jsx29(Box11, __spreadProps(__spreadValues({}, boxProps), { children: /* @__PURE__ */ jsxs15(
1588
+ Breadcrumbs,
1589
+ {
1590
+ separator: /* @__PURE__ */ jsx29(IconChevronRight, { size: 14, stroke: 2, color: "var(--mantine-color-slate-4)" }),
1591
+ separatorMargin: "xs",
1592
+ children: [
1593
+ /* @__PURE__ */ jsx29(
1594
+ SdLink.Sub,
1595
+ {
1596
+ href: homeHref,
1597
+ "aria-label": homeLabel,
1598
+ style: { display: "inline-flex", alignItems: "center" },
1599
+ children: /* @__PURE__ */ jsx29(IconHome, { size: 16, stroke: 2 })
1600
+ }
1601
+ ),
1602
+ trail.map((item, i) => {
1603
+ const isLast = i === trail.length - 1;
1604
+ return isLast ? /* @__PURE__ */ jsx29(SdLink.Body, { children: item.label }, item.id) : /* @__PURE__ */ jsx29(SdLink.Sub, { href: item.href, children: item.label }, item.id);
1605
+ })
1606
+ ]
1607
+ }
1608
+ ) }));
1609
+ }
1610
+
1494
1611
  // ui/organism/HeroCarousel.tsx
1495
1612
  import { Carousel } from "@mantine/carousel";
1496
- import { Anchor as Anchor2, Box as Box11, Group as Group9, Stack as Stack15 } from "@mantine/core";
1613
+ import { Anchor as Anchor2, Box as Box12, Group as Group9, Stack as Stack15 } from "@mantine/core";
1497
1614
  import { IconArrowNarrowRight } from "@tabler/icons-react";
1498
- import { Fragment as Fragment3, jsx as jsx28, jsxs as jsxs15 } from "react/jsx-runtime";
1615
+ import { Fragment as Fragment3, jsx as jsx30, jsxs as jsxs16 } from "react/jsx-runtime";
1499
1616
  var variantMap = {
1500
1617
  primary: SdButton.Primary,
1501
1618
  secondary: SdButton.Secondary,
@@ -1505,13 +1622,13 @@ var variantMap = {
1505
1622
  function CtaButton({ cta }) {
1506
1623
  var _a4;
1507
1624
  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 }) });
1625
+ return /* @__PURE__ */ jsx30(Anchor2, { href: cta.href, underline: "never", children: cta.icon ? /* @__PURE__ */ jsx30(Button3, { size: "md", rightSection: /* @__PURE__ */ jsx30(IconArrowNarrowRight, {}), children: cta.label }) : /* @__PURE__ */ jsx30(Button3, { size: "md", children: cta.label }) });
1509
1626
  }
1510
1627
  function HeroCarousel({ slides, children }) {
1511
- if (children) return /* @__PURE__ */ jsx28(Fragment3, { children });
1628
+ if (children) return /* @__PURE__ */ jsx30(Fragment3, { children });
1512
1629
  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,
1630
+ return /* @__PURE__ */ jsx30(Carousel, { withIndicators: true, height: "60svh", children: filterdSlides.map((slide, i) => /* @__PURE__ */ jsx30(Carousel.Slide, { children: /* @__PURE__ */ jsx30(
1631
+ Box12,
1515
1632
  {
1516
1633
  style: {
1517
1634
  height: "100%",
@@ -1522,8 +1639,8 @@ function HeroCarousel({ slides, children }) {
1522
1639
  alignItems: "center",
1523
1640
  justifyContent: "center"
1524
1641
  },
1525
- children: /* @__PURE__ */ jsxs15(Stack15, { align: "center", style: { textAlign: "center", maxWidth: 780 }, px: "xl", children: [
1526
- /* @__PURE__ */ jsx28(
1642
+ children: /* @__PURE__ */ jsxs16(Stack15, { align: "center", style: { textAlign: "center", maxWidth: 780 }, px: "xl", children: [
1643
+ /* @__PURE__ */ jsx30(
1527
1644
  SdTextBox.Hero,
1528
1645
  {
1529
1646
  title: slide.title,
@@ -1532,18 +1649,27 @@ function HeroCarousel({ slides, children }) {
1532
1649
  align: "center"
1533
1650
  }
1534
1651
  ),
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)) })
1652
+ slide.ctas && slide.ctas.length > 0 && /* @__PURE__ */ jsx30(Group9, { gap: "sm", mt: "md", children: slide.ctas.map((cta, i2) => /* @__PURE__ */ jsx30(CtaButton, { cta }, cta.href)) })
1536
1653
  ] })
1537
1654
  }
1538
1655
  ) }, i)) });
1539
1656
  }
1540
1657
 
1541
1658
  // ui/organism/Header.tsx
1542
- import { Box as Box12, Burger, Drawer, Group as Group10, Menu, NavLink, Stack as Stack16 } from "@mantine/core";
1659
+ import { Box as Box13, Burger, Drawer, Group as Group10, Menu, NavLink, Stack as Stack16 } from "@mantine/core";
1543
1660
  import { IconChevronDown } from "@tabler/icons-react";
1544
1661
  import { useDisclosure, useFocusWithin, useHover, useMergedRef } from "@mantine/hooks";
1545
- import { Fragment as Fragment4, jsx as jsx29, jsxs as jsxs16 } from "react/jsx-runtime";
1662
+ import { Fragment as Fragment4, jsx as jsx31, jsxs as jsxs17 } from "react/jsx-runtime";
1546
1663
  var BAR_HEIGHT = 60;
1664
+ var MAX_DEPTH = 3;
1665
+ var NAV_LINK_STYLES = {
1666
+ label: {
1667
+ fontWeight: textStyles.Body.fw,
1668
+ fontSize: `var(--mantine-font-size-${textStyles.Body.fz})`,
1669
+ color: toCssColor(textStyles.Body.c),
1670
+ lineHeight: textStyles.Body.lh
1671
+ }
1672
+ };
1547
1673
  function useNavTree(navItems) {
1548
1674
  const visibleItems = filterAndSort(navItems);
1549
1675
  return {
@@ -1552,27 +1678,36 @@ function useNavTree(navItems) {
1552
1678
  hasAnyChildren: visibleItems.some((item) => item.parentId)
1553
1679
  };
1554
1680
  }
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,
1681
+ function MobileNavNode({ item, depth, childrenOf, close }) {
1682
+ const kids = depth < MAX_DEPTH ? childrenOf(item.id) : [];
1683
+ if (kids.length === 0) {
1684
+ return /* @__PURE__ */ jsx31(Box13, { px: "sm", py: 8, children: /* @__PURE__ */ jsx31(SdLink.Body, { href: item.href, onClick: close, children: item.label }) });
1685
+ }
1686
+ return /* @__PURE__ */ jsx31(
1687
+ NavLink,
1688
+ {
1689
+ label: item.label,
1690
+ styles: NAV_LINK_STYLES,
1691
+ component: item.href ? "a" : "button",
1692
+ href: item.href,
1693
+ childrenOffset: 28,
1694
+ children: kids.map((kid) => /* @__PURE__ */ jsx31(
1695
+ MobileNavNode,
1564
1696
  {
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))
1697
+ item: kid,
1698
+ depth: depth + 1,
1699
+ childrenOf,
1700
+ close
1571
1701
  },
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" }) })
1702
+ kid.id
1703
+ ))
1704
+ }
1705
+ );
1706
+ }
1707
+ function MobileNav({ opened, close, topItems, childrenOf, loginFlag }) {
1708
+ return /* @__PURE__ */ jsx31(Drawer, { opened, onClose: close, hiddenFrom: "sm", size: "xs", children: /* @__PURE__ */ jsxs17(Stack16, { gap: 0, children: [
1709
+ topItems.map((item) => /* @__PURE__ */ jsx31(MobileNavNode, { item, depth: 1, childrenOf, close }, item.id)),
1710
+ loginFlag && /* @__PURE__ */ jsx31(Stack16, { gap: "xs", mt: "md", children: /* @__PURE__ */ jsx31(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
1576
1711
  ] }) });
1577
1712
  }
1578
1713
  function MegaHeader({ navItems, loginFlag }) {
@@ -1582,9 +1717,9 @@ function MegaHeader({ navItems, loginFlag }) {
1582
1717
  const { focused, ref: focusRef } = useFocusWithin();
1583
1718
  const rootRef = useMergedRef(hoverRef, focusRef);
1584
1719
  const expanded = hasAnyChildren && (hovered || focused);
1585
- return /* @__PURE__ */ jsxs16(Fragment4, { children: [
1586
- /* @__PURE__ */ jsx29(
1587
- Box12,
1720
+ return /* @__PURE__ */ jsxs17(Fragment4, { children: [
1721
+ /* @__PURE__ */ jsx31(
1722
+ Box13,
1588
1723
  {
1589
1724
  ref: rootRef,
1590
1725
  pos: "relative",
@@ -1594,12 +1729,12 @@ function MegaHeader({ navItems, loginFlag }) {
1594
1729
  borderBottom: expanded ? "1px solid var(--mantine-color-slate-2)" : void 0,
1595
1730
  transition: "box-shadow 0.15s"
1596
1731
  },
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) => {
1732
+ children: /* @__PURE__ */ jsx31(SdContainer, { children: /* @__PURE__ */ jsxs17(Group10, { justify: "space-between", align: "flex-start", wrap: "nowrap", children: [
1733
+ /* @__PURE__ */ jsx31(Group10, { h: BAR_HEIGHT, align: "center", children: /* @__PURE__ */ jsx31(Logo, {}) }),
1734
+ /* @__PURE__ */ jsx31(Group10, { gap: "xl", align: "flex-start", wrap: "nowrap", visibleFrom: "sm", children: topItems.map((item) => {
1600
1735
  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 }) }),
1736
+ return /* @__PURE__ */ jsxs17(Stack16, { gap: 0, align: "center", children: [
1737
+ /* @__PURE__ */ jsx31(Group10, { h: BAR_HEIGHT, align: "center", children: /* @__PURE__ */ jsx31(SdLink.Body, { href: item.href, children: item.label }) }),
1603
1738
  kids.length > 0 && /*
1604
1739
  Mantine Collapse를 쓰지 않는다 — 접힐 때 display:none이 되어
1605
1740
  하위 링크가 폭 계산에서 빠졌다가 펼칠 때 다시 들어오면서
@@ -1607,8 +1742,8 @@ function MegaHeader({ navItems, loginFlag }) {
1607
1742
  height 0 + overflow hidden은 폭 기여를 유지하므로 간격이 고정된다.
1608
1743
  visibility:hidden이 접힌 상태의 링크를 탭 순서에서도 빼준다.
1609
1744
  */
1610
- /* @__PURE__ */ jsx29(
1611
- Box12,
1745
+ /* @__PURE__ */ jsx31(
1746
+ Box13,
1612
1747
  {
1613
1748
  "aria-hidden": !expanded,
1614
1749
  style: {
@@ -1618,19 +1753,28 @@ function MegaHeader({ navItems, loginFlag }) {
1618
1753
  visibility: expanded ? "visible" : "hidden",
1619
1754
  transition: "opacity 0.15s ease"
1620
1755
  },
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)) })
1756
+ children: /* @__PURE__ */ jsx31(Stack16, { gap: "xs", pt: 4, pb: "lg", align: "center", children: kids.map((kid) => {
1757
+ const grandkids = childrenOf(kid.id);
1758
+ if (grandkids.length === 0) {
1759
+ return /* @__PURE__ */ jsx31(SdLink.Body, { href: kid.href, children: kid.label }, kid.id);
1760
+ }
1761
+ return /* @__PURE__ */ jsxs17(Stack16, { gap: 2, align: "center", children: [
1762
+ /* @__PURE__ */ jsx31(SdLink.Body, { href: kid.href, children: kid.label }),
1763
+ grandkids.map((gk) => /* @__PURE__ */ jsx31(SdLink.Sub, { href: gk.href, children: gk.label }, gk.id))
1764
+ ] }, kid.id);
1765
+ }) })
1622
1766
  }
1623
1767
  )
1624
1768
  ] }, item.id);
1625
1769
  }) }),
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" }) })
1770
+ /* @__PURE__ */ jsxs17(Group10, { h: BAR_HEIGHT, align: "center", gap: "sm", wrap: "nowrap", children: [
1771
+ /* @__PURE__ */ jsx31(Burger, { hiddenFrom: "sm", opened, onClick: toggle }),
1772
+ loginFlag && /* @__PURE__ */ jsx31(Group10, { gap: "sm", visibleFrom: "sm", children: /* @__PURE__ */ jsx31(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
1629
1773
  ] })
1630
1774
  ] }) })
1631
1775
  }
1632
1776
  ),
1633
- /* @__PURE__ */ jsx29(
1777
+ /* @__PURE__ */ jsx31(
1634
1778
  MobileNav,
1635
1779
  {
1636
1780
  opened,
@@ -1642,16 +1786,19 @@ function MegaHeader({ navItems, loginFlag }) {
1642
1786
  )
1643
1787
  ] });
1644
1788
  }
1789
+ function renderMenuLeaf(item) {
1790
+ return item.href ? /* @__PURE__ */ jsx31(Menu.Item, { component: "a", href: item.href, children: item.label }, item.id) : /* @__PURE__ */ jsx31(Menu.Label, { children: item.label }, item.id);
1791
+ }
1645
1792
  function SimpleHeader({ navItems, loginFlag }) {
1646
1793
  const [opened, { toggle, close }] = useDisclosure();
1647
1794
  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) => {
1795
+ return /* @__PURE__ */ jsxs17(Fragment4, { children: [
1796
+ /* @__PURE__ */ jsx31(Box13, { bg: "var(--mantine-color-body)", children: /* @__PURE__ */ jsx31(SdContainer, { children: /* @__PURE__ */ jsxs17(Group10, { h: BAR_HEIGHT, justify: "space-between", align: "center", wrap: "nowrap", children: [
1797
+ /* @__PURE__ */ jsx31(Logo, {}),
1798
+ /* @__PURE__ */ jsx31(Group10, { gap: "xl", align: "center", wrap: "nowrap", visibleFrom: "sm", children: topItems.map((item) => {
1652
1799
  const kids = childrenOf(item.id);
1653
1800
  if (kids.length === 0) {
1654
- return /* @__PURE__ */ jsx29(SdLink.Body, { href: item.href, children: item.label }, item.id);
1801
+ return /* @__PURE__ */ jsx31(SdLink.Body, { href: item.href, children: item.label }, item.id);
1655
1802
  }
1656
1803
  return (
1657
1804
  /*
@@ -1659,7 +1806,7 @@ function SimpleHeader({ navItems, loginFlag }) {
1659
1806
  Menu.Target은 ref를 받을 수 있는 단일 엘리먼트여야 하므로
1660
1807
  SdLink/SdText가 아니라 Box를 타깃으로 두고 라벨을 그 안에 넣는다.
1661
1808
  */
1662
- /* @__PURE__ */ jsxs16(
1809
+ /* @__PURE__ */ jsxs17(
1663
1810
  Menu,
1664
1811
  {
1665
1812
  trigger: "click-hover",
@@ -1671,25 +1818,91 @@ function SimpleHeader({ navItems, loginFlag }) {
1671
1818
  radius: "md",
1672
1819
  withinPortal: true,
1673
1820
  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 })
1821
+ /* @__PURE__ */ jsx31(Menu.Target, { children: /* @__PURE__ */ jsx31(Box13, { style: { cursor: "pointer" }, children: /* @__PURE__ */ jsxs17(Group10, { gap: 4, align: "center", wrap: "nowrap", children: [
1822
+ /* @__PURE__ */ jsx31(SdLink.Body, { href: item.href, children: item.label }),
1823
+ /* @__PURE__ */ jsx31(IconChevronDown, { size: 14, stroke: 2 })
1677
1824
  ] }) }) }),
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
- ) })
1825
+ /* @__PURE__ */ jsx31(Menu.Dropdown, { children: kids.map((kid) => {
1826
+ const grandkids = childrenOf(kid.id);
1827
+ if (grandkids.length > 0) {
1828
+ return /* @__PURE__ */ jsxs17(Menu.Sub, { children: [
1829
+ /* @__PURE__ */ jsx31(Menu.Sub.Target, { children: /* @__PURE__ */ jsx31(Menu.Sub.Item, { children: kid.label }) }),
1830
+ /* @__PURE__ */ jsx31(Menu.Sub.Dropdown, { children: grandkids.map(renderMenuLeaf) })
1831
+ ] }, kid.id);
1832
+ }
1833
+ return renderMenuLeaf(kid);
1834
+ }) })
1681
1835
  ]
1682
1836
  },
1683
1837
  item.id
1684
1838
  )
1685
1839
  );
1686
1840
  }) }),
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" }) })
1841
+ /* @__PURE__ */ jsxs17(Group10, { align: "center", gap: "sm", wrap: "nowrap", children: [
1842
+ /* @__PURE__ */ jsx31(Burger, { hiddenFrom: "sm", opened, onClick: toggle }),
1843
+ loginFlag && /* @__PURE__ */ jsx31(Group10, { gap: "sm", visibleFrom: "sm", children: /* @__PURE__ */ jsx31(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
1844
+ ] })
1845
+ ] }) }) }),
1846
+ /* @__PURE__ */ jsx31(
1847
+ MobileNav,
1848
+ {
1849
+ opened,
1850
+ close,
1851
+ topItems,
1852
+ childrenOf,
1853
+ loginFlag
1854
+ }
1855
+ )
1856
+ ] });
1857
+ }
1858
+ function PanelHeader({ navItems, loginFlag }) {
1859
+ const [opened, { toggle, close }] = useDisclosure();
1860
+ const { topItems, childrenOf } = useNavTree(navItems);
1861
+ return /* @__PURE__ */ jsxs17(Fragment4, { children: [
1862
+ /* @__PURE__ */ jsx31(Box13, { bg: "var(--mantine-color-body)", children: /* @__PURE__ */ jsx31(SdContainer, { children: /* @__PURE__ */ jsxs17(Group10, { h: BAR_HEIGHT, justify: "space-between", align: "center", wrap: "nowrap", children: [
1863
+ /* @__PURE__ */ jsx31(Logo, {}),
1864
+ /* @__PURE__ */ jsx31(Group10, { gap: "xl", align: "center", wrap: "nowrap", visibleFrom: "sm", children: topItems.map((item) => {
1865
+ const kids = childrenOf(item.id);
1866
+ if (kids.length === 0) {
1867
+ return /* @__PURE__ */ jsx31(SdLink.Body, { href: item.href, children: item.label }, item.id);
1868
+ }
1869
+ return /* @__PURE__ */ jsxs17(
1870
+ Menu,
1871
+ {
1872
+ trigger: "click-hover",
1873
+ openDelay: 50,
1874
+ closeDelay: 120,
1875
+ position: "bottom",
1876
+ offset: 12,
1877
+ shadow: "md",
1878
+ radius: "md",
1879
+ withinPortal: true,
1880
+ children: [
1881
+ /* @__PURE__ */ jsx31(Menu.Target, { children: /* @__PURE__ */ jsx31(Box13, { style: { cursor: "pointer" }, children: /* @__PURE__ */ jsxs17(Group10, { gap: 4, align: "center", wrap: "nowrap", children: [
1882
+ /* @__PURE__ */ jsx31(SdLink.Body, { href: item.href, children: item.label }),
1883
+ /* @__PURE__ */ jsx31(IconChevronDown, { size: 14, stroke: 2 })
1884
+ ] }) }) }),
1885
+ /* @__PURE__ */ jsx31(Menu.Dropdown, { children: /* @__PURE__ */ jsx31(Stack16, { gap: "xs", p: "xs", children: kids.map((kid) => {
1886
+ const grandkids = childrenOf(kid.id);
1887
+ if (grandkids.length === 0) {
1888
+ return /* @__PURE__ */ jsx31(SdLink.Body, { href: kid.href, children: kid.label }, kid.id);
1889
+ }
1890
+ return /* @__PURE__ */ jsxs17(Stack16, { gap: 2, children: [
1891
+ /* @__PURE__ */ jsx31(SdLink.Body, { href: kid.href, children: kid.label }),
1892
+ grandkids.map((gk) => /* @__PURE__ */ jsx31(SdLink.Sub, { href: gk.href, pl: "sm", children: gk.label }, gk.id))
1893
+ ] }, kid.id);
1894
+ }) }) })
1895
+ ]
1896
+ },
1897
+ item.id
1898
+ );
1899
+ }) }),
1900
+ /* @__PURE__ */ jsxs17(Group10, { align: "center", gap: "sm", wrap: "nowrap", children: [
1901
+ /* @__PURE__ */ jsx31(Burger, { hiddenFrom: "sm", opened, onClick: toggle }),
1902
+ loginFlag && /* @__PURE__ */ jsx31(Group10, { gap: "sm", visibleFrom: "sm", children: /* @__PURE__ */ jsx31(SdButton.Primary, { size: "xs", children: "\uB85C\uADF8\uC778" }) })
1690
1903
  ] })
1691
1904
  ] }) }) }),
1692
- /* @__PURE__ */ jsx29(
1905
+ /* @__PURE__ */ jsx31(
1693
1906
  MobileNav,
1694
1907
  {
1695
1908
  opened,
@@ -1701,12 +1914,17 @@ function SimpleHeader({ navItems, loginFlag }) {
1701
1914
  )
1702
1915
  ] });
1703
1916
  }
1704
- var SdHeader = Object.assign(MegaHeader, { Mega: MegaHeader, Simple: SimpleHeader });
1917
+ var SdHeader = Object.assign(MegaHeader, {
1918
+ Mega: MegaHeader,
1919
+ Simple: SimpleHeader,
1920
+ Panel: PanelHeader
1921
+ });
1705
1922
  var SdHeaderMega = MegaHeader;
1706
1923
  var SdHeaderSimple = SimpleHeader;
1924
+ var SdHeaderPanel = PanelHeader;
1707
1925
 
1708
1926
  // 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";
1927
+ 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
1928
  import {
1711
1929
  IconBrandFacebook,
1712
1930
  IconBrandGithub,
@@ -1716,16 +1934,16 @@ import {
1716
1934
  IconBrandYoutube,
1717
1935
  IconWorld
1718
1936
  } from "@tabler/icons-react";
1719
- import { Fragment as Fragment5, jsx as jsx30, jsxs as jsxs17 } from "react/jsx-runtime";
1937
+ import { Fragment as Fragment5, jsx as jsx32, jsxs as jsxs18 } from "react/jsx-runtime";
1720
1938
  function FooterNavColumns({ items }) {
1721
1939
  const topLevel = items.filter((item) => !item.parentId);
1722
1940
  const getChildren = (parentId) => items.filter((item) => item.parentId === parentId);
1723
1941
  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),
1942
+ return /* @__PURE__ */ jsx32(Fragment5, { children: topLevel.map((group) => /* @__PURE__ */ jsx32(Grid5.Col, { span: { base: 6, sm: 4, md: "auto" }, children: /* @__PURE__ */ jsxs18(Stack17, { gap: "xs", children: [
1943
+ /* @__PURE__ */ jsx32(SdLink.Sub, { href: group.href, children: group.label }, group.id),
1726
1944
  getChildren(group.id).map((link, id) => {
1727
1945
  if (id >= CHILD_THRESH) return;
1728
- return /* @__PURE__ */ jsx30(SdLink.Hint, { href: link.href, children: link.label }, link.id);
1946
+ return /* @__PURE__ */ jsx32(SdLink.Hint, { href: link.href, children: link.label }, link.id);
1729
1947
  })
1730
1948
  ] }) }, group.id)) });
1731
1949
  }
@@ -1739,10 +1957,10 @@ var SOCIAL_ICONS = {
1739
1957
  blog: IconWorld
1740
1958
  };
1741
1959
  function FooterSocials({ items }) {
1742
- return /* @__PURE__ */ jsx30(Group11, { gap: 0, wrap: "nowrap", children: items.map((item) => {
1960
+ return /* @__PURE__ */ jsx32(Group11, { gap: 0, wrap: "nowrap", children: items.map((item) => {
1743
1961
  var _a4, _b;
1744
1962
  const Icon = (_a4 = SOCIAL_ICONS[item.platform]) != null ? _a4 : IconWorld;
1745
- return /* @__PURE__ */ jsx30(
1963
+ return /* @__PURE__ */ jsx32(
1746
1964
  ActionIcon,
1747
1965
  {
1748
1966
  component: "a",
@@ -1753,54 +1971,54 @@ function FooterSocials({ items }) {
1753
1971
  color: "gray",
1754
1972
  variant: "subtle",
1755
1973
  "aria-label": (_b = item.label) != null ? _b : item.platform,
1756
- children: /* @__PURE__ */ jsx30(Icon, { size: 18, stroke: 1.5 })
1974
+ children: /* @__PURE__ */ jsx32(Icon, { size: 18, stroke: 1.5 })
1757
1975
  },
1758
1976
  item.url
1759
1977
  );
1760
1978
  }) });
1761
1979
  }
1762
1980
  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
1981
+ return /* @__PURE__ */ jsxs18(Group11, { gap: 6, wrap: "nowrap", align: "baseline", children: [
1982
+ /* @__PURE__ */ jsx32(SdText.Sub, { c: "slate.4", style: { whiteSpace: "nowrap" }, children: label }),
1983
+ typeof children === "string" ? /* @__PURE__ */ jsx32(SdText.Sub, { children }) : children
1766
1984
  ] });
1767
1985
  }
1768
1986
  function FooterCompanyInfo({ company }) {
1769
1987
  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 }) })
1988
+ return /* @__PURE__ */ jsxs18(SimpleGrid6, { cols: { base: 2, sm: 2, md: 1 }, spacing: "md", verticalSpacing: 0, children: [
1989
+ /* @__PURE__ */ jsx32(InfoCell, { label: "\uC0C1\uD638", children: company.name }),
1990
+ /* @__PURE__ */ jsx32(InfoCell, { label: "\uC0AC\uC5C5\uC790\uB4F1\uB85D\uBC88\uD638", children: company.registrationNumber }),
1991
+ sortedAddresses.map((addr) => /* @__PURE__ */ jsx32(InfoCell, { label: addr.label, children: addr.address }, addr.label)),
1992
+ /* @__PURE__ */ jsx32(InfoCell, { label: "Tel", children: /* @__PURE__ */ jsx32(SdLink.Sub, { href: `tel:${company.tel}`, children: company.tel }) }),
1993
+ company.fax && /* @__PURE__ */ jsx32(InfoCell, { label: "Fax", children: company.fax }),
1994
+ /* @__PURE__ */ jsx32(InfoCell, { label: "Email", children: /* @__PURE__ */ jsx32(SdLink.Sub, { href: `mailto:${company.email}`, children: company.email }) })
1777
1995
  ] });
1778
1996
  }
1779
1997
  function SdFooter({ company, navItems, policyLinks, description }) {
1780
1998
  const visibleNav = filterAndSort(navItems);
1781
1999
  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 }) }) })
2000
+ return /* @__PURE__ */ jsx32(Box14, { component: "footer", children: /* @__PURE__ */ jsx32(SdContainer, { py: "lg", children: /* @__PURE__ */ jsxs18(Stack17, { children: [
2001
+ /* @__PURE__ */ jsx32(Logo, { size: "sm" }),
2002
+ description && /* @__PURE__ */ jsx32(SdText.Sub, { children: description }),
2003
+ /* @__PURE__ */ jsxs18(Flex, { direction: { base: "column", md: "row" }, gap: 48, align: "flex-start", children: [
2004
+ /* @__PURE__ */ jsx32(Box14, { flex: { base: "0 0 auto", md: "1 1 0" }, w: { base: "100%", md: "auto" }, children: /* @__PURE__ */ jsx32(FooterCompanyInfo, { company }) }),
2005
+ visibleNav.length > 0 && /* @__PURE__ */ jsx32(Box14, { flex: { base: "0 0 auto", md: "2 1 0" }, w: { base: "100%", md: "auto" }, children: /* @__PURE__ */ jsx32(Grid5, { style: { "--grid-gutter": "24px" }, children: /* @__PURE__ */ jsx32(FooterNavColumns, { items: visibleNav }) }) })
1788
2006
  ] }),
1789
- /* @__PURE__ */ jsx30(Divider3, {}),
1790
- /* @__PURE__ */ jsxs17(Group11, { justify: "space-between", wrap: "wrap", gap: "xs", children: [
1791
- /* @__PURE__ */ jsxs17(SdText.Sub, { children: [
2007
+ /* @__PURE__ */ jsx32(Divider3, {}),
2008
+ /* @__PURE__ */ jsxs18(Group11, { justify: "space-between", wrap: "wrap", gap: "xs", children: [
2009
+ /* @__PURE__ */ jsxs18(SdText.Sub, { children: [
1792
2010
  "\xA9 ",
1793
2011
  company.copyrightYear,
1794
2012
  " ",
1795
2013
  t(company.name),
1796
2014
  ". All rights reserved."
1797
2015
  ] }),
1798
- /* @__PURE__ */ jsxs17(Group11, { gap: "lg", wrap: "wrap", children: [
1799
- visiblePolicy.length > 0 && /* @__PURE__ */ jsx30(Group11, { gap: "lg", children: visiblePolicy.map((item) => {
2016
+ /* @__PURE__ */ jsxs18(Group11, { gap: "lg", wrap: "wrap", children: [
2017
+ visiblePolicy.length > 0 && /* @__PURE__ */ jsx32(Group11, { gap: "lg", children: visiblePolicy.map((item) => {
1800
2018
  const Link4 = item.highlight ? SdLink.Body : SdLink.Sub;
1801
- return /* @__PURE__ */ jsx30(Link4, { href: item.href, children: item.label }, item.id);
2019
+ return /* @__PURE__ */ jsx32(Link4, { href: item.href, children: item.label }, item.id);
1802
2020
  }) }),
1803
- company.socials && company.socials.length > 0 && /* @__PURE__ */ jsx30(FooterSocials, { items: company.socials })
2021
+ company.socials && company.socials.length > 0 && /* @__PURE__ */ jsx32(FooterSocials, { items: company.socials })
1804
2022
  ] })
1805
2023
  ] })
1806
2024
  ] }) }) });
@@ -1808,7 +2026,7 @@ function SdFooter({ company, navItems, policyLinks, description }) {
1808
2026
 
1809
2027
  // ui/organism/FeatureSection.tsx
1810
2028
  import { Stack as Stack18 } from "@mantine/core";
1811
- import { jsx as jsx31, jsxs as jsxs18 } from "react/jsx-runtime";
2029
+ import { jsx as jsx33, jsxs as jsxs19 } from "react/jsx-runtime";
1812
2030
  function SdFeatureSection(_a4) {
1813
2031
  var _b = _a4, {
1814
2032
  label,
@@ -1825,8 +2043,8 @@ function SdFeatureSection(_a4) {
1825
2043
  "cols",
1826
2044
  "py"
1827
2045
  ]);
1828
- return /* @__PURE__ */ jsx31(SdContainer, __spreadProps(__spreadValues({ py }, boxProps), { children: /* @__PURE__ */ jsxs18(Stack18, { gap: "xl", children: [
1829
- /* @__PURE__ */ jsx31(
2046
+ return /* @__PURE__ */ jsx33(SdContainer, __spreadProps(__spreadValues({ py }, boxProps), { children: /* @__PURE__ */ jsxs19(Stack18, { gap: "xl", children: [
2047
+ /* @__PURE__ */ jsx33(
1830
2048
  SdTextBox.Section,
1831
2049
  {
1832
2050
  label,
@@ -1837,13 +2055,13 @@ function SdFeatureSection(_a4) {
1837
2055
  align: "center"
1838
2056
  }
1839
2057
  ),
1840
- /* @__PURE__ */ jsx31(SdFeatures, { items, cols })
2058
+ /* @__PURE__ */ jsx33(SdFeatures, { items, cols })
1841
2059
  ] }) }));
1842
2060
  }
1843
2061
 
1844
2062
  // ui/organism/TimelineSection.tsx
1845
2063
  import { Center as Center3, Stack as Stack19 } from "@mantine/core";
1846
- import { jsx as jsx32, jsxs as jsxs19 } from "react/jsx-runtime";
2064
+ import { jsx as jsx34, jsxs as jsxs20 } from "react/jsx-runtime";
1847
2065
  function SdTimelineSection(_a4) {
1848
2066
  var _b = _a4, {
1849
2067
  label,
@@ -1858,15 +2076,15 @@ function SdTimelineSection(_a4) {
1858
2076
  "items",
1859
2077
  "py"
1860
2078
  ]);
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 }) })
2079
+ return /* @__PURE__ */ jsx34(Center3, { children: /* @__PURE__ */ jsxs20(Stack19, __spreadProps(__spreadValues({ py, gap: "md" }, boxProps), { children: [
2080
+ /* @__PURE__ */ jsx34(SdTextBox.Section, { label, title, description }),
2081
+ /* @__PURE__ */ jsx34(Center3, { children: /* @__PURE__ */ jsx34(SdTimeline, { items }) })
1864
2082
  ] })) });
1865
2083
  }
1866
2084
 
1867
2085
  // ui/organism/StepsSection.tsx
1868
2086
  import { Stack as Stack20 } from "@mantine/core";
1869
- import { jsx as jsx33, jsxs as jsxs20 } from "react/jsx-runtime";
2087
+ import { jsx as jsx35, jsxs as jsxs21 } from "react/jsx-runtime";
1870
2088
  function SdStepsSection(_a4) {
1871
2089
  var _b = _a4, {
1872
2090
  label,
@@ -1881,17 +2099,17 @@ function SdStepsSection(_a4) {
1881
2099
  "items",
1882
2100
  "py"
1883
2101
  ]);
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 })
2102
+ return /* @__PURE__ */ jsx35(SdContainer, __spreadProps(__spreadValues({ py }, boxProps), { children: /* @__PURE__ */ jsxs21(Stack20, { gap: "xl", children: [
2103
+ (label || title || description) && /* @__PURE__ */ jsx35(SdTextBox.Section, { label, title, description }),
2104
+ /* @__PURE__ */ jsx35(SdSteps.Bubble, { items })
1887
2105
  ] }) }));
1888
2106
  }
1889
2107
 
1890
2108
  // ui/organism/ErrorView.tsx
1891
2109
  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";
2110
+ import { jsx as jsx36, jsxs as jsxs22 } from "react/jsx-runtime";
1893
2111
  function StatusCode({ code }) {
1894
- return /* @__PURE__ */ jsx34(
2112
+ return /* @__PURE__ */ jsx36(
1895
2113
  Text2,
1896
2114
  {
1897
2115
  fz: 160,
@@ -1905,15 +2123,15 @@ function StatusCode({ code }) {
1905
2123
  );
1906
2124
  }
1907
2125
  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." })
2126
+ return /* @__PURE__ */ jsx36(Center4, { mih: "60vh", children: /* @__PURE__ */ jsx36(SdContainer, { children: /* @__PURE__ */ jsxs22(Stack21, { align: "center", gap: "lg", ta: "center", children: [
2127
+ /* @__PURE__ */ jsx36(StatusCode, { code: "500" }),
2128
+ /* @__PURE__ */ jsxs22(Stack21, { gap: "sm", align: "center", children: [
2129
+ /* @__PURE__ */ jsx36(SdTitle.Section, { children: "\uC11C\uBC84\uC5D0\uC11C \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4" }),
2130
+ /* @__PURE__ */ jsx36(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
2131
  ] }),
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" })
2132
+ /* @__PURE__ */ jsxs22(Group12, { gap: "sm", justify: "center", children: [
2133
+ /* @__PURE__ */ jsx36(SdButton.Primary, { onClick: onReset, children: "\uB2E4\uC2DC \uC2DC\uB3C4" }),
2134
+ onHome && /* @__PURE__ */ jsx36(SdButton.Ghost, { onClick: onHome, children: "\uD648\uC73C\uB85C" })
1917
2135
  ] })
1918
2136
  ] }) }) });
1919
2137
  }
@@ -1925,15 +2143,15 @@ function NotFound({
1925
2143
  },
1926
2144
  onBack = () => window.history.back()
1927
2145
  }) {
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 })
2146
+ return /* @__PURE__ */ jsx36(Center4, { mih: "60vh", children: /* @__PURE__ */ jsx36(SdContainer, { children: /* @__PURE__ */ jsxs22(Stack21, { align: "center", gap: "lg", ta: "center", children: [
2147
+ /* @__PURE__ */ jsx36(StatusCode, { code: "404" }),
2148
+ /* @__PURE__ */ jsxs22(Stack21, { gap: "sm", align: "center", children: [
2149
+ /* @__PURE__ */ jsx36(SdTitle.Section, { children: title }),
2150
+ /* @__PURE__ */ jsx36(SdText.Body, { maw: 480, children: description })
1933
2151
  ] }),
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" })
2152
+ /* @__PURE__ */ jsxs22(Group12, { gap: "sm", justify: "center", children: [
2153
+ onHome && /* @__PURE__ */ jsx36(SdButton.Primary, { onClick: onHome, children: "\uD648\uC73C\uB85C" }),
2154
+ onBack && /* @__PURE__ */ jsx36(SdButton.Ghost, { onClick: onBack, children: "\uB4A4\uB85C \uAC00\uAE30" })
1937
2155
  ] })
1938
2156
  ] }) }) });
1939
2157
  }
@@ -1947,7 +2165,7 @@ var SdErrorViewPage = SdErrorView.Page;
1947
2165
  var SdErrorViewNotFound = SdErrorView.NotFound;
1948
2166
 
1949
2167
  // 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";
2168
+ 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
2169
  import {
1952
2170
  IconBrandApple,
1953
2171
  IconBrandGithub as IconBrandGithub2,
@@ -1973,7 +2191,7 @@ var brandDotTexture = {
1973
2191
  };
1974
2192
 
1975
2193
  // ui/organism/LoginView.tsx
1976
- import { Fragment as Fragment6, jsx as jsx35, jsxs as jsxs22 } from "react/jsx-runtime";
2194
+ import { Fragment as Fragment6, jsx as jsx37, jsxs as jsxs23 } from "react/jsx-runtime";
1977
2195
  var SOCIAL_META = {
1978
2196
  google: { Icon: IconBrandGoogle, label: "\uAD6C\uAE00\uB85C \uB85C\uADF8\uC778" },
1979
2197
  kakao: { Icon: IconBrandKakaoTalk, label: "\uCE74\uCE74\uC624\uB85C \uB85C\uADF8\uC778" },
@@ -2002,9 +2220,9 @@ function LoginForm({
2002
2220
  remember: data.get("remember") === "on"
2003
2221
  });
2004
2222
  }
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(
2223
+ return /* @__PURE__ */ jsx37("form", { onSubmit: handleSubmit, noValidate: true, children: /* @__PURE__ */ jsxs23(Stack22, { gap: "md", children: [
2224
+ error && /* @__PURE__ */ jsx37(SdText.Error, { children: error }),
2225
+ /* @__PURE__ */ jsx37(
2008
2226
  SdInput.Email,
2009
2227
  {
2010
2228
  name: "email",
@@ -2014,7 +2232,7 @@ function LoginForm({
2014
2232
  required: true
2015
2233
  }
2016
2234
  ),
2017
- /* @__PURE__ */ jsx35(
2235
+ /* @__PURE__ */ jsx37(
2018
2236
  SdInput.Password,
2019
2237
  {
2020
2238
  name: "password",
@@ -2024,50 +2242,50 @@ function LoginForm({
2024
2242
  required: true
2025
2243
  }
2026
2244
  ),
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?" })
2245
+ (withRemember || findPasswordHref) && /* @__PURE__ */ jsxs23(Group13, { justify: "space-between", align: "center", wrap: "nowrap", children: [
2246
+ withRemember ? /* @__PURE__ */ jsx37(Checkbox2, { name: "remember", size: "xs", label: "\uC790\uB3D9 \uB85C\uADF8\uC778" }) : /* @__PURE__ */ jsx37("span", {}),
2247
+ findPasswordHref && /* @__PURE__ */ jsx37(SdLink.Sub, { href: findPasswordHref, children: "\uBE44\uBC00\uBC88\uD638\uB97C \uC78A\uC73C\uC168\uB098\uC694?" })
2030
2248
  ] }),
2031
- /* @__PURE__ */ jsx35(
2249
+ /* @__PURE__ */ jsx37(
2032
2250
  SdButton.Primary,
2033
2251
  {
2034
2252
  type: "submit",
2035
2253
  fullWidth: true,
2036
2254
  loading,
2037
- leftSection: /* @__PURE__ */ jsx35(IconLogin2, { size: 16 }),
2255
+ leftSection: /* @__PURE__ */ jsx37(IconLogin2, { size: 16 }),
2038
2256
  children: submitLabel
2039
2257
  }
2040
2258
  ),
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) => {
2259
+ socials && socials.length > 0 && /* @__PURE__ */ jsxs23(Fragment6, { children: [
2260
+ /* @__PURE__ */ jsx37(Divider4, { label: "\uB610\uB294", labelPosition: "center" }),
2261
+ /* @__PURE__ */ jsx37(Stack22, { gap: "xs", children: socials.map((social) => {
2044
2262
  var _a4;
2045
2263
  const { Icon, label } = SOCIAL_META[social.provider];
2046
- return /* @__PURE__ */ jsx35(
2264
+ return /* @__PURE__ */ jsx37(
2047
2265
  SdButton.Outline,
2048
2266
  {
2049
2267
  color: "slate",
2050
2268
  fullWidth: true,
2051
2269
  type: "button",
2052
2270
  onClick: social.onClick,
2053
- leftSection: /* @__PURE__ */ jsx35(Icon, { size: 16 }),
2271
+ leftSection: /* @__PURE__ */ jsx37(Icon, { size: 16 }),
2054
2272
  children: (_a4 = social.label) != null ? _a4 : label
2055
2273
  },
2056
2274
  social.provider
2057
2275
  );
2058
2276
  }) })
2059
2277
  ] }),
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" })
2278
+ signUpHref && /* @__PURE__ */ jsxs23(Group13, { gap: 6, justify: "center", children: [
2279
+ /* @__PURE__ */ jsx37(SdText.Sub, { children: "\uC544\uC9C1 \uACC4\uC815\uC774 \uC5C6\uC73C\uC2E0\uAC00\uC694?" }),
2280
+ /* @__PURE__ */ jsx37(SdLink.Sub, { href: signUpHref, c: "primary.6", children: "\uD68C\uC6D0\uAC00\uC785" })
2063
2281
  ] }),
2064
2282
  children
2065
2283
  ] }) });
2066
2284
  }
2067
2285
  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 : "" })
2286
+ return /* @__PURE__ */ jsxs23(Stack22, { gap: "lg", children: [
2287
+ /* @__PURE__ */ jsx37(Logo, { size: "sm" }),
2288
+ /* @__PURE__ */ jsx37(SdTextBox.Card, { title, description: description != null ? description : "" })
2071
2289
  ] });
2072
2290
  }
2073
2291
  function Card7(_a4) {
@@ -2080,9 +2298,9 @@ function Card7(_a4) {
2080
2298
  "description",
2081
2299
  "mih"
2082
2300
  ]);
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))
2301
+ return /* @__PURE__ */ jsx37(Center5, { mih, bg: "slate.0", p: "md", children: /* @__PURE__ */ jsx37(Paper, { w: "100%", maw: 420, p: { base: "lg", sm: "xl" }, radius: "lg", withBorder: true, shadow: "sm", children: /* @__PURE__ */ jsxs23(Stack22, { gap: "xl", children: [
2302
+ /* @__PURE__ */ jsx37(FormHeader, { title, description }),
2303
+ /* @__PURE__ */ jsx37(LoginForm, __spreadValues({}, formProps))
2086
2304
  ] }) }) });
2087
2305
  }
2088
2306
  function Split(_a4) {
@@ -2099,16 +2317,16 @@ function Split(_a4) {
2099
2317
  "brandDescription",
2100
2318
  "mih"
2101
2319
  ]);
2102
- return /* @__PURE__ */ jsxs22(SimpleGrid7, { cols: { base: 1, md: 2 }, spacing: 0, mih, children: [
2103
- /* @__PURE__ */ jsxs22(
2104
- Box15,
2320
+ return /* @__PURE__ */ jsxs23(SimpleGrid7, { cols: { base: 1, md: 2 }, spacing: 0, mih, children: [
2321
+ /* @__PURE__ */ jsxs23(
2322
+ Box16,
2105
2323
  {
2106
2324
  visibleFrom: "md",
2107
2325
  pos: "relative",
2108
2326
  style: __spreadValues({ overflow: "hidden", display: "flex", alignItems: "flex-end" }, brandSurface),
2109
2327
  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(
2328
+ /* @__PURE__ */ jsx37(Box16, { "aria-hidden": true, pos: "absolute", inset: 0, style: brandDotTexture }),
2329
+ /* @__PURE__ */ jsx37(Box16, { pos: "relative", p: 48, style: { zIndex: 1, width: "100%" }, children: /* @__PURE__ */ jsx37(
2112
2330
  SdTextBox.Hero,
2113
2331
  {
2114
2332
  title: brandTitle,
@@ -2122,9 +2340,9 @@ function Split(_a4) {
2122
2340
  ]
2123
2341
  }
2124
2342
  ),
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))
2343
+ /* @__PURE__ */ jsx37(Center5, { p: { base: "md", sm: "xl" }, bg: "white", children: /* @__PURE__ */ jsxs23(Stack22, { gap: "xl", w: "100%", maw: 400, children: [
2344
+ /* @__PURE__ */ jsx37(FormHeader, { title, description }),
2345
+ /* @__PURE__ */ jsx37(LoginForm, __spreadValues({}, formProps))
2128
2346
  ] }) })
2129
2347
  ] });
2130
2348
  }
@@ -2138,11 +2356,11 @@ var SdLoginViewCard = SdLoginView.Card;
2138
2356
  var SdLoginViewSplit = SdLoginView.Split;
2139
2357
 
2140
2358
  // ui/organism/Result.tsx
2141
- import { Box as Box16, Center as Center6, Group as Group14, Stack as Stack23 } from "@mantine/core";
2359
+ import { Box as Box17, Center as Center6, Group as Group14, Stack as Stack23 } from "@mantine/core";
2142
2360
  import { IconCircleCheck, IconCircleX } from "@tabler/icons-react";
2143
- import { jsx as jsx36, jsxs as jsxs23 } from "react/jsx-runtime";
2361
+ import { jsx as jsx38, jsxs as jsxs24 } from "react/jsx-runtime";
2144
2362
  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)` }) });
2363
+ return /* @__PURE__ */ jsx38(Center6, { w: 88, h: 88, bg: `${color}.0`, style: { borderRadius: "50%" }, "aria-hidden": true, children: /* @__PURE__ */ jsx38(Icon, { size: 48, stroke: 1.5, color: `var(--mantine-color-${color}-6)` }) });
2146
2364
  }
2147
2365
  function createResult(defaults) {
2148
2366
  return function SdResult2({
@@ -2153,16 +2371,16 @@ function createResult(defaults) {
2153
2371
  children,
2154
2372
  mih = "60vh"
2155
2373
  }) {
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 })
2374
+ return /* @__PURE__ */ jsx38(Center6, { mih, children: /* @__PURE__ */ jsx38(SdContainer, { children: /* @__PURE__ */ jsxs24(Stack23, { align: "center", gap: "lg", ta: "center", children: [
2375
+ /* @__PURE__ */ jsx38(ResultIcon, { color: defaults.color, Icon: defaults.Icon }),
2376
+ /* @__PURE__ */ jsxs24(Stack23, { gap: "sm", align: "center", children: [
2377
+ /* @__PURE__ */ jsx38(SdTitle.Section, { children: title }),
2378
+ description && /* @__PURE__ */ jsx38(SdText.Body, { maw: 480, children: description })
2161
2379
  ] }),
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 })
2380
+ children && /* @__PURE__ */ jsx38(Box17, { children }),
2381
+ (primaryAction || secondaryAction) && /* @__PURE__ */ jsxs24(Group14, { gap: "sm", justify: "center", children: [
2382
+ primaryAction && /* @__PURE__ */ jsx38(SdButton.Primary, { onClick: primaryAction.onClick, children: primaryAction.label }),
2383
+ secondaryAction && /* @__PURE__ */ jsx38(SdButton.Ghost, { onClick: secondaryAction.onClick, children: secondaryAction.label })
2166
2384
  ] })
2167
2385
  ] }) }) });
2168
2386
  };
@@ -2186,10 +2404,11 @@ var SdResultError = SdResult.Error;
2186
2404
 
2187
2405
  // ui/template/MainLayout.tsx
2188
2406
  import { AppShell } from "@mantine/core";
2189
- import { jsx as jsx37, jsxs as jsxs24 } from "react/jsx-runtime";
2407
+ import { jsx as jsx39, jsxs as jsxs25 } from "react/jsx-runtime";
2190
2408
  var headers = {
2191
2409
  mega: SdHeader.Mega,
2192
- simple: SdHeader.Simple
2410
+ simple: SdHeader.Simple,
2411
+ panel: SdHeader.Panel
2193
2412
  };
2194
2413
  function MainLayout({
2195
2414
  children,
@@ -2199,45 +2418,65 @@ function MainLayout({
2199
2418
  headerVariant = "mega"
2200
2419
  }) {
2201
2420
  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 })
2421
+ return /* @__PURE__ */ jsxs25(AppShell, { header: { height: 60 }, children: [
2422
+ /* @__PURE__ */ jsx39(AppShell.Header, { children: /* @__PURE__ */ jsx39(Header, { navItems, loginFlag }) }),
2423
+ /* @__PURE__ */ jsx39(AppShell.Main, { children }),
2424
+ /* @__PURE__ */ jsx39(SdFooter, { company: companyInfo, navItems })
2206
2425
  ] });
2207
2426
  }
2208
2427
 
2209
2428
  // 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";
2429
+ import { Box as Box18, Divider as Divider5, Group as Group15, Space, Stack as Stack24 } from "@mantine/core";
2430
+ import { Fragment as Fragment7, jsx as jsx40, jsxs as jsxs26 } from "react/jsx-runtime";
2212
2431
  var HERO_MIN_H = "38svh";
2213
2432
  var HERO_PY = { base: 56, sm: 88 };
2214
2433
  var HERO_MAW = 680;
2215
- function Content({ children }) {
2216
- return /* @__PURE__ */ jsx38(SdContainer, { py: "xl", children: /* @__PURE__ */ jsx38(Stack24, { gap: "xl", children }) });
2434
+ function Content({
2435
+ children,
2436
+ navItems,
2437
+ breadcrumb = true,
2438
+ currentHref
2439
+ }) {
2440
+ const showBreadcrumb = breadcrumb && !!navItems && navItems.length > 0;
2441
+ return /* @__PURE__ */ jsxs26(SdContainer, { py: "xl", children: [
2442
+ showBreadcrumb && /* @__PURE__ */ jsx40(SdBreadcrumb, { navItems, currentHref, mb: "lg" }),
2443
+ /* @__PURE__ */ jsx40(Stack24, { gap: "xl", children })
2444
+ ] });
2217
2445
  }
2218
2446
  function LayoutGap() {
2219
- return /* @__PURE__ */ jsx38(Space, { h: 48 });
2447
+ return /* @__PURE__ */ jsx40(Space, {});
2220
2448
  }
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, {}),
2449
+ function Minimal({
2450
+ label,
2451
+ title,
2452
+ description,
2453
+ children,
2454
+ navItems,
2455
+ breadcrumb,
2456
+ currentHref
2457
+ }) {
2458
+ return /* @__PURE__ */ jsxs26(Plain2, { navItems, breadcrumb, currentHref, children: [
2459
+ /* @__PURE__ */ jsx40(LayoutGap, {}),
2460
+ /* @__PURE__ */ jsx40(SdTextBox.Section, { label, title, description: description != null ? description : "" }),
2461
+ /* @__PURE__ */ jsx40(Divider5, {}),
2225
2462
  children
2226
2463
  ] });
2227
2464
  }
2228
- function Plain2({ children }) {
2229
- return /* @__PURE__ */ jsxs25(Fragment7, { children: [
2230
- /* @__PURE__ */ jsx38(LayoutGap, {}),
2231
- /* @__PURE__ */ jsx38(Content, { children })
2232
- ] });
2465
+ function Plain2({
2466
+ children,
2467
+ navItems,
2468
+ breadcrumb,
2469
+ currentHref
2470
+ }) {
2471
+ return /* @__PURE__ */ jsx40(Fragment7, { children: /* @__PURE__ */ jsx40(Content, { navItems, breadcrumb, currentHref, children }) });
2233
2472
  }
2234
2473
  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 })
2474
+ return /* @__PURE__ */ jsxs26(Stack24, { gap: "md", maw: HERO_MAW, children: [
2475
+ label && /* @__PURE__ */ jsxs26(Group15, { gap: "sm", align: "center", wrap: "nowrap", children: [
2476
+ /* @__PURE__ */ jsx40(Box18, { w: 28, h: 2, bg: "primary.3", style: { borderRadius: 2 } }),
2477
+ /* @__PURE__ */ jsx40(SdText.Eyebrow, { c: "primary.1", children: label })
2239
2478
  ] }),
2240
- /* @__PURE__ */ jsx38(
2479
+ /* @__PURE__ */ jsx40(
2241
2480
  SdTextBox.Hero,
2242
2481
  {
2243
2482
  title,
@@ -2250,10 +2489,19 @@ function HeroCopy({ label, title, description }) {
2250
2489
  )
2251
2490
  ] });
2252
2491
  }
2253
- function Image2({ image, label, title, description, children }) {
2254
- return /* @__PURE__ */ jsxs25(Fragment7, { children: [
2255
- /* @__PURE__ */ jsxs25(
2256
- Box17,
2492
+ function Image2({
2493
+ image,
2494
+ label,
2495
+ title,
2496
+ description,
2497
+ children,
2498
+ navItems,
2499
+ breadcrumb,
2500
+ currentHref
2501
+ }) {
2502
+ return /* @__PURE__ */ jsxs26(Fragment7, { children: [
2503
+ /* @__PURE__ */ jsxs26(
2504
+ Box18,
2257
2505
  {
2258
2506
  pos: "relative",
2259
2507
  style: {
@@ -2266,8 +2514,8 @@ function Image2({ image, label, title, description, children }) {
2266
2514
  backgroundColor: "var(--mantine-color-slate-9)"
2267
2515
  },
2268
2516
  children: [
2269
- /* @__PURE__ */ jsx38(
2270
- Box17,
2517
+ /* @__PURE__ */ jsx40(
2518
+ Box18,
2271
2519
  {
2272
2520
  "aria-hidden": true,
2273
2521
  pos: "absolute",
@@ -2277,17 +2525,25 @@ function Image2({ image, label, title, description, children }) {
2277
2525
  }
2278
2526
  }
2279
2527
  ),
2280
- /* @__PURE__ */ jsx38(SdContainer, { pos: "relative", py: HERO_PY, style: { zIndex: 1, width: "100%" }, children: /* @__PURE__ */ jsx38(HeroCopy, { label, title, description }) })
2528
+ /* @__PURE__ */ jsx40(SdContainer, { pos: "relative", py: HERO_PY, style: { zIndex: 1, width: "100%" }, children: /* @__PURE__ */ jsx40(HeroCopy, { label, title, description }) })
2281
2529
  ]
2282
2530
  }
2283
2531
  ),
2284
- /* @__PURE__ */ jsx38(Content, { children })
2532
+ /* @__PURE__ */ jsx40(Content, { navItems, breadcrumb, currentHref, children })
2285
2533
  ] });
2286
2534
  }
2287
- function Brand({ label, title, description, children }) {
2288
- return /* @__PURE__ */ jsxs25(Fragment7, { children: [
2289
- /* @__PURE__ */ jsxs25(
2290
- Box17,
2535
+ function Brand({
2536
+ label,
2537
+ title,
2538
+ description,
2539
+ children,
2540
+ navItems,
2541
+ breadcrumb,
2542
+ currentHref
2543
+ }) {
2544
+ return /* @__PURE__ */ jsxs26(Fragment7, { children: [
2545
+ /* @__PURE__ */ jsxs26(
2546
+ Box18,
2291
2547
  {
2292
2548
  pos: "relative",
2293
2549
  style: __spreadValues({
@@ -2298,12 +2554,12 @@ function Brand({ label, title, description, children }) {
2298
2554
  borderBottom: "1px solid var(--mantine-color-slate-8)"
2299
2555
  }, brandSurface),
2300
2556
  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 }) })
2557
+ /* @__PURE__ */ jsx40(Box18, { "aria-hidden": true, pos: "absolute", inset: 0, style: brandDotTexture }),
2558
+ /* @__PURE__ */ jsx40(SdContainer, { pos: "relative", py: HERO_PY, style: { zIndex: 1, width: "100%" }, children: /* @__PURE__ */ jsx40(HeroCopy, { label, title, description }) })
2303
2559
  ]
2304
2560
  }
2305
2561
  ),
2306
- /* @__PURE__ */ jsx38(Content, { children })
2562
+ /* @__PURE__ */ jsx40(Content, { navItems, breadcrumb, currentHref, children })
2307
2563
  ] });
2308
2564
  }
2309
2565
  var PageLayout = {
@@ -2321,6 +2577,9 @@ var PageLayoutMinimal = PageLayout.Minimal;
2321
2577
  var PageLayoutBrand = PageLayout.Brand;
2322
2578
  var PageLayoutPlain = PageLayout.Plain;
2323
2579
 
2580
+ // ui/template/SdProvider.tsx
2581
+ import { MantineProvider } from "@mantine/core";
2582
+
2324
2583
  // ui/theme.ts
2325
2584
  import { createTheme, rem as rem2 } from "@mantine/core";
2326
2585
  var primary = [
@@ -2565,7 +2824,6 @@ var theme = createTheme({
2565
2824
  Anchor: {
2566
2825
  defaultProps: { c: "slate.5", fz: "sm", underline: "never" }
2567
2826
  },
2568
- // SdHeader 모바일 드로어의 2단 아코디언 타이포를 SdLink와 맞춘다.
2569
2827
  NavLink: {
2570
2828
  defaultProps: { c: "slate.7", fz: "sm" }
2571
2829
  },
@@ -2579,10 +2837,25 @@ var theme = createTheme({
2579
2837
  }
2580
2838
  }
2581
2839
  });
2840
+
2841
+ // ui/template/SdProvider.tsx
2842
+ import { jsx as jsx41, jsxs as jsxs27 } from "react/jsx-runtime";
2843
+ function SdProvider({
2844
+ children,
2845
+ theme: theme2 = theme,
2846
+ navItems,
2847
+ defaultColorScheme = "light"
2848
+ }) {
2849
+ return /* @__PURE__ */ jsxs27(MantineProvider, { theme: theme2, defaultColorScheme, children: [
2850
+ /* @__PURE__ */ jsx41(SdToastProvider, {}),
2851
+ /* @__PURE__ */ jsx41(NavProvider, { navItems, children })
2852
+ ] });
2853
+ }
2582
2854
  export {
2583
2855
  HeroCarousel,
2584
2856
  Logo,
2585
2857
  MainLayout,
2858
+ NavProvider,
2586
2859
  PageLayout,
2587
2860
  PageLayoutBrand,
2588
2861
  PageLayoutImage,
@@ -2593,6 +2866,7 @@ export {
2593
2866
  SdBadgePrimary,
2594
2867
  SdBadgeSuccess,
2595
2868
  SdBadgeWarning,
2869
+ SdBreadcrumb,
2596
2870
  SdButton,
2597
2871
  SdButtonCancel,
2598
2872
  SdButtonDelete,
@@ -2624,6 +2898,7 @@ export {
2624
2898
  SdFooter,
2625
2899
  SdHeader,
2626
2900
  SdHeaderMega,
2901
+ SdHeaderPanel,
2627
2902
  SdHeaderSimple,
2628
2903
  SdInput,
2629
2904
  SdInputAutocomplete,
@@ -2666,6 +2941,7 @@ export {
2666
2941
  SdPricingCardDefault,
2667
2942
  SdPricingCardFeatured,
2668
2943
  SdPricingCardGrid,
2944
+ SdProvider,
2669
2945
  SdQuote,
2670
2946
  SdQuoteCard,
2671
2947
  SdQuotePlain,
@@ -2729,5 +3005,6 @@ export {
2729
3005
  SdToastSuccess,
2730
3006
  SdToastUpdate,
2731
3007
  SdToastWarning,
2732
- theme
3008
+ theme,
3009
+ useNav
2733
3010
  };