@inf-monkeys-tech/monkeys-design 0.4.34 → 0.4.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +226 -226
  3. package/dist/components/base/index.js.map +1 -1
  4. package/dist/components/base/index.mjs.map +1 -1
  5. package/dist/components/data-explorer/index.js.map +1 -1
  6. package/dist/components/data-explorer/index.mjs.map +1 -1
  7. package/dist/components/layout/index.js.map +1 -1
  8. package/dist/components/layout/index.mjs.map +1 -1
  9. package/dist/components/login/index.js.map +1 -1
  10. package/dist/components/login/index.mjs.map +1 -1
  11. package/dist/components/toast/index.d.mts +75 -0
  12. package/dist/components/toast/index.d.ts +75 -0
  13. package/dist/components/toast/index.js +283 -0
  14. package/dist/components/toast/index.js.map +1 -0
  15. package/dist/components/toast/index.mjs +273 -0
  16. package/dist/components/toast/index.mjs.map +1 -0
  17. package/dist/components/toolbar/index.js.map +1 -1
  18. package/dist/components/toolbar/index.mjs.map +1 -1
  19. package/dist/components/workbench/index.js.map +1 -1
  20. package/dist/components/workbench/index.mjs.map +1 -1
  21. package/dist/icons/oauth/index.js.map +1 -1
  22. package/dist/icons/oauth/index.mjs.map +1 -1
  23. package/dist/index.d.mts +2 -0
  24. package/dist/index.d.ts +2 -0
  25. package/dist/index.js +284 -10
  26. package/dist/index.js.map +1 -1
  27. package/dist/index.mjs +276 -11
  28. package/dist/index.mjs.map +1 -1
  29. package/dist/palette/index.js.map +1 -1
  30. package/dist/palette/index.mjs.map +1 -1
  31. package/dist/registry/index.js.map +1 -1
  32. package/dist/registry/index.mjs.map +1 -1
  33. package/dist/styles/artist-login.scss +374 -374
  34. package/dist/styles/global.scss +21 -21
  35. package/dist/styles/workflow-board.scss +440 -440
  36. package/dist/styles/workflow-nodes.css +340 -340
  37. package/dist/theme-system/index.js.map +1 -1
  38. package/dist/theme-system/index.mjs.map +1 -1
  39. package/dist/themes/artist/index.js.map +1 -1
  40. package/dist/themes/artist/index.mjs.map +1 -1
  41. package/dist/themes/bsd/index.js.map +1 -1
  42. package/dist/themes/bsd/index.mjs.map +1 -1
  43. package/dist/themes/concept/index.js.map +1 -1
  44. package/dist/themes/concept/index.mjs.map +1 -1
  45. package/dist/themes/default/index.js.map +1 -1
  46. package/dist/themes/default/index.mjs.map +1 -1
  47. package/package.json +146 -139
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/layout/index.tsx"],"names":["jsxs","jsx","Fragment","DropdownMenu","useState","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["import { useEffect, useState, type ReactNode } from 'react';\r\nimport * as DropdownMenu from '@radix-ui/react-dropdown-menu';\r\n\r\n// ============================================================\r\n// cn utility (inline clsx + tailwind-merge–lite for zero deps)\r\n// ============================================================\r\nexport function cn(...inputs: (string | undefined | null | false)[]): string {\r\n return inputs.filter(Boolean).join(' ');\r\n}\r\n\r\n// ============================================================\r\n// NavButton\r\n// ============================================================\r\nexport interface NavButtonProps {\r\n /** 是否处于激活状态 */\r\n active?: boolean;\r\n /** 左侧图标 */\r\n icon?: ReactNode;\r\n /** 右侧附加内容(如 chevron) */\r\n postfix?: ReactNode;\r\n /** 点击回调 */\r\n onClick?: () => void;\r\n className?: string;\r\n children: ReactNode;\r\n}\r\n\r\nexport function NavButton({ active, icon, postfix, onClick, className, children }: NavButtonProps) {\r\n return (\r\n <div\r\n className={cn(\r\n 'flex w-full cursor-pointer select-none items-center gap-2 rounded-xl border p-2 text-xs text-[hsl(var(--foreground))] transition-colors',\r\n active\r\n ? 'border-[hsl(var(--input))] bg-[hsl(var(--muted))] font-bold'\r\n : 'border-transparent hover:border-[hsl(var(--input))]/60 hover:bg-[hsl(var(--muted))]/60',\r\n className,\r\n )}\r\n onClick={onClick}\r\n >\r\n <div className=\"w-[20px] [&_svg]:h-[16px] [&_svg]:w-[16px]\">{icon}</div>\r\n <span className=\"text-sm\">{children}</span>\r\n {postfix}\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================\r\n// AppHeader\r\n// ============================================================\r\nexport interface HeaderTab {\r\n id: string;\r\n label: string;\r\n}\r\n\r\nexport interface AppHeaderLogo {\r\n /** Logo 图片 URL,若为空则显示 fallback */\r\n url?: string;\r\n /** 品牌名称 */\r\n title: string;\r\n /** 点击 Logo 回调 */\r\n onClick?: () => void;\r\n}\r\n\r\nexport interface AppHeaderUser {\r\n name?: string;\r\n email?: string;\r\n photo?: string;\r\n}\r\n\r\nexport interface AppHeaderProps {\r\n /** 品牌 Logo */\r\n logo: AppHeaderLogo;\r\n /** 导航 tabs */\r\n tabs?: HeaderTab[];\r\n /** 当前激活的 tab id */\r\n activeTab?: string;\r\n /** tab 切换回调 */\r\n onTabChange?: (tabId: string) => void;\r\n /** 用户信息 */\r\n user?: AppHeaderUser;\r\n /** 退出登录回调 */\r\n onLogout?: () => void;\r\n /** 退出登录文案 */\r\n logoutLabel?: string;\r\n /** 用户菜单中的额外菜单项(在退出登录按钮之前渲染) */\r\n userMenuItems?: ReactNode;\r\n /** header 右侧额外内容 */\r\n extra?: ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function AppHeader({\r\n logo,\r\n tabs,\r\n activeTab,\r\n onTabChange,\r\n user,\r\n onLogout,\r\n logoutLabel = '退出登录',\r\n userMenuItems,\r\n extra,\r\n className,\r\n}: AppHeaderProps) {\r\n const getUserInitials = (name: string) =>\r\n name.split(' ').map((n) => n[0]).join('').toUpperCase().slice(0, 2);\r\n\r\n return (\r\n <header\r\n className={cn(\r\n 'flex h-[72px] w-full shrink-0 items-center justify-between gap-4 rounded-xl border border-[hsl(var(--input))] bg-[hsl(var(--background))] p-[var(--global-spacing,0.75rem)]',\r\n className,\r\n )}\r\n >\r\n {/* Logo */}\r\n <div\r\n className=\"flex shrink-0 cursor-pointer items-center gap-2\"\r\n onClick={logo.onClick}\r\n >\r\n <div\r\n className={cn(\r\n 'flex h-8 w-8 items-center justify-center rounded-lg overflow-hidden',\r\n logo.url ? 'bg-transparent' : 'bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))]',\r\n )}\r\n >\r\n {logo.url ? (\r\n <img src={logo.url} alt={logo.title} className=\"h-full w-full object-contain\" />\r\n ) : (\r\n <span className=\"text-sm font-bold\">{logo.title.charAt(0)}</span>\r\n )}\r\n </div>\r\n <span className=\"text-lg font-semibold whitespace-nowrap\">{logo.title}</span>\r\n </div>\r\n\r\n {/* Separator + Tabs */}\r\n {tabs && tabs.length > 0 && (\r\n <>\r\n <div className=\"h-1/2 w-px bg-[hsl(var(--border))]\" />\r\n <div className=\"flex flex-1 items-center\">\r\n <div className=\"inline-flex h-9 items-center gap-1 rounded-md bg-transparent p-1\">\r\n {tabs.map((tab) => (\r\n <button\r\n key={tab.id}\r\n className={cn(\r\n 'inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium transition-all',\r\n tab.id === activeTab\r\n ? 'bg-[hsl(var(--muted))] text-[hsl(var(--foreground))] shadow-sm'\r\n : 'text-[hsl(var(--muted-foreground))] hover:bg-[hsl(var(--muted))]/50',\r\n )}\r\n onClick={() => onTabChange?.(tab.id)}\r\n >\r\n {tab.label}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n {(!tabs || tabs.length === 0) && <div className=\"flex-1\" />}\r\n\r\n {/* Right side */}\r\n <div className=\"flex shrink-0 items-center gap-4\">\r\n {extra}\r\n {user && (\r\n <DropdownMenu.Root>\r\n <DropdownMenu.Trigger asChild>\r\n <button className=\"flex h-8 w-8 items-center justify-center rounded-full hover:ring-2 hover:ring-[hsl(var(--ring))]/20 transition-all overflow-hidden focus-visible:outline-none\">\r\n {user.photo ? (\r\n <img src={user.photo} alt={user.name} className=\"h-8 w-8 rounded-full object-cover\" />\r\n ) : (\r\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-[hsl(var(--muted))] text-xs font-medium\">\r\n {user.name ? getUserInitials(user.name) : 'U'}\r\n </div>\r\n )}\r\n </button>\r\n </DropdownMenu.Trigger>\r\n <DropdownMenu.Portal>\r\n <DropdownMenu.Content\r\n className=\"z-50 w-52 rounded-md border border-[hsl(var(--border))] bg-[hsl(var(--popover))] p-1 text-[hsl(var(--popover-foreground))] shadow-md animate-in fade-in-0 zoom-in-95\"\r\n sideOffset={5}\r\n align=\"end\"\r\n >\r\n {/* User info label */}\r\n <DropdownMenu.Label className=\"flex items-center gap-2 px-2 py-1.5 font-normal\">\r\n {user.photo ? (\r\n <img src={user.photo} alt={user.name} className=\"h-8 w-8 rounded-full object-cover\" />\r\n ) : (\r\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-[hsl(var(--muted))] text-xs font-medium\">\r\n {user.name ? getUserInitials(user.name) : 'U'}\r\n </div>\r\n )}\r\n <div className=\"flex flex-col\">\r\n <span className=\"text-sm font-medium leading-none\">{user.name}</span>\r\n {user.email && <span className=\"text-xs text-[hsl(var(--muted-foreground))] leading-none mt-1\">{user.email}</span>}\r\n </div>\r\n </DropdownMenu.Label>\r\n\r\n <DropdownMenu.Separator className=\"h-px bg-[hsl(var(--border))] my-1\" />\r\n\r\n <DropdownMenu.Group>\r\n {userMenuItems}\r\n\r\n {/* Logout */}\r\n <DropdownMenu.Item\r\n className=\"relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm text-[hsl(var(--destructive))] outline-none transition-colors hover:bg-[hsl(var(--accent))]\"\r\n onSelect={() => onLogout?.()}\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"/><polyline points=\"16 17 21 12 16 7\"/><line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\"/></svg>\r\n {logoutLabel}\r\n </DropdownMenu.Item>\r\n </DropdownMenu.Group>\r\n </DropdownMenu.Content>\r\n </DropdownMenu.Portal>\r\n </DropdownMenu.Root>\r\n )}\r\n </div>\r\n </header>\r\n );\r\n}\r\n\r\n// ============================================================\r\n// AppSidebar\r\n// ============================================================\r\nexport interface SidebarNavItem {\r\n id: string;\r\n label: string;\r\n icon?: ReactNode;\r\n /** 如果有 children 则为分组,点击展开/折叠 */\r\n children?: SidebarNavItem[];\r\n}\r\n\r\nexport interface SidebarAccount {\r\n name?: string;\r\n photo?: string;\r\n}\r\n\r\nexport interface AppSidebarProps {\r\n /** Logo */\r\n logo?: AppHeaderLogo;\r\n /** 导航菜单 */\r\n navItems: SidebarNavItem[];\r\n /** 当前路径/激活的 item id */\r\n activeItemId?: string;\r\n /** 点击导航项回调 */\r\n onNavigate?: (itemId: string) => void;\r\n /** 账户信息 */\r\n account?: SidebarAccount;\r\n /** 退出登录回调 */\r\n onLogout?: () => void;\r\n /** 退出登录文案 */\r\n logoutLabel?: string;\r\n /** 底部额外内容(如版本号) */\r\n footer?: ReactNode;\r\n /** 默认展开的分组 id 列表 */\r\n defaultExpandedGroups?: string[];\r\n className?: string;\r\n}\r\n\r\nexport function AppSidebar({\r\n logo,\r\n navItems,\r\n activeItemId,\r\n onNavigate,\r\n account,\r\n onLogout,\r\n logoutLabel = '退出登录',\r\n footer,\r\n defaultExpandedGroups,\r\n className,\r\n}: AppSidebarProps) {\r\n return (\r\n <div\r\n className={cn(\r\n 'flex w-[13.7rem] shrink-0 flex-col justify-between gap-[var(--global-spacing,0.75rem)] overflow-y-hidden rounded-xl border border-[hsl(var(--input))] bg-[hsl(var(--background))] p-5',\r\n className,\r\n )}\r\n >\r\n {/* Logo */}\r\n {logo && (\r\n <div className=\"flex shrink-0 cursor-pointer items-center gap-2\" onClick={logo.onClick}>\r\n <div\r\n className={cn(\r\n 'flex h-8 w-8 items-center justify-center rounded-lg overflow-hidden',\r\n logo.url ? 'bg-transparent' : 'bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))]',\r\n )}\r\n >\r\n {logo.url ? (\r\n <img src={logo.url} alt={logo.title} className=\"h-full w-full object-contain\" />\r\n ) : (\r\n <span className=\"text-sm font-bold\">{logo.title.charAt(0)}</span>\r\n )}\r\n </div>\r\n <span className=\"text-lg font-semibold whitespace-nowrap\">{logo.title}</span>\r\n </div>\r\n )}\r\n\r\n {/* Navigation */}\r\n <SidebarNavList\r\n items={navItems}\r\n activeItemId={activeItemId}\r\n onNavigate={onNavigate}\r\n defaultExpandedGroups={defaultExpandedGroups}\r\n />\r\n\r\n {/* Account Section */}\r\n {(account || footer) && (\r\n <div className=\"flex flex-col gap-2\">\r\n {account && (\r\n <div className=\"flex w-full flex-col gap-2 rounded-lg bg-[hsl(var(--muted))] p-2 shadow-sm\">\r\n <div className=\"flex w-full items-center justify-between px-3 py-1\">\r\n <div className=\"flex items-center gap-2\">\r\n {account.photo ? (\r\n <img src={account.photo} alt={account.name} className=\"h-5 w-5 rounded-full object-cover\" />\r\n ) : (\r\n <div className=\"flex h-5 w-5 items-center justify-center rounded-full bg-[hsl(var(--muted))] text-[10px] font-medium\">\r\n {account.name ? account.name.charAt(0).toUpperCase() : 'U'}\r\n </div>\r\n )}\r\n <span className=\"text-xs font-medium truncate max-w-[100px]\">{account.name}</span>\r\n </div>\r\n {onLogout && (\r\n <button\r\n onClick={onLogout}\r\n className=\"flex items-center justify-center text-[hsl(var(--destructive))] hover:opacity-80 transition-opacity\"\r\n title={logoutLabel}\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"/><polyline points=\"16 17 21 12 16 7\"/><line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\"/></svg>\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n {footer}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================\r\n// SidebarNavList (internal accordion-style nav)\r\n// ============================================================\r\ninterface SidebarNavListProps {\r\n items: SidebarNavItem[];\r\n activeItemId?: string;\r\n onNavigate?: (itemId: string) => void;\r\n defaultExpandedGroups?: string[];\r\n}\r\n\r\nfunction SidebarNavList({ items, activeItemId, onNavigate, defaultExpandedGroups }: SidebarNavListProps) {\r\n const [expanded, setExpanded] = useState<Record<string, boolean>>(() => {\r\n const map: Record<string, boolean> = {};\r\n (defaultExpandedGroups ?? items.map((i) => i.id)).forEach((id) => { map[id] = true; });\r\n return map;\r\n });\r\n const [localActiveItemId, setLocalActiveItemId] = useState<string | undefined>(activeItemId);\r\n\r\n useEffect(() => {\r\n if (activeItemId !== undefined) {\r\n setLocalActiveItemId(activeItemId);\r\n }\r\n }, [activeItemId]);\r\n\r\n const toggle = (id: string) => {\r\n setExpanded((prev: Record<string, boolean>) => ({ ...prev, [id]: !prev[id] }));\r\n };\r\n const resolvedActiveItemId = activeItemId ?? localActiveItemId;\r\n\r\n return (\r\n <div className=\"h-full flex-1 overflow-y-auto\" style={{ scrollbarWidth: 'none', msOverflowStyle: 'none' }}>\r\n <style>{`.monkeys-sidebar-nav::-webkit-scrollbar { display: none; }`}</style>\r\n <div className=\"monkeys-sidebar-nav flex w-full flex-col gap-2 text-xs text-[hsl(var(--foreground))]\">\r\n {items.map((item) => {\r\n if (item.children && item.children.length > 0) {\r\n const isExpanded = expanded[item.id] ?? true;\r\n return (\r\n <div key={item.id}>\r\n <NavButton\r\n icon={item.icon}\r\n onClick={() => toggle(item.id)}\r\n postfix={\r\n <div className=\"flex flex-1 justify-end\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"\r\n className=\"shrink-0 text-[hsl(var(--foreground))] transition-transform duration-200\"\r\n style={{ transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)' }}\r\n >\r\n <path d=\"m9 18 6-6-6-6\"/>\r\n </svg>\r\n </div>\r\n }\r\n >\r\n {item.label}\r\n </NavButton>\r\n {isExpanded && (\r\n <div className=\"flex flex-col gap-1 mt-1\">\r\n {item.children.map((child) => (\r\n <NavButton\r\n key={child.id}\r\n active={child.id === resolvedActiveItemId}\r\n onClick={() => {\r\n setLocalActiveItemId(child.id);\r\n onNavigate?.(child.id);\r\n }}\r\n >\r\n {child.label}\r\n </NavButton>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n return (\r\n <NavButton\r\n key={item.id}\r\n icon={item.icon}\r\n active={item.id === resolvedActiveItemId}\r\n onClick={() => {\r\n setLocalActiveItemId(item.id);\r\n onNavigate?.(item.id);\r\n }}\r\n >\r\n {item.label}\r\n </NavButton>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================\r\n// AppLayout\r\n// ============================================================\r\nexport interface AppLayoutProps {\r\n /** header 组件 */\r\n header: ReactNode;\r\n /** sidebar 组件 */\r\n sidebar: ReactNode;\r\n /** 主内容 */\r\n children: ReactNode;\r\n /** 是否 flush 布局(无内边距) */\r\n flush?: boolean;\r\n className?: string;\r\n}\r\n\r\nexport function AppLayout({ header, sidebar, children, flush = false, className }: AppLayoutProps) {\r\n return (\r\n <div className={cn(\r\n 'flex h-screen flex-col gap-[var(--global-spacing,0.75rem)] overflow-hidden p-[var(--global-spacing,0.75rem)]',\r\n className,\r\n )} style={{ backgroundColor: 'hsl(var(--muted))' }}>\r\n {header}\r\n <div className=\"flex flex-1 gap-[var(--global-spacing,0.75rem)] overflow-hidden min-h-0\">\r\n {sidebar}\r\n <main className={cn(\r\n 'flex-1 min-h-0 overflow-hidden rounded-xl border border-[hsl(var(--input))] bg-[hsl(var(--background))]',\r\n !flush && 'overflow-y-auto',\r\n )}>\r\n {flush ? children : (\r\n <div className=\"h-full overflow-y-auto\">\r\n {children}\r\n </div>\r\n )}\r\n </main>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../../src/components/layout/index.tsx"],"names":["jsxs","jsx","Fragment","DropdownMenu","useState","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["import { useEffect, useState, type ReactNode } from 'react';\nimport * as DropdownMenu from '@radix-ui/react-dropdown-menu';\n\n// ============================================================\n// cn utility (inline clsx + tailwind-merge–lite for zero deps)\n// ============================================================\nexport function cn(...inputs: (string | undefined | null | false)[]): string {\n return inputs.filter(Boolean).join(' ');\n}\n\n// ============================================================\n// NavButton\n// ============================================================\nexport interface NavButtonProps {\n /** 是否处于激活状态 */\n active?: boolean;\n /** 左侧图标 */\n icon?: ReactNode;\n /** 右侧附加内容(如 chevron) */\n postfix?: ReactNode;\n /** 点击回调 */\n onClick?: () => void;\n className?: string;\n children: ReactNode;\n}\n\nexport function NavButton({ active, icon, postfix, onClick, className, children }: NavButtonProps) {\n return (\n <div\n className={cn(\n 'flex w-full cursor-pointer select-none items-center gap-2 rounded-xl border p-2 text-xs text-[hsl(var(--foreground))] transition-colors',\n active\n ? 'border-[hsl(var(--input))] bg-[hsl(var(--muted))] font-bold'\n : 'border-transparent hover:border-[hsl(var(--input))]/60 hover:bg-[hsl(var(--muted))]/60',\n className,\n )}\n onClick={onClick}\n >\n <div className=\"w-[20px] [&_svg]:h-[16px] [&_svg]:w-[16px]\">{icon}</div>\n <span className=\"text-sm\">{children}</span>\n {postfix}\n </div>\n );\n}\n\n// ============================================================\n// AppHeader\n// ============================================================\nexport interface HeaderTab {\n id: string;\n label: string;\n}\n\nexport interface AppHeaderLogo {\n /** Logo 图片 URL,若为空则显示 fallback */\n url?: string;\n /** 品牌名称 */\n title: string;\n /** 点击 Logo 回调 */\n onClick?: () => void;\n}\n\nexport interface AppHeaderUser {\n name?: string;\n email?: string;\n photo?: string;\n}\n\nexport interface AppHeaderProps {\n /** 品牌 Logo */\n logo: AppHeaderLogo;\n /** 导航 tabs */\n tabs?: HeaderTab[];\n /** 当前激活的 tab id */\n activeTab?: string;\n /** tab 切换回调 */\n onTabChange?: (tabId: string) => void;\n /** 用户信息 */\n user?: AppHeaderUser;\n /** 退出登录回调 */\n onLogout?: () => void;\n /** 退出登录文案 */\n logoutLabel?: string;\n /** 用户菜单中的额外菜单项(在退出登录按钮之前渲染) */\n userMenuItems?: ReactNode;\n /** header 右侧额外内容 */\n extra?: ReactNode;\n className?: string;\n}\n\nexport function AppHeader({\n logo,\n tabs,\n activeTab,\n onTabChange,\n user,\n onLogout,\n logoutLabel = '退出登录',\n userMenuItems,\n extra,\n className,\n}: AppHeaderProps) {\n const getUserInitials = (name: string) =>\n name.split(' ').map((n) => n[0]).join('').toUpperCase().slice(0, 2);\n\n return (\n <header\n className={cn(\n 'flex h-[72px] w-full shrink-0 items-center justify-between gap-4 rounded-xl border border-[hsl(var(--input))] bg-[hsl(var(--background))] p-[var(--global-spacing,0.75rem)]',\n className,\n )}\n >\n {/* Logo */}\n <div\n className=\"flex shrink-0 cursor-pointer items-center gap-2\"\n onClick={logo.onClick}\n >\n <div\n className={cn(\n 'flex h-8 w-8 items-center justify-center rounded-lg overflow-hidden',\n logo.url ? 'bg-transparent' : 'bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))]',\n )}\n >\n {logo.url ? (\n <img src={logo.url} alt={logo.title} className=\"h-full w-full object-contain\" />\n ) : (\n <span className=\"text-sm font-bold\">{logo.title.charAt(0)}</span>\n )}\n </div>\n <span className=\"text-lg font-semibold whitespace-nowrap\">{logo.title}</span>\n </div>\n\n {/* Separator + Tabs */}\n {tabs && tabs.length > 0 && (\n <>\n <div className=\"h-1/2 w-px bg-[hsl(var(--border))]\" />\n <div className=\"flex flex-1 items-center\">\n <div className=\"inline-flex h-9 items-center gap-1 rounded-md bg-transparent p-1\">\n {tabs.map((tab) => (\n <button\n key={tab.id}\n className={cn(\n 'inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium transition-all',\n tab.id === activeTab\n ? 'bg-[hsl(var(--muted))] text-[hsl(var(--foreground))] shadow-sm'\n : 'text-[hsl(var(--muted-foreground))] hover:bg-[hsl(var(--muted))]/50',\n )}\n onClick={() => onTabChange?.(tab.id)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n </div>\n </>\n )}\n {(!tabs || tabs.length === 0) && <div className=\"flex-1\" />}\n\n {/* Right side */}\n <div className=\"flex shrink-0 items-center gap-4\">\n {extra}\n {user && (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button className=\"flex h-8 w-8 items-center justify-center rounded-full hover:ring-2 hover:ring-[hsl(var(--ring))]/20 transition-all overflow-hidden focus-visible:outline-none\">\n {user.photo ? (\n <img src={user.photo} alt={user.name} className=\"h-8 w-8 rounded-full object-cover\" />\n ) : (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-[hsl(var(--muted))] text-xs font-medium\">\n {user.name ? getUserInitials(user.name) : 'U'}\n </div>\n )}\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n className=\"z-50 w-52 rounded-md border border-[hsl(var(--border))] bg-[hsl(var(--popover))] p-1 text-[hsl(var(--popover-foreground))] shadow-md animate-in fade-in-0 zoom-in-95\"\n sideOffset={5}\n align=\"end\"\n >\n {/* User info label */}\n <DropdownMenu.Label className=\"flex items-center gap-2 px-2 py-1.5 font-normal\">\n {user.photo ? (\n <img src={user.photo} alt={user.name} className=\"h-8 w-8 rounded-full object-cover\" />\n ) : (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-[hsl(var(--muted))] text-xs font-medium\">\n {user.name ? getUserInitials(user.name) : 'U'}\n </div>\n )}\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium leading-none\">{user.name}</span>\n {user.email && <span className=\"text-xs text-[hsl(var(--muted-foreground))] leading-none mt-1\">{user.email}</span>}\n </div>\n </DropdownMenu.Label>\n\n <DropdownMenu.Separator className=\"h-px bg-[hsl(var(--border))] my-1\" />\n\n <DropdownMenu.Group>\n {userMenuItems}\n\n {/* Logout */}\n <DropdownMenu.Item\n className=\"relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm text-[hsl(var(--destructive))] outline-none transition-colors hover:bg-[hsl(var(--accent))]\"\n onSelect={() => onLogout?.()}\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"/><polyline points=\"16 17 21 12 16 7\"/><line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\"/></svg>\n {logoutLabel}\n </DropdownMenu.Item>\n </DropdownMenu.Group>\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n )}\n </div>\n </header>\n );\n}\n\n// ============================================================\n// AppSidebar\n// ============================================================\nexport interface SidebarNavItem {\n id: string;\n label: string;\n icon?: ReactNode;\n /** 如果有 children 则为分组,点击展开/折叠 */\n children?: SidebarNavItem[];\n}\n\nexport interface SidebarAccount {\n name?: string;\n photo?: string;\n}\n\nexport interface AppSidebarProps {\n /** Logo */\n logo?: AppHeaderLogo;\n /** 导航菜单 */\n navItems: SidebarNavItem[];\n /** 当前路径/激活的 item id */\n activeItemId?: string;\n /** 点击导航项回调 */\n onNavigate?: (itemId: string) => void;\n /** 账户信息 */\n account?: SidebarAccount;\n /** 退出登录回调 */\n onLogout?: () => void;\n /** 退出登录文案 */\n logoutLabel?: string;\n /** 底部额外内容(如版本号) */\n footer?: ReactNode;\n /** 默认展开的分组 id 列表 */\n defaultExpandedGroups?: string[];\n className?: string;\n}\n\nexport function AppSidebar({\n logo,\n navItems,\n activeItemId,\n onNavigate,\n account,\n onLogout,\n logoutLabel = '退出登录',\n footer,\n defaultExpandedGroups,\n className,\n}: AppSidebarProps) {\n return (\n <div\n className={cn(\n 'flex w-[13.7rem] shrink-0 flex-col justify-between gap-[var(--global-spacing,0.75rem)] overflow-y-hidden rounded-xl border border-[hsl(var(--input))] bg-[hsl(var(--background))] p-5',\n className,\n )}\n >\n {/* Logo */}\n {logo && (\n <div className=\"flex shrink-0 cursor-pointer items-center gap-2\" onClick={logo.onClick}>\n <div\n className={cn(\n 'flex h-8 w-8 items-center justify-center rounded-lg overflow-hidden',\n logo.url ? 'bg-transparent' : 'bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))]',\n )}\n >\n {logo.url ? (\n <img src={logo.url} alt={logo.title} className=\"h-full w-full object-contain\" />\n ) : (\n <span className=\"text-sm font-bold\">{logo.title.charAt(0)}</span>\n )}\n </div>\n <span className=\"text-lg font-semibold whitespace-nowrap\">{logo.title}</span>\n </div>\n )}\n\n {/* Navigation */}\n <SidebarNavList\n items={navItems}\n activeItemId={activeItemId}\n onNavigate={onNavigate}\n defaultExpandedGroups={defaultExpandedGroups}\n />\n\n {/* Account Section */}\n {(account || footer) && (\n <div className=\"flex flex-col gap-2\">\n {account && (\n <div className=\"flex w-full flex-col gap-2 rounded-lg bg-[hsl(var(--muted))] p-2 shadow-sm\">\n <div className=\"flex w-full items-center justify-between px-3 py-1\">\n <div className=\"flex items-center gap-2\">\n {account.photo ? (\n <img src={account.photo} alt={account.name} className=\"h-5 w-5 rounded-full object-cover\" />\n ) : (\n <div className=\"flex h-5 w-5 items-center justify-center rounded-full bg-[hsl(var(--muted))] text-[10px] font-medium\">\n {account.name ? account.name.charAt(0).toUpperCase() : 'U'}\n </div>\n )}\n <span className=\"text-xs font-medium truncate max-w-[100px]\">{account.name}</span>\n </div>\n {onLogout && (\n <button\n onClick={onLogout}\n className=\"flex items-center justify-center text-[hsl(var(--destructive))] hover:opacity-80 transition-opacity\"\n title={logoutLabel}\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"/><polyline points=\"16 17 21 12 16 7\"/><line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\"/></svg>\n </button>\n )}\n </div>\n </div>\n )}\n {footer}\n </div>\n )}\n </div>\n );\n}\n\n// ============================================================\n// SidebarNavList (internal accordion-style nav)\n// ============================================================\ninterface SidebarNavListProps {\n items: SidebarNavItem[];\n activeItemId?: string;\n onNavigate?: (itemId: string) => void;\n defaultExpandedGroups?: string[];\n}\n\nfunction SidebarNavList({ items, activeItemId, onNavigate, defaultExpandedGroups }: SidebarNavListProps) {\n const [expanded, setExpanded] = useState<Record<string, boolean>>(() => {\n const map: Record<string, boolean> = {};\n (defaultExpandedGroups ?? items.map((i) => i.id)).forEach((id) => { map[id] = true; });\n return map;\n });\n const [localActiveItemId, setLocalActiveItemId] = useState<string | undefined>(activeItemId);\n\n useEffect(() => {\n if (activeItemId !== undefined) {\n setLocalActiveItemId(activeItemId);\n }\n }, [activeItemId]);\n\n const toggle = (id: string) => {\n setExpanded((prev: Record<string, boolean>) => ({ ...prev, [id]: !prev[id] }));\n };\n const resolvedActiveItemId = activeItemId ?? localActiveItemId;\n\n return (\n <div className=\"h-full flex-1 overflow-y-auto\" style={{ scrollbarWidth: 'none', msOverflowStyle: 'none' }}>\n <style>{`.monkeys-sidebar-nav::-webkit-scrollbar { display: none; }`}</style>\n <div className=\"monkeys-sidebar-nav flex w-full flex-col gap-2 text-xs text-[hsl(var(--foreground))]\">\n {items.map((item) => {\n if (item.children && item.children.length > 0) {\n const isExpanded = expanded[item.id] ?? true;\n return (\n <div key={item.id}>\n <NavButton\n icon={item.icon}\n onClick={() => toggle(item.id)}\n postfix={\n <div className=\"flex flex-1 justify-end\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\" height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"\n className=\"shrink-0 text-[hsl(var(--foreground))] transition-transform duration-200\"\n style={{ transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)' }}\n >\n <path d=\"m9 18 6-6-6-6\"/>\n </svg>\n </div>\n }\n >\n {item.label}\n </NavButton>\n {isExpanded && (\n <div className=\"flex flex-col gap-1 mt-1\">\n {item.children.map((child) => (\n <NavButton\n key={child.id}\n active={child.id === resolvedActiveItemId}\n onClick={() => {\n setLocalActiveItemId(child.id);\n onNavigate?.(child.id);\n }}\n >\n {child.label}\n </NavButton>\n ))}\n </div>\n )}\n </div>\n );\n }\n return (\n <NavButton\n key={item.id}\n icon={item.icon}\n active={item.id === resolvedActiveItemId}\n onClick={() => {\n setLocalActiveItemId(item.id);\n onNavigate?.(item.id);\n }}\n >\n {item.label}\n </NavButton>\n );\n })}\n </div>\n </div>\n );\n}\n\n// ============================================================\n// AppLayout\n// ============================================================\nexport interface AppLayoutProps {\n /** header 组件 */\n header: ReactNode;\n /** sidebar 组件 */\n sidebar: ReactNode;\n /** 主内容 */\n children: ReactNode;\n /** 是否 flush 布局(无内边距) */\n flush?: boolean;\n className?: string;\n}\n\nexport function AppLayout({ header, sidebar, children, flush = false, className }: AppLayoutProps) {\n return (\n <div className={cn(\n 'flex h-screen flex-col gap-[var(--global-spacing,0.75rem)] overflow-hidden p-[var(--global-spacing,0.75rem)]',\n className,\n )} style={{ backgroundColor: 'hsl(var(--muted))' }}>\n {header}\n <div className=\"flex flex-1 gap-[var(--global-spacing,0.75rem)] overflow-hidden min-h-0\">\n {sidebar}\n <main className={cn(\n 'flex-1 min-h-0 overflow-hidden rounded-xl border border-[hsl(var(--input))] bg-[hsl(var(--background))]',\n !flush && 'overflow-y-auto',\n )}>\n {flush ? children : (\n <div className=\"h-full overflow-y-auto\">\n {children}\n </div>\n )}\n </main>\n </div>\n </div>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/layout/index.tsx"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import { useEffect, useState, type ReactNode } from 'react';\r\nimport * as DropdownMenu from '@radix-ui/react-dropdown-menu';\r\n\r\n// ============================================================\r\n// cn utility (inline clsx + tailwind-merge–lite for zero deps)\r\n// ============================================================\r\nexport function cn(...inputs: (string | undefined | null | false)[]): string {\r\n return inputs.filter(Boolean).join(' ');\r\n}\r\n\r\n// ============================================================\r\n// NavButton\r\n// ============================================================\r\nexport interface NavButtonProps {\r\n /** 是否处于激活状态 */\r\n active?: boolean;\r\n /** 左侧图标 */\r\n icon?: ReactNode;\r\n /** 右侧附加内容(如 chevron) */\r\n postfix?: ReactNode;\r\n /** 点击回调 */\r\n onClick?: () => void;\r\n className?: string;\r\n children: ReactNode;\r\n}\r\n\r\nexport function NavButton({ active, icon, postfix, onClick, className, children }: NavButtonProps) {\r\n return (\r\n <div\r\n className={cn(\r\n 'flex w-full cursor-pointer select-none items-center gap-2 rounded-xl border p-2 text-xs text-[hsl(var(--foreground))] transition-colors',\r\n active\r\n ? 'border-[hsl(var(--input))] bg-[hsl(var(--muted))] font-bold'\r\n : 'border-transparent hover:border-[hsl(var(--input))]/60 hover:bg-[hsl(var(--muted))]/60',\r\n className,\r\n )}\r\n onClick={onClick}\r\n >\r\n <div className=\"w-[20px] [&_svg]:h-[16px] [&_svg]:w-[16px]\">{icon}</div>\r\n <span className=\"text-sm\">{children}</span>\r\n {postfix}\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================\r\n// AppHeader\r\n// ============================================================\r\nexport interface HeaderTab {\r\n id: string;\r\n label: string;\r\n}\r\n\r\nexport interface AppHeaderLogo {\r\n /** Logo 图片 URL,若为空则显示 fallback */\r\n url?: string;\r\n /** 品牌名称 */\r\n title: string;\r\n /** 点击 Logo 回调 */\r\n onClick?: () => void;\r\n}\r\n\r\nexport interface AppHeaderUser {\r\n name?: string;\r\n email?: string;\r\n photo?: string;\r\n}\r\n\r\nexport interface AppHeaderProps {\r\n /** 品牌 Logo */\r\n logo: AppHeaderLogo;\r\n /** 导航 tabs */\r\n tabs?: HeaderTab[];\r\n /** 当前激活的 tab id */\r\n activeTab?: string;\r\n /** tab 切换回调 */\r\n onTabChange?: (tabId: string) => void;\r\n /** 用户信息 */\r\n user?: AppHeaderUser;\r\n /** 退出登录回调 */\r\n onLogout?: () => void;\r\n /** 退出登录文案 */\r\n logoutLabel?: string;\r\n /** 用户菜单中的额外菜单项(在退出登录按钮之前渲染) */\r\n userMenuItems?: ReactNode;\r\n /** header 右侧额外内容 */\r\n extra?: ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function AppHeader({\r\n logo,\r\n tabs,\r\n activeTab,\r\n onTabChange,\r\n user,\r\n onLogout,\r\n logoutLabel = '退出登录',\r\n userMenuItems,\r\n extra,\r\n className,\r\n}: AppHeaderProps) {\r\n const getUserInitials = (name: string) =>\r\n name.split(' ').map((n) => n[0]).join('').toUpperCase().slice(0, 2);\r\n\r\n return (\r\n <header\r\n className={cn(\r\n 'flex h-[72px] w-full shrink-0 items-center justify-between gap-4 rounded-xl border border-[hsl(var(--input))] bg-[hsl(var(--background))] p-[var(--global-spacing,0.75rem)]',\r\n className,\r\n )}\r\n >\r\n {/* Logo */}\r\n <div\r\n className=\"flex shrink-0 cursor-pointer items-center gap-2\"\r\n onClick={logo.onClick}\r\n >\r\n <div\r\n className={cn(\r\n 'flex h-8 w-8 items-center justify-center rounded-lg overflow-hidden',\r\n logo.url ? 'bg-transparent' : 'bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))]',\r\n )}\r\n >\r\n {logo.url ? (\r\n <img src={logo.url} alt={logo.title} className=\"h-full w-full object-contain\" />\r\n ) : (\r\n <span className=\"text-sm font-bold\">{logo.title.charAt(0)}</span>\r\n )}\r\n </div>\r\n <span className=\"text-lg font-semibold whitespace-nowrap\">{logo.title}</span>\r\n </div>\r\n\r\n {/* Separator + Tabs */}\r\n {tabs && tabs.length > 0 && (\r\n <>\r\n <div className=\"h-1/2 w-px bg-[hsl(var(--border))]\" />\r\n <div className=\"flex flex-1 items-center\">\r\n <div className=\"inline-flex h-9 items-center gap-1 rounded-md bg-transparent p-1\">\r\n {tabs.map((tab) => (\r\n <button\r\n key={tab.id}\r\n className={cn(\r\n 'inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium transition-all',\r\n tab.id === activeTab\r\n ? 'bg-[hsl(var(--muted))] text-[hsl(var(--foreground))] shadow-sm'\r\n : 'text-[hsl(var(--muted-foreground))] hover:bg-[hsl(var(--muted))]/50',\r\n )}\r\n onClick={() => onTabChange?.(tab.id)}\r\n >\r\n {tab.label}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n {(!tabs || tabs.length === 0) && <div className=\"flex-1\" />}\r\n\r\n {/* Right side */}\r\n <div className=\"flex shrink-0 items-center gap-4\">\r\n {extra}\r\n {user && (\r\n <DropdownMenu.Root>\r\n <DropdownMenu.Trigger asChild>\r\n <button className=\"flex h-8 w-8 items-center justify-center rounded-full hover:ring-2 hover:ring-[hsl(var(--ring))]/20 transition-all overflow-hidden focus-visible:outline-none\">\r\n {user.photo ? (\r\n <img src={user.photo} alt={user.name} className=\"h-8 w-8 rounded-full object-cover\" />\r\n ) : (\r\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-[hsl(var(--muted))] text-xs font-medium\">\r\n {user.name ? getUserInitials(user.name) : 'U'}\r\n </div>\r\n )}\r\n </button>\r\n </DropdownMenu.Trigger>\r\n <DropdownMenu.Portal>\r\n <DropdownMenu.Content\r\n className=\"z-50 w-52 rounded-md border border-[hsl(var(--border))] bg-[hsl(var(--popover))] p-1 text-[hsl(var(--popover-foreground))] shadow-md animate-in fade-in-0 zoom-in-95\"\r\n sideOffset={5}\r\n align=\"end\"\r\n >\r\n {/* User info label */}\r\n <DropdownMenu.Label className=\"flex items-center gap-2 px-2 py-1.5 font-normal\">\r\n {user.photo ? (\r\n <img src={user.photo} alt={user.name} className=\"h-8 w-8 rounded-full object-cover\" />\r\n ) : (\r\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-[hsl(var(--muted))] text-xs font-medium\">\r\n {user.name ? getUserInitials(user.name) : 'U'}\r\n </div>\r\n )}\r\n <div className=\"flex flex-col\">\r\n <span className=\"text-sm font-medium leading-none\">{user.name}</span>\r\n {user.email && <span className=\"text-xs text-[hsl(var(--muted-foreground))] leading-none mt-1\">{user.email}</span>}\r\n </div>\r\n </DropdownMenu.Label>\r\n\r\n <DropdownMenu.Separator className=\"h-px bg-[hsl(var(--border))] my-1\" />\r\n\r\n <DropdownMenu.Group>\r\n {userMenuItems}\r\n\r\n {/* Logout */}\r\n <DropdownMenu.Item\r\n className=\"relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm text-[hsl(var(--destructive))] outline-none transition-colors hover:bg-[hsl(var(--accent))]\"\r\n onSelect={() => onLogout?.()}\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"/><polyline points=\"16 17 21 12 16 7\"/><line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\"/></svg>\r\n {logoutLabel}\r\n </DropdownMenu.Item>\r\n </DropdownMenu.Group>\r\n </DropdownMenu.Content>\r\n </DropdownMenu.Portal>\r\n </DropdownMenu.Root>\r\n )}\r\n </div>\r\n </header>\r\n );\r\n}\r\n\r\n// ============================================================\r\n// AppSidebar\r\n// ============================================================\r\nexport interface SidebarNavItem {\r\n id: string;\r\n label: string;\r\n icon?: ReactNode;\r\n /** 如果有 children 则为分组,点击展开/折叠 */\r\n children?: SidebarNavItem[];\r\n}\r\n\r\nexport interface SidebarAccount {\r\n name?: string;\r\n photo?: string;\r\n}\r\n\r\nexport interface AppSidebarProps {\r\n /** Logo */\r\n logo?: AppHeaderLogo;\r\n /** 导航菜单 */\r\n navItems: SidebarNavItem[];\r\n /** 当前路径/激活的 item id */\r\n activeItemId?: string;\r\n /** 点击导航项回调 */\r\n onNavigate?: (itemId: string) => void;\r\n /** 账户信息 */\r\n account?: SidebarAccount;\r\n /** 退出登录回调 */\r\n onLogout?: () => void;\r\n /** 退出登录文案 */\r\n logoutLabel?: string;\r\n /** 底部额外内容(如版本号) */\r\n footer?: ReactNode;\r\n /** 默认展开的分组 id 列表 */\r\n defaultExpandedGroups?: string[];\r\n className?: string;\r\n}\r\n\r\nexport function AppSidebar({\r\n logo,\r\n navItems,\r\n activeItemId,\r\n onNavigate,\r\n account,\r\n onLogout,\r\n logoutLabel = '退出登录',\r\n footer,\r\n defaultExpandedGroups,\r\n className,\r\n}: AppSidebarProps) {\r\n return (\r\n <div\r\n className={cn(\r\n 'flex w-[13.7rem] shrink-0 flex-col justify-between gap-[var(--global-spacing,0.75rem)] overflow-y-hidden rounded-xl border border-[hsl(var(--input))] bg-[hsl(var(--background))] p-5',\r\n className,\r\n )}\r\n >\r\n {/* Logo */}\r\n {logo && (\r\n <div className=\"flex shrink-0 cursor-pointer items-center gap-2\" onClick={logo.onClick}>\r\n <div\r\n className={cn(\r\n 'flex h-8 w-8 items-center justify-center rounded-lg overflow-hidden',\r\n logo.url ? 'bg-transparent' : 'bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))]',\r\n )}\r\n >\r\n {logo.url ? (\r\n <img src={logo.url} alt={logo.title} className=\"h-full w-full object-contain\" />\r\n ) : (\r\n <span className=\"text-sm font-bold\">{logo.title.charAt(0)}</span>\r\n )}\r\n </div>\r\n <span className=\"text-lg font-semibold whitespace-nowrap\">{logo.title}</span>\r\n </div>\r\n )}\r\n\r\n {/* Navigation */}\r\n <SidebarNavList\r\n items={navItems}\r\n activeItemId={activeItemId}\r\n onNavigate={onNavigate}\r\n defaultExpandedGroups={defaultExpandedGroups}\r\n />\r\n\r\n {/* Account Section */}\r\n {(account || footer) && (\r\n <div className=\"flex flex-col gap-2\">\r\n {account && (\r\n <div className=\"flex w-full flex-col gap-2 rounded-lg bg-[hsl(var(--muted))] p-2 shadow-sm\">\r\n <div className=\"flex w-full items-center justify-between px-3 py-1\">\r\n <div className=\"flex items-center gap-2\">\r\n {account.photo ? (\r\n <img src={account.photo} alt={account.name} className=\"h-5 w-5 rounded-full object-cover\" />\r\n ) : (\r\n <div className=\"flex h-5 w-5 items-center justify-center rounded-full bg-[hsl(var(--muted))] text-[10px] font-medium\">\r\n {account.name ? account.name.charAt(0).toUpperCase() : 'U'}\r\n </div>\r\n )}\r\n <span className=\"text-xs font-medium truncate max-w-[100px]\">{account.name}</span>\r\n </div>\r\n {onLogout && (\r\n <button\r\n onClick={onLogout}\r\n className=\"flex items-center justify-center text-[hsl(var(--destructive))] hover:opacity-80 transition-opacity\"\r\n title={logoutLabel}\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"/><polyline points=\"16 17 21 12 16 7\"/><line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\"/></svg>\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n {footer}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================\r\n// SidebarNavList (internal accordion-style nav)\r\n// ============================================================\r\ninterface SidebarNavListProps {\r\n items: SidebarNavItem[];\r\n activeItemId?: string;\r\n onNavigate?: (itemId: string) => void;\r\n defaultExpandedGroups?: string[];\r\n}\r\n\r\nfunction SidebarNavList({ items, activeItemId, onNavigate, defaultExpandedGroups }: SidebarNavListProps) {\r\n const [expanded, setExpanded] = useState<Record<string, boolean>>(() => {\r\n const map: Record<string, boolean> = {};\r\n (defaultExpandedGroups ?? items.map((i) => i.id)).forEach((id) => { map[id] = true; });\r\n return map;\r\n });\r\n const [localActiveItemId, setLocalActiveItemId] = useState<string | undefined>(activeItemId);\r\n\r\n useEffect(() => {\r\n if (activeItemId !== undefined) {\r\n setLocalActiveItemId(activeItemId);\r\n }\r\n }, [activeItemId]);\r\n\r\n const toggle = (id: string) => {\r\n setExpanded((prev: Record<string, boolean>) => ({ ...prev, [id]: !prev[id] }));\r\n };\r\n const resolvedActiveItemId = activeItemId ?? localActiveItemId;\r\n\r\n return (\r\n <div className=\"h-full flex-1 overflow-y-auto\" style={{ scrollbarWidth: 'none', msOverflowStyle: 'none' }}>\r\n <style>{`.monkeys-sidebar-nav::-webkit-scrollbar { display: none; }`}</style>\r\n <div className=\"monkeys-sidebar-nav flex w-full flex-col gap-2 text-xs text-[hsl(var(--foreground))]\">\r\n {items.map((item) => {\r\n if (item.children && item.children.length > 0) {\r\n const isExpanded = expanded[item.id] ?? true;\r\n return (\r\n <div key={item.id}>\r\n <NavButton\r\n icon={item.icon}\r\n onClick={() => toggle(item.id)}\r\n postfix={\r\n <div className=\"flex flex-1 justify-end\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"\r\n className=\"shrink-0 text-[hsl(var(--foreground))] transition-transform duration-200\"\r\n style={{ transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)' }}\r\n >\r\n <path d=\"m9 18 6-6-6-6\"/>\r\n </svg>\r\n </div>\r\n }\r\n >\r\n {item.label}\r\n </NavButton>\r\n {isExpanded && (\r\n <div className=\"flex flex-col gap-1 mt-1\">\r\n {item.children.map((child) => (\r\n <NavButton\r\n key={child.id}\r\n active={child.id === resolvedActiveItemId}\r\n onClick={() => {\r\n setLocalActiveItemId(child.id);\r\n onNavigate?.(child.id);\r\n }}\r\n >\r\n {child.label}\r\n </NavButton>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n return (\r\n <NavButton\r\n key={item.id}\r\n icon={item.icon}\r\n active={item.id === resolvedActiveItemId}\r\n onClick={() => {\r\n setLocalActiveItemId(item.id);\r\n onNavigate?.(item.id);\r\n }}\r\n >\r\n {item.label}\r\n </NavButton>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================\r\n// AppLayout\r\n// ============================================================\r\nexport interface AppLayoutProps {\r\n /** header 组件 */\r\n header: ReactNode;\r\n /** sidebar 组件 */\r\n sidebar: ReactNode;\r\n /** 主内容 */\r\n children: ReactNode;\r\n /** 是否 flush 布局(无内边距) */\r\n flush?: boolean;\r\n className?: string;\r\n}\r\n\r\nexport function AppLayout({ header, sidebar, children, flush = false, className }: AppLayoutProps) {\r\n return (\r\n <div className={cn(\r\n 'flex h-screen flex-col gap-[var(--global-spacing,0.75rem)] overflow-hidden p-[var(--global-spacing,0.75rem)]',\r\n className,\r\n )} style={{ backgroundColor: 'hsl(var(--muted))' }}>\r\n {header}\r\n <div className=\"flex flex-1 gap-[var(--global-spacing,0.75rem)] overflow-hidden min-h-0\">\r\n {sidebar}\r\n <main className={cn(\r\n 'flex-1 min-h-0 overflow-hidden rounded-xl border border-[hsl(var(--input))] bg-[hsl(var(--background))]',\r\n !flush && 'overflow-y-auto',\r\n )}>\r\n {flush ? children : (\r\n <div className=\"h-full overflow-y-auto\">\r\n {children}\r\n </div>\r\n )}\r\n </main>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../../src/components/layout/index.tsx"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import { useEffect, useState, type ReactNode } from 'react';\nimport * as DropdownMenu from '@radix-ui/react-dropdown-menu';\n\n// ============================================================\n// cn utility (inline clsx + tailwind-merge–lite for zero deps)\n// ============================================================\nexport function cn(...inputs: (string | undefined | null | false)[]): string {\n return inputs.filter(Boolean).join(' ');\n}\n\n// ============================================================\n// NavButton\n// ============================================================\nexport interface NavButtonProps {\n /** 是否处于激活状态 */\n active?: boolean;\n /** 左侧图标 */\n icon?: ReactNode;\n /** 右侧附加内容(如 chevron) */\n postfix?: ReactNode;\n /** 点击回调 */\n onClick?: () => void;\n className?: string;\n children: ReactNode;\n}\n\nexport function NavButton({ active, icon, postfix, onClick, className, children }: NavButtonProps) {\n return (\n <div\n className={cn(\n 'flex w-full cursor-pointer select-none items-center gap-2 rounded-xl border p-2 text-xs text-[hsl(var(--foreground))] transition-colors',\n active\n ? 'border-[hsl(var(--input))] bg-[hsl(var(--muted))] font-bold'\n : 'border-transparent hover:border-[hsl(var(--input))]/60 hover:bg-[hsl(var(--muted))]/60',\n className,\n )}\n onClick={onClick}\n >\n <div className=\"w-[20px] [&_svg]:h-[16px] [&_svg]:w-[16px]\">{icon}</div>\n <span className=\"text-sm\">{children}</span>\n {postfix}\n </div>\n );\n}\n\n// ============================================================\n// AppHeader\n// ============================================================\nexport interface HeaderTab {\n id: string;\n label: string;\n}\n\nexport interface AppHeaderLogo {\n /** Logo 图片 URL,若为空则显示 fallback */\n url?: string;\n /** 品牌名称 */\n title: string;\n /** 点击 Logo 回调 */\n onClick?: () => void;\n}\n\nexport interface AppHeaderUser {\n name?: string;\n email?: string;\n photo?: string;\n}\n\nexport interface AppHeaderProps {\n /** 品牌 Logo */\n logo: AppHeaderLogo;\n /** 导航 tabs */\n tabs?: HeaderTab[];\n /** 当前激活的 tab id */\n activeTab?: string;\n /** tab 切换回调 */\n onTabChange?: (tabId: string) => void;\n /** 用户信息 */\n user?: AppHeaderUser;\n /** 退出登录回调 */\n onLogout?: () => void;\n /** 退出登录文案 */\n logoutLabel?: string;\n /** 用户菜单中的额外菜单项(在退出登录按钮之前渲染) */\n userMenuItems?: ReactNode;\n /** header 右侧额外内容 */\n extra?: ReactNode;\n className?: string;\n}\n\nexport function AppHeader({\n logo,\n tabs,\n activeTab,\n onTabChange,\n user,\n onLogout,\n logoutLabel = '退出登录',\n userMenuItems,\n extra,\n className,\n}: AppHeaderProps) {\n const getUserInitials = (name: string) =>\n name.split(' ').map((n) => n[0]).join('').toUpperCase().slice(0, 2);\n\n return (\n <header\n className={cn(\n 'flex h-[72px] w-full shrink-0 items-center justify-between gap-4 rounded-xl border border-[hsl(var(--input))] bg-[hsl(var(--background))] p-[var(--global-spacing,0.75rem)]',\n className,\n )}\n >\n {/* Logo */}\n <div\n className=\"flex shrink-0 cursor-pointer items-center gap-2\"\n onClick={logo.onClick}\n >\n <div\n className={cn(\n 'flex h-8 w-8 items-center justify-center rounded-lg overflow-hidden',\n logo.url ? 'bg-transparent' : 'bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))]',\n )}\n >\n {logo.url ? (\n <img src={logo.url} alt={logo.title} className=\"h-full w-full object-contain\" />\n ) : (\n <span className=\"text-sm font-bold\">{logo.title.charAt(0)}</span>\n )}\n </div>\n <span className=\"text-lg font-semibold whitespace-nowrap\">{logo.title}</span>\n </div>\n\n {/* Separator + Tabs */}\n {tabs && tabs.length > 0 && (\n <>\n <div className=\"h-1/2 w-px bg-[hsl(var(--border))]\" />\n <div className=\"flex flex-1 items-center\">\n <div className=\"inline-flex h-9 items-center gap-1 rounded-md bg-transparent p-1\">\n {tabs.map((tab) => (\n <button\n key={tab.id}\n className={cn(\n 'inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium transition-all',\n tab.id === activeTab\n ? 'bg-[hsl(var(--muted))] text-[hsl(var(--foreground))] shadow-sm'\n : 'text-[hsl(var(--muted-foreground))] hover:bg-[hsl(var(--muted))]/50',\n )}\n onClick={() => onTabChange?.(tab.id)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n </div>\n </>\n )}\n {(!tabs || tabs.length === 0) && <div className=\"flex-1\" />}\n\n {/* Right side */}\n <div className=\"flex shrink-0 items-center gap-4\">\n {extra}\n {user && (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button className=\"flex h-8 w-8 items-center justify-center rounded-full hover:ring-2 hover:ring-[hsl(var(--ring))]/20 transition-all overflow-hidden focus-visible:outline-none\">\n {user.photo ? (\n <img src={user.photo} alt={user.name} className=\"h-8 w-8 rounded-full object-cover\" />\n ) : (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-[hsl(var(--muted))] text-xs font-medium\">\n {user.name ? getUserInitials(user.name) : 'U'}\n </div>\n )}\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n className=\"z-50 w-52 rounded-md border border-[hsl(var(--border))] bg-[hsl(var(--popover))] p-1 text-[hsl(var(--popover-foreground))] shadow-md animate-in fade-in-0 zoom-in-95\"\n sideOffset={5}\n align=\"end\"\n >\n {/* User info label */}\n <DropdownMenu.Label className=\"flex items-center gap-2 px-2 py-1.5 font-normal\">\n {user.photo ? (\n <img src={user.photo} alt={user.name} className=\"h-8 w-8 rounded-full object-cover\" />\n ) : (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-[hsl(var(--muted))] text-xs font-medium\">\n {user.name ? getUserInitials(user.name) : 'U'}\n </div>\n )}\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium leading-none\">{user.name}</span>\n {user.email && <span className=\"text-xs text-[hsl(var(--muted-foreground))] leading-none mt-1\">{user.email}</span>}\n </div>\n </DropdownMenu.Label>\n\n <DropdownMenu.Separator className=\"h-px bg-[hsl(var(--border))] my-1\" />\n\n <DropdownMenu.Group>\n {userMenuItems}\n\n {/* Logout */}\n <DropdownMenu.Item\n className=\"relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm text-[hsl(var(--destructive))] outline-none transition-colors hover:bg-[hsl(var(--accent))]\"\n onSelect={() => onLogout?.()}\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"/><polyline points=\"16 17 21 12 16 7\"/><line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\"/></svg>\n {logoutLabel}\n </DropdownMenu.Item>\n </DropdownMenu.Group>\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n )}\n </div>\n </header>\n );\n}\n\n// ============================================================\n// AppSidebar\n// ============================================================\nexport interface SidebarNavItem {\n id: string;\n label: string;\n icon?: ReactNode;\n /** 如果有 children 则为分组,点击展开/折叠 */\n children?: SidebarNavItem[];\n}\n\nexport interface SidebarAccount {\n name?: string;\n photo?: string;\n}\n\nexport interface AppSidebarProps {\n /** Logo */\n logo?: AppHeaderLogo;\n /** 导航菜单 */\n navItems: SidebarNavItem[];\n /** 当前路径/激活的 item id */\n activeItemId?: string;\n /** 点击导航项回调 */\n onNavigate?: (itemId: string) => void;\n /** 账户信息 */\n account?: SidebarAccount;\n /** 退出登录回调 */\n onLogout?: () => void;\n /** 退出登录文案 */\n logoutLabel?: string;\n /** 底部额外内容(如版本号) */\n footer?: ReactNode;\n /** 默认展开的分组 id 列表 */\n defaultExpandedGroups?: string[];\n className?: string;\n}\n\nexport function AppSidebar({\n logo,\n navItems,\n activeItemId,\n onNavigate,\n account,\n onLogout,\n logoutLabel = '退出登录',\n footer,\n defaultExpandedGroups,\n className,\n}: AppSidebarProps) {\n return (\n <div\n className={cn(\n 'flex w-[13.7rem] shrink-0 flex-col justify-between gap-[var(--global-spacing,0.75rem)] overflow-y-hidden rounded-xl border border-[hsl(var(--input))] bg-[hsl(var(--background))] p-5',\n className,\n )}\n >\n {/* Logo */}\n {logo && (\n <div className=\"flex shrink-0 cursor-pointer items-center gap-2\" onClick={logo.onClick}>\n <div\n className={cn(\n 'flex h-8 w-8 items-center justify-center rounded-lg overflow-hidden',\n logo.url ? 'bg-transparent' : 'bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))]',\n )}\n >\n {logo.url ? (\n <img src={logo.url} alt={logo.title} className=\"h-full w-full object-contain\" />\n ) : (\n <span className=\"text-sm font-bold\">{logo.title.charAt(0)}</span>\n )}\n </div>\n <span className=\"text-lg font-semibold whitespace-nowrap\">{logo.title}</span>\n </div>\n )}\n\n {/* Navigation */}\n <SidebarNavList\n items={navItems}\n activeItemId={activeItemId}\n onNavigate={onNavigate}\n defaultExpandedGroups={defaultExpandedGroups}\n />\n\n {/* Account Section */}\n {(account || footer) && (\n <div className=\"flex flex-col gap-2\">\n {account && (\n <div className=\"flex w-full flex-col gap-2 rounded-lg bg-[hsl(var(--muted))] p-2 shadow-sm\">\n <div className=\"flex w-full items-center justify-between px-3 py-1\">\n <div className=\"flex items-center gap-2\">\n {account.photo ? (\n <img src={account.photo} alt={account.name} className=\"h-5 w-5 rounded-full object-cover\" />\n ) : (\n <div className=\"flex h-5 w-5 items-center justify-center rounded-full bg-[hsl(var(--muted))] text-[10px] font-medium\">\n {account.name ? account.name.charAt(0).toUpperCase() : 'U'}\n </div>\n )}\n <span className=\"text-xs font-medium truncate max-w-[100px]\">{account.name}</span>\n </div>\n {onLogout && (\n <button\n onClick={onLogout}\n className=\"flex items-center justify-center text-[hsl(var(--destructive))] hover:opacity-80 transition-opacity\"\n title={logoutLabel}\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"/><polyline points=\"16 17 21 12 16 7\"/><line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\"/></svg>\n </button>\n )}\n </div>\n </div>\n )}\n {footer}\n </div>\n )}\n </div>\n );\n}\n\n// ============================================================\n// SidebarNavList (internal accordion-style nav)\n// ============================================================\ninterface SidebarNavListProps {\n items: SidebarNavItem[];\n activeItemId?: string;\n onNavigate?: (itemId: string) => void;\n defaultExpandedGroups?: string[];\n}\n\nfunction SidebarNavList({ items, activeItemId, onNavigate, defaultExpandedGroups }: SidebarNavListProps) {\n const [expanded, setExpanded] = useState<Record<string, boolean>>(() => {\n const map: Record<string, boolean> = {};\n (defaultExpandedGroups ?? items.map((i) => i.id)).forEach((id) => { map[id] = true; });\n return map;\n });\n const [localActiveItemId, setLocalActiveItemId] = useState<string | undefined>(activeItemId);\n\n useEffect(() => {\n if (activeItemId !== undefined) {\n setLocalActiveItemId(activeItemId);\n }\n }, [activeItemId]);\n\n const toggle = (id: string) => {\n setExpanded((prev: Record<string, boolean>) => ({ ...prev, [id]: !prev[id] }));\n };\n const resolvedActiveItemId = activeItemId ?? localActiveItemId;\n\n return (\n <div className=\"h-full flex-1 overflow-y-auto\" style={{ scrollbarWidth: 'none', msOverflowStyle: 'none' }}>\n <style>{`.monkeys-sidebar-nav::-webkit-scrollbar { display: none; }`}</style>\n <div className=\"monkeys-sidebar-nav flex w-full flex-col gap-2 text-xs text-[hsl(var(--foreground))]\">\n {items.map((item) => {\n if (item.children && item.children.length > 0) {\n const isExpanded = expanded[item.id] ?? true;\n return (\n <div key={item.id}>\n <NavButton\n icon={item.icon}\n onClick={() => toggle(item.id)}\n postfix={\n <div className=\"flex flex-1 justify-end\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\" height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"\n className=\"shrink-0 text-[hsl(var(--foreground))] transition-transform duration-200\"\n style={{ transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)' }}\n >\n <path d=\"m9 18 6-6-6-6\"/>\n </svg>\n </div>\n }\n >\n {item.label}\n </NavButton>\n {isExpanded && (\n <div className=\"flex flex-col gap-1 mt-1\">\n {item.children.map((child) => (\n <NavButton\n key={child.id}\n active={child.id === resolvedActiveItemId}\n onClick={() => {\n setLocalActiveItemId(child.id);\n onNavigate?.(child.id);\n }}\n >\n {child.label}\n </NavButton>\n ))}\n </div>\n )}\n </div>\n );\n }\n return (\n <NavButton\n key={item.id}\n icon={item.icon}\n active={item.id === resolvedActiveItemId}\n onClick={() => {\n setLocalActiveItemId(item.id);\n onNavigate?.(item.id);\n }}\n >\n {item.label}\n </NavButton>\n );\n })}\n </div>\n </div>\n );\n}\n\n// ============================================================\n// AppLayout\n// ============================================================\nexport interface AppLayoutProps {\n /** header 组件 */\n header: ReactNode;\n /** sidebar 组件 */\n sidebar: ReactNode;\n /** 主内容 */\n children: ReactNode;\n /** 是否 flush 布局(无内边距) */\n flush?: boolean;\n className?: string;\n}\n\nexport function AppLayout({ header, sidebar, children, flush = false, className }: AppLayoutProps) {\n return (\n <div className={cn(\n 'flex h-screen flex-col gap-[var(--global-spacing,0.75rem)] overflow-hidden p-[var(--global-spacing,0.75rem)]',\n className,\n )} style={{ backgroundColor: 'hsl(var(--muted))' }}>\n {header}\n <div className=\"flex flex-1 gap-[var(--global-spacing,0.75rem)] overflow-hidden min-h-0\">\n {sidebar}\n <main className={cn(\n 'flex-1 min-h-0 overflow-hidden rounded-xl border border-[hsl(var(--input))] bg-[hsl(var(--background))]',\n !flush && 'overflow-y-auto',\n )}>\n {flush ? children : (\n <div className=\"h-full overflow-y-auto\">\n {children}\n </div>\n )}\n </main>\n </div>\n </div>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/login/LoginLayout.tsx","../../../src/components/login/EmailAuth.tsx","../../../src/components/login/OIDCButton.tsx","../../../src/components/login/OAuthButton.tsx","../../../src/components/login/AuthDivider.tsx","../../../src/components/login/PendingApproval.tsx"],"names":["jsx","jsxs","React","useCallback","buttonStyle","containerStyle","titleStyle"],"mappings":"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","file":"index.js","sourcesContent":["import React from 'react';\r\nimport type { LoginLayoutProps } from './types';\r\n\r\nconst containerStyle: React.CSSProperties = {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n minHeight: '100vh',\r\n padding: '1rem',\r\n};\r\n\r\nconst cardStyle: React.CSSProperties = {\r\n width: '100%',\r\n maxWidth: '400px',\r\n};\r\n\r\nconst logoContainerStyle: React.CSSProperties = {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n marginBottom: '1.5rem',\r\n};\r\n\r\nconst logoImageStyle: React.CSSProperties = {\r\n height: '48px',\r\n width: 'auto',\r\n};\r\n\r\nconst titleStyle: React.CSSProperties = {\r\n fontSize: '1.5rem',\r\n fontWeight: 700,\r\n textAlign: 'center' as const,\r\n marginBottom: '0.5rem',\r\n lineHeight: 1.2,\r\n};\r\n\r\nconst subtitleStyle: React.CSSProperties = {\r\n fontSize: '0.875rem',\r\n textAlign: 'center' as const,\r\n marginBottom: '1.5rem',\r\n opacity: 0.6,\r\n};\r\n\r\nconst footerStyle: React.CSSProperties = {\r\n fontSize: '0.75rem',\r\n textAlign: 'center' as const,\r\n marginTop: '2rem',\r\n opacity: 0.4,\r\n};\r\n\r\nexport const LoginLayout: React.FC<LoginLayoutProps> = ({\r\n className,\r\n style,\r\n children,\r\n logo,\r\n title,\r\n subtitle,\r\n footer,\r\n}) => {\r\n const renderLogo = () => {\r\n if (!logo) return null;\r\n if (typeof logo === 'string') {\r\n return (\r\n <div style={logoContainerStyle}>\r\n <img src={logo} alt={title || 'Logo'} style={logoImageStyle} />\r\n </div>\r\n );\r\n }\r\n return <div style={logoContainerStyle}>{logo}</div>;\r\n };\r\n\r\n return (\r\n <div className={className} style={{ ...containerStyle, ...style }}>\r\n <div style={cardStyle}>\r\n {renderLogo()}\r\n {title && <h1 style={titleStyle}>{title}</h1>}\r\n {subtitle && <p style={subtitleStyle}>{subtitle}</p>}\r\n {children}\r\n {footer && <p style={footerStyle}>{footer}</p>}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React, { useCallback } from 'react';\r\nimport type { EmailAuthProps } from './types';\r\n\r\nconst formStyle: React.CSSProperties = {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: '1rem',\r\n};\r\n\r\nconst labelStyle: React.CSSProperties = {\r\n display: 'block',\r\n fontSize: '0.875rem',\r\n fontWeight: 500,\r\n marginBottom: '0.375rem',\r\n};\r\n\r\nconst inputStyle: React.CSSProperties = {\r\n display: 'block',\r\n width: '100%',\r\n padding: '0.5rem 0.75rem',\r\n fontSize: '0.875rem',\r\n lineHeight: 1.5,\r\n backgroundColor: 'transparent',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '0.375rem',\r\n outline: 'none',\r\n boxSizing: 'border-box',\r\n};\r\n\r\nconst buttonStyle: React.CSSProperties = {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n width: '100%',\r\n padding: '0.625rem 1rem',\r\n fontSize: '0.875rem',\r\n fontWeight: 500,\r\n color: '#ffffff',\r\n backgroundColor: '#111827',\r\n border: 'none',\r\n borderRadius: '0.375rem',\r\n cursor: 'pointer',\r\n lineHeight: 1.5,\r\n};\r\n\r\nconst buttonDisabledStyle: React.CSSProperties = {\r\n ...buttonStyle,\r\n opacity: 0.6,\r\n cursor: 'not-allowed',\r\n};\r\n\r\nconst errorStyle: React.CSSProperties = {\r\n fontSize: '0.875rem',\r\n color: '#dc2626',\r\n marginTop: '-0.25rem',\r\n};\r\n\r\nexport const EmailAuth = React.forwardRef<HTMLFormElement, EmailAuthProps>(\r\n (\r\n {\r\n className,\r\n email,\r\n onEmailChange,\r\n password,\r\n onPasswordChange,\r\n onSubmit,\r\n isLoading = false,\r\n disabled = false,\r\n emailLabel = 'Email',\r\n emailPlaceholder = 'Enter your email',\r\n passwordLabel = 'Password',\r\n passwordPlaceholder = 'Enter your password',\r\n submitText = 'Sign In',\r\n loadingText = 'Signing in...',\r\n error,\r\n },\r\n ref,\r\n ) => {\r\n const handleSubmit = useCallback(\r\n (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!isLoading && !disabled) {\r\n onSubmit();\r\n }\r\n },\r\n [onSubmit, isLoading, disabled],\r\n );\r\n\r\n const isDisabled = isLoading || disabled;\r\n\r\n return (\r\n <form ref={ref} className={className} style={formStyle} onSubmit={handleSubmit}>\r\n <div>\r\n <label style={labelStyle}>{emailLabel}</label>\r\n <input\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => onEmailChange(e.target.value)}\r\n placeholder={emailPlaceholder}\r\n disabled={isDisabled}\r\n required\r\n autoComplete=\"email\"\r\n style={inputStyle}\r\n />\r\n </div>\r\n\r\n <div>\r\n <label style={labelStyle}>{passwordLabel}</label>\r\n <input\r\n type=\"password\"\r\n value={password}\r\n onChange={(e) => onPasswordChange(e.target.value)}\r\n placeholder={passwordPlaceholder}\r\n disabled={isDisabled}\r\n required\r\n autoComplete=\"current-password\"\r\n style={inputStyle}\r\n />\r\n </div>\r\n\r\n {error && <p style={errorStyle}>{error}</p>}\r\n\r\n <button type=\"submit\" disabled={isDisabled} style={isDisabled ? buttonDisabledStyle : buttonStyle}>\r\n {isLoading ? loadingText : submitText}\r\n </button>\r\n </form>\r\n );\r\n },\r\n);\r\n\r\nEmailAuth.displayName = 'EmailAuth';\r\n","import React from 'react';\r\nimport type { OIDCButtonProps } from './types';\r\n\r\nconst buttonStyle: React.CSSProperties = {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '0.5rem',\r\n width: '100%',\r\n padding: '0.625rem 1rem',\r\n fontSize: '0.875rem',\r\n fontWeight: 500,\r\n backgroundColor: 'transparent',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '0.375rem',\r\n cursor: 'pointer',\r\n lineHeight: 1.5,\r\n};\r\n\r\nexport const OIDCButton = React.forwardRef<HTMLButtonElement, OIDCButtonProps>(\r\n ({ className, label = 'Sign in with SSO', onClick, icon }, ref) => {\r\n return (\r\n <button ref={ref} type=\"button\" className={className} style={buttonStyle} onClick={onClick}>\r\n {icon && <span style={{ display: 'inline-flex', alignItems: 'center' }}>{icon}</span>}\r\n {label}\r\n </button>\r\n );\r\n },\r\n);\r\n\r\nOIDCButton.displayName = 'OIDCButton';\r\n","import React from 'react';\r\nimport type { OAuthButtonProps } from './types';\r\n\r\nconst buttonStyle: React.CSSProperties = {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '0.5rem',\r\n width: '100%',\r\n padding: '0.625rem 1rem',\r\n fontSize: '0.875rem',\r\n fontWeight: 500,\r\n backgroundColor: 'transparent',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '0.375rem',\r\n cursor: 'pointer',\r\n lineHeight: 1.5,\r\n};\r\n\r\nexport const OAuthButton = React.forwardRef<HTMLButtonElement, OAuthButtonProps>(\r\n ({ className, providerName, onClick, icon }, ref) => {\r\n return (\r\n <button ref={ref} type=\"button\" className={className} style={buttonStyle} onClick={onClick}>\r\n {icon && <span style={{ display: 'inline-flex', alignItems: 'center' }}>{icon}</span>}\r\n {providerName}\r\n </button>\r\n );\r\n },\r\n);\r\n\r\nOAuthButton.displayName = 'OAuthButton';\r\n","import React from 'react';\r\nimport type { AuthDividerProps } from './types';\r\n\r\nconst containerStyle: React.CSSProperties = {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '0.75rem',\r\n margin: '1rem 0',\r\n};\r\n\r\nconst lineStyle: React.CSSProperties = {\r\n flex: 1,\r\n height: '1px',\r\n backgroundColor: '#e5e7eb',\r\n};\r\n\r\nconst textStyle: React.CSSProperties = {\r\n fontSize: '0.75rem',\r\n opacity: 0.5,\r\n whiteSpace: 'nowrap',\r\n};\r\n\r\nexport const AuthDivider: React.FC<AuthDividerProps> = ({ className, text = 'or' }) => {\r\n return (\r\n <div className={className} style={containerStyle}>\r\n <div style={lineStyle} />\r\n <span style={textStyle}>{text}</span>\r\n <div style={lineStyle} />\r\n </div>\r\n );\r\n};\r\n","import React from 'react';\r\nimport type { PendingApprovalProps } from './types';\r\n\r\nconst containerStyle: React.CSSProperties = {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n textAlign: 'center',\r\n padding: '1.5rem 0',\r\n gap: '1rem',\r\n};\r\n\r\nconst titleStyle: React.CSSProperties = {\r\n fontSize: '1.125rem',\r\n fontWeight: 600,\r\n margin: 0,\r\n};\r\n\r\nconst descriptionStyle: React.CSSProperties = {\r\n fontSize: '0.875rem',\r\n opacity: 0.6,\r\n lineHeight: 1.5,\r\n margin: 0,\r\n};\r\n\r\nconst backButtonStyle: React.CSSProperties = {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n padding: '0.5rem 1.5rem',\r\n fontSize: '0.875rem',\r\n fontWeight: 500,\r\n backgroundColor: 'transparent',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '0.375rem',\r\n cursor: 'pointer',\r\n marginTop: '0.5rem',\r\n};\r\n\r\nexport const PendingApproval: React.FC<PendingApprovalProps> = ({\r\n className,\r\n icon,\r\n title = 'Pending Approval',\r\n description = 'Your account is awaiting administrator approval. Please check back later.',\r\n backText = 'Go Back',\r\n onBack,\r\n}) => {\r\n return (\r\n <div className={className} style={containerStyle}>\r\n {icon}\r\n <h2 style={titleStyle}>{title}</h2>\r\n <p style={descriptionStyle}>{description}</p>\r\n {onBack && (\r\n <button type=\"button\" style={backButtonStyle} onClick={onBack}>\r\n {backText}\r\n </button>\r\n )}\r\n </div>\r\n );\r\n};\r\n"]}
1
+ {"version":3,"sources":["../../../src/components/login/LoginLayout.tsx","../../../src/components/login/EmailAuth.tsx","../../../src/components/login/OIDCButton.tsx","../../../src/components/login/OAuthButton.tsx","../../../src/components/login/AuthDivider.tsx","../../../src/components/login/PendingApproval.tsx"],"names":["jsx","jsxs","React","useCallback","buttonStyle","containerStyle","titleStyle"],"mappings":"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","file":"index.js","sourcesContent":["import React from 'react';\nimport type { LoginLayoutProps } from './types';\n\nconst containerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '100vh',\n padding: '1rem',\n};\n\nconst cardStyle: React.CSSProperties = {\n width: '100%',\n maxWidth: '400px',\n};\n\nconst logoContainerStyle: React.CSSProperties = {\n display: 'flex',\n justifyContent: 'center',\n marginBottom: '1.5rem',\n};\n\nconst logoImageStyle: React.CSSProperties = {\n height: '48px',\n width: 'auto',\n};\n\nconst titleStyle: React.CSSProperties = {\n fontSize: '1.5rem',\n fontWeight: 700,\n textAlign: 'center' as const,\n marginBottom: '0.5rem',\n lineHeight: 1.2,\n};\n\nconst subtitleStyle: React.CSSProperties = {\n fontSize: '0.875rem',\n textAlign: 'center' as const,\n marginBottom: '1.5rem',\n opacity: 0.6,\n};\n\nconst footerStyle: React.CSSProperties = {\n fontSize: '0.75rem',\n textAlign: 'center' as const,\n marginTop: '2rem',\n opacity: 0.4,\n};\n\nexport const LoginLayout: React.FC<LoginLayoutProps> = ({\n className,\n style,\n children,\n logo,\n title,\n subtitle,\n footer,\n}) => {\n const renderLogo = () => {\n if (!logo) return null;\n if (typeof logo === 'string') {\n return (\n <div style={logoContainerStyle}>\n <img src={logo} alt={title || 'Logo'} style={logoImageStyle} />\n </div>\n );\n }\n return <div style={logoContainerStyle}>{logo}</div>;\n };\n\n return (\n <div className={className} style={{ ...containerStyle, ...style }}>\n <div style={cardStyle}>\n {renderLogo()}\n {title && <h1 style={titleStyle}>{title}</h1>}\n {subtitle && <p style={subtitleStyle}>{subtitle}</p>}\n {children}\n {footer && <p style={footerStyle}>{footer}</p>}\n </div>\n </div>\n );\n};\n","import React, { useCallback } from 'react';\nimport type { EmailAuthProps } from './types';\n\nconst formStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: '1rem',\n};\n\nconst labelStyle: React.CSSProperties = {\n display: 'block',\n fontSize: '0.875rem',\n fontWeight: 500,\n marginBottom: '0.375rem',\n};\n\nconst inputStyle: React.CSSProperties = {\n display: 'block',\n width: '100%',\n padding: '0.5rem 0.75rem',\n fontSize: '0.875rem',\n lineHeight: 1.5,\n backgroundColor: 'transparent',\n border: '1px solid #d1d5db',\n borderRadius: '0.375rem',\n outline: 'none',\n boxSizing: 'border-box',\n};\n\nconst buttonStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n padding: '0.625rem 1rem',\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#ffffff',\n backgroundColor: '#111827',\n border: 'none',\n borderRadius: '0.375rem',\n cursor: 'pointer',\n lineHeight: 1.5,\n};\n\nconst buttonDisabledStyle: React.CSSProperties = {\n ...buttonStyle,\n opacity: 0.6,\n cursor: 'not-allowed',\n};\n\nconst errorStyle: React.CSSProperties = {\n fontSize: '0.875rem',\n color: '#dc2626',\n marginTop: '-0.25rem',\n};\n\nexport const EmailAuth = React.forwardRef<HTMLFormElement, EmailAuthProps>(\n (\n {\n className,\n email,\n onEmailChange,\n password,\n onPasswordChange,\n onSubmit,\n isLoading = false,\n disabled = false,\n emailLabel = 'Email',\n emailPlaceholder = 'Enter your email',\n passwordLabel = 'Password',\n passwordPlaceholder = 'Enter your password',\n submitText = 'Sign In',\n loadingText = 'Signing in...',\n error,\n },\n ref,\n ) => {\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault();\n if (!isLoading && !disabled) {\n onSubmit();\n }\n },\n [onSubmit, isLoading, disabled],\n );\n\n const isDisabled = isLoading || disabled;\n\n return (\n <form ref={ref} className={className} style={formStyle} onSubmit={handleSubmit}>\n <div>\n <label style={labelStyle}>{emailLabel}</label>\n <input\n type=\"email\"\n value={email}\n onChange={(e) => onEmailChange(e.target.value)}\n placeholder={emailPlaceholder}\n disabled={isDisabled}\n required\n autoComplete=\"email\"\n style={inputStyle}\n />\n </div>\n\n <div>\n <label style={labelStyle}>{passwordLabel}</label>\n <input\n type=\"password\"\n value={password}\n onChange={(e) => onPasswordChange(e.target.value)}\n placeholder={passwordPlaceholder}\n disabled={isDisabled}\n required\n autoComplete=\"current-password\"\n style={inputStyle}\n />\n </div>\n\n {error && <p style={errorStyle}>{error}</p>}\n\n <button type=\"submit\" disabled={isDisabled} style={isDisabled ? buttonDisabledStyle : buttonStyle}>\n {isLoading ? loadingText : submitText}\n </button>\n </form>\n );\n },\n);\n\nEmailAuth.displayName = 'EmailAuth';\n","import React from 'react';\nimport type { OIDCButtonProps } from './types';\n\nconst buttonStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '0.5rem',\n width: '100%',\n padding: '0.625rem 1rem',\n fontSize: '0.875rem',\n fontWeight: 500,\n backgroundColor: 'transparent',\n border: '1px solid #d1d5db',\n borderRadius: '0.375rem',\n cursor: 'pointer',\n lineHeight: 1.5,\n};\n\nexport const OIDCButton = React.forwardRef<HTMLButtonElement, OIDCButtonProps>(\n ({ className, label = 'Sign in with SSO', onClick, icon }, ref) => {\n return (\n <button ref={ref} type=\"button\" className={className} style={buttonStyle} onClick={onClick}>\n {icon && <span style={{ display: 'inline-flex', alignItems: 'center' }}>{icon}</span>}\n {label}\n </button>\n );\n },\n);\n\nOIDCButton.displayName = 'OIDCButton';\n","import React from 'react';\nimport type { OAuthButtonProps } from './types';\n\nconst buttonStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '0.5rem',\n width: '100%',\n padding: '0.625rem 1rem',\n fontSize: '0.875rem',\n fontWeight: 500,\n backgroundColor: 'transparent',\n border: '1px solid #d1d5db',\n borderRadius: '0.375rem',\n cursor: 'pointer',\n lineHeight: 1.5,\n};\n\nexport const OAuthButton = React.forwardRef<HTMLButtonElement, OAuthButtonProps>(\n ({ className, providerName, onClick, icon }, ref) => {\n return (\n <button ref={ref} type=\"button\" className={className} style={buttonStyle} onClick={onClick}>\n {icon && <span style={{ display: 'inline-flex', alignItems: 'center' }}>{icon}</span>}\n {providerName}\n </button>\n );\n },\n);\n\nOAuthButton.displayName = 'OAuthButton';\n","import React from 'react';\nimport type { AuthDividerProps } from './types';\n\nconst containerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n margin: '1rem 0',\n};\n\nconst lineStyle: React.CSSProperties = {\n flex: 1,\n height: '1px',\n backgroundColor: '#e5e7eb',\n};\n\nconst textStyle: React.CSSProperties = {\n fontSize: '0.75rem',\n opacity: 0.5,\n whiteSpace: 'nowrap',\n};\n\nexport const AuthDivider: React.FC<AuthDividerProps> = ({ className, text = 'or' }) => {\n return (\n <div className={className} style={containerStyle}>\n <div style={lineStyle} />\n <span style={textStyle}>{text}</span>\n <div style={lineStyle} />\n </div>\n );\n};\n","import React from 'react';\nimport type { PendingApprovalProps } from './types';\n\nconst containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n textAlign: 'center',\n padding: '1.5rem 0',\n gap: '1rem',\n};\n\nconst titleStyle: React.CSSProperties = {\n fontSize: '1.125rem',\n fontWeight: 600,\n margin: 0,\n};\n\nconst descriptionStyle: React.CSSProperties = {\n fontSize: '0.875rem',\n opacity: 0.6,\n lineHeight: 1.5,\n margin: 0,\n};\n\nconst backButtonStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '0.5rem 1.5rem',\n fontSize: '0.875rem',\n fontWeight: 500,\n backgroundColor: 'transparent',\n border: '1px solid #d1d5db',\n borderRadius: '0.375rem',\n cursor: 'pointer',\n marginTop: '0.5rem',\n};\n\nexport const PendingApproval: React.FC<PendingApprovalProps> = ({\n className,\n icon,\n title = 'Pending Approval',\n description = 'Your account is awaiting administrator approval. Please check back later.',\n backText = 'Go Back',\n onBack,\n}) => {\n return (\n <div className={className} style={containerStyle}>\n {icon}\n <h2 style={titleStyle}>{title}</h2>\n <p style={descriptionStyle}>{description}</p>\n {onBack && (\n <button type=\"button\" style={backButtonStyle} onClick={onBack}>\n {backText}\n </button>\n )}\n </div>\n );\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/login/LoginLayout.tsx","../../../src/components/login/EmailAuth.tsx","../../../src/components/login/OIDCButton.tsx","../../../src/components/login/OAuthButton.tsx","../../../src/components/login/AuthDivider.tsx","../../../src/components/login/PendingApproval.tsx"],"names":["jsxs","jsx","buttonStyle","React","containerStyle","titleStyle"],"mappings":"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","file":"index.mjs","sourcesContent":["import React from 'react';\r\nimport type { LoginLayoutProps } from './types';\r\n\r\nconst containerStyle: React.CSSProperties = {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n minHeight: '100vh',\r\n padding: '1rem',\r\n};\r\n\r\nconst cardStyle: React.CSSProperties = {\r\n width: '100%',\r\n maxWidth: '400px',\r\n};\r\n\r\nconst logoContainerStyle: React.CSSProperties = {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n marginBottom: '1.5rem',\r\n};\r\n\r\nconst logoImageStyle: React.CSSProperties = {\r\n height: '48px',\r\n width: 'auto',\r\n};\r\n\r\nconst titleStyle: React.CSSProperties = {\r\n fontSize: '1.5rem',\r\n fontWeight: 700,\r\n textAlign: 'center' as const,\r\n marginBottom: '0.5rem',\r\n lineHeight: 1.2,\r\n};\r\n\r\nconst subtitleStyle: React.CSSProperties = {\r\n fontSize: '0.875rem',\r\n textAlign: 'center' as const,\r\n marginBottom: '1.5rem',\r\n opacity: 0.6,\r\n};\r\n\r\nconst footerStyle: React.CSSProperties = {\r\n fontSize: '0.75rem',\r\n textAlign: 'center' as const,\r\n marginTop: '2rem',\r\n opacity: 0.4,\r\n};\r\n\r\nexport const LoginLayout: React.FC<LoginLayoutProps> = ({\r\n className,\r\n style,\r\n children,\r\n logo,\r\n title,\r\n subtitle,\r\n footer,\r\n}) => {\r\n const renderLogo = () => {\r\n if (!logo) return null;\r\n if (typeof logo === 'string') {\r\n return (\r\n <div style={logoContainerStyle}>\r\n <img src={logo} alt={title || 'Logo'} style={logoImageStyle} />\r\n </div>\r\n );\r\n }\r\n return <div style={logoContainerStyle}>{logo}</div>;\r\n };\r\n\r\n return (\r\n <div className={className} style={{ ...containerStyle, ...style }}>\r\n <div style={cardStyle}>\r\n {renderLogo()}\r\n {title && <h1 style={titleStyle}>{title}</h1>}\r\n {subtitle && <p style={subtitleStyle}>{subtitle}</p>}\r\n {children}\r\n {footer && <p style={footerStyle}>{footer}</p>}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React, { useCallback } from 'react';\r\nimport type { EmailAuthProps } from './types';\r\n\r\nconst formStyle: React.CSSProperties = {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: '1rem',\r\n};\r\n\r\nconst labelStyle: React.CSSProperties = {\r\n display: 'block',\r\n fontSize: '0.875rem',\r\n fontWeight: 500,\r\n marginBottom: '0.375rem',\r\n};\r\n\r\nconst inputStyle: React.CSSProperties = {\r\n display: 'block',\r\n width: '100%',\r\n padding: '0.5rem 0.75rem',\r\n fontSize: '0.875rem',\r\n lineHeight: 1.5,\r\n backgroundColor: 'transparent',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '0.375rem',\r\n outline: 'none',\r\n boxSizing: 'border-box',\r\n};\r\n\r\nconst buttonStyle: React.CSSProperties = {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n width: '100%',\r\n padding: '0.625rem 1rem',\r\n fontSize: '0.875rem',\r\n fontWeight: 500,\r\n color: '#ffffff',\r\n backgroundColor: '#111827',\r\n border: 'none',\r\n borderRadius: '0.375rem',\r\n cursor: 'pointer',\r\n lineHeight: 1.5,\r\n};\r\n\r\nconst buttonDisabledStyle: React.CSSProperties = {\r\n ...buttonStyle,\r\n opacity: 0.6,\r\n cursor: 'not-allowed',\r\n};\r\n\r\nconst errorStyle: React.CSSProperties = {\r\n fontSize: '0.875rem',\r\n color: '#dc2626',\r\n marginTop: '-0.25rem',\r\n};\r\n\r\nexport const EmailAuth = React.forwardRef<HTMLFormElement, EmailAuthProps>(\r\n (\r\n {\r\n className,\r\n email,\r\n onEmailChange,\r\n password,\r\n onPasswordChange,\r\n onSubmit,\r\n isLoading = false,\r\n disabled = false,\r\n emailLabel = 'Email',\r\n emailPlaceholder = 'Enter your email',\r\n passwordLabel = 'Password',\r\n passwordPlaceholder = 'Enter your password',\r\n submitText = 'Sign In',\r\n loadingText = 'Signing in...',\r\n error,\r\n },\r\n ref,\r\n ) => {\r\n const handleSubmit = useCallback(\r\n (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!isLoading && !disabled) {\r\n onSubmit();\r\n }\r\n },\r\n [onSubmit, isLoading, disabled],\r\n );\r\n\r\n const isDisabled = isLoading || disabled;\r\n\r\n return (\r\n <form ref={ref} className={className} style={formStyle} onSubmit={handleSubmit}>\r\n <div>\r\n <label style={labelStyle}>{emailLabel}</label>\r\n <input\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => onEmailChange(e.target.value)}\r\n placeholder={emailPlaceholder}\r\n disabled={isDisabled}\r\n required\r\n autoComplete=\"email\"\r\n style={inputStyle}\r\n />\r\n </div>\r\n\r\n <div>\r\n <label style={labelStyle}>{passwordLabel}</label>\r\n <input\r\n type=\"password\"\r\n value={password}\r\n onChange={(e) => onPasswordChange(e.target.value)}\r\n placeholder={passwordPlaceholder}\r\n disabled={isDisabled}\r\n required\r\n autoComplete=\"current-password\"\r\n style={inputStyle}\r\n />\r\n </div>\r\n\r\n {error && <p style={errorStyle}>{error}</p>}\r\n\r\n <button type=\"submit\" disabled={isDisabled} style={isDisabled ? buttonDisabledStyle : buttonStyle}>\r\n {isLoading ? loadingText : submitText}\r\n </button>\r\n </form>\r\n );\r\n },\r\n);\r\n\r\nEmailAuth.displayName = 'EmailAuth';\r\n","import React from 'react';\r\nimport type { OIDCButtonProps } from './types';\r\n\r\nconst buttonStyle: React.CSSProperties = {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '0.5rem',\r\n width: '100%',\r\n padding: '0.625rem 1rem',\r\n fontSize: '0.875rem',\r\n fontWeight: 500,\r\n backgroundColor: 'transparent',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '0.375rem',\r\n cursor: 'pointer',\r\n lineHeight: 1.5,\r\n};\r\n\r\nexport const OIDCButton = React.forwardRef<HTMLButtonElement, OIDCButtonProps>(\r\n ({ className, label = 'Sign in with SSO', onClick, icon }, ref) => {\r\n return (\r\n <button ref={ref} type=\"button\" className={className} style={buttonStyle} onClick={onClick}>\r\n {icon && <span style={{ display: 'inline-flex', alignItems: 'center' }}>{icon}</span>}\r\n {label}\r\n </button>\r\n );\r\n },\r\n);\r\n\r\nOIDCButton.displayName = 'OIDCButton';\r\n","import React from 'react';\r\nimport type { OAuthButtonProps } from './types';\r\n\r\nconst buttonStyle: React.CSSProperties = {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '0.5rem',\r\n width: '100%',\r\n padding: '0.625rem 1rem',\r\n fontSize: '0.875rem',\r\n fontWeight: 500,\r\n backgroundColor: 'transparent',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '0.375rem',\r\n cursor: 'pointer',\r\n lineHeight: 1.5,\r\n};\r\n\r\nexport const OAuthButton = React.forwardRef<HTMLButtonElement, OAuthButtonProps>(\r\n ({ className, providerName, onClick, icon }, ref) => {\r\n return (\r\n <button ref={ref} type=\"button\" className={className} style={buttonStyle} onClick={onClick}>\r\n {icon && <span style={{ display: 'inline-flex', alignItems: 'center' }}>{icon}</span>}\r\n {providerName}\r\n </button>\r\n );\r\n },\r\n);\r\n\r\nOAuthButton.displayName = 'OAuthButton';\r\n","import React from 'react';\r\nimport type { AuthDividerProps } from './types';\r\n\r\nconst containerStyle: React.CSSProperties = {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '0.75rem',\r\n margin: '1rem 0',\r\n};\r\n\r\nconst lineStyle: React.CSSProperties = {\r\n flex: 1,\r\n height: '1px',\r\n backgroundColor: '#e5e7eb',\r\n};\r\n\r\nconst textStyle: React.CSSProperties = {\r\n fontSize: '0.75rem',\r\n opacity: 0.5,\r\n whiteSpace: 'nowrap',\r\n};\r\n\r\nexport const AuthDivider: React.FC<AuthDividerProps> = ({ className, text = 'or' }) => {\r\n return (\r\n <div className={className} style={containerStyle}>\r\n <div style={lineStyle} />\r\n <span style={textStyle}>{text}</span>\r\n <div style={lineStyle} />\r\n </div>\r\n );\r\n};\r\n","import React from 'react';\r\nimport type { PendingApprovalProps } from './types';\r\n\r\nconst containerStyle: React.CSSProperties = {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n textAlign: 'center',\r\n padding: '1.5rem 0',\r\n gap: '1rem',\r\n};\r\n\r\nconst titleStyle: React.CSSProperties = {\r\n fontSize: '1.125rem',\r\n fontWeight: 600,\r\n margin: 0,\r\n};\r\n\r\nconst descriptionStyle: React.CSSProperties = {\r\n fontSize: '0.875rem',\r\n opacity: 0.6,\r\n lineHeight: 1.5,\r\n margin: 0,\r\n};\r\n\r\nconst backButtonStyle: React.CSSProperties = {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n padding: '0.5rem 1.5rem',\r\n fontSize: '0.875rem',\r\n fontWeight: 500,\r\n backgroundColor: 'transparent',\r\n border: '1px solid #d1d5db',\r\n borderRadius: '0.375rem',\r\n cursor: 'pointer',\r\n marginTop: '0.5rem',\r\n};\r\n\r\nexport const PendingApproval: React.FC<PendingApprovalProps> = ({\r\n className,\r\n icon,\r\n title = 'Pending Approval',\r\n description = 'Your account is awaiting administrator approval. Please check back later.',\r\n backText = 'Go Back',\r\n onBack,\r\n}) => {\r\n return (\r\n <div className={className} style={containerStyle}>\r\n {icon}\r\n <h2 style={titleStyle}>{title}</h2>\r\n <p style={descriptionStyle}>{description}</p>\r\n {onBack && (\r\n <button type=\"button\" style={backButtonStyle} onClick={onBack}>\r\n {backText}\r\n </button>\r\n )}\r\n </div>\r\n );\r\n};\r\n"]}
1
+ {"version":3,"sources":["../../../src/components/login/LoginLayout.tsx","../../../src/components/login/EmailAuth.tsx","../../../src/components/login/OIDCButton.tsx","../../../src/components/login/OAuthButton.tsx","../../../src/components/login/AuthDivider.tsx","../../../src/components/login/PendingApproval.tsx"],"names":["jsxs","jsx","buttonStyle","React","containerStyle","titleStyle"],"mappings":"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","file":"index.mjs","sourcesContent":["import React from 'react';\nimport type { LoginLayoutProps } from './types';\n\nconst containerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '100vh',\n padding: '1rem',\n};\n\nconst cardStyle: React.CSSProperties = {\n width: '100%',\n maxWidth: '400px',\n};\n\nconst logoContainerStyle: React.CSSProperties = {\n display: 'flex',\n justifyContent: 'center',\n marginBottom: '1.5rem',\n};\n\nconst logoImageStyle: React.CSSProperties = {\n height: '48px',\n width: 'auto',\n};\n\nconst titleStyle: React.CSSProperties = {\n fontSize: '1.5rem',\n fontWeight: 700,\n textAlign: 'center' as const,\n marginBottom: '0.5rem',\n lineHeight: 1.2,\n};\n\nconst subtitleStyle: React.CSSProperties = {\n fontSize: '0.875rem',\n textAlign: 'center' as const,\n marginBottom: '1.5rem',\n opacity: 0.6,\n};\n\nconst footerStyle: React.CSSProperties = {\n fontSize: '0.75rem',\n textAlign: 'center' as const,\n marginTop: '2rem',\n opacity: 0.4,\n};\n\nexport const LoginLayout: React.FC<LoginLayoutProps> = ({\n className,\n style,\n children,\n logo,\n title,\n subtitle,\n footer,\n}) => {\n const renderLogo = () => {\n if (!logo) return null;\n if (typeof logo === 'string') {\n return (\n <div style={logoContainerStyle}>\n <img src={logo} alt={title || 'Logo'} style={logoImageStyle} />\n </div>\n );\n }\n return <div style={logoContainerStyle}>{logo}</div>;\n };\n\n return (\n <div className={className} style={{ ...containerStyle, ...style }}>\n <div style={cardStyle}>\n {renderLogo()}\n {title && <h1 style={titleStyle}>{title}</h1>}\n {subtitle && <p style={subtitleStyle}>{subtitle}</p>}\n {children}\n {footer && <p style={footerStyle}>{footer}</p>}\n </div>\n </div>\n );\n};\n","import React, { useCallback } from 'react';\nimport type { EmailAuthProps } from './types';\n\nconst formStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: '1rem',\n};\n\nconst labelStyle: React.CSSProperties = {\n display: 'block',\n fontSize: '0.875rem',\n fontWeight: 500,\n marginBottom: '0.375rem',\n};\n\nconst inputStyle: React.CSSProperties = {\n display: 'block',\n width: '100%',\n padding: '0.5rem 0.75rem',\n fontSize: '0.875rem',\n lineHeight: 1.5,\n backgroundColor: 'transparent',\n border: '1px solid #d1d5db',\n borderRadius: '0.375rem',\n outline: 'none',\n boxSizing: 'border-box',\n};\n\nconst buttonStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n padding: '0.625rem 1rem',\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#ffffff',\n backgroundColor: '#111827',\n border: 'none',\n borderRadius: '0.375rem',\n cursor: 'pointer',\n lineHeight: 1.5,\n};\n\nconst buttonDisabledStyle: React.CSSProperties = {\n ...buttonStyle,\n opacity: 0.6,\n cursor: 'not-allowed',\n};\n\nconst errorStyle: React.CSSProperties = {\n fontSize: '0.875rem',\n color: '#dc2626',\n marginTop: '-0.25rem',\n};\n\nexport const EmailAuth = React.forwardRef<HTMLFormElement, EmailAuthProps>(\n (\n {\n className,\n email,\n onEmailChange,\n password,\n onPasswordChange,\n onSubmit,\n isLoading = false,\n disabled = false,\n emailLabel = 'Email',\n emailPlaceholder = 'Enter your email',\n passwordLabel = 'Password',\n passwordPlaceholder = 'Enter your password',\n submitText = 'Sign In',\n loadingText = 'Signing in...',\n error,\n },\n ref,\n ) => {\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault();\n if (!isLoading && !disabled) {\n onSubmit();\n }\n },\n [onSubmit, isLoading, disabled],\n );\n\n const isDisabled = isLoading || disabled;\n\n return (\n <form ref={ref} className={className} style={formStyle} onSubmit={handleSubmit}>\n <div>\n <label style={labelStyle}>{emailLabel}</label>\n <input\n type=\"email\"\n value={email}\n onChange={(e) => onEmailChange(e.target.value)}\n placeholder={emailPlaceholder}\n disabled={isDisabled}\n required\n autoComplete=\"email\"\n style={inputStyle}\n />\n </div>\n\n <div>\n <label style={labelStyle}>{passwordLabel}</label>\n <input\n type=\"password\"\n value={password}\n onChange={(e) => onPasswordChange(e.target.value)}\n placeholder={passwordPlaceholder}\n disabled={isDisabled}\n required\n autoComplete=\"current-password\"\n style={inputStyle}\n />\n </div>\n\n {error && <p style={errorStyle}>{error}</p>}\n\n <button type=\"submit\" disabled={isDisabled} style={isDisabled ? buttonDisabledStyle : buttonStyle}>\n {isLoading ? loadingText : submitText}\n </button>\n </form>\n );\n },\n);\n\nEmailAuth.displayName = 'EmailAuth';\n","import React from 'react';\nimport type { OIDCButtonProps } from './types';\n\nconst buttonStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '0.5rem',\n width: '100%',\n padding: '0.625rem 1rem',\n fontSize: '0.875rem',\n fontWeight: 500,\n backgroundColor: 'transparent',\n border: '1px solid #d1d5db',\n borderRadius: '0.375rem',\n cursor: 'pointer',\n lineHeight: 1.5,\n};\n\nexport const OIDCButton = React.forwardRef<HTMLButtonElement, OIDCButtonProps>(\n ({ className, label = 'Sign in with SSO', onClick, icon }, ref) => {\n return (\n <button ref={ref} type=\"button\" className={className} style={buttonStyle} onClick={onClick}>\n {icon && <span style={{ display: 'inline-flex', alignItems: 'center' }}>{icon}</span>}\n {label}\n </button>\n );\n },\n);\n\nOIDCButton.displayName = 'OIDCButton';\n","import React from 'react';\nimport type { OAuthButtonProps } from './types';\n\nconst buttonStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '0.5rem',\n width: '100%',\n padding: '0.625rem 1rem',\n fontSize: '0.875rem',\n fontWeight: 500,\n backgroundColor: 'transparent',\n border: '1px solid #d1d5db',\n borderRadius: '0.375rem',\n cursor: 'pointer',\n lineHeight: 1.5,\n};\n\nexport const OAuthButton = React.forwardRef<HTMLButtonElement, OAuthButtonProps>(\n ({ className, providerName, onClick, icon }, ref) => {\n return (\n <button ref={ref} type=\"button\" className={className} style={buttonStyle} onClick={onClick}>\n {icon && <span style={{ display: 'inline-flex', alignItems: 'center' }}>{icon}</span>}\n {providerName}\n </button>\n );\n },\n);\n\nOAuthButton.displayName = 'OAuthButton';\n","import React from 'react';\nimport type { AuthDividerProps } from './types';\n\nconst containerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n margin: '1rem 0',\n};\n\nconst lineStyle: React.CSSProperties = {\n flex: 1,\n height: '1px',\n backgroundColor: '#e5e7eb',\n};\n\nconst textStyle: React.CSSProperties = {\n fontSize: '0.75rem',\n opacity: 0.5,\n whiteSpace: 'nowrap',\n};\n\nexport const AuthDivider: React.FC<AuthDividerProps> = ({ className, text = 'or' }) => {\n return (\n <div className={className} style={containerStyle}>\n <div style={lineStyle} />\n <span style={textStyle}>{text}</span>\n <div style={lineStyle} />\n </div>\n );\n};\n","import React from 'react';\nimport type { PendingApprovalProps } from './types';\n\nconst containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n textAlign: 'center',\n padding: '1.5rem 0',\n gap: '1rem',\n};\n\nconst titleStyle: React.CSSProperties = {\n fontSize: '1.125rem',\n fontWeight: 600,\n margin: 0,\n};\n\nconst descriptionStyle: React.CSSProperties = {\n fontSize: '0.875rem',\n opacity: 0.6,\n lineHeight: 1.5,\n margin: 0,\n};\n\nconst backButtonStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '0.5rem 1.5rem',\n fontSize: '0.875rem',\n fontWeight: 500,\n backgroundColor: 'transparent',\n border: '1px solid #d1d5db',\n borderRadius: '0.375rem',\n cursor: 'pointer',\n marginTop: '0.5rem',\n};\n\nexport const PendingApproval: React.FC<PendingApprovalProps> = ({\n className,\n icon,\n title = 'Pending Approval',\n description = 'Your account is awaiting administrator approval. Please check back later.',\n backText = 'Go Back',\n onBack,\n}) => {\n return (\n <div className={className} style={containerStyle}>\n {icon}\n <h2 style={titleStyle}>{title}</h2>\n <p style={descriptionStyle}>{description}</p>\n {onBack && (\n <button type=\"button\" style={backButtonStyle} onClick={onBack}>\n {backText}\n </button>\n )}\n </div>\n );\n};\n"]}
@@ -0,0 +1,75 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode, ReactElement } from 'react';
3
+ import { ToasterProps, ExternalToast, ToastT, ToastToDismiss } from 'sonner';
4
+ export { ExternalToast, ToasterProps } from 'sonner';
5
+
6
+ type ToastVariant = 'error' | 'warning' | 'success' | 'info';
7
+ type ToastInput = Omit<ExternalToast, 'description'> & {
8
+ title?: ReactNode;
9
+ description?: ReactNode;
10
+ variant?: ToastVariant;
11
+ };
12
+ type MonkeysToasterProps = ToasterProps & {
13
+ useThemeClassNames?: boolean;
14
+ };
15
+ type MonkeysToastProviderProps = {
16
+ children: ReactNode;
17
+ toasterProps?: MonkeysToasterProps;
18
+ };
19
+ type ToastValue = Error | string | {
20
+ message?: unknown;
21
+ title?: unknown;
22
+ } | null | undefined;
23
+ type ToastResolver<T> = T | ((value: ToastValue) => T);
24
+ type ToastTranslate = (value: string, params?: Record<string, unknown>) => string;
25
+ type ToastValueOptions = {
26
+ variant?: ToastResolver<ToastVariant | undefined>;
27
+ title?: ToastResolver<string | undefined>;
28
+ description?: ToastResolver<string | undefined>;
29
+ fallbackDescription?: ToastResolver<string | undefined>;
30
+ signature?: ToastResolver<string | undefined>;
31
+ duration?: ToastResolver<number | undefined>;
32
+ translate?: ToastTranslate;
33
+ messages?: Partial<ToastDefaultMessages>;
34
+ };
35
+ type ToastFeedEntry = {
36
+ variant?: ToastVariant;
37
+ title?: string;
38
+ description?: string;
39
+ duration?: number;
40
+ signature?: string;
41
+ } | null | undefined;
42
+ type ToastDefaultMessages = {
43
+ errorTitle: string;
44
+ warningTitle: string;
45
+ defaultErrorDescription: string;
46
+ defaultWarningDescription: string;
47
+ };
48
+ type ToastPromiseInput<T = unknown> = Promise<T> | (() => Promise<T>);
49
+ type ToastPromiseReturn<T = unknown> = string | number | {
50
+ unwrap: () => Promise<T>;
51
+ };
52
+ type MonkeysToastApi = {
53
+ (message: ReactNode, options?: ExternalToast): string | number;
54
+ show: (input: ToastInput) => string | number | undefined;
55
+ error: (input: ReactNode | ToastInput, options?: ExternalToast) => string | number | undefined;
56
+ warning: (input: ReactNode | ToastInput, options?: ExternalToast) => string | number | undefined;
57
+ success: (input: ReactNode | ToastInput, options?: ExternalToast) => string | number | undefined;
58
+ info: (input: ReactNode | ToastInput, options?: ExternalToast) => string | number | undefined;
59
+ message: (message: ReactNode, options?: ExternalToast) => string | number;
60
+ promise: <T = unknown>(promise: ToastPromiseInput<T>, data?: unknown) => ToastPromiseReturn<T>;
61
+ dismiss: (id?: number | string) => string | number;
62
+ loading: (message: ReactNode, options?: ExternalToast) => string | number;
63
+ custom: (jsx: (id: number | string) => ReactElement, data?: ExternalToast) => string | number;
64
+ getHistory: () => Array<ToastT | ToastToDismiss>;
65
+ getToasts: () => Array<ToastT | ToastToDismiss>;
66
+ };
67
+ declare function extractToastMessage(value: ToastValue, fallback?: string): string;
68
+ declare function resolveToastVariantForMessage(value: ToastValue): ToastVariant;
69
+ declare function MonkeysToaster({ className, closeButton, position, richColors, toastOptions, useThemeClassNames, visibleToasts, ...props }: MonkeysToasterProps): react_jsx_runtime.JSX.Element;
70
+ declare function MonkeysToastProvider({ children, toasterProps }: MonkeysToastProviderProps): react_jsx_runtime.JSX.Element;
71
+ declare function useToastOnValue(value: ToastValue, options?: ToastValueOptions): void;
72
+ declare function useToastFeed(items: ToastFeedEntry[], options?: Pick<ToastValueOptions, 'messages' | 'translate'>): void;
73
+ declare const toast: MonkeysToastApi;
74
+
75
+ export { type MonkeysToastApi, MonkeysToastProvider, type MonkeysToastProviderProps, MonkeysToaster, type MonkeysToasterProps, type ToastInput, MonkeysToastProvider as ToastProvider, type ToastVariant, MonkeysToaster as Toaster, extractToastMessage, resolveToastVariantForMessage, toast, useToastFeed, useToastOnValue };