@snksergio/design-system 0.37.2 → 0.38.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.
Files changed (47) hide show
  1. package/dist-lib/chunks/{kpi-delta-0eogwK3C.mjs → kpi-delta-BQ6waavJ.mjs} +2 -2
  2. package/dist-lib/chunks/{kpi-delta-0eogwK3C.mjs.map → kpi-delta-BQ6waavJ.mjs.map} +1 -1
  3. package/dist-lib/chunks/{kpi-delta-Cz6qAe4c.cjs → kpi-delta-NM4hUgz4.cjs} +2 -2
  4. package/dist-lib/chunks/{kpi-delta-Cz6qAe4c.cjs.map → kpi-delta-NM4hUgz4.cjs.map} +1 -1
  5. package/dist-lib/chunks/{panel-NCZKvmDE.mjs → panel-BYgb6UTx.mjs} +2 -2
  6. package/dist-lib/chunks/{panel-NCZKvmDE.mjs.map → panel-BYgb6UTx.mjs.map} +1 -1
  7. package/dist-lib/chunks/{panel-DNobvn1Z.cjs → panel-CmmbJAIs.cjs} +2 -2
  8. package/dist-lib/chunks/{panel-DNobvn1Z.cjs.map → panel-CmmbJAIs.cjs.map} +1 -1
  9. package/dist-lib/chunks/{useTheme-BeD_2lZN.cjs → useTheme-C8eZFGSb.cjs} +175 -33
  10. package/dist-lib/chunks/useTheme-C8eZFGSb.cjs.map +1 -0
  11. package/dist-lib/chunks/{useTheme-CYMBVr3I.mjs → useTheme-Chash1gR.mjs} +178 -36
  12. package/dist-lib/chunks/useTheme-Chash1gR.mjs.map +1 -0
  13. package/dist-lib/index.cjs +7 -3
  14. package/dist-lib/index.cjs.map +1 -1
  15. package/dist-lib/index.mjs +221 -217
  16. package/dist-lib/index.mjs.map +1 -1
  17. package/dist-lib/preview/chat.cjs +1 -1
  18. package/dist-lib/preview/chat.mjs +1 -1
  19. package/dist-lib/preview/clientes.cjs +2 -2
  20. package/dist-lib/preview/clientes.mjs +2 -2
  21. package/dist-lib/preview/dashboard.cjs +2 -2
  22. package/dist-lib/preview/dashboard.mjs +2 -2
  23. package/dist-lib/src/components/ui/AppShell/app-shell.d.ts +1 -1
  24. package/dist-lib/src/components/ui/AppShell/app-shell.d.ts.map +1 -1
  25. package/dist-lib/src/components/ui/AppShell/app-shell.types.d.ts +23 -3
  26. package/dist-lib/src/components/ui/AppShell/app-shell.types.d.ts.map +1 -1
  27. package/dist-lib/src/components/ui/MenuSidebar/index.d.ts +3 -1
  28. package/dist-lib/src/components/ui/MenuSidebar/index.d.ts.map +1 -1
  29. package/dist-lib/src/components/ui/MenuSidebar/menu-sidebar.d.ts +1 -1
  30. package/dist-lib/src/components/ui/MenuSidebar/menu-sidebar.d.ts.map +1 -1
  31. package/dist-lib/src/components/ui/MenuSidebar/nav-link.d.ts +29 -0
  32. package/dist-lib/src/components/ui/MenuSidebar/nav-link.d.ts.map +1 -0
  33. package/dist-lib/src/components/ui/MenuSidebar/sidebar-item.d.ts +16 -1
  34. package/dist-lib/src/components/ui/MenuSidebar/sidebar-item.d.ts.map +1 -1
  35. package/dist-lib/src/components/ui/MenuSidebar/sidebar-panel.d.ts +6 -4
  36. package/dist-lib/src/components/ui/MenuSidebar/sidebar-panel.d.ts.map +1 -1
  37. package/dist-lib/src/components/ui/MenuSidebar/sidebar-rail.d.ts +7 -3
  38. package/dist-lib/src/components/ui/MenuSidebar/sidebar-rail.d.ts.map +1 -1
  39. package/dist-lib/src/components/ui/MenuSidebar/sidebar-section.d.ts +4 -2
  40. package/dist-lib/src/components/ui/MenuSidebar/sidebar-section.d.ts.map +1 -1
  41. package/dist-lib/src/components/ui/MenuSidebar/sidebar-subgroup.d.ts +6 -3
  42. package/dist-lib/src/components/ui/MenuSidebar/sidebar-subgroup.d.ts.map +1 -1
  43. package/dist-lib/src/components/ui/MenuSidebar/sidebar.types.d.ts +56 -2
  44. package/dist-lib/src/components/ui/MenuSidebar/sidebar.types.d.ts.map +1 -1
  45. package/package.json +7 -4
  46. package/dist-lib/chunks/useTheme-BeD_2lZN.cjs.map +0 -1
  47. package/dist-lib/chunks/useTheme-CYMBVr3I.mjs.map +0 -1
@@ -1558,6 +1558,33 @@ function SidebarBrandIcon({ size = 18 }) {
1558
1558
  }
1559
1559
  );
1560
1560
  }
1561
+ const EXTERNO = /^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;
1562
+ function isExternalHref(href) {
1563
+ if (!href) return false;
1564
+ if (href.startsWith("#")) return false;
1565
+ return EXTERNO.test(href);
1566
+ }
1567
+ function isHashHref(href) {
1568
+ return !!href && href.startsWith("#");
1569
+ }
1570
+ function isModifiedClick(e) {
1571
+ return (e.button ?? 0) !== 0 || !!e.metaKey || !!e.ctrlKey || !!e.shiftKey || !!e.altKey;
1572
+ }
1573
+ function shouldPreventNavigation({
1574
+ href,
1575
+ hasHandler,
1576
+ target,
1577
+ event
1578
+ }) {
1579
+ if (!href) return false;
1580
+ if (!hasHandler) return false;
1581
+ if (event.defaultPrevented) return false;
1582
+ if (target && target !== "_self") return false;
1583
+ if (isHashHref(href)) return false;
1584
+ if (isExternalHref(href)) return false;
1585
+ if (isModifiedClick(event)) return false;
1586
+ return true;
1587
+ }
1561
1588
  function SidebarRail({
1562
1589
  contexts,
1563
1590
  activeContextId,
@@ -1566,10 +1593,21 @@ function SidebarRail({
1566
1593
  user,
1567
1594
  showAdd = false,
1568
1595
  onAddClick,
1596
+ brandHref = "/",
1597
+ onBrandClick,
1598
+ renderLink,
1569
1599
  className
1570
1600
  }) {
1571
1601
  return /* @__PURE__ */ jsxRuntime.jsxs("aside", { className: avatar.cn(sidebarRail(), className), children: [
1572
- /* @__PURE__ */ jsxRuntime.jsx("a", { href: "/", className: sidebarRailBrand(), "aria-label": "Home", children: brand ?? /* @__PURE__ */ jsxRuntime.jsx(SidebarBrandIcon, {}) }),
1602
+ /* @__PURE__ */ jsxRuntime.jsx(
1603
+ SidebarBrandLink,
1604
+ {
1605
+ href: brandHref,
1606
+ onClick: onBrandClick,
1607
+ renderLink,
1608
+ children: brand ?? /* @__PURE__ */ jsxRuntime.jsx(SidebarBrandIcon, {})
1609
+ }
1610
+ ),
1573
1611
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: sidebarRailList(), children: [
1574
1612
  contexts.map((ctx) => {
1575
1613
  const Icon = ctx.icon;
@@ -1605,8 +1643,52 @@ function SidebarRail({
1605
1643
  user !== null && /* @__PURE__ */ jsxRuntime.jsx("div", { className: sidebarRailUser(), children: user ?? /* @__PURE__ */ jsxRuntime.jsx("div", { className: sidebarRailUserDefault(), children: "SV" }) })
1606
1644
  ] });
1607
1645
  }
1646
+ function SidebarBrandLink({
1647
+ href,
1648
+ onClick,
1649
+ renderLink,
1650
+ children
1651
+ }) {
1652
+ if (!href) {
1653
+ return /* @__PURE__ */ jsxRuntime.jsx(
1654
+ "button",
1655
+ {
1656
+ type: "button",
1657
+ className: sidebarRailBrand(),
1658
+ onClick,
1659
+ "aria-label": "Home",
1660
+ children
1661
+ }
1662
+ );
1663
+ }
1664
+ const handleClick = (e) => {
1665
+ if (!renderLink) {
1666
+ const prevent = shouldPreventNavigation({ href, hasHandler: !!onClick, event: e });
1667
+ if (prevent) e.preventDefault();
1668
+ }
1669
+ onClick?.(e);
1670
+ };
1671
+ const linkProps = {
1672
+ href,
1673
+ className: sidebarRailBrand(),
1674
+ onClick: handleClick,
1675
+ "aria-label": "Home",
1676
+ children
1677
+ };
1678
+ if (renderLink) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: renderLink(linkProps) });
1679
+ return /* @__PURE__ */ jsxRuntime.jsx("a", { ...linkProps });
1680
+ }
1608
1681
  const SidebarItem = React.forwardRef(
1609
- ({ item, active, subitem, iconBrand, onClick, className }, ref) => {
1682
+ ({
1683
+ item,
1684
+ active,
1685
+ subitem,
1686
+ iconBrand,
1687
+ onClick,
1688
+ renderLink,
1689
+ interceptNavigation,
1690
+ className
1691
+ }, ref) => {
1610
1692
  const Icon = item.icon;
1611
1693
  const classes = avatar.cn(sidebarItem({ active, subitem }), className);
1612
1694
  const content = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -1622,21 +1704,30 @@ const SidebarItem = React.forwardRef(
1622
1704
  item.badge && /* @__PURE__ */ jsxRuntime.jsx(SidebarPill, { kind: item.badgeKind, active, children: item.badge })
1623
1705
  ] });
1624
1706
  const handleClick = (e) => {
1707
+ if (!renderLink) {
1708
+ const prevent = shouldPreventNavigation({
1709
+ href: item.href,
1710
+ hasHandler: interceptNavigation ?? !!(item.onClick || onClick),
1711
+ target: item.target,
1712
+ event: e
1713
+ });
1714
+ if (prevent) e.preventDefault();
1715
+ }
1625
1716
  if (item.onClick) item.onClick(e);
1626
1717
  onClick?.(e);
1627
1718
  };
1628
1719
  if (item.href) {
1629
- return /* @__PURE__ */ jsxRuntime.jsx(
1630
- "a",
1631
- {
1632
- ref,
1633
- href: item.href,
1634
- className: classes,
1635
- onClick: handleClick,
1636
- "aria-current": active ? "page" : void 0,
1637
- children: content
1638
- }
1639
- );
1720
+ const linkProps = {
1721
+ href: item.href,
1722
+ className: classes,
1723
+ onClick: handleClick,
1724
+ target: item.target,
1725
+ "aria-current": active ? "page" : void 0,
1726
+ ref,
1727
+ children: content
1728
+ };
1729
+ if (renderLink) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: renderLink(linkProps) });
1730
+ return /* @__PURE__ */ jsxRuntime.jsx("a", { ...linkProps });
1640
1731
  }
1641
1732
  return /* @__PURE__ */ jsxRuntime.jsx(
1642
1733
  "button",
@@ -1664,6 +1755,8 @@ function SidebarSubgroup({
1664
1755
  item,
1665
1756
  activeItemHref,
1666
1757
  onItemClick,
1758
+ renderLink,
1759
+ interceptNavigation,
1667
1760
  open,
1668
1761
  defaultOpen,
1669
1762
  onOpenChange,
@@ -1718,7 +1811,9 @@ function SidebarSubgroup({
1718
1811
  item: sub,
1719
1812
  subitem: true,
1720
1813
  active: sub.href !== void 0 && sub.href === activeItemHref,
1721
- onClick: () => onItemClick?.(sub)
1814
+ onClick: (e) => onItemClick?.(sub, e),
1815
+ renderLink,
1816
+ interceptNavigation
1722
1817
  },
1723
1818
  sub.href ?? sub.name
1724
1819
  )) })
@@ -1728,6 +1823,7 @@ function SidebarSection({
1728
1823
  section,
1729
1824
  open,
1730
1825
  onOpenChange,
1826
+ renderLink,
1731
1827
  className
1732
1828
  }) {
1733
1829
  const [internalOpen, setInternalOpen] = React.useState(section.defaultOpen ?? true);
@@ -1792,6 +1888,7 @@ function SidebarSection({
1792
1888
  {
1793
1889
  href: item.href,
1794
1890
  onClick: item.onClick,
1891
+ renderLink,
1795
1892
  title: item.name,
1796
1893
  children: [
1797
1894
  Icon ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -1821,6 +1918,7 @@ function SidebarSection({
1821
1918
  {
1822
1919
  href: item.href,
1823
1920
  onClick: item.onClick,
1921
+ renderLink,
1824
1922
  title: `Conversar com ${item.name}`,
1825
1923
  children: [
1826
1924
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -1852,22 +1950,34 @@ function SidebarSectionLink({
1852
1950
  href,
1853
1951
  onClick,
1854
1952
  title,
1953
+ renderLink,
1855
1954
  children
1856
1955
  }) {
1857
1956
  const handleClick = (e) => {
1858
- if (!href || href === "#") e.preventDefault();
1957
+ if (!href || href === "#") {
1958
+ e.preventDefault();
1959
+ onClick?.(e);
1960
+ return;
1961
+ }
1962
+ if (!renderLink) {
1963
+ const prevent = shouldPreventNavigation({
1964
+ href,
1965
+ hasHandler: !!onClick,
1966
+ event: e
1967
+ });
1968
+ if (prevent) e.preventDefault();
1969
+ }
1859
1970
  onClick?.(e);
1860
1971
  };
1861
- return /* @__PURE__ */ jsxRuntime.jsx(
1862
- "a",
1863
- {
1864
- href: href ?? "#",
1865
- className: sidebarSectionItem(),
1866
- onClick: handleClick,
1867
- title,
1868
- children
1869
- }
1870
- );
1972
+ const linkProps = {
1973
+ href: href ?? "#",
1974
+ className: sidebarSectionItem(),
1975
+ onClick: handleClick,
1976
+ title,
1977
+ children
1978
+ };
1979
+ if (renderLink && href && href !== "#") return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: renderLink(linkProps) });
1980
+ return /* @__PURE__ */ jsxRuntime.jsx("a", { ...linkProps });
1871
1981
  }
1872
1982
  function SidebarPanel({
1873
1983
  context,
@@ -1876,6 +1986,8 @@ function SidebarPanel({
1876
1986
  mobile,
1877
1987
  activeItemHref,
1878
1988
  onItemClick,
1989
+ renderLink,
1990
+ interceptNavigation,
1879
1991
  contexts,
1880
1992
  onContextChange,
1881
1993
  onTitleClick,
@@ -1936,7 +2048,9 @@ function SidebarPanel({
1936
2048
  {
1937
2049
  item,
1938
2050
  activeItemHref,
1939
- onItemClick
2051
+ onItemClick,
2052
+ renderLink,
2053
+ interceptNavigation
1940
2054
  },
1941
2055
  item.name
1942
2056
  );
@@ -1946,12 +2060,21 @@ function SidebarPanel({
1946
2060
  {
1947
2061
  item,
1948
2062
  active: item.href !== void 0 && item.href === activeItemHref,
1949
- onClick: () => onItemClick?.(item)
2063
+ onClick: (e) => onItemClick?.(item, e),
2064
+ renderLink,
2065
+ interceptNavigation
1950
2066
  },
1951
2067
  item.href ?? item.name
1952
2068
  );
1953
2069
  }) }),
1954
- context.sections?.map((section) => /* @__PURE__ */ jsxRuntime.jsx(SidebarSection, { section }, section.id))
2070
+ context.sections?.map((section) => /* @__PURE__ */ jsxRuntime.jsx(
2071
+ SidebarSection,
2072
+ {
2073
+ section,
2074
+ renderLink
2075
+ },
2076
+ section.id
2077
+ ))
1955
2078
  ] }) })
1956
2079
  ]
1957
2080
  }
@@ -2006,6 +2129,9 @@ function MenuSidebar({
2006
2129
  defaultMobileOpen,
2007
2130
  onMobileOpenChange,
2008
2131
  mobileBreakpoint = "(max-width: 767px)",
2132
+ renderLink,
2133
+ brandHref,
2134
+ onBrandClick,
2009
2135
  className
2010
2136
  }) {
2011
2137
  const isMobile = useMediaQuery(mobileBreakpoint);
@@ -2040,11 +2166,12 @@ function MenuSidebar({
2040
2166
  }, []);
2041
2167
  const shouldFloat = !isMobile && !!expandOnHover && collapsed && (hoverExpanded || hoverExiting);
2042
2168
  const activeContext = contexts.find((c) => c.id === ctxId) ?? contexts[0];
2043
- const handleItemClick = (item) => {
2169
+ const interceptNavigation = !renderLink && !!onItemClick;
2170
+ const handleItemClick = (item, event) => {
2044
2171
  if (item.href && activeItemHref === void 0) {
2045
2172
  setItemHref(item.href);
2046
2173
  }
2047
- onItemClick?.(item);
2174
+ onItemClick?.(item, event);
2048
2175
  if (isMobile && item.href) setOpenMobile(false);
2049
2176
  };
2050
2177
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -2094,7 +2221,10 @@ function MenuSidebar({
2094
2221
  brand,
2095
2222
  user,
2096
2223
  showAdd: showRailAdd,
2097
- onAddClick: onRailAddClick
2224
+ onAddClick: onRailAddClick,
2225
+ brandHref,
2226
+ onBrandClick,
2227
+ renderLink
2098
2228
  }
2099
2229
  ),
2100
2230
  activeContext && /* @__PURE__ */ jsxRuntime.jsx(
@@ -2108,7 +2238,9 @@ function MenuSidebar({
2108
2238
  onItemClick: handleItemClick,
2109
2239
  contexts,
2110
2240
  onContextChange: setCtxId,
2111
- onTitleClick: onPanelTitleClick
2241
+ onTitleClick: onPanelTitleClick,
2242
+ renderLink,
2243
+ interceptNavigation
2112
2244
  }
2113
2245
  ),
2114
2246
  isMobile && openMobile && /* @__PURE__ */ jsxRuntime.jsx(
@@ -2314,6 +2446,9 @@ function AppShell({
2314
2446
  defaultActiveItemHref,
2315
2447
  activeItemHref,
2316
2448
  onItemClick,
2449
+ renderLink,
2450
+ brandHref,
2451
+ onBrandClick,
2317
2452
  // Header
2318
2453
  breadcrumb,
2319
2454
  commandGroups,
@@ -2385,6 +2520,9 @@ function AppShell({
2385
2520
  activeItemHref,
2386
2521
  defaultActiveItemHref,
2387
2522
  onItemClick,
2523
+ renderLink,
2524
+ brandHref,
2525
+ onBrandClick,
2388
2526
  user: userNode,
2389
2527
  panelCollapsed: menuCollapsed,
2390
2528
  onPanelCollapseChange: (next) => {
@@ -2510,7 +2648,11 @@ exports.SidebarSubgroup = SidebarSubgroup;
2510
2648
  exports.UserMenu = UserMenu;
2511
2649
  exports.chipCount = chipCount;
2512
2650
  exports.chipVariants = chipVariants;
2651
+ exports.isExternalHref = isExternalHref;
2652
+ exports.isHashHref = isHashHref;
2653
+ exports.isModifiedClick = isModifiedClick;
2654
+ exports.shouldPreventNavigation = shouldPreventNavigation;
2513
2655
  exports.useControllable = useControllable;
2514
2656
  exports.useMediaQuery = useMediaQuery;
2515
2657
  exports.useTheme = useTheme;
2516
- //# sourceMappingURL=useTheme-BeD_2lZN.cjs.map
2658
+ //# sourceMappingURL=useTheme-C8eZFGSb.cjs.map