@fayz-ai/ui 0.8.2 → 0.8.4

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 (63) hide show
  1. package/dist/{chunk-XAOGMWLC.cjs → chunk-7ZQQZD4Q.cjs} +354 -80
  2. package/dist/chunk-7ZQQZD4Q.cjs.map +1 -0
  3. package/dist/{chunk-IEYCOJTY.cjs → chunk-B3BTZDTA.cjs} +10 -42
  4. package/dist/chunk-B3BTZDTA.cjs.map +1 -0
  5. package/dist/{chunk-O5F4LLSL.js → chunk-DYMBFHD7.js} +8 -7
  6. package/dist/chunk-DYMBFHD7.js.map +1 -0
  7. package/dist/{chunk-FY7OZNKU.js → chunk-G6OKZ7WL.js} +35 -8
  8. package/dist/chunk-G6OKZ7WL.js.map +1 -0
  9. package/dist/{chunk-W5O2X277.js → chunk-M34ACV5E.js} +27 -4
  10. package/dist/chunk-M34ACV5E.js.map +1 -0
  11. package/dist/{chunk-NWPMNPGR.cjs → chunk-MUGRP5DD.cjs} +57 -34
  12. package/dist/chunk-MUGRP5DD.cjs.map +1 -0
  13. package/dist/{chunk-ODY3GZ3Y.cjs → chunk-NZV47HWO.cjs} +36 -7
  14. package/dist/chunk-NZV47HWO.cjs.map +1 -0
  15. package/dist/{chunk-J3IUFUNR.js → chunk-R4LPSXTT.js} +8 -38
  16. package/dist/chunk-R4LPSXTT.js.map +1 -0
  17. package/dist/{chunk-TDGSY5W6.cjs → chunk-R4SQ2GVD.cjs} +8 -7
  18. package/dist/chunk-R4SQ2GVD.cjs.map +1 -0
  19. package/dist/{chunk-MZZMZYSE.js → chunk-VVQ45ZDZ.js} +357 -83
  20. package/dist/chunk-VVQ45ZDZ.js.map +1 -0
  21. package/dist/dashboard/OnboardingWidget.d.ts.map +1 -1
  22. package/dist/dashboard/index.cjs +26 -26
  23. package/dist/dashboard/index.js +2 -2
  24. package/dist/index.cjs +137 -137
  25. package/dist/index.js +5 -5
  26. package/dist/layout/AppShell.d.ts +41 -1
  27. package/dist/layout/AppShell.d.ts.map +1 -1
  28. package/dist/layout/ModulePage.d.ts +9 -6
  29. package/dist/layout/ModulePage.d.ts.map +1 -1
  30. package/dist/layout/Sidebar.d.ts +24 -1
  31. package/dist/layout/Sidebar.d.ts.map +1 -1
  32. package/dist/layout/Topbar.d.ts +13 -1
  33. package/dist/layout/Topbar.d.ts.map +1 -1
  34. package/dist/layout/index.cjs +19 -19
  35. package/dist/layout/index.js +1 -1
  36. package/dist/primitives/data-table.d.ts.map +1 -1
  37. package/dist/primitives/index.cjs +83 -83
  38. package/dist/primitives/index.js +2 -2
  39. package/dist/primitives/search-select.d.ts +3 -1
  40. package/dist/primitives/search-select.d.ts.map +1 -1
  41. package/dist/theme/index.cjs +8 -8
  42. package/dist/theme/index.d.ts.map +1 -1
  43. package/dist/theme/index.js +1 -1
  44. package/package.json +3 -3
  45. package/src/dashboard/OnboardingWidget.tsx +41 -1
  46. package/src/layout/AppShell.tsx +255 -7
  47. package/src/layout/ModulePage.tsx +32 -3
  48. package/src/layout/Sidebar.tsx +198 -61
  49. package/src/layout/Topbar.tsx +51 -4
  50. package/src/primitives/data-table.tsx +10 -1
  51. package/src/primitives/search-select.tsx +12 -4
  52. package/src/styles.css +34 -0
  53. package/src/theme/index.ts +9 -6
  54. package/dist/chunk-FY7OZNKU.js.map +0 -1
  55. package/dist/chunk-IEYCOJTY.cjs.map +0 -1
  56. package/dist/chunk-J3IUFUNR.js.map +0 -1
  57. package/dist/chunk-MZZMZYSE.js.map +0 -1
  58. package/dist/chunk-NWPMNPGR.cjs.map +0 -1
  59. package/dist/chunk-O5F4LLSL.js.map +0 -1
  60. package/dist/chunk-ODY3GZ3Y.cjs.map +0 -1
  61. package/dist/chunk-TDGSY5W6.cjs.map +0 -1
  62. package/dist/chunk-W5O2X277.js.map +0 -1
  63. package/dist/chunk-XAOGMWLC.cjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/stores/layout.store.ts","../src/layout/Sidebar.tsx","../src/layout/Topbar.tsx","../src/layout/AppShell.tsx","../src/layout/PageTransition.tsx","../src/layout/ModulePage.tsx","../src/layout/ContentSplit.tsx"],"names":["React","React2","jsxs","jsx","UserCog","Settings","CreditCard","Fragment","ICON_MAP","Home","Users","Bell","Calendar","CalendarClock","Package","Activity","BarChart3","FileText","Mail","DollarSign","Megaphone","ShoppingCart","ShoppingBag","Target","Wrench","ClipboardList","Briefcase","BookOpen","MessageCircle","Globe","BookOpenCheck","Percent","Tag","Tags","Camera","UtensilsCrossed","Search","MapPin","Handshake","Contact","Building2","ChevronDown","Filter","Plus","Shield","List","ListChecks","FolderOpen","Dog","Cat","PawPrint","Heart","LayoutTemplate","LeafyGreen","Apple","Egg","Wheat","Landmark","Receipt","TrendingUp","CircleDollarSign","Clock","UserPlus","UserX","Boxes","FileCheck2","PartyPopper","Radio","CalendarDays","BadgeDollarSign","Banknote","Layers","Music","Eye","ListMusic","Disc3","UsersRound","Mic","CalendarCheck2","CalendarX","ListPlus","Map","Ban","Clock3","Inbox","UserCheck","Star","Zap","getIcon","Menu","ArrowLeftRight","Wallet","React4","React5","NavItem","React6"],"mappings":"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","file":"chunk-MZZMZYSE.js","sourcesContent":["import { create } from 'zustand'\n\ninterface LayoutState {\n sidebarOpen: boolean\n sidebarCollapsed: boolean\n mobileDrawerOpen: boolean\n commandPaletteOpen: boolean\n toggleSidebar: () => void\n setSidebarCollapsed: (collapsed: boolean) => void\n toggleMobileDrawer: () => void\n setCommandPaletteOpen: (open: boolean) => void\n}\n\nexport const useLayoutStore = create<LayoutState>((set) => ({\n sidebarOpen: true,\n sidebarCollapsed: false,\n mobileDrawerOpen: false,\n commandPaletteOpen: false,\n\n toggleSidebar: () =>\n set((state) => ({ sidebarOpen: !state.sidebarOpen })),\n\n setSidebarCollapsed: (collapsed) =>\n set({ sidebarCollapsed: collapsed }),\n\n toggleMobileDrawer: () =>\n set((state) => ({ mobileDrawerOpen: !state.mobileDrawerOpen })),\n\n setCommandPaletteOpen: (open) =>\n set({ commandPaletteOpen: open }),\n}))\n","import * as React from 'react'\nimport * as Tooltip from '@radix-ui/react-tooltip'\nimport {\n Home,\n Users,\n Settings,\n CreditCard,\n Bell,\n Calendar,\n CalendarClock,\n Package,\n Activity,\n BarChart3,\n FileText,\n Mail,\n PanelLeftClose,\n PanelLeft,\n Search,\n Shield,\n DollarSign,\n Megaphone,\n Receipt,\n ShoppingCart,\n ShoppingBag,\n Target,\n Wrench,\n ClipboardList,\n ListChecks,\n Briefcase,\n UserCog,\n BookOpen,\n BookOpenCheck,\n MessageCircle,\n Globe,\n Percent,\n Tag,\n Tags,\n Camera,\n UtensilsCrossed,\n MapPin,\n Map,\n Handshake,\n Contact,\n Building2,\n Filter,\n Plus,\n List,\n ListPlus,\n ChevronDown,\n Ban,\n Clock,\n Dog,\n Cat,\n PawPrint,\n Heart,\n FolderOpen,\n LayoutTemplate,\n LeafyGreen,\n Apple,\n Egg,\n Wheat,\n PartyPopper,\n Radio,\n CalendarDays,\n CalendarCheck2,\n CalendarX,\n BadgeDollarSign,\n Banknote,\n Landmark,\n CircleDollarSign,\n Layers,\n Music,\n Eye,\n ListMusic,\n Disc3,\n UsersRound,\n Mic,\n Zap,\n Award,\n LayoutDashboard,\n MessageSquare,\n Inbox,\n Star,\n TrendingUp,\n UserCheck,\n UserPlus,\n UserX,\n Workflow,\n Boxes,\n Clock3,\n FileCheck2,\n type LucideIcon,\n} from 'lucide-react'\nimport { cn } from '../utils/cn'\nimport { useLayoutStore } from '../stores/layout.store'\n\nexport interface NavigationItem {\n id: string\n label: string\n icon: string\n route: string\n section: 'main' | 'secondary' | 'settings'\n badge?: string | number\n permission?: { feature: string; action: 'read' | 'create' | 'edit' | 'delete' }\n children?: NavigationItem[]\n}\n\nexport interface SidebarUser {\n fullName: string\n avatarUrl?: string\n email: string\n}\n\nexport interface SidebarProps {\n navigation: NavigationItem[]\n logo?: React.ReactNode\n collapsed: boolean\n onToggle: () => void\n onNavigate?: (route: string) => void\n currentPath?: string\n user?: SidebarUser\n onSignOut?: () => void\n onProfile?: () => void\n onSettings?: () => void\n onBilling?: () => void\n userMenuExtras?: { label: string; icon?: React.ReactNode; onClick: () => void }[]\n orgSwitcher?: React.ReactNode\n topContent?: React.ReactNode\n footerContent?: React.ReactNode\n /** When true, removes all borders for a cleaner framed look */\n borderless?: boolean\n /** User menu component to render at the bottom */\n userMenuSlot?: React.ReactNode\n /** Notification slot to render at the bottom */\n notificationSlot?: React.ReactNode\n /** Unread notification count for the bell indicator */\n unreadCount?: number\n}\n\nconst ICON_MAP: Record<string, LucideIcon> = {\n Home, Users, Settings, CreditCard, Bell, Calendar, CalendarClock, Package, Activity, BarChart3,\n FileText, Mail, DollarSign, Megaphone, ShoppingCart, Target, Wrench,\n Receipt, ShoppingBag, ClipboardList, ListChecks, Briefcase, UserCog, BookOpen, BookOpenCheck, MessageCircle, Globe,\n Percent, Tag, Tags, Camera, UtensilsCrossed, MapPin, Map, Handshake, Contact,\n Building2, Filter, Plus, List, ListPlus, Search, Shield, Ban, Clock, Dog, Cat, PawPrint, Heart, FolderOpen, LayoutTemplate, LeafyGreen, Apple, Egg, Wheat,\n PartyPopper, Radio, CalendarDays, CalendarCheck2, CalendarX, BadgeDollarSign, Banknote, Landmark, CircleDollarSign, Layers, Music, Eye, ListMusic, Disc3, UsersRound, Mic,\n Zap, Award, LayoutDashboard, MessageSquare, Inbox, Star, TrendingUp, UserCheck, UserPlus, UserX, Workflow, Boxes, Clock3, FileCheck2,\n}\n\nexport { ICON_MAP }\n\nfunction getIcon(name: string): LucideIcon {\n return ICON_MAP[name] ?? Home\n}\n\nfunction NavItem({\n item,\n collapsed,\n isActive,\n onNavigate,\n}: {\n item: NavigationItem\n collapsed: boolean\n isActive: boolean\n onNavigate: (route: string) => void\n}) {\n const Icon = getIcon(item.icon)\n\n const content = (\n <button\n onClick={() => onNavigate(item.route)}\n className={cn(\n 'flex w-full items-center gap-3 rounded-md px-2.5 py-1.5 text-[13px] font-medium transition-colors',\n 'hover:bg-sidebar-accent/60 hover:text-sidebar-accent-foreground',\n isActive\n ? 'bg-sidebar-accent font-semibold text-sidebar-accent-foreground shadow-sm'\n : 'text-sidebar-foreground/80',\n collapsed && 'justify-center px-2',\n )}\n >\n <Icon className=\"h-4 w-4 shrink-0\" />\n {!collapsed && (\n <>\n <span className=\"flex-1 truncate text-left\">{item.label}</span>\n {item.badge !== undefined && (\n <span className=\"ml-auto rounded-full bg-primary px-2 py-0.5 text-xs font-semibold text-primary-foreground\">\n {item.badge}\n </span>\n )}\n </>\n )}\n </button>\n )\n\n if (collapsed) {\n return (\n <Tooltip.Root delayDuration={0}>\n <Tooltip.Trigger asChild>{content}</Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content\n side=\"right\"\n sideOffset={8}\n className=\"fayz-glass-surface z-50 rounded-md bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md\"\n >\n {item.label}\n {item.badge !== undefined && (\n <span className=\"ml-2 rounded-full bg-primary px-1.5 py-0.5 text-xs text-primary-foreground\">\n {item.badge}\n </span>\n )}\n <Tooltip.Arrow className=\"fill-popover\" />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n )\n }\n\n return content\n}\n\n/** How specifically `route` matches `path` (-1 = no match; higher = more specific).\n * An exact match beats a prefix match; a longer prefix beats a shorter one. */\nfunction routeMatchScore(route: string, path: string): number {\n if (path === route) return route.length + 1\n if (route !== '/' && path.startsWith(route + '/')) return route.length\n return -1\n}\n\n/** The single most-specific nav route that matches the current path (longest wins).\n * Prevents a parent like `/courses` from staying active on `/courses/sales`. */\nfunction resolveActiveRoute(navigation: NavigationItem[], path: string): string | null {\n let best: string | null = null\n let bestScore = 0\n const consider = (route?: string) => {\n if (!route) return\n const score = routeMatchScore(route, path)\n if (score > bestScore) { bestScore = score; best = route }\n }\n for (const item of navigation) {\n consider(item.route)\n for (const child of item.children ?? []) consider(child.route)\n }\n return best\n}\n\nfunction NavGroup({\n item,\n collapsed,\n activeRoute,\n onNavigate,\n}: {\n item: NavigationItem\n collapsed: boolean\n activeRoute: string | null\n onNavigate: (route: string) => void\n}) {\n const isChildActive = item.children?.some((c) => c.route === activeRoute)\n const [open, setOpen] = React.useState(() => isChildActive ?? false)\n const Icon = getIcon(item.icon)\n\n if (collapsed) {\n return (\n <Tooltip.Root delayDuration={0}>\n <Tooltip.Trigger asChild>\n <button\n onClick={() => onNavigate(item.route)}\n className={cn(\n 'flex w-full items-center justify-center rounded-md px-2 py-2 text-sm font-medium transition-colors',\n 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',\n isChildActive ? 'bg-sidebar-accent text-sidebar-accent-foreground' : 'text-sidebar-muted'\n )}\n >\n <Icon className=\"h-4 w-4 shrink-0\" />\n </button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content side=\"right\" sideOffset={8} className=\"fayz-glass-surface z-50 rounded-md bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md\">\n {item.label}\n <Tooltip.Arrow className=\"fill-popover\" />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n )\n }\n\n return (\n <div>\n <button\n onClick={() => setOpen(!open)}\n className={cn(\n 'flex w-full items-center gap-3 rounded-md px-3 py-2 text-sm font-medium transition-colors',\n 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',\n isChildActive ? 'text-sidebar-accent-foreground' : 'text-sidebar-muted'\n )}\n >\n <Icon className=\"h-4 w-4 shrink-0\" />\n <span className=\"flex-1 truncate text-left\">{item.label}</span>\n <ChevronDown className={cn('h-3.5 w-3.5 shrink-0 transition-transform', open && 'rotate-180')} />\n </button>\n {open && (\n <div className=\"ml-4 mt-0.5 space-y-0.5 border-l border-sidebar-border/50 pl-3\">\n {item.children?.map((child) => {\n const ChildIcon = getIcon(child.icon)\n const isActive = child.route === activeRoute\n return (\n <button\n key={child.id}\n onClick={() => onNavigate(child.route)}\n className={cn(\n 'flex w-full items-center gap-2.5 rounded-md px-2 py-1.5 text-sm transition-colors',\n isActive\n ? 'font-medium text-sidebar-accent-foreground'\n : 'text-sidebar-muted hover:text-sidebar-accent-foreground'\n )}\n >\n <ChildIcon className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate\">{child.label}</span>\n </button>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\nexport function Sidebar({\n navigation,\n logo,\n collapsed,\n onToggle,\n onNavigate,\n currentPath: currentPathProp = '/',\n user: _user,\n orgSwitcher,\n topContent,\n footerContent,\n borderless,\n userMenuSlot,\n notificationSlot,\n unreadCount = 0,\n}: SidebarProps) {\n const currentPath = currentPathProp\n const setCommandPaletteOpen = useLayoutStore((s) => s.setCommandPaletteOpen)\n\n // Most-specific match wins, so sibling routes that share a prefix (e.g.\n // /courses vs /courses/sales) don't both light up.\n const activeRoute = resolveActiveRoute(navigation, currentPath)\n\n const mainItems = navigation.filter((item) => item.section === 'main')\n const secondaryItems = navigation.filter((item) => item.section === 'secondary')\n const settingsItems = navigation.filter((item) => item.section === 'settings')\n\n const handleNavigate = (route: string) => {\n onNavigate?.(route)\n }\n\n return (\n <Tooltip.Provider>\n <aside\n data-print=\"hide\"\n className={cn(\n 'flex h-full flex-col bg-sidebar text-sidebar-foreground transition-all duration-200',\n !borderless && 'border-r border-sidebar-border',\n collapsed ? 'w-16' : 'w-64'\n )}\n >\n {/* Logo + Collapse Toggle */}\n <div\n className={cn(\n 'flex h-14 items-center justify-between px-4',\n !borderless && 'border-b border-sidebar-border',\n collapsed && 'justify-center px-2'\n )}\n >\n {!collapsed && (\n <>\n {logo ?? <span className=\"text-lg font-bold\">App</span>}\n <button\n onClick={onToggle}\n className=\"ml-auto rounded-md p-1.5 text-sidebar-muted transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\"\n aria-label=\"Collapse sidebar\"\n >\n <PanelLeftClose className=\"h-4 w-4\" />\n </button>\n </>\n )}\n {collapsed && (\n <button\n onClick={onToggle}\n className=\"rounded-md p-1.5 text-sidebar-muted transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\"\n aria-label=\"Expand sidebar\"\n >\n <PanelLeft className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n\n {/* Main Navigation */}\n <nav className=\"flex-1 space-y-1 overflow-y-auto p-2\">\n {topContent && <div className=\"mb-4 space-y-2\">{topContent}</div>}\n\n {mainItems.length > 0 && (\n <div className=\"space-y-1\">\n {mainItems.map((item) =>\n item.children && item.children.length > 0 ? (\n <NavGroup key={item.id} item={item} collapsed={collapsed} activeRoute={activeRoute} onNavigate={handleNavigate} />\n ) : (\n <NavItem\n key={item.id}\n item={item}\n collapsed={collapsed}\n isActive={item.route === activeRoute}\n onNavigate={handleNavigate}\n />\n )\n )}\n </div>\n )}\n\n {secondaryItems.length > 0 && (\n <div className=\"mt-6 space-y-1\">\n {secondaryItems.map((item) =>\n item.children && item.children.length > 0 ? (\n <NavGroup key={item.id} item={item} collapsed={collapsed} activeRoute={activeRoute} onNavigate={handleNavigate} />\n ) : (\n <NavItem\n key={item.id}\n item={item}\n collapsed={collapsed}\n isActive={item.route === activeRoute}\n onNavigate={handleNavigate}\n />\n )\n )}\n </div>\n )}\n </nav>\n\n {/* Settings nav items */}\n {settingsItems.length > 0 && (\n <div className={cn('p-2 space-y-1', !borderless && 'border-t border-sidebar-border')}>\n {settingsItems.map((item) => (\n <NavItem\n key={item.id}\n item={item}\n collapsed={collapsed}\n isActive={item.route === activeRoute}\n onNavigate={handleNavigate}\n />\n ))}\n </div>\n )}\n\n {footerContent && (\n <div className={cn('p-2', !borderless && 'border-t border-sidebar-border')}>\n <div className=\"space-y-2\">{footerContent}</div>\n </div>\n )}\n\n {/* Org Switcher — above user row */}\n {orgSwitcher && React.isValidElement(orgSwitcher)\n ? React.cloneElement(orgSwitcher as React.ReactElement<any>, { collapsed })\n : orgSwitcher}\n\n {/* Bottom: User row with inline action icons */}\n <div className={cn('p-2', !borderless && 'border-t border-sidebar-border')}>\n <div className={cn(\n 'flex items-center rounded-md',\n collapsed ? 'flex-col gap-1' : 'gap-1 px-1'\n )}>\n {/* User Menu slot */}\n {userMenuSlot}\n\n {/* Spacer pushes icons to right when expanded */}\n {!collapsed && <div className=\"flex-1\" />}\n\n {/* Search — opens command palette */}\n <button\n onClick={() => setCommandPaletteOpen(true)}\n className=\"inline-flex shrink-0 items-center justify-center rounded-md p-2 text-sidebar-muted transition-colors hover:bg-sidebar-accent/50 hover:text-sidebar-accent-foreground\"\n aria-label=\"Search\"\n >\n <Search className=\"h-4 w-4\" />\n </button>\n\n {/* Notification slot or default bell */}\n {notificationSlot ?? (\n <button\n className=\"relative inline-flex shrink-0 items-center justify-center rounded-md p-2 text-sidebar-muted transition-colors hover:bg-sidebar-accent/50 hover:text-sidebar-accent-foreground\"\n aria-label={unreadCount > 0 ? `${unreadCount} unread notifications` : 'Notifications'}\n >\n <Bell className=\"h-4 w-4\" />\n {unreadCount > 0 && (\n <span className=\"absolute right-1 top-1 h-2 w-2 rounded-full bg-destructive\" />\n )}\n </button>\n )}\n </div>\n </div>\n </aside>\n </Tooltip.Provider>\n )\n}\n","import * as React from 'react'\nimport * as Popover from '@radix-ui/react-popover'\nimport {\n Menu,\n Search,\n ChevronDown,\n Filter,\n Home,\n Users,\n Settings,\n CreditCard,\n Bell,\n Calendar,\n CalendarClock,\n Package,\n Activity,\n BarChart3,\n Clapperboard,\n Newspaper,\n FileText,\n Mail,\n DollarSign,\n Megaphone,\n ShoppingCart,\n ShoppingBag,\n Target,\n Wrench,\n ClipboardList,\n ClipboardCheck,\n Briefcase,\n UserCog,\n BookOpen,\n BookOpenCheck,\n MessageCircle,\n Globe,\n Percent,\n Tag,\n Tags,\n Camera,\n UtensilsCrossed,\n MapPin,\n Handshake,\n Contact,\n Building2,\n Plus,\n Shield,\n List,\n ListChecks,\n FileCheck2,\n FolderOpen,\n Dog,\n Cat,\n PawPrint,\n Heart,\n LayoutTemplate,\n LeafyGreen,\n Apple,\n Egg,\n Wheat,\n ArrowDownCircle,\n ArrowUpCircle,\n Landmark,\n Receipt,\n TrendingUp,\n CircleDollarSign,\n Wallet,\n Clock,\n AlertTriangle,\n Sparkles,\n Warehouse,\n Ruler,\n ArrowUpRight,\n ArrowDownRight,\n ArrowLeftRight,\n Plug,\n SlidersHorizontal,\n TableProperties,\n UserPlus,\n UserCheck,\n UserX,\n TreePalm,\n Boxes,\n Box,\n PartyPopper,\n Radio,\n CalendarDays,\n CalendarCheck2,\n CalendarX,\n BadgeDollarSign,\n Banknote,\n Layers,\n Music,\n Eye,\n ListMusic,\n ListPlus,\n Map,\n Ban,\n Clock3,\n Disc3,\n UsersRound,\n Mic,\n Inbox,\n Star,\n Zap,\n type LucideIcon,\n} from 'lucide-react'\nimport { cn } from '../utils/cn'\nimport { useLayoutStore } from '../stores/layout.store'\n\nexport interface NavigationItem {\n id: string\n label: string\n icon: string\n route: string\n section: 'main' | 'secondary' | 'settings'\n badge?: string | number\n children?: NavigationItem[]\n permission?: { feature: string; action: 'read' | 'create' | 'edit' | 'delete' }\n}\n\nexport interface TopbarProps {\n navigation: NavigationItem[]\n logo?: React.ReactNode\n user?: { fullName: string; avatarUrl?: string; email: string }\n onMenuClick?: () => void\n leftContent?: React.ReactNode\n rightContent?: React.ReactNode\n currentPath?: string\n onNavigate?: (route: string) => void\n searchPlaceholder?: string\n onSignOut?: () => void\n onProfile?: () => void\n onSettings?: () => void\n onBilling?: () => void\n userMenuExtras?: { label: string; icon?: React.ReactNode; onClick: () => void }[]\n}\n\nfunction TopbarUserMenu({\n user,\n onSignOut,\n onProfile,\n onSettings,\n onBilling,\n userMenuExtras,\n}: Pick<TopbarProps, 'user' | 'onSignOut' | 'onProfile' | 'onSettings' | 'onBilling' | 'userMenuExtras'>) {\n const [open, setOpen] = React.useState(false)\n if (!user) return null\n const initial = (user.fullName?.trim()?.[0] ?? user.email?.[0] ?? '?').toUpperCase()\n const item = (label: string, onClick?: () => void, Icon?: LucideIcon) =>\n onClick ? (\n <button\n key={label}\n onClick={() => { setOpen(false); onClick() }}\n className=\"flex w-full items-center gap-2.5 rounded-lg px-3 py-2 text-sm text-popover-foreground transition-colors hover:bg-muted/70\"\n >\n {Icon && <Icon className=\"h-4 w-4 text-muted-foreground\" />}\n <span>{label}</span>\n </button>\n ) : null\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.Trigger asChild>\n <button\n aria-label=\"User menu\"\n className=\"ml-1 flex h-9 w-9 items-center justify-center overflow-hidden rounded-full bg-primary text-xs font-semibold text-primary-foreground ring-2 ring-transparent transition hover:ring-sidebar-border\"\n >\n {user.avatarUrl ? (\n // eslint-disable-next-line @next/next/no-img-element\n <img src={user.avatarUrl} alt=\"\" className=\"h-full w-full object-cover\" />\n ) : (\n initial\n )}\n </button>\n </Popover.Trigger>\n <Popover.Portal>\n <Popover.Content\n align=\"end\"\n sideOffset={8}\n className=\"fayz-glass-surface z-50 min-w-[220px] rounded-xl border border-border bg-popover p-1.5 shadow-lg animate-in fade-in-0 zoom-in-95\"\n >\n <div className=\"border-b border-border px-3 py-2\">\n <p className=\"truncate text-sm font-medium text-foreground\">{user.fullName || user.email}</p>\n <p className=\"truncate text-xs text-muted-foreground\">{user.email}</p>\n </div>\n <div className=\"mt-1 space-y-0.5\">\n {item('Perfil', onProfile, UserCog)}\n {item('Configurações', onSettings, Settings)}\n {item('Cobrança', onBilling, CreditCard)}\n {userMenuExtras?.map((e) => item(e.label, e.onClick))}\n {onSignOut && (\n <>\n <div className=\"my-1 border-t border-border\" />\n {item('Sair', onSignOut)}\n </>\n )}\n </div>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n )\n}\n\nexport const ICON_MAP: Record<string, LucideIcon> = {\n Home, Users, Settings, CreditCard, Bell, Calendar, CalendarClock, Package, Activity, BarChart3,\n FileText, Mail, DollarSign, Megaphone, ShoppingCart, ShoppingBag, Target, Wrench,\n ClipboardList, ClipboardCheck, Briefcase, UserCog, BookOpen, MessageCircle, Globe,\n BookOpenCheck, Percent, Tag, Tags, Camera, UtensilsCrossed, Search, MapPin, Handshake,\n Contact, Building2, ChevronDown, Filter, Plus, Shield, List, ListChecks, FolderOpen, Dog, Cat, PawPrint, Heart, LayoutTemplate, LeafyGreen, Apple, Egg, Wheat,\n ArrowDownCircle, ArrowUpCircle, ArrowLeftRight, Plug, SlidersHorizontal, TableProperties, Landmark, Receipt, TrendingUp, CircleDollarSign, Clock, AlertTriangle, Sparkles, Wallet, Warehouse, Ruler, ArrowUpRight, ArrowDownRight, UserPlus, UserX, TreePalm,\n Boxes, Box, FileCheck2, PartyPopper, Radio, CalendarDays, BadgeDollarSign, Banknote, Layers, Music, Eye, ListMusic, Disc3, UsersRound, Mic,\n CalendarCheck2, CalendarX, ListPlus, Map, Ban, Clock3, Inbox, UserCheck, Star, Zap, Clapperboard, Newspaper,\n}\n\nfunction getIcon(name: string): LucideIcon {\n return ICON_MAP[name] ?? Home\n}\n\nfunction NavDropdown({ item, currentPath, onNavigate }: {\n item: NavigationItem\n currentPath: string\n onNavigate: (route: string) => void\n}) {\n const [open, setOpen] = React.useState(false)\n const Icon = getIcon(item.icon)\n const isChildActive = item.children?.some(\n (child) => currentPath === child.route || currentPath.startsWith(child.route + '/')\n )\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.Trigger asChild>\n <button\n data-nav-active={isChildActive || undefined}\n className={cn(\n 'flex items-center gap-1.5 whitespace-nowrap border-b-2 px-3 py-2 text-sm transition-colors',\n isChildActive\n ? 'border-sidebar-accent-foreground font-semibold text-sidebar-foreground'\n : 'border-transparent text-sidebar-muted hover:text-sidebar-foreground'\n )}\n >\n <Icon className=\"h-4 w-4\" />\n <span>{item.label}</span>\n <ChevronDown className={cn('h-3 w-3 transition-transform', open && 'rotate-180')} />\n </button>\n </Popover.Trigger>\n <Popover.Portal>\n <Popover.Content\n align=\"start\"\n sideOffset={4}\n className=\"fayz-glass-surface z-50 min-w-[200px] rounded-xl border border-border bg-popover p-1.5 shadow-lg animate-in fade-in-0 zoom-in-95\"\n >\n {item.children?.map((child) => {\n const ChildIcon = getIcon(child.icon)\n const isActive = currentPath === child.route || currentPath.startsWith(child.route + '/')\n return (\n <button\n key={child.id}\n onClick={() => {\n onNavigate(child.route)\n setOpen(false)\n }}\n className={cn(\n 'flex w-full items-center gap-2.5 rounded-lg px-3 py-2 text-sm transition-colors',\n isActive\n ? 'bg-muted font-medium text-foreground'\n : 'text-popover-foreground hover:bg-muted/70'\n )}\n >\n <ChildIcon className=\"h-4 w-4 text-muted-foreground\" />\n <span>{child.label}</span>\n </button>\n )\n })}\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n )\n}\n\nexport function Topbar({\n navigation,\n logo,\n user,\n onMenuClick,\n leftContent,\n rightContent,\n currentPath = '/',\n onNavigate,\n searchPlaceholder = 'Search...',\n onSignOut,\n onProfile,\n onSettings,\n onBilling,\n userMenuExtras,\n}: TopbarProps) {\n const setCommandPaletteOpen = useLayoutStore((s) => s.setCommandPaletteOpen)\n\n const mainNav = navigation.filter((item) => item.section === 'main')\n const secondaryNav = navigation.filter((item) => item.section === 'secondary')\n const allNav = [...mainNav, ...secondaryNav]\n\n const handleNavigate = (route: string) => {\n onNavigate?.(route)\n }\n\n return (\n <header data-print=\"hide\" className=\"sticky top-0 z-50 w-full shrink-0\">\n {/* Row 1: Logo + Search + Actions */}\n <div className=\"border-b border-sidebar-border bg-sidebar text-sidebar-foreground\">\n <div className=\"flex h-14 w-full items-center justify-between px-4 md:px-6\">\n {/* Left: Mobile menu + Logo — the hamburger is only rendered when an\n onMenuClick handler is supplied. Mobile-first apps with a bottom\n nav omit it so the bottom bar is the primary navigation. */}\n <div className=\"flex items-center gap-3\">\n {onMenuClick && (\n <button\n onClick={onMenuClick}\n className=\"inline-flex items-center justify-center rounded-md p-2 text-sidebar-foreground/70 hover:bg-sidebar/30 hover:text-sidebar-foreground md:hidden\"\n aria-label=\"Open menu\"\n >\n <Menu className=\"h-5 w-5\" />\n </button>\n )}\n <div className=\"hidden shrink-0 items-center md:flex\">\n {logo ?? <span className=\"text-lg font-bold\">App</span>}\n </div>\n </div>\n\n {/* Center: Search (desktop only) */}\n <div className=\"mx-8 hidden max-w-sm flex-1 md:flex\">\n <button\n onClick={() => setCommandPaletteOpen(true)}\n className=\"relative flex h-8 w-full items-center rounded-md border border-sidebar-border bg-sidebar-accent px-3 pl-8 text-sm text-sidebar-muted shadow-sm transition-colors hover:border-sidebar-foreground/25 hover:bg-sidebar-foreground/10 hover:text-sidebar-foreground\"\n >\n <Search className=\"absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-sidebar-muted\" />\n <span className=\"text-xs\">{searchPlaceholder}</span>\n <kbd className=\"ml-auto hidden rounded border border-sidebar-border bg-sidebar-accent px-1.5 py-0.5 text-[10px] font-medium text-sidebar-muted sm:inline-block\">\n ⌘K\n </kbd>\n </button>\n </div>\n\n {/* Right: Actions */}\n <div className=\"flex items-center gap-1\">\n {leftContent}\n {rightContent}\n <TopbarUserMenu\n user={user}\n onSignOut={onSignOut}\n onProfile={onProfile}\n onSettings={onSettings}\n onBilling={onBilling}\n userMenuExtras={userMenuExtras}\n />\n </div>\n </div>\n </div>\n\n {/* Row 2: Navigation — desktop only */}\n <div className=\"hidden md:block bg-sidebar\">\n <div className=\"flex h-11 w-full items-center px-4 md:px-6\">\n <nav ref={(el) => {\n if (!el) return\n const active = el.querySelector('[data-nav-active=\"true\"]') as HTMLElement\n if (active) {\n const left = active.offsetLeft - el.offsetWidth / 2 + active.offsetWidth / 2\n el.scrollTo({ left: Math.max(0, left), behavior: 'smooth' })\n }\n }} className=\"flex items-center gap-0.5 overflow-x-auto scrollbar-none\">\n {allNav.map((item) => {\n if (item.children && item.children.length > 0) {\n return (\n <NavDropdown\n key={item.id}\n item={item}\n currentPath={currentPath}\n onNavigate={handleNavigate}\n />\n )\n }\n\n const Icon = getIcon(item.icon)\n const isActive =\n item.route === '/'\n ? currentPath === '/'\n : currentPath === item.route || currentPath.startsWith(item.route + '/')\n\n return (\n <button\n key={item.id}\n data-nav-active={isActive || undefined}\n onClick={() => handleNavigate(item.route)}\n className={cn(\n 'flex items-center gap-1.5 whitespace-nowrap border-b-2 px-3 py-2 text-sm transition-colors',\n isActive\n ? 'border-primary font-semibold text-sidebar-foreground'\n : 'border-transparent text-sidebar-muted hover:text-sidebar-foreground'\n )}\n >\n <Icon className=\"h-4 w-4\" />\n <span>{item.label}</span>\n {item.badge !== undefined && (\n <span className=\"rounded-full bg-primary px-1.5 py-0.5 text-[10px] font-semibold text-primary-foreground\">\n {item.badge}\n </span>\n )}\n </button>\n )\n })}\n </nav>\n </div>\n </div>\n </header>\n )\n}\n","import * as React from 'react'\nimport {\n Menu,\n Home,\n Receipt,\n ArrowLeftRight,\n Calendar,\n CreditCard,\n Settings,\n MessageCircle,\n Wallet,\n PiggyBank,\n Plus,\n type LucideIcon,\n} from 'lucide-react'\nimport { Sidebar, type NavigationItem, type SidebarUser, type SidebarProps } from './Sidebar'\nimport { Topbar } from './Topbar'\nimport { SaveBar, SaveBarProvider } from './SaveBar'\nimport { useLayoutStore } from '../stores/layout.store'\nimport { cn } from '../utils/cn'\n\n// ---------------------------------------------------------------------------\n// Module header slot — the page top-bar exposes a DOM node that module pages\n// (ModulePage 'tabs' variant) portal their title + sub-nav into, so the module\n// header lives in the shell's top-of-page container (GoHighLevel style).\n// ---------------------------------------------------------------------------\n\nconst ModuleHeaderSlotContext = React.createContext<HTMLElement | null>(null)\n\nexport function useModuleHeaderSlot(): HTMLElement | null {\n return React.useContext(ModuleHeaderSlotContext)\n}\n\n// Right-aligned slot for a page's primary action buttons (e.g. \"New campaign\").\nconst ModuleHeaderActionsSlotContext = React.createContext<HTMLElement | null>(null)\n\nexport function useModuleHeaderActionsSlot(): HTMLElement | null {\n return React.useContext(ModuleHeaderActionsSlotContext)\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface AppShellUser {\n fullName: string\n avatarUrl?: string\n email: string\n}\n\n// ---------------------------------------------------------------------------\n// Bottom-nav item model\n//\n// Two kinds share the mobile tab bar:\n// - route (default): a normal tab that navigates to `route`.\n// - action: a NON-route item rendered as a raised, elevated circular center\n// button (Mobills style). It fires `onBottomNavAction(id)` instead of\n// navigating — e.g. a global quick-add \"+\".\n// ---------------------------------------------------------------------------\n\nexport interface BottomNavRouteItem {\n kind?: 'route'\n label: string\n icon: string\n route: string\n}\n\nexport interface BottomNavActionItem {\n kind: 'action'\n /** Identifier passed to onBottomNavAction. */\n id: string\n icon: string\n /** Optional accessible label. */\n label?: string\n}\n\nexport type BottomNavItem = BottomNavRouteItem | BottomNavActionItem\n\n/** Mobile header treatment (small screens, <md). Desktop is unaffected.\n * - 'minimal' : a small top header bar (the default / today's behavior).\n * - 'transparent' : NO header bar; content is edge-to-edge with a floating\n * profile avatar pinned top-right (calls onProfile).\n * - 'hidden' : no header bar and no floating avatar. */\nexport type MobileHeaderVariant = 'transparent' | 'minimal' | 'hidden'\n\nexport interface AppShellProps {\n /** Layout variant */\n variant: 'sidebar' | 'topbar' | 'minimal'\n /** Wrap the main content in an inset framed card. The sidebar is always\n * flush/full-height (GoHighLevel style). */\n contentFrame?: boolean\n navigation?: NavigationItem[]\n logo?: React.ReactNode\n user?: AppShellUser\n children?: React.ReactNode\n onNavigate?: (route: string) => void\n onSignOut?: () => void\n onProfile?: () => void\n onSettings?: () => void\n onBilling?: () => void\n pageTitle?: string\n currentPath?: string\n userMenuExtras?: { label: string; icon?: React.ReactNode; onClick: () => void }[]\n orgSwitcher?: React.ReactNode\n topbarStart?: React.ReactNode\n topbarEnd?: React.ReactNode\n sidebarTopContent?: React.ReactNode\n sidebarFooterContent?: React.ReactNode\n bottomNav?: BottomNavItem[]\n /** Fired when a bottom-nav `action` item (e.g. the center \"+\") is tapped. */\n onBottomNavAction?: (id: string) => void\n /** Mobile header treatment (<md). Default: 'minimal'. Desktop unaffected. */\n mobileHeader?: MobileHeaderVariant\n /** Rendered in sidebar bottom user slot */\n userMenuSlot?: React.ReactNode\n /** Rendered in sidebar bottom notification slot */\n notificationSlot?: React.ReactNode\n /** Unread notification count */\n unreadCount?: number\n}\n\n// ---------------------------------------------------------------------------\n// Sidebar layout\n// ---------------------------------------------------------------------------\n\nfunction SidebarLayout({\n navigation = [],\n logo,\n user,\n children,\n onNavigate,\n onSignOut,\n onProfile,\n onSettings,\n onBilling,\n userMenuExtras: _userMenuExtras,\n orgSwitcher,\n sidebarTopContent,\n sidebarFooterContent,\n frame,\n currentPath,\n pageTitle,\n topbarStart,\n topbarEnd,\n userMenuSlot,\n notificationSlot,\n unreadCount = 0,\n hasBottomNav = false,\n mobileHeader = 'minimal',\n}: {\n navigation?: NavigationItem[]\n logo?: React.ReactNode\n user?: AppShellUser\n children?: React.ReactNode\n onNavigate?: (route: string) => void\n onSignOut?: () => void\n onProfile?: () => void\n onSettings?: () => void\n onBilling?: () => void\n userMenuExtras?: AppShellProps['userMenuExtras']\n orgSwitcher?: React.ReactNode\n sidebarTopContent?: React.ReactNode\n sidebarFooterContent?: React.ReactNode\n frame?: boolean\n currentPath?: string\n pageTitle?: string\n topbarStart?: React.ReactNode\n topbarEnd?: React.ReactNode\n userMenuSlot?: React.ReactNode\n notificationSlot?: React.ReactNode\n unreadCount?: number\n /** When a mobile bottom-nav bar is present, the mobile hamburger is\n * suppressed so the bottom nav is the primary mobile navigation. */\n hasBottomNav?: boolean\n /** Mobile header treatment (<md). Desktop keeps its top bar untouched. */\n mobileHeader?: MobileHeaderVariant\n}) {\n const sidebarCollapsed = useLayoutStore((s) => s.sidebarCollapsed)\n const setSidebarCollapsed = useLayoutStore((s) => s.setSidebarCollapsed)\n const [mobileMenuOpen, setMobileMenuOpen] = React.useState(false)\n const [headerSlot, setHeaderSlot] = React.useState<HTMLElement | null>(null)\n const [actionsSlot, setActionsSlot] = React.useState<HTMLElement | null>(null)\n\n return (\n <SaveBarProvider>\n <ModuleHeaderSlotContext.Provider value={headerSlot}>\n <ModuleHeaderActionsSlotContext.Provider value={actionsSlot}>\n <div className={cn(\n 'flex h-screen overflow-hidden bg-background',\n // Frame mode: the inset gap around the framed card takes the sidebar (menu)\n // color, so the white card reads as a panel floating on the same tone as the\n // left menu. The card's own md:m-2 margin reveals this behind it.\n frame && 'md:bg-sidebar',\n )}>\n {/* Desktop Sidebar — always flush / full-height (GoHighLevel style) */}\n <div className=\"hidden md:flex\">\n <Sidebar\n navigation={navigation}\n logo={logo}\n collapsed={sidebarCollapsed}\n onToggle={() => setSidebarCollapsed(!sidebarCollapsed)}\n onNavigate={onNavigate}\n currentPath={currentPath}\n user={user}\n onSignOut={onSignOut}\n onProfile={onProfile}\n onSettings={onSettings}\n onBilling={onBilling}\n orgSwitcher={orgSwitcher}\n topContent={sidebarTopContent}\n footerContent={sidebarFooterContent}\n borderless={false}\n userMenuSlot={userMenuSlot}\n notificationSlot={notificationSlot}\n unreadCount={unreadCount}\n />\n </div>\n\n {/* Main content — optionally wrapped in an inset framed card.\n The inset/rounding is suppressed on mobile so the content stays\n edge-to-edge (the framed card only reads well on larger screens). */}\n <div className={cn(\n 'relative flex flex-1 flex-col overflow-hidden',\n frame && 'md:m-2 md:rounded-xl md:border md:border-border md:bg-card'\n )}>\n {/* Top bar — mobile hamburger + module header slot (title + sub-nav) + actions.\n On mobile the bar is suppressed for the 'transparent' / 'hidden' header\n treatments (content goes edge-to-edge); desktop keeps it always. The\n portal targets below stay mounted (display:none on mobile) so module\n pages can still portal their sub-nav on desktop without crashing. */}\n <div className={cn(\n 'flex min-h-14 shrink-0 items-center justify-between gap-3 border-b border-border bg-card px-4 py-2',\n mobileHeader !== 'minimal' && 'hidden md:flex',\n )}>\n <div className=\"flex min-w-0 flex-1 items-center gap-3\">\n {/* Mobile hamburger — suppressed when a bottom-nav bar owns mobile\n navigation (mobile-first apps). Desktop sidebar is untouched. */}\n {!hasBottomNav && (\n <button\n onClick={() => setMobileMenuOpen(true)}\n className=\"inline-flex items-center justify-center rounded-md p-2 text-muted-foreground hover:bg-accent md:hidden\"\n aria-label=\"Open menu\"\n >\n <Menu className=\"h-5 w-5\" />\n </button>\n )}\n {pageTitle && <h2 className=\"font-semibold text-lg\">{pageTitle}</h2>}\n {topbarStart}\n {/* Module pages (tabs variant) portal their sub-nav here */}\n <div ref={setHeaderSlot} className=\"flex min-w-0 flex-1 items-center\" />\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {/* Pages portal their primary action buttons here */}\n <div ref={setActionsSlot} className=\"flex items-center gap-2\" />\n {topbarEnd}\n </div>\n </div>\n\n {/* Page content */}\n <main className=\"flex-1 overflow-y-auto pb-16 md:pb-0\">\n {children}\n </main>\n\n {/* App-wide floating SaveBar (spans the content column, not the sidebar) */}\n <SaveBar />\n </div>\n\n {/* Mobile drawer — animated, owns its own close transition. */}\n {mobileMenuOpen && (\n <MobileOverlay\n navigation={navigation}\n logo={logo}\n user={user}\n currentPath={currentPath}\n onNavigate={onNavigate}\n onSignOut={onSignOut}\n onProfile={onProfile}\n onSettings={onSettings}\n onBilling={onBilling}\n orgSwitcher={orgSwitcher}\n topContent={sidebarTopContent}\n footerContent={sidebarFooterContent}\n userMenuSlot={userMenuSlot}\n notificationSlot={notificationSlot}\n unreadCount={unreadCount}\n onClose={() => setMobileMenuOpen(false)}\n />\n )}\n </div>\n </ModuleHeaderActionsSlotContext.Provider>\n </ModuleHeaderSlotContext.Provider>\n </SaveBarProvider>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Topbar layout\n// ---------------------------------------------------------------------------\n\nfunction TopbarLayout({\n navigation = [],\n logo,\n user,\n children,\n onNavigate,\n onSignOut,\n onProfile,\n onSettings,\n onBilling,\n userMenuExtras,\n frame,\n currentPath,\n topbarStart,\n topbarEnd,\n hasBottomNav = false,\n}: {\n navigation?: NavigationItem[]\n logo?: React.ReactNode\n user?: AppShellUser\n children?: React.ReactNode\n onNavigate?: (route: string) => void\n onSignOut?: () => void\n onProfile?: () => void\n onSettings?: () => void\n onBilling?: () => void\n userMenuExtras?: AppShellProps['userMenuExtras']\n frame?: boolean\n currentPath?: string\n topbarStart?: React.ReactNode\n topbarEnd?: React.ReactNode\n /** When a mobile bottom-nav bar is present, the mobile hamburger is\n * suppressed so the bottom nav is the primary mobile navigation. */\n hasBottomNav?: boolean\n}) {\n const [mobileMenuOpen, setMobileMenuOpen] = React.useState(false)\n\n // Topbar is full-bleed (edge to edge); only the content area gets the frame.\n return (\n <SaveBarProvider>\n <div className=\"relative flex h-screen flex-col overflow-hidden bg-background\">\n <Topbar\n navigation={navigation}\n logo={logo}\n user={user}\n currentPath={currentPath}\n onNavigate={onNavigate}\n onSignOut={onSignOut}\n onProfile={onProfile}\n onSettings={onSettings}\n onBilling={onBilling}\n userMenuExtras={userMenuExtras}\n leftContent={topbarStart}\n rightContent={topbarEnd}\n onMenuClick={hasBottomNav ? undefined : () => setMobileMenuOpen(true)}\n />\n {/* Frame inset/border only from md up, so mobile stays edge-to-edge. The\n inset gap behind the framed card is the header color (bg-sidebar), so the\n white card reads as a panel floating on the same navy as the topbar. */}\n <main className={cn('flex-1 overflow-y-auto pb-16 md:pb-0', frame && 'md:bg-sidebar md:p-2')}>\n <div className={cn('min-h-full', frame && 'md:rounded-xl md:border md:border-border md:bg-card')}>\n {children}\n </div>\n </main>\n\n {/* App-wide floating SaveBar */}\n <SaveBar />\n\n {/* Mobile drawer — topbar has no persistent sidebar, so the burger opens\n the same animated nav drawer used by the sidebar layout. */}\n {mobileMenuOpen && (\n <MobileOverlay\n navigation={navigation}\n logo={logo}\n user={user}\n currentPath={currentPath}\n onNavigate={onNavigate}\n onSignOut={onSignOut}\n onProfile={onProfile}\n onSettings={onSettings}\n onBilling={onBilling}\n userMenuSlot={user ? <DrawerUserRow user={user} /> : undefined}\n onClose={() => setMobileMenuOpen(false)}\n />\n )}\n </div>\n </SaveBarProvider>\n )\n}\n\n// Compact user identity for the mobile drawer's bottom row.\nfunction DrawerUserRow({ user }: { user: AppShellUser }) {\n const label = user.fullName || user.email\n return (\n <div className=\"flex min-w-0 items-center gap-2 px-1\">\n {user.avatarUrl ? (\n <img src={user.avatarUrl} alt=\"\" className=\"h-7 w-7 shrink-0 rounded-full object-cover\" />\n ) : (\n <span className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-primary text-xs font-semibold text-primary-foreground\">\n {(label || '?').charAt(0).toUpperCase()}\n </span>\n )}\n <span className=\"truncate text-sm font-medium text-sidebar-foreground\">{label}</span>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Minimal layout\n// ---------------------------------------------------------------------------\n\nfunction MinimalLayout({\n logo,\n user: _user,\n children,\n headerEnd,\n}: {\n logo?: React.ReactNode\n user?: AppShellUser\n children?: React.ReactNode\n headerEnd?: React.ReactNode\n}) {\n return (\n <div className=\"flex h-screen flex-col\">\n <header className=\"flex h-14 shrink-0 items-center justify-between border-b border-border bg-card px-4 md:px-6\">\n <div className=\"flex items-center gap-3\">\n {logo ?? <span className=\"text-lg font-bold\">App</span>}\n </div>\n {headerEnd && <div className=\"flex items-center gap-2\">{headerEnd}</div>}\n </header>\n <main className=\"flex-1 overflow-y-auto pb-16 md:pb-0\">\n {children}\n </main>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Mobile overlay drawer\n// ---------------------------------------------------------------------------\n\ntype MobileOverlayProps = Omit<SidebarProps, 'collapsed' | 'onToggle'> & {\n onClose: () => void\n}\n\nfunction MobileOverlay({ onClose, onNavigate, ...sidebarProps }: MobileOverlayProps) {\n // Mount hidden, then flip to visible on the next frame so the CSS transition\n // plays on open. On dismiss we play the exit transition first, then unmount.\n const [visible, setVisible] = React.useState(false)\n\n React.useEffect(() => {\n const id = requestAnimationFrame(() => setVisible(true))\n return () => cancelAnimationFrame(id)\n }, [])\n\n const close = React.useCallback(() => {\n setVisible(false)\n window.setTimeout(onClose, 250)\n }, [onClose])\n\n // Lock body scroll while the drawer is open.\n React.useEffect(() => {\n const previous = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n return () => {\n document.body.style.overflow = previous\n }\n }, [])\n\n // Dismiss on Escape.\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') close()\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [close])\n\n return (\n <div className=\"fixed inset-0 z-[60] md:hidden\">\n {/* Backdrop — fades in/out */}\n <div\n className={cn(\n 'absolute inset-0 bg-black/50 transition-opacity duration-300 ease-out',\n visible ? 'opacity-100' : 'opacity-0',\n )}\n onClick={close}\n />\n {/* Drawer — slides in from the left, reusing the real Sidebar for full\n design parity (icons, active state, org switcher, bottom user row). */}\n <div\n className={cn(\n 'absolute inset-y-0 left-0 shadow-2xl transition-transform duration-300 ease-out will-change-transform',\n visible ? 'translate-x-0' : '-translate-x-full',\n )}\n >\n <Sidebar\n {...sidebarProps}\n collapsed={false}\n onToggle={close}\n borderless\n onNavigate={(route) => {\n onNavigate?.(route)\n close()\n }}\n />\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Mobile bottom tab bar — rendered for every variant on small screens.\n// ui must NOT import from saas, so the icon lookup is a small local map (a\n// mirror of the saas icon convention). Unknown icon names fall back to Home.\n// ---------------------------------------------------------------------------\n\nconst BOTTOM_NAV_ICONS: Record<string, LucideIcon> = {\n Home,\n Receipt,\n ArrowLeftRight,\n Calendar,\n CreditCard,\n Settings,\n Menu,\n MessageCircle,\n Wallet,\n PiggyBank,\n Plus,\n}\n\n// Floating profile avatar — mobile-only (md:hidden), pinned top-right over the\n// content. Used with the 'transparent' mobile header treatment so there is no\n// header bar but the user still has a one-tap route into their profile.\nfunction FloatingProfileAvatar({ user, onClick }: { user?: AppShellUser; onClick?: () => void }) {\n if (!user) return null\n const label = user.fullName || user.email\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label=\"Profile\"\n className=\"fixed right-3 top-3 z-40 md:hidden\"\n >\n {user.avatarUrl ? (\n <img\n src={user.avatarUrl}\n alt=\"\"\n className=\"h-9 w-9 rounded-full object-cover shadow-md ring-2 ring-background\"\n />\n ) : (\n <span className=\"flex h-9 w-9 items-center justify-center rounded-full bg-primary text-sm font-semibold text-primary-foreground shadow-md ring-2 ring-background\">\n {(label || '?').charAt(0).toUpperCase()}\n </span>\n )}\n </button>\n )\n}\n\nfunction MobileBottomNav({\n items,\n currentPath,\n onNavigate,\n onAction,\n}: {\n items: NonNullable<AppShellProps['bottomNav']>\n currentPath?: string\n onNavigate?: (route: string) => void\n onAction?: (id: string) => void\n}) {\n const path = currentPath ?? ''\n return (\n <nav className=\"fixed inset-x-0 bottom-0 z-50 flex h-16 items-center justify-around border-t border-border bg-background md:hidden\">\n {items.map((item) => {\n // Elevated center ACTION button (Mobills style) — raised above the bar,\n // circular, primary-filled; fires onBottomNavAction instead of routing.\n if (item.kind === 'action') {\n const ActionIcon = BOTTOM_NAV_ICONS[item.icon] ?? Plus\n return (\n <div key={item.id} className=\"flex flex-1 items-start justify-center\">\n <button\n type=\"button\"\n onClick={() => onAction?.(item.id)}\n aria-label={item.label ?? 'Add'}\n className=\"-mt-6 flex h-14 w-14 items-center justify-center rounded-full bg-primary text-primary-foreground shadow-lg shadow-primary/30 ring-4 ring-background transition-transform active:scale-95\"\n >\n <ActionIcon className=\"h-6 w-6\" />\n </button>\n </div>\n )\n }\n const isActive =\n item.route === '/'\n ? path === '/' || path === ''\n : path === item.route || path.startsWith(item.route + '/')\n const Icon = BOTTOM_NAV_ICONS[item.icon] ?? Home\n return (\n <button\n key={item.route}\n type=\"button\"\n onClick={() => onNavigate?.(item.route)}\n className={cn(\n 'flex flex-1 flex-col items-center justify-center gap-0.5 px-1 py-1 transition-colors',\n isActive ? 'text-primary' : 'text-muted-foreground',\n )}\n aria-current={isActive ? 'page' : undefined}\n >\n <Icon className=\"h-5 w-5\" />\n <span className=\"text-xs\">{item.label}</span>\n </button>\n )\n })}\n </nav>\n )\n}\n\n// ---------------------------------------------------------------------------\n// AppShell — main entry point\n// ---------------------------------------------------------------------------\n\nexport function AppShell({\n variant,\n contentFrame,\n navigation = [],\n logo,\n user,\n children,\n onNavigate,\n onSignOut,\n onProfile,\n onSettings,\n onBilling,\n pageTitle,\n currentPath,\n userMenuExtras,\n orgSwitcher,\n topbarStart,\n topbarEnd,\n sidebarTopContent,\n sidebarFooterContent,\n bottomNav,\n onBottomNavAction,\n mobileHeader = 'minimal',\n userMenuSlot,\n notificationSlot,\n unreadCount = 0,\n}: AppShellProps) {\n const hasBottomNav = !!bottomNav?.length\n const bottomBar = hasBottomNav ? (\n <MobileBottomNav\n items={bottomNav!}\n currentPath={currentPath}\n onNavigate={onNavigate}\n onAction={onBottomNavAction}\n />\n ) : null\n // Transparent mobile header → no bar, a floating avatar top-right instead.\n const floatingAvatar =\n mobileHeader === 'transparent' && user ? (\n <FloatingProfileAvatar user={user} onClick={onProfile} />\n ) : null\n\n let layoutElement: React.ReactNode\n switch (variant) {\n case 'sidebar':\n layoutElement = (\n <SidebarLayout\n navigation={navigation}\n logo={logo}\n user={user}\n onNavigate={onNavigate}\n onSignOut={onSignOut}\n onProfile={onProfile}\n onSettings={onSettings}\n onBilling={onBilling}\n userMenuExtras={userMenuExtras}\n orgSwitcher={orgSwitcher}\n sidebarTopContent={sidebarTopContent}\n sidebarFooterContent={sidebarFooterContent}\n frame={contentFrame}\n currentPath={currentPath}\n pageTitle={pageTitle}\n topbarStart={topbarStart}\n topbarEnd={topbarEnd}\n userMenuSlot={userMenuSlot}\n notificationSlot={notificationSlot}\n unreadCount={unreadCount}\n hasBottomNav={hasBottomNav}\n mobileHeader={mobileHeader}\n >\n {children}\n </SidebarLayout>\n )\n break\n\n case 'topbar':\n layoutElement = (\n <TopbarLayout\n navigation={navigation}\n logo={logo}\n user={user}\n onNavigate={onNavigate}\n onSignOut={onSignOut}\n onProfile={onProfile}\n onSettings={onSettings}\n onBilling={onBilling}\n userMenuExtras={userMenuExtras}\n frame={contentFrame}\n currentPath={currentPath}\n topbarStart={topbarStart}\n topbarEnd={topbarEnd}\n hasBottomNav={hasBottomNav}\n >\n {children}\n </TopbarLayout>\n )\n break\n\n case 'minimal':\n layoutElement = (\n <MinimalLayout logo={logo} user={user} headerEnd={topbarEnd}>\n {children}\n </MinimalLayout>\n )\n break\n\n default: {\n const _exhaustive: never = variant\n return null\n }\n }\n\n return (\n <>\n {layoutElement}\n {floatingAvatar}\n {bottomBar}\n </>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../utils/cn'\n\n// ---------------------------------------------------------------------------\n// PageTransition — the single, SDK-owned animation applied to every nested\n// navigation (route changes in the shell + module-internal view changes).\n// Plugins never implement transitions themselves; they render content and the\n// shell/ModulePage wrap it in <PageTransition>. The style is provided app-wide\n// via NavTransitionProvider so different products/repos can ship a different\n// feel (slide | fade | none | future custom) without touching plugins.\n// ---------------------------------------------------------------------------\n\nexport type NavTransition = 'slide' | 'fade' | 'none'\n\nconst NavTransitionContext = React.createContext<NavTransition>('slide')\n\nexport function NavTransitionProvider({ value, children }: { value: NavTransition; children: React.ReactNode }) {\n return <NavTransitionContext.Provider value={value}>{children}</NavTransitionContext.Provider>\n}\n\nexport function useNavTransition(): NavTransition {\n return React.useContext(NavTransitionContext)\n}\n\nfunction resolveTransitionClass(transition: NavTransition, direction?: 'forward' | 'back'): string {\n if (transition === 'none') return ''\n if (transition === 'fade') return 'saas-page-enter'\n // slide (default) — direction-aware, falls back to a plain enter.\n if (direction === 'back') return 'saas-nav-back'\n if (direction === 'forward') return 'saas-nav-forward'\n return 'saas-page-enter'\n}\n\n/**\n * Wraps content and re-fires the active transition whenever `transitionKey`\n * changes (the key swap forces the node to remount, restarting the CSS\n * animation). Direction is optional and only used by the 'slide' transition.\n */\nexport function PageTransition({\n transitionKey,\n direction,\n className,\n children,\n}: {\n transitionKey: string | number\n direction?: 'forward' | 'back'\n className?: string\n children: React.ReactNode\n}) {\n const transition = useNavTransition()\n const animClass = resolveTransitionClass(transition, direction)\n return (\n <div key={transitionKey} className={cn(animClass, className)}>\n {children}\n </div>\n )\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { ChevronDown, ChevronRight, ChevronLeft } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { cn } from '../utils/cn'\nimport { ICON_MAP } from './Topbar'\nimport { useModuleHeaderSlot, useModuleHeaderActionsSlot } from './AppShell'\nimport { PageTransition } from './PageTransition'\nimport { useBackHandler } from './SaveBar'\nimport { useCrossModuleBack } from './useCrossModuleBack'\n\n// ---------------------------------------------------------------------------\n// PageHeaderActions — portals a page's primary action button(s) into the shell\n// top-bar's right-aligned actions slot. Falls back to a right-aligned inline row\n// when there's no slot (e.g. topbar layout). Any page can use it:\n// <PageHeaderActions><Button>New campaign</Button></PageHeaderActions>\n// ---------------------------------------------------------------------------\n\nexport function PageHeaderActions({ children }: { children: React.ReactNode }) {\n const slot = useModuleHeaderActionsSlot()\n if (slot) return createPortal(children, slot)\n return <div className=\"mb-4 flex items-center justify-end gap-2\">{children}</div>\n}\n\nexport interface ModuleNavItem {\n id: string\n label: string\n icon?: string\n active?: boolean\n onClick?: () => void\n children?: { id: string; label: string; active?: boolean; onClick?: () => void }[]\n}\n\nexport interface ModulePageProps {\n title: string\n subtitle?: string\n nav: ModuleNavItem[]\n children: React.ReactNode\n className?: string\n /** Optional action element rendered next to the title (e.g. settings gear) */\n headerAction?: React.ReactNode\n /** Show the title/subtitle header. Default: true */\n showHeader?: boolean\n /** Optional content pinned to the bottom of the sidebar (e.g. \"Powered by X\") */\n sidebarFooter?: React.ReactNode\n /** How the module-internal nav renders. Falls back to the ModuleLayout context\n * (set by the app shell from its layout), then 'rail'. */\n navVariant?: ModuleNavVariant\n /** Active sub-view id — drives the SDK page transition when it changes.\n * Plugins pass their `useModuleNavigation().view`; they no longer animate themselves. */\n viewKey?: string\n /** Navigation direction for the transition (from `useModuleNavigation`). */\n direction?: 'forward' | 'back'\n}\n\n// ---------------------------------------------------------------------------\n// ModuleLayout context — lets the app shell decide how every module's internal\n// navigation renders ('rail' for topbar products, 'tabs' for sidebar/GHL-style\n// products), so plugins stay agnostic and products feel distinct.\n// ---------------------------------------------------------------------------\n\nexport type ModuleNavVariant = 'rail' | 'tabs'\n\nconst ModuleLayoutContext = React.createContext<ModuleNavVariant>('rail')\n\nexport function ModuleLayoutProvider({ variant, children }: { variant: ModuleNavVariant; children: React.ReactNode }) {\n return <ModuleLayoutContext.Provider value={variant}>{children}</ModuleLayoutContext.Provider>\n}\n\nexport function useModuleLayout(): ModuleNavVariant {\n return React.useContext(ModuleLayoutContext)\n}\n\nfunction NavItem({ item }: { item: ModuleNavItem }) {\n const [expanded, setExpanded] = React.useState(true)\n const Icon = item.icon ? (ICON_MAP[item.icon] ?? null) : null\n const hasChildren = item.children && item.children.length > 0\n const hasActiveChild = hasChildren && item.children!.some((c) => c.active)\n const isActive = item.active || hasActiveChild\n\n return (\n <div>\n <button\n type=\"button\"\n onClick={() => hasChildren ? setExpanded(!expanded) : item.onClick?.()}\n className={cn(\n 'flex items-center gap-2 w-full rounded-md px-2.5 py-1.5 text-sm transition-colors',\n isActive\n ? 'bg-primary/10 text-primary font-medium'\n : 'text-muted-foreground hover:text-foreground hover:bg-muted/50'\n )}\n >\n {Icon && <Icon className=\"h-4 w-4 shrink-0\" />}\n <span className=\"flex-1 text-left truncate\">{item.label}</span>\n {hasChildren && (\n expanded\n ? <ChevronDown className=\"h-3.5 w-3.5 shrink-0 opacity-50\" />\n : <ChevronRight className=\"h-3.5 w-3.5 shrink-0 opacity-50\" />\n )}\n </button>\n {hasChildren && expanded && (\n <div className=\"ml-4 mt-0.5 space-y-0.5 border-l pl-2\">\n {item.children!.map((child) => (\n <button\n key={child.id}\n type=\"button\"\n onClick={child.onClick}\n className={cn(\n 'flex items-center w-full rounded-md px-2.5 py-1 text-xs transition-colors',\n child.active\n ? 'text-primary font-medium bg-primary/5'\n : 'text-muted-foreground hover:text-foreground hover:bg-muted/50'\n )}\n >\n {child.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n/** Horizontal scrollable tabs for mobile — with expandable children */\nfunction MobileTabs({ nav }: { nav: ModuleNavItem[] }) {\n const scrollRef = React.useRef<HTMLDivElement>(null)\n const [expandedId, setExpandedId] = React.useState<string | null>(null)\n\n // Auto-scroll to active tab on mount\n React.useEffect(() => {\n const container = scrollRef.current\n if (!container) return\n const activeEl = container.querySelector('[data-active=\"true\"]') as HTMLElement\n if (activeEl) {\n const left = activeEl.offsetLeft - container.offsetWidth / 2 + activeEl.offsetWidth / 2\n container.scrollTo({ left: Math.max(0, left), behavior: 'smooth' })\n }\n }, [nav])\n\n return (\n <div className=\"md:hidden -mx-1 mb-4 no-print\">\n <div ref={scrollRef} className=\"flex gap-1 px-1 pb-2 overflow-x-auto scrollbar-none\">\n {nav.map((item) => {\n const Icon = item.icon ? (ICON_MAP[item.icon] ?? null) : null\n const hasChildren = item.children && item.children.length > 0\n const isActive = item.active || item.children?.some((c) => c.active)\n const isExpanded = expandedId === item.id\n\n return (\n <button\n key={item.id}\n type=\"button\"\n data-active={isActive || undefined}\n onClick={() => {\n if (hasChildren) {\n setExpandedId(isExpanded ? null : item.id)\n } else {\n item.onClick?.()\n setExpandedId(null)\n }\n }}\n className={cn(\n 'flex items-center gap-1.5 whitespace-nowrap rounded-full px-3 py-1.5 text-xs font-medium transition-colors shrink-0',\n isActive\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted text-muted-foreground hover:text-foreground'\n )}\n >\n {Icon && <Icon className=\"h-3 w-3\" />}\n {item.label}\n {hasChildren && <ChevronDown className={cn('h-2.5 w-2.5 transition-transform', isExpanded && 'rotate-180')} />}\n </button>\n )\n })}\n </div>\n\n {/* Expanded children dropdown */}\n {expandedId && (() => {\n const item = nav.find((n) => n.id === expandedId)\n if (!item?.children) return null\n return (\n <div className=\"flex gap-1 px-2 pb-2 animate-in fade-in-0 slide-in-from-top-1\">\n {item.children.map((child) => (\n <button\n key={child.id}\n type=\"button\"\n onClick={() => { child.onClick?.(); setExpandedId(null) }}\n className={cn(\n 'whitespace-nowrap rounded-full px-2.5 py-1 text-[11px] font-medium transition-colors shrink-0',\n child.active\n ? 'bg-foreground/10 text-foreground'\n : 'text-muted-foreground hover:text-foreground'\n )}\n >\n {child.label}\n </button>\n ))}\n </div>\n )\n })()}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// SubpageHeader\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Back-button style — the SINGLE, app-wide affordance for returning from a\n// detail/subpage. Set once by the product via <BackStyleProvider>, NOT chosen\n// per-plugin (mirrors NavTransitionProvider for page transitions). Plugins just\n// pass `onBack` + `parentLabel` to SubpageHeader and inherit whatever style the\n// app picked:\n// 'link' → subtle \"← Back to {parent}\" above the title (default)\n// 'breadcrumb' → \"{parent} › Title\"\n// 'icon' → square chevron button beside the title\n// ---------------------------------------------------------------------------\n\nexport type BackButtonStyle = 'link' | 'breadcrumb' | 'icon'\n\nconst BackStyleContext = React.createContext<BackButtonStyle>('link')\n\nexport function BackStyleProvider({ style, children }: { style: BackButtonStyle; children: React.ReactNode }) {\n return <BackStyleContext.Provider value={style}>{children}</BackStyleContext.Provider>\n}\n\nexport function useBackStyle(): BackButtonStyle {\n return React.useContext(BackStyleContext)\n}\n\nexport interface SubpageHeaderProps {\n /** Page title */\n title: string\n /** Short description */\n subtitle?: string\n /** Lucide icon name */\n icon?: string\n /** Back button handler */\n onBack?: () => void\n /** Parent label (e.g. \"Invoices\") — used by every back style (\"Back to Invoices\", breadcrumb root, etc.) */\n parentLabel?: string\n /** Actions rendered on the right */\n actions?: React.ReactNode\n /** Override the app-wide back style for this one header. Rarely needed. */\n backStyle?: BackButtonStyle\n}\n\nexport function SubpageHeader({ title, subtitle, icon, onBack, parentLabel, actions, backStyle }: SubpageHeaderProps) {\n const t = useTranslation()\n const appStyle = useBackStyle()\n\n // Defer to the global navigation history when the user came from another\n // module, so the back link points at the actual previous page. Within the\n // same module the page's own onBack/parentLabel pass through unchanged.\n const { onBack: effectiveOnBack, parentLabel: effectiveParentLabel } = useCrossModuleBack(onBack, parentLabel)\n\n // Wire this page's back action into the app-wide Escape key (no per-plugin code).\n useBackHandler(effectiveOnBack)\n const Icon = icon ? (ICON_MAP[icon] ?? null) : null\n // Breadcrumb/link need a parent label; without one we fall back to the icon button.\n const style: BackButtonStyle = !effectiveOnBack ? 'icon' : (backStyle ?? appStyle)\n const effectiveStyle: BackButtonStyle = style !== 'icon' && !effectiveParentLabel ? 'icon' : style\n\n const titleBlock = (\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"flex items-center gap-3\">\n {effectiveStyle === 'icon' && effectiveOnBack && (\n <button\n onClick={effectiveOnBack}\n className=\"flex h-8 w-8 items-center justify-center rounded-lg border hover:bg-muted bg-card shadow-button active:shadow-button-inset transition-colors\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n )}\n {Icon && (\n <div className=\"flex h-10 w-10 items-center justify-center rounded-xl bg-muted\">\n <Icon className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n )}\n <div>\n <h2 className=\"text-xl font-bold\">{title}</h2>\n {subtitle && <p className=\"text-sm text-muted-foreground\">{subtitle}</p>}\n </div>\n </div>\n {actions && <div className=\"no-print\">{actions}</div>}\n </div>\n )\n\n if (effectiveStyle === 'breadcrumb') {\n return (\n <div className=\"space-y-4 mb-6\">\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <button onClick={effectiveOnBack} className=\"hover:text-foreground transition-colors\">{effectiveParentLabel}</button>\n <ChevronRight className=\"h-3.5 w-3.5\" />\n <span className=\"text-foreground font-medium\">{title}</span>\n </div>\n {actions && <div className=\"no-print\">{actions}</div>}\n </div>\n {subtitle && <p className=\"text-sm text-muted-foreground -mt-2\">{subtitle}</p>}\n </div>\n )\n }\n\n if (effectiveStyle === 'link') {\n return (\n <div className=\"space-y-3 mb-6\">\n <button\n onClick={effectiveOnBack}\n className=\"inline-flex items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n {t('crud.detail.backTo', { entities: effectiveParentLabel as string })}\n </button>\n {titleBlock}\n </div>\n )\n }\n\n // icon (default fallback)\n return <div className=\"space-y-4 mb-6\">{titleBlock}</div>\n}\n\n// ---------------------------------------------------------------------------\n// ModuleHeader — GoHighLevel-style module header (title + horizontal sub-nav),\n// portalled into the shell's top-of-page header slot. Active tab's children\n// render as a secondary pill row. Falls back to inline if no slot is present.\n// ---------------------------------------------------------------------------\n\nfunction ModuleHeader({ nav }: { nav: ModuleNavItem[] }) {\n const slot = useModuleHeaderSlot()\n\n // Tabs are flat: a parent with children navigates straight to its default\n // \"list\" view (sub-actions like \"New\" live as a button inside that list).\n function defaultChild(item: ModuleNavItem) {\n const kids = item.children ?? []\n return kids.find((c) => /list/i.test(c.id) || /^list$/i.test(c.label)) ?? kids[kids.length - 1]\n }\n\n const content = (\n <div className=\"flex w-full min-w-0 items-center gap-4\">\n <div className=\"flex min-w-0 items-center gap-0.5 overflow-x-auto scrollbar-none\">\n {nav.map((item) => {\n const Icon = item.icon ? (ICON_MAP[item.icon] ?? null) : null\n const hasChildren = item.children && item.children.length > 0\n const isActive = item.active || item.children?.some((c) => c.active)\n return (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => (hasChildren ? defaultChild(item)?.onClick?.() : item.onClick?.())}\n className={cn(\n 'flex shrink-0 items-center gap-1.5 whitespace-nowrap border-b-2 px-2.5 py-1.5 text-sm font-medium transition-colors',\n isActive\n ? 'border-primary text-foreground'\n : 'border-transparent text-muted-foreground hover:text-foreground',\n )}\n >\n {Icon && <Icon className=\"h-4 w-4\" />}\n {item.label}\n </button>\n )\n })}\n </div>\n </div>\n )\n\n if (slot) return createPortal(content, slot)\n // Fallback: render inline above content when no shell header slot exists.\n return <div className=\"mb-5 border-b border-border pb-2\">{content}</div>\n}\n\n// ---------------------------------------------------------------------------\n// ModulePage\n// ---------------------------------------------------------------------------\n\nexport function ModulePage({ title, subtitle, nav, children, className, headerAction, showHeader = true, sidebarFooter, navVariant, viewKey, direction }: ModulePageProps) {\n const ctxVariant = useModuleLayout()\n const variant = navVariant ?? ctxVariant\n const transitionKey = viewKey ?? 'view'\n\n // Tabs variant — the module sub-nav renders in the shell's top-of-page header\n // container and actions in its right slot (GoHighLevel style); the content\n // area holds only the view (the shell owns the page title).\n if (variant === 'tabs') {\n return (\n <>\n <ModuleHeader nav={nav} />\n {/* Header actions belong to the module overview only; internal sub-views\n (showHeader=false) carry their own actions. */}\n {showHeader && headerAction && <PageHeaderActions>{headerAction}</PageHeaderActions>}\n <PageTransition transitionKey={transitionKey} direction={direction} className={cn('min-w-0', className)}>\n {children}\n </PageTransition>\n </>\n )\n }\n\n // Rail variant (default) — left sub-nav column.\n return (\n <div className={cn('flex gap-6 -mt-2', className)}>\n {/* Side navigation — hidden on mobile + print */}\n <div className=\"w-48 shrink-0 hidden md:block no-print\">\n <div className={cn(sidebarFooter && 'sticky top-4 flex flex-col')} style={sidebarFooter ? { height: 'calc(100vh - 8rem)' } : undefined}>\n <div>\n <p className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider px-2.5 mb-2\">{title}</p>\n <nav className=\"space-y-0.5\">\n {nav.map((item) => (\n <NavItem key={item.id} item={item} />\n ))}\n </nav>\n </div>\n {sidebarFooter && <div className=\"mt-auto\">{sidebarFooter}</div>}\n </div>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n {showHeader && (\n <div className=\"mb-6 flex items-start justify-between gap-3\">\n <div>\n <h1 className=\"text-2xl font-bold\">{title}</h1>\n {subtitle && <p className=\"text-sm text-muted-foreground\">{subtitle}</p>}\n </div>\n {headerAction}\n </div>\n )}\n {/* Mobile tabs */}\n <MobileTabs nav={nav} />\n <PageTransition transitionKey={transitionKey} direction={direction}>\n {children}\n </PageTransition>\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { PanelRight, PanelRightClose, PanelRightOpen } from 'lucide-react'\nimport { cn } from '../utils/cn'\nimport { Button } from '../primitives/button'\nimport {\n Sheet, SheetContent, SheetHeader, SheetBody, SheetTitle, SheetDescription,\n} from '../primitives/sheet'\n\n// ---------------------------------------------------------------------------\n// ContentSplit — main content with a right-aligned companion panel, mobile\n// first. Below `lg` the aside lives in a right Sheet (opened by a trigger the\n// host places wherever fits — typically SubpageHeader actions, via\n// <ContentSplitTrigger/>). From `lg` up it docks as a sticky right column.\n//\n// Pairs with SubpageHeader/ModulePage: the page keeps its own back-button\n// header; ContentSplit only owns the columns below it. Reuse for any\n// \"document + operational panel\" page (script + shooting checklist, form +\n// help, detail + activity feed).\n// ---------------------------------------------------------------------------\n\ninterface ContentSplitContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n}\n\nconst ContentSplitContext = React.createContext<ContentSplitContextValue | null>(null)\n\nexport interface ContentSplitProps {\n /** Main column (the document). */\n children: React.ReactNode\n /** Companion panel content (the checklist / help / activity). */\n aside: React.ReactNode\n /** Panel title — Sheet header on mobile, card header on desktop. */\n asideTitle: React.ReactNode\n /** Optional subtitle under the title. */\n asideDescription?: React.ReactNode\n /** Desktop column width (defaults to 20rem). */\n asideWidth?: string\n /** Controlled mobile-sheet state; uncontrolled when omitted. */\n asideOpen?: boolean\n onAsideOpenChange?: (open: boolean) => void\n /** Desktop column can collapse into a slim reopen rail. */\n collapsible?: boolean\n /** Initial desktop collapsed state (e.g. expand only on the relevant day). */\n defaultCollapsed?: boolean\n className?: string\n}\n\nexport function ContentSplit({\n children,\n aside,\n asideTitle,\n asideDescription,\n asideWidth = '20rem',\n asideOpen,\n onAsideOpenChange,\n collapsible = false,\n defaultCollapsed = false,\n className,\n}: ContentSplitProps) {\n const [internalOpen, setInternalOpen] = React.useState(false)\n const open = asideOpen ?? internalOpen\n const setOpen = onAsideOpenChange ?? setInternalOpen\n const [collapsed, setCollapsed] = React.useState(collapsible && defaultCollapsed)\n\n return (\n <ContentSplitContext.Provider value={{ open, setOpen }}>\n <div\n className={cn('lg:grid lg:items-start lg:gap-6', className)}\n style={{ gridTemplateColumns: `minmax(0, 1fr) ${collapsed ? 'auto' : asideWidth}` }}\n >\n <div className=\"min-w-0\">{children}</div>\n\n {/* Desktop: docked sticky column (or slim reopen rail when collapsed) */}\n <aside className=\"hidden lg:block lg:sticky lg:top-4\">\n {collapsed ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setCollapsed(false)}\n className=\"h-9 w-9 p-0\"\n aria-label={typeof asideTitle === 'string' ? asideTitle : undefined}\n title={typeof asideTitle === 'string' ? asideTitle : undefined}\n >\n <PanelRightOpen className=\"h-4 w-4\" />\n </Button>\n ) : (\n <div className=\"rounded-card border border-border bg-card\">\n <div className=\"flex items-start justify-between gap-2 border-b border-border px-4 py-3\">\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-foreground\">{asideTitle}</p>\n {asideDescription && (\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{asideDescription}</p>\n )}\n </div>\n {collapsible && (\n <button\n type=\"button\"\n onClick={() => setCollapsed(true)}\n className=\"rounded p-1 text-muted-foreground transition-colors hover:bg-muted/60 hover:text-foreground\"\n aria-label=\"collapse\"\n >\n <PanelRightClose className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n <div className=\"p-4\">{aside}</div>\n </div>\n )}\n </aside>\n </div>\n\n {/* Mobile: right sheet */}\n <div className=\"lg:hidden\">\n <Sheet open={open} onOpenChange={setOpen}>\n <SheetContent width=\"max-w-sm\">\n <SheetHeader>\n <SheetTitle>{asideTitle}</SheetTitle>\n {asideDescription && <SheetDescription>{asideDescription}</SheetDescription>}\n </SheetHeader>\n <SheetBody>{aside}</SheetBody>\n </SheetContent>\n </Sheet>\n </div>\n </ContentSplitContext.Provider>\n )\n}\n\nexport interface ContentSplitTriggerProps {\n /** Accessible label; also the visible text unless `iconOnly`. */\n label: React.ReactNode\n iconOnly?: boolean\n className?: string\n}\n\n/** Opens the mobile aside sheet. Renders nothing from `lg` up (the panel is\n * already docked). Place inside SubpageHeader `actions` or any toolbar. */\nexport function ContentSplitTrigger({ label, iconOnly, className }: ContentSplitTriggerProps) {\n const ctx = React.useContext(ContentSplitContext)\n if (!ctx) return null\n return (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => ctx.setOpen(true)}\n className={cn('lg:hidden', className)}\n aria-label={typeof label === 'string' ? label : undefined}\n >\n <PanelRight className={cn('h-4 w-4', !iconOnly && 'mr-1.5')} />\n {!iconOnly && label}\n </Button>\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/dashboard/DashboardGrid.tsx","../src/dashboard/layout.ts","../src/dashboard/preferences.ts","../src/dashboard/DashboardRange.tsx","../src/dashboard/DashboardCustomizeMenu.tsx","../src/dashboard/DashboardCanvas.tsx","../src/dashboard/GoldCard.tsx","../src/dashboard/icon.ts","../src/dashboard/KpiCard.tsx","../src/dashboard/ChartWidget.tsx","../src/dashboard/TableWidget.tsx","../src/dashboard/OnboardingWidget.tsx","../src/dashboard/define.ts"],"names":["jsx","cn","React","React2","SegmentedControl","useTranslation","Dropdown","DropdownTrigger","jsxs","Button","SlidersHorizontal","DropdownContent","DropdownLabel","DropdownSeparator","DropdownCheckboxItem","DropdownItem","RotateCcw","Fragment","EyeOff","resolvePluginComponent","React3","hashRouterAdapter","usePluginRuntime","getDashboardWidgets","Card","CardHeader","CardTitle","CardDescription","CardContent","React4","LucideIcons","React5","TrendingUp","TrendingDown","React6","ResponsiveContainer","PieChart","Tooltip","Pie","Cell","Legend","BarChart","CartesianGrid","XAxis","YAxis","Bar","AreaChart","Area","LineChart","Line","DataTable","React7","Check","Circle"],"mappings":"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","file":"chunk-NWPMNPGR.cjs","sourcesContent":["import * as React from 'react'\nimport { cn } from '../utils/cn'\n\nexport interface DashboardGridItem {\n id: string\n /** Column span on the 4-col grid (defaults to 1). */\n span?: number\n node: React.ReactNode\n}\n\n/** Literal span → Tailwind classes (kept literal so the JIT compiler picks them up). */\nconst SPAN_CLASS: Record<number, string> = {\n 1: '',\n 2: 'sm:col-span-2',\n 3: 'sm:col-span-2 lg:col-span-3',\n 4: 'sm:col-span-2 lg:col-span-4',\n}\n\nexport interface DashboardGridProps {\n items: DashboardGridItem[]\n className?: string\n}\n\n/** Responsive 4-col dashboard grid — the layout every dashboard shares. */\nexport function DashboardGrid({ items, className }: DashboardGridProps) {\n return (\n <div className={cn('grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4', className)}>\n {items.map((item) => (\n <div key={item.id} className={SPAN_CLASS[Math.min(Math.max(item.span ?? 1, 1), 4)] ?? ''}>\n {item.node}\n </div>\n ))}\n </div>\n )\n}\n","import type { DashboardLayoutConfig, DashboardWidgetDef } from '@fayz-ai/core'\n\nexport interface LaidOutWidget {\n def: DashboardWidgetDef\n /** Effective span after applying overrides (1–4). */\n span: number\n order: number\n}\n\n/**\n * Resolve the widgets to render on a surface, in order, applying three layers:\n * 1. registration defaults (defaultVisible / defaultOrder / span)\n * 2. app config (the app curates the home surface)\n * 3. user preferences (show/hide/reorder — read but currently empty)\n *\n * Later layers win. Returns only visible widgets, sorted by effective order.\n * Accepts any DashboardWidgetDef (registry-resolved or shim-built).\n */\nexport function resolveDashboardLayout(\n registered: DashboardWidgetDef[],\n appConfig?: DashboardLayoutConfig,\n userPrefs?: DashboardLayoutConfig,\n /** When true, widgets are visible by default regardless of their\n * `defaultVisible` (used on a plugin-home to show everything; the global\n * home leaves this false so `defaultVisible:false` curates the start set). */\n forceVisibleByDefault = false,\n): LaidOutWidget[] {\n type Override = { visible?: boolean; order?: number; span?: number }\n const overrides = new Map<string, Override>()\n const merge = (cfg?: DashboardLayoutConfig) => {\n for (const w of cfg?.widgets ?? []) {\n overrides.set(w.id, { ...overrides.get(w.id), ...w })\n }\n }\n merge(appConfig)\n merge(userPrefs)\n\n return registered\n .map((def, index) => {\n const o = overrides.get(def.id)\n const baseVisible = forceVisibleByDefault ? true : (def.defaultVisible ?? true)\n const visible = o?.visible ?? baseVisible\n const order = o?.order ?? def.defaultOrder ?? index\n const span = Math.min(Math.max(o?.span ?? def.span ?? 1, 1), 4)\n return { def, visible, order, span }\n })\n .filter((x) => x.visible)\n .sort((a, b) => a.order - b.order)\n .map(({ def, span, order }) => ({ def, span, order }))\n}\n","import * as React from 'react'\nimport type { DashboardLayoutConfig, DashboardSurface } from '@fayz-ai/core'\n\nexport interface DashboardPreferencesState {\n /** User-level layout overrides for this surface (null when none saved). */\n prefs: DashboardLayoutConfig | null\n /** Persist updated overrides. */\n save: (next: DashboardLayoutConfig) => void\n /** Toggle a single widget's visibility and persist. */\n setVisible: (widgetId: string, visible: boolean) => void\n /** Clear all overrides (reset to registration + app defaults). */\n reset: () => void\n}\n\nconst KEY = (surface: DashboardSurface, scope: string) => `fayz.dashboard.prefs.${scope}.${surface}`\n\nfunction read(key: string): DashboardLayoutConfig | null {\n if (typeof window === 'undefined') return null\n try {\n const raw = window.localStorage.getItem(key)\n return raw ? (JSON.parse(raw) as DashboardLayoutConfig) : null\n } catch {\n return null\n }\n}\n\n/**\n * Per-user dashboard preferences, persisted to localStorage.\n *\n * `scope` lets a plugin-home keep its own prefs separate from the global home\n * (pass the domain). A future pass can swap the storage for the tenant/plugin\n * binding store without touching callers — `resolveDashboardLayout` already\n * consumes whatever this returns as the `userPrefs` layer.\n */\nexport function useDashboardPreferences(surface: DashboardSurface, scope = 'home'): DashboardPreferencesState {\n const key = KEY(surface, scope)\n const [prefs, setPrefs] = React.useState<DashboardLayoutConfig | null>(() => read(key))\n\n // Re-read when the target surface/scope changes.\n React.useEffect(() => { setPrefs(read(key)) }, [key])\n\n const save = React.useCallback((next: DashboardLayoutConfig) => {\n setPrefs(next)\n if (typeof window !== 'undefined') {\n try { window.localStorage.setItem(key, JSON.stringify(next)) } catch { /* ignore quota/availability */ }\n }\n }, [key])\n\n const setVisible = React.useCallback((widgetId: string, visible: boolean) => {\n setPrefs((cur) => {\n const widgets = [...(cur?.widgets ?? [])]\n const i = widgets.findIndex((w) => w.id === widgetId)\n if (i >= 0) widgets[i] = { ...widgets[i]!, visible }\n else widgets.push({ id: widgetId, visible })\n const next = { ...cur, widgets }\n if (typeof window !== 'undefined') {\n try { window.localStorage.setItem(key, JSON.stringify(next)) } catch { /* ignore */ }\n }\n return next\n })\n }, [key])\n\n const reset = React.useCallback(() => {\n setPrefs(null)\n if (typeof window !== 'undefined') {\n try { window.localStorage.removeItem(key) } catch { /* ignore */ }\n }\n }, [key])\n\n return { prefs, save, setVisible, reset }\n}\n","import * as React from 'react'\nimport { SegmentedControl } from '../primitives/segmented-control'\n\n// ---------------------------------------------------------------------------\n// Shared dashboard time range. The canvas provides it; widgets read it via\n// useDashboardRange() and refetch/filter their data accordingly.\n// ---------------------------------------------------------------------------\n\nexport type DashboardRange = string\n\nexport const DEFAULT_RANGE_OPTIONS: DashboardRange[] = ['7d', '30d', '90d']\n\ninterface DashboardRangeContextValue {\n range: DashboardRange\n setRange: (range: DashboardRange) => void\n options: DashboardRange[]\n}\n\nconst DashboardRangeContext = React.createContext<DashboardRangeContextValue | null>(null)\n\n/**\n * Read the shared dashboard range. Returns null when no range control is\n * mounted, so widgets can stay range-agnostic.\n */\nexport function useDashboardRange(): DashboardRangeContextValue | null {\n return React.useContext(DashboardRangeContext)\n}\n\nexport interface DashboardRangeProviderProps {\n options?: DashboardRange[]\n defaultRange?: DashboardRange\n onChange?: (range: DashboardRange) => void\n children: React.ReactNode\n}\n\nexport function DashboardRangeProvider({\n options = DEFAULT_RANGE_OPTIONS, defaultRange, onChange, children,\n}: DashboardRangeProviderProps) {\n const [range, setRangeState] = React.useState<DashboardRange>(defaultRange ?? options[1] ?? options[0] ?? '30d')\n const setRange = React.useCallback((r: DashboardRange) => {\n setRangeState(r)\n onChange?.(r)\n }, [onChange])\n const value = React.useMemo(() => ({ range, setRange, options }), [range, setRange, options])\n return <DashboardRangeContext.Provider value={value}>{children}</DashboardRangeContext.Provider>\n}\n\n/** Segmented 7d / 30d / 90d control bound to the shared dashboard range.\n * Thin wrapper over the canonical SegmentedControl primitive. */\nexport function DashboardRangeControl({ className }: { className?: string }) {\n const ctx = useDashboardRange()\n if (!ctx) return null\n return (\n <SegmentedControl\n options={ctx.options}\n value={ctx.range}\n onChange={ctx.setRange}\n className={className}\n aria-label=\"Time range\"\n />\n )\n}\n","import * as React from 'react'\nimport { SlidersHorizontal, RotateCcw } from 'lucide-react'\nimport type { DashboardWidgetDef } from '@fayz-ai/core'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Button } from '../primitives/button'\nimport {\n Dropdown, DropdownTrigger, DropdownContent, DropdownLabel, DropdownSeparator, DropdownCheckboxItem, DropdownItem,\n} from '../primitives/dropdown'\n\nexport interface DashboardCustomizeMenuProps {\n /** Full set of registered widgets for this surface. */\n widgets: DashboardWidgetDef[]\n /** Ids currently visible. */\n visibleIds: Set<string>\n onToggle: (widgetId: string, visible: boolean) => void\n onReset: () => void\n label?: string\n}\n\n/** Gear menu to choose which widgets appear on the dashboard (persisted). */\nexport function DashboardCustomizeMenu({ widgets, visibleIds, onToggle, onReset, label }: DashboardCustomizeMenuProps) {\n const t = useTranslation()\n if (widgets.length === 0) return null\n return (\n <Dropdown>\n <DropdownTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"gap-1.5\">\n <SlidersHorizontal className=\"h-3.5 w-3.5\" />\n {label ?? 'Customize'}\n </Button>\n </DropdownTrigger>\n <DropdownContent align=\"end\" className=\"max-h-[70vh] w-60 overflow-y-auto\">\n <DropdownLabel>{label ?? 'Show widgets'}</DropdownLabel>\n <DropdownSeparator />\n {widgets.map((w) => (\n <DropdownCheckboxItem\n key={w.id}\n checked={visibleIds.has(w.id)}\n onCheckedChange={(checked) => onToggle(w.id, Boolean(checked))}\n onSelect={(e) => e.preventDefault()}\n >\n {t(w.title)}\n </DropdownCheckboxItem>\n ))}\n <DropdownSeparator />\n <DropdownItem onSelect={() => onReset()}>\n <RotateCcw className=\"mr-2 h-3.5 w-3.5\" />\n {'Reset to defaults'}\n </DropdownItem>\n </DropdownContent>\n </Dropdown>\n )\n}\n","import * as React from 'react'\nimport { EyeOff } from 'lucide-react'\nimport {\n usePluginRuntime,\n getDashboardWidgets,\n resolvePluginComponent,\n hashRouterAdapter,\n type DashboardLayoutConfig,\n type DashboardSurface,\n type DashboardWidgetDef,\n} from '@fayz-ai/core'\nimport { Card, CardHeader, CardTitle, CardDescription, CardContent } from '../primitives/card'\nimport { DashboardGrid, type DashboardGridItem } from './DashboardGrid'\nimport { resolveDashboardLayout, type LaidOutWidget } from './layout'\nimport { useDashboardPreferences } from './preferences'\nimport { DashboardRangeProvider, DashboardRangeControl, type DashboardRange } from './DashboardRange'\nimport { DashboardCustomizeMenu } from './DashboardCustomizeMenu'\n\n/** Wrap a widget so a hide button fades in on hover (top-right corner). */\nfunction HoverHide({ id, onHide, children }: { id: string; onHide?: (id: string) => void; children: React.ReactNode }) {\n if (!onHide) return <>{children}</>\n return (\n <div className=\"group relative h-full\">\n {children}\n <button\n type=\"button\"\n onClick={() => onHide(id)}\n title=\"Hide widget\"\n aria-label=\"Hide widget\"\n className=\"absolute right-2 top-2 z-10 inline-flex h-6 w-6 items-center justify-center rounded-md border border-border bg-background/90 text-muted-foreground opacity-0 shadow-sm transition-opacity hover:text-foreground group-hover:opacity-100\"\n >\n <EyeOff className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n )\n}\n\nfunction toGridItems(laidOut: LaidOutWidget[], onHide?: (id: string) => void): DashboardGridItem[] {\n return laidOut.map(({ def, span }) => {\n const Component = resolvePluginComponent(def)\n const node = Component ? <Component {...(def.props ?? {})} /> : null\n return { id: def.id, span, node: <HoverHide id={def.id} onHide={onHide}>{node}</HoverHide> }\n })\n}\n\n// ---------------------------------------------------------------------------\n// Navigation — widgets (e.g. onboarding) call useDashboardNavigate() to route.\n// Defaults to the shared hash router so widgets work without explicit wiring.\n// ---------------------------------------------------------------------------\n\nconst DashboardNavigateContext = React.createContext<(path: string) => void>((path) =>\n hashRouterAdapter().navigate(path),\n)\n\nexport const DashboardNavigateProvider = DashboardNavigateContext.Provider\n\nexport function useDashboardNavigate(): (path: string) => void {\n return React.useContext(DashboardNavigateContext)\n}\n\n// ---------------------------------------------------------------------------\n// Shared widget grid — used by DashboardCanvas (registry) and by standalone\n// callers (e.g. the dashboard plugin's legacy DashboardPage shim). Resolves the\n// layout, then renders each widget by span.\n// ---------------------------------------------------------------------------\n\nexport function WidgetGrid({ widgets, appLayout, surface }: {\n widgets: DashboardWidgetDef[]\n appLayout?: DashboardLayoutConfig\n surface: DashboardSurface\n}) {\n const { prefs, setVisible } = useDashboardPreferences(surface)\n const laidOut = resolveDashboardLayout(widgets, appLayout, prefs ?? undefined)\n return <DashboardGrid items={toGridItems(laidOut, (id) => setVisible(id, false))} />\n}\n\n// ---------------------------------------------------------------------------\n// DashboardCanvas — the registry-driven renderer. Serves the global app home\n// (surface=\"home\", all domains) and a plugin's own overview (surface=\"plugin-home\"\n// + domain). Widgets a plugin registers once appear on both.\n// ---------------------------------------------------------------------------\n\nexport interface DashboardCanvasProps {\n surface: DashboardSurface\n /** Restrict to one plugin's widgets (used for plugin-home). */\n domain?: string\n title?: string\n subtitle?: string\n /** Render the in-content title/subtitle. Default: true. */\n showHeader?: boolean\n /** App-level curation of which widgets show, their order and span. */\n appLayout?: DashboardLayoutConfig\n /** App-level widgets injected into this surface's grid without a plugin — e.g.\n * an \"Ask the assistant\" CTA. Merged with the registry widgets, then laid out\n * (respects each widget's span/defaultOrder). Filtered to this surface. */\n extraWidgets?: DashboardWidgetDef[]\n /** Show a shared time-range control (sticky, top-right). Widgets read it via\n * useDashboardRange(). Pass `true` for defaults or an options object. */\n range?: boolean | DashboardRangeOptions\n /** Show the \"Customize\" menu so users can choose which widgets appear\n * (persisted per surface). Default: true. */\n customizable?: boolean\n /** Label for the customize menu trigger. */\n customizeLabel?: string\n /** Initial visibility before user prefs: 'default' honors each widget's\n * `defaultVisible` (used by the global home to curate a starting set); 'all'\n * shows every eligible widget. Defaults to 'all' on a plugin-home, 'default'\n * on the global home. */\n initialVisibility?: 'default' | 'all'\n /** Route handler for widgets that navigate (defaults to the hash router). */\n onNavigate?: (path: string) => void\n className?: string\n}\n\nexport interface DashboardRangeOptions {\n options?: DashboardRange[]\n default?: DashboardRange\n onChange?: (range: DashboardRange) => void\n}\n\nexport function DashboardCanvas({\n surface, domain, title, subtitle, showHeader = true, appLayout, extraWidgets, range,\n customizable = true, customizeLabel, initialVisibility, onNavigate, className,\n}: DashboardCanvasProps) {\n const runtime = usePluginRuntime()\n const registryWidgets = getDashboardWidgets(runtime, { surface, domain })\n const widgets = React.useMemo<DashboardWidgetDef[]>(() => {\n const extra = (extraWidgets ?? []).filter((w) => {\n if (!(w.surfaces ?? ['home', 'plugin-home']).includes(surface)) return false\n return !domain || w.domain === domain\n })\n return extra.length ? [...registryWidgets, ...extra] : registryWidgets\n }, [registryWidgets, extraWidgets, surface, domain])\n const rangeOpts: DashboardRangeOptions | null = range ? (range === true ? {} : range) : null\n\n const forceAll = (initialVisibility ?? (surface === 'plugin-home' ? 'all' : 'default')) === 'all'\n const { prefs, setVisible, reset } = useDashboardPreferences(surface, domain ?? 'home')\n const laidOut = resolveDashboardLayout(widgets, appLayout, prefs ?? undefined, forceAll)\n const visibleIds = React.useMemo(() => new Set(laidOut.map((w) => w.def.id)), [laidOut])\n\n const hasControls = Boolean(rangeOpts) || (customizable && widgets.length > 0)\n const headerBlock = showHeader && (title || subtitle) ? (\n <div>\n {title ? <h1 className=\"text-2xl font-semibold tracking-tight\">{title}</h1> : null}\n {subtitle ? <p className=\"mt-1 text-sm text-muted-foreground\">{subtitle}</p> : null}\n </div>\n ) : null\n\n // Controls sit inline on the header row (right-aligned) — no separate band, so\n // there's no empty gap above the content.\n const topRow = (headerBlock || hasControls) ? (\n <div className=\"flex items-start justify-between gap-4\">\n {headerBlock ?? <span />}\n {hasControls ? (\n <div className=\"flex shrink-0 items-center gap-2\">\n {customizable && widgets.length > 0 ? (\n <DashboardCustomizeMenu\n widgets={widgets}\n visibleIds={visibleIds}\n onToggle={setVisible}\n onReset={reset}\n label={customizeLabel}\n />\n ) : null}\n {rangeOpts ? <DashboardRangeControl /> : null}\n </div>\n ) : null}\n </div>\n ) : null\n\n const content = (\n <div className={className ?? 'space-y-6 p-6'}>\n {topRow}\n\n {widgets.length === 0 ? (\n <Card>\n <CardHeader>\n <CardTitle>Welcome!</CardTitle>\n <CardDescription>Your dashboard will show key metrics and information here.</CardDescription>\n </CardHeader>\n <CardContent>\n <p className=\"text-sm text-muted-foreground\">\n Enable plugins or register dashboard widgets to populate this view.\n </p>\n </CardContent>\n </Card>\n ) : laidOut.length === 0 ? (\n <Card>\n <CardContent className=\"p-6 text-sm text-muted-foreground\">\n All widgets are hidden. Use “Customize” to choose what to show.\n </CardContent>\n </Card>\n ) : (\n <DashboardGrid items={toGridItems(laidOut)} />\n )}\n </div>\n )\n\n const navWrapped = onNavigate\n ? <DashboardNavigateProvider value={onNavigate}>{content}</DashboardNavigateProvider>\n : content\n\n return rangeOpts\n ? (\n <DashboardRangeProvider options={rangeOpts.options} defaultRange={rangeOpts.default} onChange={rangeOpts.onChange}>\n {navWrapped}\n </DashboardRangeProvider>\n )\n : navWrapped\n}\n","import * as React from 'react'\nimport { cn } from '../utils/cn'\n\nexport interface GoldCardProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Brand-colored hero variant — `bg-primary text-primary-foreground` with a\n * soft branded shadow. Use for the headline card (e.g. a balance hero). When\n * false (default) it's a plain surface card (`bg-card` + border).\n */\n branded?: boolean\n}\n\n/**\n * GoldCard — a generic, reusable rounded card wrapper for dashboard surfaces.\n *\n * The `branded` variant paints the card in the app's primary color so a single\n * hero (balance, headline KPI, CTA) pops against the neutral grid. Both variants\n * are internally full-width so they reflow cleanly inside the responsive\n * DashboardGrid (full-width on mobile, cell-width on desktop).\n */\nexport const GoldCard = React.forwardRef<HTMLDivElement, GoldCardProps>(\n ({ branded = false, className, children, ...rest }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'h-full rounded-3xl p-5',\n branded\n ? 'bg-primary text-primary-foreground shadow-lg shadow-primary/20'\n : 'border border-border bg-card text-card-foreground shadow-sm',\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n ),\n)\nGoldCard.displayName = 'GoldCard'\n","import * as React from 'react'\nimport * as LucideIcons from 'lucide-react'\nimport type { IconRef } from './types'\n\n/** Resolve an IconRef (lucide name or component) to a renderable element. */\nexport function renderIcon(icon: IconRef | undefined, className = 'h-4 w-4'): React.ReactNode {\n if (!icon) return null\n if (typeof icon === 'string') {\n const Comp = (LucideIcons as unknown as Record<string, React.ComponentType<{ className?: string }>>)[icon]\n return Comp ? React.createElement(Comp, { className }) : null\n }\n return React.createElement(icon, { className })\n}\n","import * as React from 'react'\nimport { TrendingUp, TrendingDown, Minus } from 'lucide-react'\nimport { cn } from '../utils/cn'\nimport { Card, CardContent } from '../primitives/card'\nimport { renderIcon } from './icon'\nimport type { KpiCurrency, IconRef, KpiFormat, KpiValue, KpiTrend } from './types'\n\nexport function formatKpiValue(value: number, format?: KpiFormat, currency?: KpiCurrency): string {\n const locale = currency?.locale ?? 'pt-BR'\n switch (format) {\n case 'currency':\n return new Intl.NumberFormat(locale, { style: 'currency', currency: currency?.code ?? 'BRL', maximumFractionDigits: 0 }).format(value)\n case 'percent':\n return `${new Intl.NumberFormat(locale, { maximumFractionDigits: 1 }).format(value)}%`\n case 'duration':\n return `${Math.round(value)} min`\n default:\n return new Intl.NumberFormat(locale, { maximumFractionDigits: 1 }).format(value)\n }\n}\n\nfunction deriveTrend(current: number, previous: number | undefined, explicit: KpiTrend | undefined): KpiTrend | undefined {\n if (explicit) return explicit\n if (previous == null) return undefined\n return current > previous ? 'up' : current < previous ? 'down' : 'neutral'\n}\n\nfunction TrendChip({ trend, delta, invert }: { trend: KpiTrend; delta: number | null; invert?: boolean }) {\n if (trend === 'neutral') return null\n const good = invert ? trend === 'down' : trend === 'up'\n const Icon = trend === 'up' ? TrendingUp : TrendingDown\n return (\n <span className={cn(\n 'inline-flex items-center gap-0.5 text-xs font-medium',\n good ? 'text-emerald-600' : 'text-rose-600',\n )}>\n <Icon className=\"h-3 w-3\" />\n {delta != null ? `${delta > 0 ? '+' : ''}${delta}%` : null}\n </span>\n )\n}\n\n/** Trend-aware accent: green when good, red when bad, theme-info when flat. */\nfunction trendColor(trend: KpiTrend | undefined, invert?: boolean): string {\n if (!trend || trend === 'neutral') return 'hsl(var(--info))'\n const good = invert ? trend === 'down' : trend === 'up'\n return good ? '#10b981' : '#f43f5e'\n}\n\n/** Tiny dependency-free SVG sparkline (oldest → newest), with a soft area fill. */\nfunction Sparkline({ data, color }: { data: number[]; color: string }) {\n const gid = React.useId()\n if (!data || data.length < 2) return null\n const W = 96, H = 32, P = 3\n const min = Math.min(...data)\n const max = Math.max(...data)\n const span = max - min || 1\n const step = (W - P * 2) / (data.length - 1)\n const pts = data.map((d, i) => {\n const x = P + i * step\n const y = P + (H - P * 2) * (1 - (d - min) / span)\n return [x, y] as const\n })\n const line = pts.map(([x, y], i) => `${i === 0 ? 'M' : 'L'}${x.toFixed(1)},${y.toFixed(1)}`).join(' ')\n const area = `${line} L${pts[pts.length - 1][0].toFixed(1)},${H} L${pts[0][0].toFixed(1)},${H} Z`\n return (\n <svg viewBox={`0 0 ${W} ${H}`} className=\"h-8 w-24 shrink-0 overflow-visible\" preserveAspectRatio=\"none\" aria-hidden>\n <defs>\n <linearGradient id={gid} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={color} stopOpacity=\"0.22\" />\n <stop offset=\"100%\" stopColor={color} stopOpacity=\"0\" />\n </linearGradient>\n </defs>\n <path d={area} fill={`url(#${gid})`} />\n <path d={line} fill=\"none\" stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" vectorEffect=\"non-scaling-stroke\" />\n </svg>\n )\n}\n\n/** Semicircular radial gauge showing `value` as a fraction of `goal`. */\nfunction Gauge({ value, goal, color, children }: { value: number; goal: number; color: string; children: React.ReactNode }) {\n const pct = goal > 0 ? Math.min(1, Math.max(0, value / goal)) : 0\n const R = 40, CX = 50, CY = 46, SW = 9\n const len = Math.PI * R\n const d = `M ${CX - R} ${CY} A ${R} ${R} 0 0 1 ${CX + R} ${CY}`\n return (\n <div className=\"relative mx-auto w-full max-w-[160px]\">\n <svg viewBox=\"0 0 100 52\" className=\"w-full\" aria-hidden>\n <path d={d} fill=\"none\" stroke=\"hsl(var(--muted))\" strokeWidth={SW} strokeLinecap=\"round\" />\n <path\n d={d} fill=\"none\" stroke={color} strokeWidth={SW} strokeLinecap=\"round\"\n strokeDasharray={len} strokeDashoffset={len * (1 - pct)}\n />\n </svg>\n <div className=\"absolute inset-x-0 bottom-0 text-center text-2xl font-semibold tracking-tight text-foreground\">\n {children}\n </div>\n </div>\n )\n}\n\nexport interface KpiCardProps {\n label: string\n icon?: IconRef\n /** Pre-formatted/sync value. Provide this OR `compute`. */\n value?: React.ReactNode\n /** Numeric value formatted via `format`. Ignored when `value` is set. */\n amount?: number\n /** Async loader; the card shows a skeleton until it resolves. */\n compute?: () => Promise<KpiValue>\n format?: KpiFormat\n currency?: KpiCurrency\n sub?: React.ReactNode\n /** Trend chip inputs (for sync usage). */\n current?: number\n previous?: number\n trend?: KpiTrend\n /** For cost-style metrics where down is good (e.g. CPA). */\n invertTrend?: boolean\n /** Inline sparkline series (oldest → newest). Async usage: return via KpiValue.spark. */\n spark?: number[]\n /** Render the card as a radial gauge toward this goal value. */\n goal?: number\n /** Accent color for the sparkline/gauge. Defaults to a trend-aware color. */\n accent?: string\n loading?: boolean\n}\n\n/**\n * Canonical KPI card — consolidates the trend-chip card from plugin-marketing\n * and the async MetricCard from plugin-dashboard. Use directly, or via a\n * registered KPI widget (see defineKpiWidget).\n */\nexport function KpiCard(props: KpiCardProps) {\n const { label, icon, sub, format, currency, invertTrend } = props\n const [computed, setComputed] = React.useState<KpiValue | null>(null)\n const [errored, setErrored] = React.useState(false)\n\n React.useEffect(() => {\n if (!props.compute) return\n let cancelled = false\n props.compute()\n .then((v) => { if (!cancelled) setComputed(v) })\n .catch(() => { if (!cancelled) setErrored(true) })\n return () => { cancelled = true }\n }, [props.compute])\n\n const isAsync = Boolean(props.compute)\n const loading = props.loading || (isAsync && computed === null && !errored)\n\n let display: React.ReactNode = props.value\n let current = props.current\n let previous = props.previous\n let trend = props.trend\n let unit: string | undefined\n let spark = props.spark\n\n if (isAsync && computed) {\n display = formatKpiValue(computed.value, format, currency)\n current = computed.value\n previous = computed.previousValue\n trend = computed.trend\n unit = computed.unit\n spark = computed.spark ?? spark\n } else if (display == null && props.amount != null) {\n display = formatKpiValue(props.amount, format, currency)\n current = current ?? props.amount\n }\n\n const resolvedTrend = current != null ? deriveTrend(current, previous, trend) : trend\n const delta = current != null && previous != null && previous !== 0\n ? Math.round(((current - previous) / previous) * 100)\n : null\n const accent = props.accent ?? trendColor(resolvedTrend, invertTrend)\n\n const valueText = (\n <>\n {display}\n {unit ? <span className=\"ml-1 text-sm font-normal text-muted-foreground\">{unit}</span> : null}\n </>\n )\n const trendChip = resolvedTrend ? <TrendChip trend={resolvedTrend} delta={delta} invert={invertTrend} /> : null\n\n // Pick a body layout: gauge (goal set) → sparkline (series set) → plain.\n const isGauge = props.goal != null && current != null\n const hasSpark = Boolean(spark && spark.length >= 2)\n\n let body: React.ReactNode\n if (errored) {\n body = <span className=\"text-sm text-muted-foreground\">—</span>\n } else if (loading) {\n body = isGauge\n ? <div className=\"mx-auto h-16 w-32 animate-pulse rounded bg-muted\" />\n : <div className=\"h-7 w-20 animate-pulse rounded bg-muted\" />\n } else if (isGauge) {\n body = (\n <div>\n <Gauge value={current!} goal={props.goal!} color={accent}>{valueText}</Gauge>\n <div className=\"mt-1 flex items-center justify-center gap-2 text-xs text-muted-foreground\">\n {trendChip}\n <span>{sub ?? `out of ${formatKpiValue(props.goal!, format, currency)}`}</span>\n </div>\n </div>\n )\n } else if (hasSpark) {\n body = (\n <div className=\"flex items-end justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"text-2xl font-semibold tracking-tight text-foreground\">{valueText}</div>\n {trendChip ? <div className=\"mt-0.5\">{trendChip}</div> : null}\n </div>\n <Sparkline data={spark!} color={accent} />\n </div>\n )\n } else {\n body = (\n <div className=\"flex items-baseline justify-between gap-2\">\n <span className=\"text-2xl font-semibold tracking-tight text-foreground\">{valueText}</span>\n {trendChip ? <span className=\"mb-0.5\">{trendChip}</span> : null}\n </div>\n )\n }\n\n return (\n // h-full so cards fill the (stretch) grid cell and every card in a row matches\n // the tallest — labels/subtitles of different lengths no longer misalign them.\n <Card className=\"h-full\">\n <CardContent className=\"flex h-full flex-col p-4\">\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <span className=\"text-sm text-muted-foreground\">{label}</span>\n <span className=\"text-muted-foreground\">{renderIcon(icon)}</span>\n </div>\n {body}\n {sub && !isGauge ? <p className=\"mt-0.5 text-xs text-muted-foreground\">{sub}</p> : null}\n </CardContent>\n </Card>\n )\n}\n","import * as React from 'react'\nimport {\n ResponsiveContainer,\n LineChart, Line,\n BarChart, Bar,\n AreaChart, Area,\n PieChart, Pie, Cell,\n XAxis, YAxis, CartesianGrid, Tooltip, Legend,\n} from 'recharts'\nimport { Card, CardContent, CardHeader, CardTitle } from '../primitives/card'\nimport { renderIcon } from './icon'\nimport type { ChartSeries, ChartType, IconRef } from './types'\n\n/** Theme-driven palette (HSL triplet CSS vars defined in styles.css). */\nconst PALETTE = [\n 'hsl(var(--info))',\n 'hsl(var(--magic))',\n 'hsl(var(--success))',\n 'hsl(var(--warning))',\n 'hsl(var(--destructive))',\n]\nconst AXIS = 'hsl(var(--muted-foreground))'\nconst GRID = 'hsl(var(--border))'\n\nexport interface ChartWidgetProps {\n type: ChartType\n /** Rows of data; each key referenced by a series.dataKey. */\n data: Array<Record<string, string | number>>\n series: ChartSeries[]\n /** Key for the category axis (x-axis / pie label). */\n categoryKey?: string\n title?: string\n icon?: IconRef\n /** Right-aligned header content (e.g. a range selector). */\n headerAction?: React.ReactNode\n height?: number\n className?: string\n}\n\n/** recharts-backed chart in a Card. Replaces the hand-rolled CSS bar charts. */\nexport function ChartWidget({\n type, data, series, categoryKey = 'name', title, icon, headerAction, height = 240, className,\n}: ChartWidgetProps) {\n const color = (i: number, explicit?: string) => explicit ?? PALETTE[i % PALETTE.length]\n\n return (\n <Card className={className}>\n {(title || headerAction) && (\n <CardHeader className=\"flex-row items-center justify-between space-y-0\">\n {title ? (\n <CardTitle className=\"flex items-center gap-2\">\n {renderIcon(icon)}\n {title}\n </CardTitle>\n ) : <span />}\n {headerAction}\n </CardHeader>\n )}\n <CardContent className=\"p-4 pt-2\">\n <ResponsiveContainer width=\"100%\" height={height}>\n {type === 'pie' ? (\n <PieChart>\n <Tooltip />\n <Pie data={data} dataKey={series[0]?.dataKey ?? 'value'} nameKey={categoryKey} innerRadius={50} outerRadius={80} paddingAngle={2}>\n {data.map((_, i) => <Cell key={i} fill={color(i, series[0]?.color)} />)}\n </Pie>\n <Legend />\n </PieChart>\n ) : type === 'bar' ? (\n <BarChart data={data}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID} vertical={false} />\n <XAxis dataKey={categoryKey} stroke={AXIS} fontSize={12} tickLine={false} axisLine={false} />\n <YAxis stroke={AXIS} fontSize={12} tickLine={false} axisLine={false} width={36} />\n <Tooltip cursor={{ fill: GRID, opacity: 0.3 }} />\n {series.length > 1 && <Legend />}\n {series.map((s, i) => (\n <Bar key={s.dataKey} dataKey={s.dataKey} name={s.label ?? s.dataKey} fill={color(i, s.color)} radius={[4, 4, 0, 0]} />\n ))}\n </BarChart>\n ) : type === 'area' ? (\n <AreaChart data={data}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID} vertical={false} />\n <XAxis dataKey={categoryKey} stroke={AXIS} fontSize={12} tickLine={false} axisLine={false} />\n <YAxis stroke={AXIS} fontSize={12} tickLine={false} axisLine={false} width={36} />\n <Tooltip />\n {series.length > 1 && <Legend />}\n {series.map((s, i) => (\n <Area key={s.dataKey} dataKey={s.dataKey} name={s.label ?? s.dataKey} stroke={color(i, s.color)} fill={color(i, s.color)} fillOpacity={0.15} />\n ))}\n </AreaChart>\n ) : (\n <LineChart data={data}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID} vertical={false} />\n <XAxis dataKey={categoryKey} stroke={AXIS} fontSize={12} tickLine={false} axisLine={false} />\n <YAxis stroke={AXIS} fontSize={12} tickLine={false} axisLine={false} width={36} />\n <Tooltip />\n {series.length > 1 && <Legend />}\n {series.map((s, i) => (\n <Line key={s.dataKey} dataKey={s.dataKey} name={s.label ?? s.dataKey} stroke={color(i, s.color)} strokeWidth={2} dot={false} />\n ))}\n </LineChart>\n )}\n </ResponsiveContainer>\n </CardContent>\n </Card>\n )\n}\n","import * as React from 'react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { Card, CardContent, CardHeader, CardTitle } from '../primitives/card'\nimport { DataTable } from '../primitives/data-table'\nimport { renderIcon } from './icon'\nimport type { IconRef } from './types'\n\nexport interface TableWidgetProps<TData> {\n title?: string\n icon?: IconRef\n columns: ColumnDef<TData, unknown>[]\n data: TData[]\n loading?: boolean\n emptyMessage?: string\n onRowClick?: (row: TData) => void\n /** Right-aligned header content (e.g. a \"view all\" link). */\n headerAction?: React.ReactNode\n className?: string\n}\n\n/** \"Recent N\" table in a Card — wraps the shared DataTable primitive. */\nexport function TableWidget<TData>({\n title, icon, columns, data, loading, emptyMessage, onRowClick, headerAction, className,\n}: TableWidgetProps<TData>) {\n return (\n <Card className={className}>\n {(title || headerAction) && (\n <CardHeader className=\"flex-row items-center justify-between space-y-0\">\n {title ? (\n <CardTitle className=\"flex items-center gap-2\">\n {renderIcon(icon)}\n {title}\n </CardTitle>\n ) : <span />}\n {headerAction}\n </CardHeader>\n )}\n <CardContent className=\"p-0\">\n <DataTable\n columns={columns}\n data={data}\n loading={loading}\n emptyMessage={emptyMessage}\n onRowClick={onRowClick}\n variant=\"flat\"\n compact\n />\n </CardContent>\n </Card>\n )\n}\n","import * as React from 'react'\nimport { Check, Circle } from 'lucide-react'\nimport { cn } from '../utils/cn'\nimport { Card, CardContent, CardHeader, CardTitle, CardDescription } from '../primitives/card'\nimport { Button } from '../primitives/button'\nimport { renderIcon } from './icon'\nimport type { IconRef } from './types'\n\nexport interface OnboardingStepInput {\n id: string\n title: string\n description?: string\n icon?: IconRef\n /** Async check: resolves true when the step is already complete. */\n check?: () => Promise<boolean>\n /** Pre-resolved completion (takes precedence over `check`). */\n done?: boolean\n /** Route string (uses onNavigate) or a callback. */\n action?: string | (() => void)\n actionLabel?: string\n}\n\nexport interface OnboardingWidgetProps {\n title?: string\n subtitle?: string\n steps: OnboardingStepInput[]\n onNavigate?: (path: string) => void\n /** Hide the whole widget once every step is complete. Default: true. */\n hideWhenComplete?: boolean\n className?: string\n}\n\n/** Getting-started checklist (\"first steps to set up\") with progress. */\nexport function OnboardingWidget({\n title = 'Getting started', subtitle, steps, onNavigate, hideWhenComplete = true, className,\n}: OnboardingWidgetProps) {\n const [completed, setCompleted] = React.useState<Record<string, boolean>>(() =>\n Object.fromEntries(steps.map((s) => [s.id, Boolean(s.done)])),\n )\n\n React.useEffect(() => {\n let cancelled = false\n Promise.all(steps.map(async (s) => {\n if (s.done != null) return [s.id, s.done] as const\n if (!s.check) return [s.id, false] as const\n try { return [s.id, await s.check()] as const } catch { return [s.id, false] as const }\n })).then((entries) => { if (!cancelled) setCompleted(Object.fromEntries(entries)) })\n return () => { cancelled = true }\n }, [steps])\n\n const doneCount = steps.filter((s) => completed[s.id]).length\n const allDone = doneCount === steps.length\n if (allDone && hideWhenComplete) return null\n\n const runAction = (action: OnboardingStepInput['action']) => {\n if (!action) return\n if (typeof action === 'string') onNavigate?.(action)\n else action()\n }\n\n return (\n <Card className={className}>\n <CardHeader>\n <CardTitle>{title}</CardTitle>\n {subtitle ? <CardDescription>{subtitle}</CardDescription> : null}\n <div className=\"mt-2 flex items-center gap-3\">\n <div className=\"h-1.5 flex-1 overflow-hidden rounded-full bg-muted\">\n <div className=\"h-full rounded-full bg-primary transition-all\"\n style={{ width: `${steps.length ? (doneCount / steps.length) * 100 : 0}%` }} />\n </div>\n <span className=\"text-xs font-medium text-muted-foreground\">{doneCount}/{steps.length}</span>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-1 pt-0\">\n {steps.map((step) => {\n const isDone = completed[step.id]\n return (\n <div key={step.id} className=\"flex items-center gap-3 rounded-lg px-2 py-2.5 hover:bg-muted/50\">\n <span className={cn(\n 'flex h-7 w-7 shrink-0 items-center justify-center rounded-full',\n isDone ? 'bg-emerald-100 text-emerald-600' : 'bg-muted text-muted-foreground',\n )}>\n {isDone ? <Check className=\"h-4 w-4\" /> : (renderIcon(step.icon, 'h-4 w-4') ?? <Circle className=\"h-4 w-4\" />)}\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className={cn('text-sm font-medium', isDone && 'text-muted-foreground line-through')}>{step.title}</p>\n {step.description ? <p className=\"truncate text-xs text-muted-foreground\">{step.description}</p> : null}\n </div>\n {!isDone && step.action ? (\n <Button size=\"sm\" variant=\"outline\" onClick={() => runAction(step.action)}>\n {step.actionLabel ?? 'Start'}\n </Button>\n ) : null}\n </div>\n )\n })}\n </CardContent>\n </Card>\n )\n}\n","import type { DashboardWidgetDef, DashboardWidgetKind, DashboardSurface } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Widget-definition builders. Each sets the right `kind` + default `span` so a\n// plugin author writes data, not layout. The widget's component renders the\n// presentational primitives (KpiCard, ChartWidget, TableWidget, ...).\n// ---------------------------------------------------------------------------\n\nexport interface DefineWidgetInput {\n id: string\n title: string\n component: React.ComponentType<unknown>\n description?: string\n icon?: string\n domain?: string\n span?: 1 | 2 | 3 | 4\n defaultVisible?: boolean\n defaultOrder?: number\n surfaces?: DashboardSurface[]\n verticalId?: DashboardWidgetDef['verticalId']\n permission?: DashboardWidgetDef['permission']\n props?: Record<string, unknown>\n}\n\nfunction build(kind: DashboardWidgetKind, defaultSpan: 1 | 2 | 3 | 4, input: DefineWidgetInput): DashboardWidgetDef {\n return {\n kind,\n span: input.span ?? defaultSpan,\n defaultVisible: input.defaultVisible ?? true,\n id: input.id,\n title: input.title,\n description: input.description,\n icon: input.icon,\n domain: input.domain,\n defaultOrder: input.defaultOrder,\n surfaces: input.surfaces,\n verticalId: input.verticalId,\n permission: input.permission,\n component: input.component,\n props: input.props,\n }\n}\n\n/** KPI card widget — spans 1 column (forms the 4-up top row). */\nexport const defineKpiWidget = (input: DefineWidgetInput): DashboardWidgetDef => build('kpi', 1, input)\n/** Chart widget — spans 2 columns by default. */\nexport const defineChartWidget = (input: DefineWidgetInput): DashboardWidgetDef => build('chart', 2, input)\n/** Table widget — spans the full row by default. */\nexport const defineTableWidget = (input: DefineWidgetInput): DashboardWidgetDef => build('table', 4, input)\n/** Onboarding checklist widget — spans half the row (2 cols) by default. */\nexport const defineOnboardingWidget = (input: DefineWidgetInput): DashboardWidgetDef => build('onboarding', 2, input)\n/** Custom client-provided widget — spans 2 columns by default. */\nexport const defineCustomWidget = (input: DefineWidgetInput): DashboardWidgetDef => build('custom', 2, input)\n"]}