@eintrek/erp-shell 0.1.43 → 0.1.45

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/index.esm.js CHANGED
@@ -1087,7 +1087,7 @@ function NavMain({ items, orgCode, closeOnNavigation = false, approvalCounts, })
1087
1087
  // is active (so parent+child don't both light up).
1088
1088
  const isItemActive = pathname === itemUrl && !hasActiveSubItem;
1089
1089
  item.icon;
1090
- return (jsx(Collapsible, { asChild: true, defaultOpen: isItemActive || hasActiveSubItem, className: "group/collapsible", children: jsxs(SidebarMenuItem, { children: [jsx(CollapsibleTrigger, { asChild: true, children: jsx(SidebarMenuButton, { asChild: !item.subModules || item.subModules.length === 0, isActive: isItemActive, className: " data-[state=open]:text-sidebar-accent-foreground", children: item.subModules && item.subModules.length > 0 ? (jsxs(Fragment$1, { children: [jsx("span", { id: item.id, children: item.titleTh }), jsx(ChevronRight, { className: "ml-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90" })] })) : (jsx(Link, { href: itemUrl, className: "flex items-center gap-2 w-full min-w-0 flex-1", onClick: handleNavLinkClick, children: jsx("span", { id: item.id, className: "flex-1 truncate", title: item.titleTh, children: item.titleTh }) })) }) }), item.subModules && item.subModules.length > 0 && (jsx(CollapsibleContent, { children: jsx(SidebarMenuSub, { children: item.subModules.map(subItem => {
1090
+ return (jsx(Collapsible, { asChild: true, defaultOpen: isItemActive || hasActiveSubItem, className: "group/collapsible", children: jsxs(SidebarMenuItem, { children: [jsx(CollapsibleTrigger, { asChild: true, children: jsx(SidebarMenuButton, { asChild: !item.subModules || item.subModules.length === 0, isActive: isItemActive, className: " data-[state=open]:text-sidebar-accent-foreground", children: item.subModules && item.subModules.length > 0 ? (jsxs(Fragment$1, { children: [jsx("span", { id: item.id, children: item.titleTh }), jsx(ChevronRight, { className: "ml-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90" })] })) : (jsx(Link, { href: itemUrl, prefetch: false, className: "flex items-center gap-2 w-full min-w-0 flex-1", onClick: handleNavLinkClick, children: jsx("span", { id: item.id, className: "flex-1 truncate", title: item.titleTh, children: item.titleTh }) })) }) }), item.subModules && item.subModules.length > 0 && (jsx(CollapsibleContent, { children: jsx(SidebarMenuSub, { children: item.subModules.map(subItem => {
1091
1091
  const subItemUrl = buildUrlWithCode(code, subItem.url);
1092
1092
  const isSubItemActive = subItemUrl === activeSubItemUrl;
1093
1093
  const SubIcon = subItem.icon;
@@ -1104,10 +1104,10 @@ function NavMain({ items, orgCode, closeOnNavigation = false, approvalCounts, })
1104
1104
  const SubPageIcon = subPage.icon;
1105
1105
  return (jsx(SidebarMenuSubItem, { children: jsx(SidebarMenuSubButton, { asChild: true, className: `font-thai w-full text-sm ${isSubPageActive
1106
1106
  ? "text-sidebar-accent-foreground font-medium"
1107
- : "text-sidebar-foreground"}`, isActive: false, children: jsxs(Link, { href: subPageUrl, className: "w-full flex items-center", onClick: handleNavLinkClick, children: [SubPageIcon && (jsx(SubPageIcon, { className: "sidebar-subpage-icon flex-shrink-0" })), jsx("span", { className: "flex-1 truncate", title: subPage.titleTh, children: subPage.titleTh })] }) }) }, subPage.id));
1107
+ : "text-sidebar-foreground"}`, isActive: false, children: jsxs(Link, { href: subPageUrl, prefetch: false, className: "w-full flex items-center", onClick: handleNavLinkClick, children: [SubPageIcon && (jsx(SubPageIcon, { className: "sidebar-subpage-icon flex-shrink-0" })), jsx("span", { className: "flex-1 truncate", title: subPage.titleTh, children: subPage.titleTh })] }) }) }, subPage.id));
1108
1108
  }) }) })] }) }, subItem.id));
1109
1109
  }
1110
- return (jsx(SidebarMenuSubItem, { children: jsx(SidebarMenuSubButton, { asChild: true, className: "w-full", isActive: isSubItemActive, children: jsxs(Link, { href: subItemUrl, className: "w-full flex items-center", onClick: handleNavLinkClick, children: [SubIcon && (jsx(SubIcon, { className: "sidebar-submodule-icon flex-shrink-0" })), jsx("span", { className: "flex-1 truncate", title: subItem.titleTh, children: subItem.titleTh }), approvalCount > 0 && (jsx(Badge, { variant: "destructive", className: "ml-auto h-5 min-w-5 px-1.5 text-xs font-medium tabular-nums", children: approvalCount > 99 ? "99+" : approvalCount }))] }) }) }, subItem.id));
1110
+ return (jsx(SidebarMenuSubItem, { children: jsx(SidebarMenuSubButton, { asChild: true, className: "w-full", isActive: isSubItemActive, children: jsxs(Link, { href: subItemUrl, prefetch: false, className: "w-full flex items-center", onClick: handleNavLinkClick, children: [SubIcon && (jsx(SubIcon, { className: "sidebar-submodule-icon flex-shrink-0" })), jsx("span", { className: "flex-1 truncate", title: subItem.titleTh, children: subItem.titleTh }), approvalCount > 0 && (jsx(Badge, { variant: "destructive", className: "ml-auto h-5 min-w-5 px-1.5 text-xs font-medium tabular-nums", children: approvalCount > 99 ? "99+" : approvalCount }))] }) }) }, subItem.id));
1111
1111
  }) }) }))] }) }, item.id));
1112
1112
  }) }) }));
1113
1113
  }
@@ -1650,27 +1650,40 @@ function writeThemeCookie(value) {
1650
1650
  /**
1651
1651
  * Bridges next-themes (per-origin localStorage) with a cookie scoped to the
1652
1652
  * parent domain, so the light/dark/system choice is shared across the
1653
- * accounting / HR / platform subdomains. On load it adopts the shared cookie;
1654
- * on every later change it writes the cookie back.
1653
+ * accounting / HR / platform subdomains.
1654
+ *
1655
+ * Local storage wins when it already has a value (H57): adopting the shared
1656
+ * cookie first used to overwrite an explicit choice — including one set via
1657
+ * DevTools — and write `theme=light` back on every load whenever the cookie
1658
+ * still said light. Push the local value into the cookie instead so sibling
1659
+ * apps catch up.
1655
1660
  */
1656
1661
  function ThemeCookieSync() {
1657
1662
  const { theme, setTheme } = useTheme();
1658
1663
  const skipFirstWrite = React.useRef(true);
1659
1664
  React.useEffect(() => {
1665
+ const local = typeof window !== "undefined"
1666
+ ? window.localStorage.getItem("theme")
1667
+ : null;
1660
1668
  const cookie = readThemeCookie();
1661
- if (cookie) {
1669
+ if (local) {
1670
+ if (local !== theme)
1671
+ setTheme(local);
1672
+ writeThemeCookie(local);
1673
+ }
1674
+ else if (cookie) {
1662
1675
  if (cookie !== theme)
1663
1676
  setTheme(cookie);
1664
1677
  }
1665
1678
  else if (theme) {
1666
- writeThemeCookie(theme); // seed the shared cookie the first time
1679
+ writeThemeCookie(theme);
1667
1680
  }
1668
1681
  // Run once on mount — `theme` is intentionally not a dependency here.
1669
1682
  // eslint-disable-next-line react-hooks/exhaustive-deps
1670
1683
  }, []);
1671
1684
  React.useEffect(() => {
1672
1685
  // Skip the initial render; only persist genuine changes (incl. the
1673
- // setTheme() triggered by adopting the cookie above — harmless re-write).
1686
+ // setTheme() triggered by adopting storage above — harmless re-write).
1674
1687
  if (skipFirstWrite.current) {
1675
1688
  skipFirstWrite.current = false;
1676
1689
  return;