@almadar/ui 4.30.0 → 4.32.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.
@@ -20668,255 +20668,265 @@ var init_DashboardLayout = __esm({
20668
20668
  const user = userProp || (null);
20669
20669
  const { t } = useTranslate();
20670
20670
  const handleSignOut = onSignOutProp || authSignOut;
20671
- return /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "min-h-screen bg-background dark:bg-background", children: [
20672
- sidebarOpen && /* @__PURE__ */ jsxRuntime.jsx(
20673
- Box,
20674
- {
20675
- className: "fixed inset-0 bg-foreground/50 dark:bg-foreground/70 z-20 lg:hidden",
20676
- onClick: () => setSidebarOpen(false)
20677
- }
20678
- ),
20679
- /* @__PURE__ */ jsxRuntime.jsxs(
20680
- Box,
20681
- {
20682
- as: "aside",
20683
- className: cn(
20684
- "fixed inset-y-0 left-0 z-30 w-64 bg-card dark:bg-card border-r border-border dark:border-border",
20685
- "transform transition-transform duration-200 ease-in-out lg:translate-x-0",
20686
- sidebarOpen ? "translate-x-0" : "-translate-x-full"
20671
+ return /* @__PURE__ */ jsxRuntime.jsxs(
20672
+ HStack,
20673
+ {
20674
+ gap: "none",
20675
+ className: "min-h-screen w-full bg-background dark:bg-background items-stretch",
20676
+ children: [
20677
+ sidebarOpen && /* @__PURE__ */ jsxRuntime.jsx(
20678
+ Box,
20679
+ {
20680
+ className: "fixed inset-0 bg-foreground/50 dark:bg-foreground/70 z-20 lg:hidden",
20681
+ onClick: () => setSidebarOpen(false)
20682
+ }
20687
20683
  ),
20688
- children: [
20689
- /* @__PURE__ */ jsxRuntime.jsxs(
20690
- HStack,
20691
- {
20692
- align: "center",
20693
- justify: "between",
20694
- className: "h-16 px-4 border-b border-border dark:border-border",
20695
- children: [
20696
- /* @__PURE__ */ jsxRuntime.jsxs(reactRouterDom.Link, { to: "/", className: "flex items-center gap-2", children: [
20697
- logo || /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "w-8 h-8 bg-primary-600 rounded-lg flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
20698
- Typography,
20699
- {
20700
- variant: "small",
20701
- className: "text-white font-bold text-sm",
20702
- as: "span",
20703
- children: appName.charAt(0).toUpperCase()
20704
- }
20705
- ) }),
20706
- /* @__PURE__ */ jsxRuntime.jsx(
20707
- Typography,
20708
- {
20709
- variant: "label",
20710
- className: "font-semibold text-foreground dark:text-foreground",
20711
- as: "span",
20712
- children: appName
20713
- }
20714
- )
20715
- ] }),
20716
- /* @__PURE__ */ jsxRuntime.jsx(
20717
- Button,
20718
- {
20719
- variant: "ghost",
20720
- className: "lg:hidden p-2 rounded-md hover:bg-muted dark:hover:bg-muted text-muted-foreground dark:text-muted-foreground",
20721
- onClick: () => setSidebarOpen(false),
20722
- children: /* @__PURE__ */ jsxRuntime.jsx(LucideIcons.X, { className: "h-5 w-5" })
20723
- }
20724
- )
20725
- ]
20726
- }
20727
- ),
20728
- /* @__PURE__ */ jsxRuntime.jsx(
20729
- VStack,
20730
- {
20731
- as: "nav",
20732
- gap: "none",
20733
- className: "flex-1 px-3 py-4 space-y-1 overflow-y-auto",
20734
- children: navItems.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
20735
- NavLink,
20684
+ /* @__PURE__ */ jsxRuntime.jsxs(
20685
+ Box,
20686
+ {
20687
+ as: "aside",
20688
+ className: cn(
20689
+ "z-30 w-64 flex-shrink-0 bg-card dark:bg-card border-r border-border dark:border-border",
20690
+ "fixed inset-y-0 left-0 lg:static lg:translate-x-0 lg:h-auto",
20691
+ "transform transition-transform duration-200 ease-in-out",
20692
+ "flex flex-col",
20693
+ sidebarOpen ? "translate-x-0" : "-translate-x-full"
20694
+ ),
20695
+ children: [
20696
+ /* @__PURE__ */ jsxRuntime.jsxs(
20697
+ HStack,
20736
20698
  {
20737
- item,
20738
- currentPath: location.pathname
20739
- },
20740
- item.href
20741
- ))
20742
- }
20743
- ),
20744
- sidebarFooter && /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "p-4 border-t border-border dark:border-border", children: sidebarFooter })
20745
- ]
20746
- }
20747
- ),
20748
- /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "lg:pl-64", children: [
20749
- /* @__PURE__ */ jsxRuntime.jsx(
20750
- Box,
20751
- {
20752
- as: "header",
20753
- className: "sticky top-0 z-20 h-16 bg-card dark:bg-card border-b border-border dark:border-border",
20754
- children: /* @__PURE__ */ jsxRuntime.jsxs(
20755
- HStack,
20756
- {
20757
- align: "center",
20758
- justify: "between",
20759
- className: "h-full px-4 gap-4",
20760
- children: [
20761
- /* @__PURE__ */ jsxRuntime.jsx(
20762
- Button,
20763
- {
20764
- variant: "ghost",
20765
- className: "lg:hidden p-2 rounded-md hover:bg-muted dark:hover:bg-muted text-muted-foreground dark:text-muted-foreground touch-manipulation min-h-[44px] min-w-[44px] flex items-center justify-center",
20766
- onClick: () => setSidebarOpen(true),
20767
- "aria-label": "Open sidebar",
20768
- children: /* @__PURE__ */ jsxRuntime.jsx(LucideIcons.Menu, { className: "h-5 w-5" })
20769
- }
20770
- ),
20771
- searchEnabled && /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "hidden sm:block flex-1 max-w-md", children: /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "relative", children: [
20772
- /* @__PURE__ */ jsxRuntime.jsx(LucideIcons.Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground dark:text-muted-foreground" }),
20773
- /* @__PURE__ */ jsxRuntime.jsx(
20774
- Input,
20775
- {
20776
- type: "search",
20777
- placeholder: t("common.search"),
20778
- className: "pl-10 w-full",
20779
- onKeyDown: (e) => {
20780
- if (e.key === "Enter") {
20781
- handleSearchSubmit(e.target.value);
20699
+ align: "center",
20700
+ justify: "between",
20701
+ className: "h-16 px-4 border-b border-border dark:border-border",
20702
+ children: [
20703
+ /* @__PURE__ */ jsxRuntime.jsxs(reactRouterDom.Link, { to: "/", className: "flex items-center gap-2", children: [
20704
+ logo || /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "w-8 h-8 bg-primary-600 rounded-lg flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
20705
+ Typography,
20706
+ {
20707
+ variant: "small",
20708
+ className: "text-white font-bold text-sm",
20709
+ as: "span",
20710
+ children: appName.charAt(0).toUpperCase()
20782
20711
  }
20712
+ ) }),
20713
+ /* @__PURE__ */ jsxRuntime.jsx(
20714
+ Typography,
20715
+ {
20716
+ variant: "label",
20717
+ className: "font-semibold text-foreground dark:text-foreground",
20718
+ as: "span",
20719
+ children: appName
20720
+ }
20721
+ )
20722
+ ] }),
20723
+ /* @__PURE__ */ jsxRuntime.jsx(
20724
+ Button,
20725
+ {
20726
+ variant: "ghost",
20727
+ className: "lg:hidden p-2 rounded-md hover:bg-muted dark:hover:bg-muted text-muted-foreground dark:text-muted-foreground",
20728
+ onClick: () => setSidebarOpen(false),
20729
+ children: /* @__PURE__ */ jsxRuntime.jsx(LucideIcons.X, { className: "h-5 w-5" })
20783
20730
  }
20784
- }
20785
- )
20786
- ] }) }),
20787
- /* @__PURE__ */ jsxRuntime.jsxs(HStack, { align: "center", gap: "xs", children: [
20788
- headerActions,
20789
- showThemeToggle && /* @__PURE__ */ jsxRuntime.jsx(ThemeToggle, {}),
20790
- topBarActions.map((action, idx) => /* @__PURE__ */ jsxRuntime.jsxs(
20791
- Button,
20731
+ )
20732
+ ]
20733
+ }
20734
+ ),
20735
+ /* @__PURE__ */ jsxRuntime.jsx(
20736
+ VStack,
20737
+ {
20738
+ as: "nav",
20739
+ gap: "none",
20740
+ className: "flex-1 px-3 py-4 space-y-1 overflow-y-auto",
20741
+ children: navItems.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
20742
+ NavLink,
20792
20743
  {
20793
- variant: "ghost",
20794
- className: "relative p-2 rounded-full hover:bg-muted dark:hover:bg-muted",
20795
- onClick: () => handleTopBarActionClick(action.event),
20796
- "aria-label": action.label ?? action.icon,
20797
- children: [
20798
- /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: action.icon, className: "h-5 w-5 text-muted-foreground dark:text-muted-foreground" }),
20799
- action.badge !== void 0 && action.badge !== null && action.badge !== 0 && action.badge !== "" && /* @__PURE__ */ jsxRuntime.jsx(
20800
- Box,
20801
- {
20802
- as: "span",
20803
- className: cn(
20804
- "absolute -top-0.5 -right-0.5 min-w-[18px] h-[18px] px-1 rounded-full text-[10px] font-semibold text-white flex items-center justify-center",
20805
- action.variant === "danger" ? "bg-error" : action.variant === "primary" ? "bg-primary" : "bg-foreground"
20806
- ),
20807
- children: action.badge
20808
- }
20809
- )
20810
- ]
20744
+ item,
20745
+ currentPath: location.pathname
20811
20746
  },
20812
- `${action.event}-${idx}`
20813
- )),
20814
- notificationsEnabled && /* @__PURE__ */ jsxRuntime.jsxs(
20815
- Button,
20816
- {
20817
- variant: "ghost",
20818
- className: "relative p-2 rounded-full hover:bg-muted dark:hover:bg-muted",
20819
- onClick: handleNotificationClick,
20820
- "aria-label": t("common.notifications"),
20821
- children: [
20822
- /* @__PURE__ */ jsxRuntime.jsx(LucideIcons.Bell, { className: "h-5 w-5 text-muted-foreground dark:text-muted-foreground" }),
20823
- unreadCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(
20824
- Box,
20825
- {
20826
- as: "span",
20827
- className: "absolute -top-0.5 -right-0.5 min-w-[18px] h-[18px] px-1 bg-error rounded-full text-[10px] font-semibold text-white flex items-center justify-center",
20828
- children: unreadCount > 99 ? "99+" : unreadCount
20829
- }
20830
- )
20831
- ]
20832
- }
20833
- ),
20834
- user && /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "relative", children: [
20835
- /* @__PURE__ */ jsxRuntime.jsxs(
20747
+ item.href
20748
+ ))
20749
+ }
20750
+ ),
20751
+ sidebarFooter && /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "p-4 border-t border-border dark:border-border", children: sidebarFooter })
20752
+ ]
20753
+ }
20754
+ ),
20755
+ /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "none", className: "flex-1 min-w-0 min-h-screen", children: [
20756
+ /* @__PURE__ */ jsxRuntime.jsx(
20757
+ Box,
20758
+ {
20759
+ as: "header",
20760
+ className: "sticky top-0 z-20 h-16 bg-card dark:bg-card border-b border-border dark:border-border",
20761
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
20762
+ HStack,
20763
+ {
20764
+ align: "center",
20765
+ justify: "between",
20766
+ className: "h-full px-3 sm:px-4 gap-2 sm:gap-4",
20767
+ children: [
20768
+ /* @__PURE__ */ jsxRuntime.jsx(
20836
20769
  Button,
20837
20770
  {
20838
20771
  variant: "ghost",
20839
- className: "flex items-center gap-2 p-2 rounded-lg hover:bg-muted dark:hover:bg-muted",
20840
- onClick: () => setUserMenuOpen(!userMenuOpen),
20841
- children: [
20842
- /* @__PURE__ */ jsxRuntime.jsx(
20843
- Avatar,
20844
- {
20845
- src: user.avatar,
20846
- alt: user.name,
20847
- initials: user.name.split(" ").map((n) => n[0]).join("").substring(0, 2),
20848
- size: "sm"
20849
- }
20850
- ),
20851
- /* @__PURE__ */ jsxRuntime.jsx(
20852
- Typography,
20853
- {
20854
- variant: "small",
20855
- className: "hidden sm:block text-sm font-medium text-foreground dark:text-foreground",
20856
- as: "span",
20857
- children: user.name
20858
- }
20859
- ),
20860
- /* @__PURE__ */ jsxRuntime.jsx(LucideIcons.ChevronDown, { className: "hidden sm:block h-4 w-4 text-muted-foreground dark:text-muted-foreground" })
20861
- ]
20772
+ className: "lg:hidden p-2 rounded-md hover:bg-muted dark:hover:bg-muted text-muted-foreground dark:text-muted-foreground touch-manipulation min-h-[44px] min-w-[44px] flex items-center justify-center",
20773
+ onClick: () => setSidebarOpen(true),
20774
+ "aria-label": "Open sidebar",
20775
+ children: /* @__PURE__ */ jsxRuntime.jsx(LucideIcons.Menu, { className: "h-5 w-5" })
20862
20776
  }
20863
20777
  ),
20864
- userMenuOpen && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
20778
+ searchEnabled && /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "hidden sm:block flex-1 min-w-0 xl:max-w-md", children: /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "relative", children: [
20779
+ /* @__PURE__ */ jsxRuntime.jsx(LucideIcons.Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground dark:text-muted-foreground" }),
20865
20780
  /* @__PURE__ */ jsxRuntime.jsx(
20866
- Box,
20781
+ Input,
20782
+ {
20783
+ type: "search",
20784
+ placeholder: t("common.search"),
20785
+ className: "pl-10 w-full",
20786
+ onKeyDown: (e) => {
20787
+ if (e.key === "Enter") {
20788
+ handleSearchSubmit(e.target.value);
20789
+ }
20790
+ }
20791
+ }
20792
+ )
20793
+ ] }) }),
20794
+ !searchEnabled && /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex-1" }),
20795
+ /* @__PURE__ */ jsxRuntime.jsxs(HStack, { align: "center", gap: "xs", children: [
20796
+ headerActions,
20797
+ showThemeToggle && /* @__PURE__ */ jsxRuntime.jsx(ThemeToggle, {}),
20798
+ topBarActions.map((action, idx) => /* @__PURE__ */ jsxRuntime.jsxs(
20799
+ Button,
20867
20800
  {
20868
- className: "fixed inset-0 z-20",
20869
- onClick: () => setUserMenuOpen(false)
20801
+ variant: "ghost",
20802
+ className: "relative p-2 rounded-full hover:bg-muted dark:hover:bg-muted",
20803
+ onClick: () => handleTopBarActionClick(action.event),
20804
+ "aria-label": action.label ?? action.icon,
20805
+ children: [
20806
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: action.icon, className: "h-5 w-5 text-muted-foreground dark:text-muted-foreground" }),
20807
+ action.badge !== void 0 && action.badge !== null && action.badge !== 0 && action.badge !== "" && /* @__PURE__ */ jsxRuntime.jsx(
20808
+ Box,
20809
+ {
20810
+ as: "span",
20811
+ className: cn(
20812
+ "absolute -top-0.5 -right-0.5 min-w-[18px] h-[18px] px-1 rounded-full text-[10px] font-semibold text-white flex items-center justify-center",
20813
+ action.variant === "danger" ? "bg-error" : action.variant === "primary" ? "bg-primary" : "bg-foreground"
20814
+ ),
20815
+ children: action.badge
20816
+ }
20817
+ )
20818
+ ]
20819
+ },
20820
+ `${action.event}-${idx}`
20821
+ )),
20822
+ notificationsEnabled && /* @__PURE__ */ jsxRuntime.jsxs(
20823
+ Button,
20824
+ {
20825
+ variant: "ghost",
20826
+ className: "relative p-2 rounded-full hover:bg-muted dark:hover:bg-muted",
20827
+ onClick: handleNotificationClick,
20828
+ "aria-label": t("common.notifications"),
20829
+ children: [
20830
+ /* @__PURE__ */ jsxRuntime.jsx(LucideIcons.Bell, { className: "h-5 w-5 text-muted-foreground dark:text-muted-foreground" }),
20831
+ unreadCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(
20832
+ Box,
20833
+ {
20834
+ as: "span",
20835
+ className: "absolute -top-0.5 -right-0.5 min-w-[18px] h-[18px] px-1 bg-error rounded-full text-[10px] font-semibold text-white flex items-center justify-center",
20836
+ children: unreadCount > 99 ? "99+" : unreadCount
20837
+ }
20838
+ )
20839
+ ]
20870
20840
  }
20871
20841
  ),
20872
- /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "absolute right-0 mt-2 w-48 bg-card dark:bg-card rounded-lg shadow-lg border border-border dark:border-border py-1 z-30", children: [
20873
- /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "px-4 py-2 border-b border-border dark:border-border", children: [
20874
- /* @__PURE__ */ jsxRuntime.jsx(
20875
- Typography,
20876
- {
20877
- variant: "small",
20878
- className: "text-sm font-medium text-foreground dark:text-foreground",
20879
- as: "p",
20880
- children: user.name
20881
- }
20882
- ),
20883
- /* @__PURE__ */ jsxRuntime.jsx(
20884
- Typography,
20885
- {
20886
- variant: "caption",
20887
- className: "text-xs text-muted-foreground dark:text-muted-foreground",
20888
- as: "p",
20889
- children: user.email
20890
- }
20891
- )
20892
- ] }),
20842
+ user && /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "relative", children: [
20893
20843
  /* @__PURE__ */ jsxRuntime.jsxs(
20894
20844
  Button,
20895
20845
  {
20896
20846
  variant: "ghost",
20897
- onClick: () => {
20898
- setUserMenuOpen(false);
20899
- handleSignOut?.();
20900
- },
20901
- className: "w-full flex items-center gap-2 px-4 py-2 text-sm text-error dark:text-error hover:bg-error/10 dark:hover:bg-error/20",
20847
+ className: "flex items-center gap-2 p-2 rounded-lg hover:bg-muted dark:hover:bg-muted",
20848
+ onClick: () => setUserMenuOpen(!userMenuOpen),
20902
20849
  children: [
20903
- /* @__PURE__ */ jsxRuntime.jsx(LucideIcons.LogOut, { className: "h-4 w-4" }),
20904
- t("auth.signOut")
20850
+ /* @__PURE__ */ jsxRuntime.jsx(
20851
+ Avatar,
20852
+ {
20853
+ src: user.avatar,
20854
+ alt: user.name,
20855
+ initials: user.name.split(" ").map((n) => n[0]).join("").substring(0, 2),
20856
+ size: "sm"
20857
+ }
20858
+ ),
20859
+ /* @__PURE__ */ jsxRuntime.jsx(
20860
+ Typography,
20861
+ {
20862
+ variant: "small",
20863
+ className: "hidden sm:block text-sm font-medium text-foreground dark:text-foreground",
20864
+ as: "span",
20865
+ children: user.name
20866
+ }
20867
+ ),
20868
+ /* @__PURE__ */ jsxRuntime.jsx(LucideIcons.ChevronDown, { className: "hidden sm:block h-4 w-4 text-muted-foreground dark:text-muted-foreground" })
20905
20869
  ]
20906
20870
  }
20907
- )
20871
+ ),
20872
+ userMenuOpen && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
20873
+ /* @__PURE__ */ jsxRuntime.jsx(
20874
+ Box,
20875
+ {
20876
+ className: "fixed inset-0 z-20",
20877
+ onClick: () => setUserMenuOpen(false)
20878
+ }
20879
+ ),
20880
+ /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "absolute right-0 mt-2 w-48 bg-card dark:bg-card rounded-lg shadow-lg border border-border dark:border-border py-1 z-30", children: [
20881
+ /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "px-4 py-2 border-b border-border dark:border-border", children: [
20882
+ /* @__PURE__ */ jsxRuntime.jsx(
20883
+ Typography,
20884
+ {
20885
+ variant: "small",
20886
+ className: "text-sm font-medium text-foreground dark:text-foreground",
20887
+ as: "p",
20888
+ children: user.name
20889
+ }
20890
+ ),
20891
+ /* @__PURE__ */ jsxRuntime.jsx(
20892
+ Typography,
20893
+ {
20894
+ variant: "caption",
20895
+ className: "text-xs text-muted-foreground dark:text-muted-foreground",
20896
+ as: "p",
20897
+ children: user.email
20898
+ }
20899
+ )
20900
+ ] }),
20901
+ /* @__PURE__ */ jsxRuntime.jsxs(
20902
+ Button,
20903
+ {
20904
+ variant: "ghost",
20905
+ onClick: () => {
20906
+ setUserMenuOpen(false);
20907
+ handleSignOut?.();
20908
+ },
20909
+ className: "w-full flex items-center gap-2 px-4 py-2 text-sm text-error dark:text-error hover:bg-error/10 dark:hover:bg-error/20",
20910
+ children: [
20911
+ /* @__PURE__ */ jsxRuntime.jsx(LucideIcons.LogOut, { className: "h-4 w-4" }),
20912
+ t("auth.signOut")
20913
+ ]
20914
+ }
20915
+ )
20916
+ ] })
20917
+ ] })
20908
20918
  ] })
20909
20919
  ] })
20910
- ] })
20911
- ] })
20912
- ]
20920
+ ]
20921
+ }
20922
+ )
20913
20923
  }
20914
- )
20915
- }
20916
- ),
20917
- /* @__PURE__ */ jsxRuntime.jsx(Box, { as: "main", className: "p-4 sm:p-6", children })
20918
- ] })
20919
- ] });
20924
+ ),
20925
+ /* @__PURE__ */ jsxRuntime.jsx(Box, { as: "main", className: "flex-1 p-3 sm:p-4 md:p-6", children })
20926
+ ] })
20927
+ ]
20928
+ }
20929
+ );
20920
20930
  };
20921
20931
  DashboardLayout.displayName = "DashboardLayout";
20922
20932
  NavLink = ({
@@ -49005,7 +49015,7 @@ init_logger();
49005
49015
 
49006
49016
  // runtime/createClientEffectHandlers.ts
49007
49017
  function createClientEffectHandlers(options) {
49008
- const { eventBus, slotSetter, navigate, notify } = options;
49018
+ const { eventBus, slotSetter, navigate, notify, callService } = options;
49009
49019
  return {
49010
49020
  emit: (event, payload) => {
49011
49021
  const prefixedEvent = event.startsWith("UI:") ? event : `UI:${event}`;
@@ -49017,9 +49027,24 @@ function createClientEffectHandlers(options) {
49017
49027
  set: () => {
49018
49028
  console.warn("[ClientEffectHandlers] set is server-side only, ignored on client");
49019
49029
  },
49020
- callService: async () => {
49021
- console.warn("[ClientEffectHandlers] callService is server-side only, ignored on client");
49022
- return {};
49030
+ callService: async (service, action, params) => {
49031
+ if (callService) return callService(service, action, params);
49032
+ const mockId = `mock_${service}_${action}_${Math.random().toString(36).slice(2, 10)}`;
49033
+ const paramsEcho = {};
49034
+ if (params) {
49035
+ for (const [k, v] of Object.entries(params)) {
49036
+ if (v !== void 0 && (typeof v === "string" || typeof v === "number" || typeof v === "boolean" || v === null || v instanceof Date)) {
49037
+ paramsEcho[k] = v;
49038
+ }
49039
+ }
49040
+ }
49041
+ return {
49042
+ id: mockId,
49043
+ clientSecret: `secret_${mockId}`,
49044
+ success: true,
49045
+ status: "succeeded",
49046
+ ...paramsEcho
49047
+ };
49023
49048
  },
49024
49049
  renderUI: (slot, pattern, props) => {
49025
49050
  if (pattern === null) {
@@ -49402,7 +49427,8 @@ function useTraitStateMachine(traitBindings, uiSlots, options) {
49402
49427
  }
49403
49428
  },
49404
49429
  navigate: optionsRef.current?.navigate,
49405
- notify: optionsRef.current?.notify
49430
+ notify: optionsRef.current?.notify,
49431
+ callService: optionsRef.current?.callService
49406
49432
  });
49407
49433
  const persistence = optionsRef.current?.persistence;
49408
49434
  let handlers = clientHandlers;