@specscreen/backoffice-core 0.1.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/rbac/evaluator.ts","../src/core/auth/AuthContext.tsx","../src/components/feedback/LoadingScreen.tsx","../src/lib/utils.ts","../src/components/ui/button.tsx","../src/components/ui/input.tsx","../src/components/ui/label.tsx","../src/components/auth/LoginPage.tsx","../src/components/guards/AuthGuard.tsx","../src/components/layout/Sidebar.tsx","../src/components/layout/AppShell.tsx","../src/components/BackofficeApp.tsx","../src/hooks/useAuth.ts","../src/hooks/usePermissions.ts","../src/components/feedback/AccessDenied.tsx","../src/components/guards/ResourceGuard.tsx","../src/components/guards/Can.tsx","../src/components/ui/select.tsx","../src/components/ui/render-modal.tsx","../src/components/ui/settings-modal.tsx","../src/components/ui/table-action-menu.tsx","../src/components/ui/table-badge.tsx","../src/components/ui/table.tsx","../src/components/ui/data-table.tsx","../src/components/ui/table-pagination.tsx"],"names":["createContext","useReducer","useEffect","useCallback","useMemo","jsx","useContext","jsxs","Loader2","twMerge","clsx","cva","React2","Slot","React3","React4","LabelPrimitive","useState","Fragment","Icon","LayoutPanelTop","EllipsisVertical","ChevronRight","PanelLeft","Plus","ShieldOff","SelectPrimitive","React8","ChevronDown","Check","React","createPortal","X","Settings","CircleDot","UserCog","MoreHorizontal","React12","useSortable","CSS","flexRender","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","useReactTable","getCoreRowModel","React13","arrayMove","DndContext","closestCenter","SortableContext","verticalListSortingStrategy","ChevronLeft","ChevronsLeft","ChevronsRight"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { User } from \"../../types/auth\";\nimport type { ResourceMeta } from \"../../types/resource\";\n\n/**\n * Evaluate whether a user has access to a resource based on its meta constraints.\n *\n * Rules:\n * - If no constraints are defined (no requiredRoles, no requiredPermissions), access is GRANTED.\n * - If requiredRoles is set, the user must have AT LEAST ONE matching role.\n * - If requiredPermissions is set, the user must have ALL of the listed permissions.\n * - If both are set, BOTH conditions must pass.\n * - If a condition is set but the user has no roles/permissions at all, access is DENIED.\n */\nexport function canAccessResource(user: User | null, meta: ResourceMeta | undefined): boolean {\n if (!meta) return true;\n\n const { requiredRoles, requiredPermissions } = meta;\n const hasRoleConstraint = requiredRoles && requiredRoles.length > 0;\n const hasPermissionConstraint = requiredPermissions && requiredPermissions.length > 0;\n\n if (!hasRoleConstraint && !hasPermissionConstraint) return true;\n\n if (!user) return false;\n\n if (hasRoleConstraint) {\n const userRoles = user.roles ?? [];\n const rolesPassed = requiredRoles!.some((role) => userRoles.includes(role));\n if (!rolesPassed) return false;\n }\n\n if (hasPermissionConstraint) {\n const userPermissions = user.permissions ?? [];\n const permissionsPassed = requiredPermissions!.every((perm) =>\n userPermissions.includes(perm)\n );\n if (!permissionsPassed) return false;\n }\n\n return true;\n}\n\n/** Check whether a user possesses a specific permission string. */\nexport function evaluateCan(user: User | null, permission: string): boolean {\n if (!user) return false;\n return (user.permissions ?? []).includes(permission);\n}\n\n/** Check whether a user possesses a specific role string. */\nexport function evaluateHasRole(user: User | null, role: string): boolean {\n if (!user) return false;\n return (user.roles ?? []).includes(role);\n}\n\n/** Check whether a user possesses ANY of the given permissions. */\nexport function evaluateCanAny(user: User | null, permissions: string[]): boolean {\n if (!user || permissions.length === 0) return false;\n const userPermissions = user.permissions ?? [];\n return permissions.some((perm) => userPermissions.includes(perm));\n}\n\n/** Check whether a user possesses ALL of the given permissions. */\nexport function evaluateCanAll(user: User | null, permissions: string[]): boolean {\n if (!user || permissions.length === 0) return false;\n const userPermissions = user.permissions ?? [];\n return permissions.every((perm) => userPermissions.includes(perm));\n}\n","\"use client\";\n\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useReducer,\n} from \"react\";\nimport type { AuthProvider, AuthState, User } from \"../../types/auth\";\nimport {\n evaluateCan,\n evaluateCanAll,\n evaluateCanAny,\n evaluateHasRole,\n} from \"../rbac/evaluator\";\n\n// ─── State machine ────────────────────────────────────────────────────────────\n\ntype AuthAction =\n | { type: \"LOADING\" }\n | { type: \"AUTHENTICATED\"; user: User }\n | { type: \"UNAUTHENTICATED\" }\n | { type: \"ERROR\"; error: string }\n | { type: \"USER_UPDATED\"; user: User };\n\nfunction authReducer(state: AuthState, action: AuthAction): AuthState {\n switch (action.type) {\n case \"LOADING\":\n return { ...state, isLoading: true, error: null };\n case \"AUTHENTICATED\":\n return {\n isLoading: false,\n isAuthenticated: true,\n user: action.user,\n error: null,\n };\n case \"UNAUTHENTICATED\":\n return {\n isLoading: false,\n isAuthenticated: false,\n user: null,\n error: null,\n };\n case \"ERROR\":\n return {\n isLoading: false,\n isAuthenticated: false,\n user: null,\n error: action.error,\n };\n case \"USER_UPDATED\":\n return { ...state, user: action.user };\n default:\n return state;\n }\n}\n\nconst initialState: AuthState = {\n isLoading: true,\n isAuthenticated: false,\n user: null,\n error: null,\n};\n\n// ─── Context shape ────────────────────────────────────────────────────────────\n\nexport interface AuthContextValue extends AuthState {\n /** Log in with email + password via the configured AuthProvider */\n login(params: { email: string; password: string }): Promise<void>;\n\n /** Log out and clear auth state */\n logout(): Promise<void>;\n\n /** Re-fetch the user profile and update context */\n refreshUser(): Promise<void>;\n\n /** Check a single permission */\n can(permission: string): boolean;\n\n /** Check if user has ANY of the given permissions */\n canAny(permissions: string[]): boolean;\n\n /** Check if user has ALL of the given permissions */\n canAll(permissions: string[]): boolean;\n\n /** Check if user has a specific role */\n hasRole(role: string): boolean;\n}\n\nexport const AuthContext = createContext<AuthContextValue | null>(null);\n\n// ─── Provider ────────────────────────────────────────────────────────────────\n\nexport interface AuthContextProviderProps {\n authProvider: AuthProvider;\n children: React.ReactNode;\n}\n\nexport function AuthContextProvider({\n authProvider,\n children,\n}: AuthContextProviderProps) {\n const [state, dispatch] = useReducer(authReducer, initialState);\n\n // Boot flow: checkAuth → getUser\n useEffect(() => {\n let cancelled = false;\n\n async function boot() {\n dispatch({ type: \"LOADING\" });\n try {\n const isAuthenticated = await authProvider.checkAuth();\n if (cancelled) return;\n\n if (!isAuthenticated) {\n dispatch({ type: \"UNAUTHENTICATED\" });\n return;\n }\n\n const user = await authProvider.getUser();\n if (cancelled) return;\n\n if (user) {\n dispatch({ type: \"AUTHENTICATED\", user });\n } else {\n dispatch({ type: \"UNAUTHENTICATED\" });\n }\n } catch {\n if (!cancelled) dispatch({ type: \"UNAUTHENTICATED\" });\n }\n }\n\n boot();\n return () => {\n cancelled = true;\n };\n }, [authProvider]);\n\n const login = useCallback(\n async (params: { email: string; password: string }) => {\n dispatch({ type: \"LOADING\" });\n await authProvider.login(params);\n const user = await authProvider.getUser();\n if (user) {\n dispatch({ type: \"AUTHENTICATED\", user });\n } else {\n dispatch({ type: \"ERROR\", error: \"Failed to retrieve user after login.\" });\n }\n },\n [authProvider]\n );\n\n const logout = useCallback(async () => {\n try {\n await authProvider.logout();\n } catch (err) {\n // Always clear local auth state even if the remote logout fails.\n // The provider should handle token/session invalidation server-side.\n console.error(\"[BackofficeApp] Logout error:\", err);\n } finally {\n dispatch({ type: \"UNAUTHENTICATED\" });\n }\n }, [authProvider]);\n\n const refreshUser = useCallback(async () => {\n const user = await authProvider.getUser();\n if (user) dispatch({ type: \"USER_UPDATED\", user });\n }, [authProvider]);\n\n const can = useCallback(\n (permission: string) => evaluateCan(state.user, permission),\n [state.user]\n );\n\n const canAny = useCallback(\n (permissions: string[]) => evaluateCanAny(state.user, permissions),\n [state.user]\n );\n\n const canAll = useCallback(\n (permissions: string[]) => evaluateCanAll(state.user, permissions),\n [state.user]\n );\n\n const hasRole = useCallback(\n (role: string) => evaluateHasRole(state.user, role),\n [state.user]\n );\n\n const value = useMemo<AuthContextValue>(\n () => ({\n ...state,\n login,\n logout,\n refreshUser,\n can,\n canAny,\n canAll,\n hasRole,\n }),\n [state, login, logout, refreshUser, can, canAny, canAll, hasRole]\n );\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n}\n\n// ─── Hook ────────────────────────────────────────────────────────────────────\n\nexport function useAuthContext(): AuthContextValue {\n const ctx = useContext(AuthContext);\n if (!ctx) {\n throw new Error(\"useAuthContext must be used inside <BackofficeApp>.\");\n }\n return ctx;\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { Loader2 } from \"lucide-react\";\n\nexport interface LoadingScreenProps {\n /** Custom message shown below the spinner */\n message?: string;\n}\n\n/**\n * Full-screen loading indicator shown during the auth boot phase.\n */\nexport function LoadingScreen({ message }: LoadingScreenProps) {\n return (\n <div className=\"flex min-h-screen w-full flex-col items-center justify-center gap-3 bg-background\">\n <Loader2 className=\"size-8 animate-spin text-muted-foreground\" />\n {message && (\n <p className=\"text-sm text-muted-foreground\">{message}</p>\n )}\n </div>\n );\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../lib/utils\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lg text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 disabled:pointer-events-none disabled:opacity-50 cursor-pointer\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-lg px-6\",\n icon: \"size-8\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n }\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nconst Input = React.forwardRef<\n HTMLInputElement,\n React.InputHTMLAttributes<HTMLInputElement>\n>(({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-9 w-full rounded-lg border border-input bg-background px-3 py-1 text-base shadow-xs transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n ref={ref}\n {...props}\n />\n );\n});\nInput.displayName = \"Input\";\n\nexport { Input };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { cn } from \"../../lib/utils\";\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n className\n )}\n {...props}\n />\n));\nLabel.displayName = LabelPrimitive.Root.displayName;\n\nexport { Label };\n","\"use client\";\n\nimport React, { type FormEvent, useState } from \"react\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\nimport { useAuthContext } from \"../../core/auth/AuthContext\";\n\nexport interface LoginPageProps {\n /** Application name shown as the heading. Default: \"backoffice\" */\n appName?: string;\n\n /** Logo element shown above the title */\n logo?: React.ReactNode;\n\n /** Called after a successful login (e.g. for router redirect) */\n onLoginSuccess?: () => void;\n\n /** Optional \"Forgot password?\" click handler */\n onForgotPassword?: () => void;\n\n /** Custom subtitle / hint shown below the heading. Overrides the default description. */\n description?: React.ReactNode;\n}\n\n/**\n * Full-page login form matching the Figma design.\n * Delegates credential validation to the configured AuthProvider.\n */\nexport function LoginPage({\n appName = \"backoffice\",\n logo,\n onLoginSuccess,\n onForgotPassword,\n description,\n}: LoginPageProps) {\n const { login, isLoading, error } = useAuthContext();\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [localError, setLocalError] = useState<string | null>(null);\n const [attempts, setAttempts] = useState(0);\n\n // Soft client-side cap — real protection belongs on the server\n const MAX_ATTEMPTS = 10;\n\n async function handleSubmit(e: FormEvent<HTMLFormElement>) {\n e.preventDefault();\n setLocalError(null);\n\n // Basic client-side validation before hitting the provider\n if (!email.trim() || !password) {\n setLocalError(\"Please enter your email and password.\");\n return;\n }\n\n // Attempt count is a lightweight, non-persisted rate signal.\n // Real brute-force protection MUST live at the network/server layer.\n setAttempts((n) => n + 1);\n if (attempts >= MAX_ATTEMPTS) {\n setLocalError(\"Too many failed attempts. Please wait before trying again.\");\n return;\n }\n\n try {\n await login({ email: email.trim(), password });\n setAttempts(0);\n onLoginSuccess?.();\n } catch (err: unknown) {\n // Never expose raw server errors — they may contain internal details.\n // Log the real error for developers; show a safe generic message in the UI.\n console.error(\"[BackofficeApp] Login error:\", err);\n setLocalError(\"Invalid email or password.\");\n }\n }\n\n // Only surface localError (sanitised above). The context-level `error` is\n // for the LOADING→ERROR boot path and is already a controlled string.\n const displayError = localError ?? (error ? \"Authentication error. Please try again.\" : null);\n\n return (\n <div className=\"min-h-screen w-full bg-background flex items-center justify-center p-4\">\n {/* Card */}\n <div className=\"w-full max-w-sm rounded-xl border border-border bg-background shadow-xs overflow-hidden p-10\">\n {/* Header */}\n <div className=\"flex flex-col items-center gap-2 pb-8\">\n {logo ? (\n <div className=\"size-6\">{logo}</div>\n ) : (\n <div className=\"size-6 rounded-full bg-foreground flex items-center justify-center\">\n <span className=\"text-background text-xs font-bold\">B</span>\n </div>\n )}\n <h1 className=\"text-xl font-semibold text-foreground text-center\">\n Welcome to {appName}\n </h1>\n <p className=\"text-sm text-muted-foreground text-center\">\n {description ?? \"Enter your email below to login to your account\"}\n </p>\n </div>\n\n {/* Form */}\n <form onSubmit={handleSubmit} className=\"flex flex-col gap-6\">\n {/* Email */}\n <div className=\"flex flex-col gap-3\">\n <Label htmlFor=\"email\">Email</Label>\n <Input\n id=\"email\"\n type=\"email\"\n placeholder=\"m@example.com\"\n autoComplete=\"email\"\n required\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n disabled={isLoading}\n />\n </div>\n\n {/* Password */}\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex items-center justify-between\">\n <Label htmlFor=\"password\">Password</Label>\n {onForgotPassword && (\n <button\n type=\"button\"\n onClick={onForgotPassword}\n className=\"text-sm text-foreground hover:underline\"\n >\n Forgot password?\n </button>\n )}\n </div>\n <Input\n id=\"password\"\n type=\"password\"\n autoComplete=\"current-password\"\n required\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n disabled={isLoading}\n />\n </div>\n\n {/* Error message */}\n {displayError && (\n <p className=\"text-sm text-destructive text-center\" role=\"alert\">\n {displayError}\n </p>\n )}\n\n {/* Submit */}\n <Button type=\"submit\" className=\"w-full\" disabled={isLoading}>\n {isLoading ? \"Logging in…\" : \"Log in\"}\n </Button>\n </form>\n\n {/* Footer */}\n <p className=\"mt-4 text-sm text-muted-foreground text-center\">\n Don&apos;t have an account? Ask an admin for access.\n </p>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { useAuthContext } from \"../../core/auth/AuthContext\";\nimport { LoadingScreen } from \"../feedback/LoadingScreen\";\nimport { LoginPage } from \"../auth/LoginPage\";\nimport type { LoginPageProps } from \"../auth/LoginPage\";\n\nexport interface AuthGuardProps {\n /** Content to show when authenticated */\n children: React.ReactNode;\n /** Props forwarded to the built-in LoginPage. Ignored when renderLogin is provided. */\n loginPageProps?: Omit<LoginPageProps, \"onLoginSuccess\">;\n /** Render a custom login UI instead of the default LoginPage */\n renderLogin?: () => React.ReactNode;\n /** Render a custom loading state instead of the default LoadingScreen */\n renderLoading?: () => React.ReactNode;\n /** Called after successful login (e.g. router.push) */\n onLoginSuccess?: () => void;\n}\n\n/**\n * Redirects to the login page if the user is not authenticated.\n * Shows a loading screen during the auth boot phase.\n *\n * Place this at the root of the protected area.\n */\nexport function AuthGuard({\n children,\n loginPageProps,\n renderLogin,\n renderLoading,\n onLoginSuccess,\n}: AuthGuardProps) {\n const { isLoading, isAuthenticated, error } = useAuthContext();\n\n if (isLoading) {\n return renderLoading ? <>{renderLoading()}</> : <LoadingScreen />;\n }\n\n // Also gate on error — a failed boot must NOT render protected content\n if (!isAuthenticated || error) {\n if (renderLogin) return <>{renderLogin()}</>;\n return (\n <LoginPage\n {...loginPageProps}\n onLoginSuccess={onLoginSuccess}\n />\n );\n }\n\n return <>{children}</>;\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport {\n ChevronRight,\n EllipsisVertical,\n LayoutPanelTop,\n PanelLeft,\n} from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\nimport type {\n BackofficeConfig,\n Resource,\n SidebarGroup,\n} from \"../../types/resource\";\nimport { useAuthContext } from \"../../core/auth/AuthContext\";\nimport { canAccessResource } from \"../../core/rbac/evaluator\";\n\n// ─── Navigation link abstraction ─────────────────────────────────────────────\n\nexport interface NavLinkProps {\n href: string;\n children: React.ReactNode;\n className?: string;\n isActive?: boolean;\n onClick?: () => void;\n}\n\n/** Render adapter consumed by the sidebar. Defaults to a plain anchor element. */\nexport type NavLinkComponent = React.ComponentType<NavLinkProps>;\n\nconst DefaultNavLink: NavLinkComponent = ({\n href,\n children,\n className,\n onClick,\n}) => (\n <a href={href} className={className} onClick={onClick}>\n {children}\n </a>\n);\n\n// ─── Sidebar item ─────────────────────────────────────────────────────────────\n\ninterface SidebarItemProps {\n resource?: Resource;\n label: string;\n path: string;\n icon?: React.ComponentType<{ className?: string }>;\n isActive?: boolean;\n NavLink: NavLinkComponent;\n}\n\nfunction SidebarItem({\n label,\n path,\n icon: Icon,\n isActive,\n NavLink,\n}: SidebarItemProps) {\n return (\n <NavLink\n href={path}\n isActive={isActive}\n className={cn(\n \"flex h-8 w-full items-center gap-2 rounded-lg px-2 text-sm text-sidebar-foreground transition-colors\",\n \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n isActive &&\n \"bg-sidebar-accent text-sidebar-accent-foreground font-medium\",\n )}\n >\n {Icon && <Icon className=\"size-4 shrink-0\" />}\n <span className=\"flex-1 truncate\">{label}</span>\n </NavLink>\n );\n}\n\n// ─── Sidebar props ────────────────────────────────────────────────────────────\n\nexport interface SidebarProps {\n config: BackofficeConfig;\n /** Current active path (used to highlight the active item) */\n currentPath?: string;\n /** Custom NavLink component for framework-specific routing (e.g. Next.js Link) */\n NavLink?: NavLinkComponent;\n /** Called when the user clicks their profile area at the bottom */\n onUserMenuClick?: () => void;\n /** Called when the user clicks the logout option */\n onLogout?: () => void;\n}\n\n// ─── Sidebar ─────────────────────────────────────────────────────────────────\n\nexport function Sidebar({\n config,\n currentPath,\n NavLink = DefaultNavLink,\n onLogout,\n}: SidebarProps) {\n const { user } = useAuthContext();\n const [userMenuOpen, setUserMenuOpen] = useState(false);\n const headerName = config.companyName ?? config.appName;\n const websiteLabel = config.goToWebsite?.label ?? \"Go to website\";\n const WebsiteIcon = config.goToWebsite?.icon ?? LayoutPanelTop;\n const websiteTarget = config.goToWebsite?.target ?? \"_blank\";\n\n // Derive sidebar groups\n const groups: SidebarGroup[] =\n config.sidebarGroups ??\n (config.resources ? [{ label: \"\", resources: config.resources }] : []);\n\n return (\n <aside className=\"flex h-full w-[255px] shrink-0 flex-col border-r border-sidebar-border bg-sidebar\">\n {/* ── Header ─────────────────────────────────────────────────── */}\n <div className=\"flex items-center gap-2 border-b border-sidebar-border px-2 py-3\">\n <div className=\"flex h-8 w-full items-center gap-2 px-1.5\">\n {typeof config.logo === \"string\" ? (\n <img\n src={config.logo}\n alt={headerName}\n className=\"size-5 shrink-0\"\n />\n ) : config.logo ? (\n <config.logo className=\"size-5 shrink-0\" />\n ) : (\n <div className=\"size-5 shrink-0 rounded-sm bg-foreground flex items-center justify-center\">\n <span className=\"text-background text-[10px] font-bold leading-none\">\n {headerName.charAt(0).toUpperCase()}\n </span>\n </div>\n )}\n <span className=\"flex-1 truncate text-base font-semibold text-foreground\">\n {headerName}\n </span>\n </div>\n </div>\n\n {/* ── Nav ────────────────────────────────────────────────────── */}\n <div className=\"flex flex-1 flex-col gap-2 overflow-y-auto\">\n {groups.map((group, gi) => (\n <FilteredGroup\n key={group.label || gi}\n group={group}\n currentPath={currentPath}\n NavLink={NavLink}\n user={user}\n />\n ))}\n </div>\n\n {/* ── Footer links ───────────────────────────────────────────── */}\n {(config.sidebarFooterLinks && config.sidebarFooterLinks.length > 0) ||\n config.goToWebsite ? (\n <div className=\"flex flex-col gap-1 p-2\">\n {config.sidebarFooterLinks?.map((link) => (\n <NavLink\n key={link.path}\n href={link.path}\n isActive={currentPath === link.path}\n className={cn(\n \"flex h-8 w-full items-center gap-2 rounded-lg px-2 text-sm text-sidebar-foreground transition-colors\",\n \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n currentPath === link.path &&\n \"bg-sidebar-accent text-sidebar-accent-foreground\",\n )}\n >\n {link.icon && <link.icon className=\"size-4 shrink-0\" />}\n <span className=\"flex-1 truncate\">{link.label}</span>\n </NavLink>\n ))}\n\n {config.goToWebsite && (\n <a\n href={config.goToWebsite.url}\n target={websiteTarget}\n rel={\n websiteTarget === \"_blank\" ? \"noreferrer noopener\" : undefined\n }\n className={cn(\n \"flex h-8 w-full items-center gap-2 rounded-lg px-2 text-sm text-sidebar-foreground transition-colors\",\n \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n )}\n >\n <WebsiteIcon className=\"size-4 shrink-0\" />\n <span className=\"flex-1 truncate\">{websiteLabel}</span>\n </a>\n )}\n </div>\n ) : null}\n\n {/* ── User footer ────────────────────────────────────────────── */}\n {user && (\n <div className=\"flex flex-col p-2\">\n <div className=\"relative flex items-center gap-2 p-2\">\n <div className=\"flex flex-1 flex-col overflow-hidden\">\n <span className=\"truncate text-sm font-semibold text-sidebar-foreground\">\n {user.name ?? user.email.split(\"@\")[0]}\n </span>\n <span className=\"truncate text-xs text-muted-foreground\">\n {user.email}\n </span>\n </div>\n <button\n type=\"button\"\n className=\"size-4 shrink-0 text-muted-foreground hover:text-foreground\"\n onClick={() => setUserMenuOpen((v) => !v)}\n aria-label=\"User menu\"\n >\n <EllipsisVertical className=\"size-4\" />\n </button>\n\n {/* Mini dropdown */}\n {userMenuOpen && (\n <div className=\"absolute bottom-full right-0 mb-1 w-40 rounded-lg border border-border bg-background shadow-sm py-1 z-50\">\n {onLogout && (\n <button\n type=\"button\"\n className=\"w-full px-3 py-1.5 text-left text-sm text-foreground hover:bg-accent\"\n onClick={() => {\n setUserMenuOpen(false);\n onLogout();\n }}\n >\n Log out\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n )}\n </aside>\n );\n}\n\n// ─── Filtered group (hides unauthorized resources) ───────────────────────────\n\ninterface FilteredGroupProps {\n group: SidebarGroup;\n currentPath?: string;\n NavLink: NavLinkComponent;\n user: ReturnType<typeof useAuthContext>[\"user\"];\n}\n\nfunction FilteredGroup({\n group,\n currentPath,\n NavLink,\n user,\n}: FilteredGroupProps) {\n const visibleResources = group.resources.filter((r) => {\n const hideIfUnauthorized = r.meta?.hideIfUnauthorized ?? true;\n if (!hideIfUnauthorized) return true;\n return canAccessResource(user, r.meta);\n });\n\n if (visibleResources.length === 0) return null;\n\n return (\n <div className=\"flex flex-col p-2\">\n {group.label && (\n <div className=\"mb-1 flex h-8 items-center px-2 opacity-70\">\n <span className=\"text-xs text-sidebar-foreground\">{group.label}</span>\n </div>\n )}\n <div className=\"flex flex-col gap-1\">\n {visibleResources.map((resource) => (\n <SidebarItem\n key={resource.name}\n resource={resource}\n label={resource.label}\n path={resource.path}\n icon={resource.icon}\n isActive={\n currentPath === resource.path ||\n currentPath?.startsWith(resource.path + \"/\")\n }\n NavLink={NavLink}\n />\n ))}\n </div>\n </div>\n );\n}\n\n// ─── Collapsed toggle button ─────────────────────────────────────────────────\n\ninterface SidebarToggleProps {\n collapsed: boolean;\n onToggle: () => void;\n}\n\nexport function SidebarToggle({ collapsed, onToggle }: SidebarToggleProps) {\n return (\n <button\n type=\"button\"\n onClick={onToggle}\n className=\"flex size-7 items-center justify-center rounded-lg hover:bg-accent transition-colors\"\n aria-label={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n >\n {collapsed ? (\n <ChevronRight className=\"size-4\" />\n ) : (\n <PanelLeft className=\"size-4\" />\n )}\n </button>\n );\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { PanelLeft, Plus } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\nimport { Sidebar } from \"./Sidebar\";\nimport type { NavLinkComponent } from \"./Sidebar\";\nimport type { BackofficeConfig } from \"../../types/resource\";\nimport { useAuthContext } from \"../../core/auth/AuthContext\";\n\nexport interface AppShellProps {\n config: BackofficeConfig;\n /** Current path for active link highlighting */\n currentPath?: string;\n /** Custom NavLink component (e.g. next/link wrapper) */\n NavLink?: NavLinkComponent;\n /** Primary action button label for the header */\n headerActionLabel?: string;\n /** Primary action click handler */\n onHeaderAction?: () => void;\n /** Content to render in the main area */\n children: React.ReactNode;\n}\n\n/**\n * Main application shell: sidebar + header bar + content area.\n * Matches the Figma backoffice layout design.\n */\nexport function AppShell({\n config,\n currentPath,\n NavLink,\n headerActionLabel,\n onHeaderAction,\n children,\n}: AppShellProps) {\n const { logout } = useAuthContext();\n const [sidebarCollapsed, setSidebarCollapsed] = useState(false);\n\n // Derive the current page title from the active resource\n const allResources =\n config.resources ??\n config.sidebarGroups?.flatMap((g) => g.resources) ??\n [];\n\n const activeResource = allResources.find(\n (r) =>\n currentPath === r.path || currentPath?.startsWith(r.path + \"/\")\n );\n\n const pageTitle = activeResource?.label ?? config.appName;\n\n return (\n <div className=\"flex h-screen w-full overflow-hidden bg-background\">\n {/* Sidebar */}\n {!sidebarCollapsed && (\n <Sidebar\n config={config}\n currentPath={currentPath}\n NavLink={NavLink}\n onLogout={logout}\n />\n )}\n\n {/* Main area */}\n <div className=\"flex flex-1 flex-col overflow-hidden min-w-0\">\n {/* Top bar */}\n <header className=\"flex shrink-0 items-center justify-between border-b border-border px-6 py-3\">\n <div className=\"flex items-center gap-2\">\n {/* Sidebar toggle */}\n <button\n type=\"button\"\n onClick={() => setSidebarCollapsed((v) => !v)}\n className=\"flex size-7 items-center justify-center rounded-lg hover:bg-accent transition-colors\"\n aria-label=\"Toggle sidebar\"\n >\n <PanelLeft className=\"size-4 text-foreground\" />\n </button>\n\n {/* Divider */}\n <div className=\"mx-2 h-[17px] w-px bg-border\" aria-hidden />\n\n {/* Page title */}\n <h1 className=\"text-base font-semibold text-foreground\">{pageTitle}</h1>\n </div>\n\n {/* Header action */}\n {headerActionLabel && onHeaderAction && (\n <button\n type=\"button\"\n onClick={onHeaderAction}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-lg bg-foreground px-2.5 py-1.5\",\n \"text-sm font-medium text-background shadow-xs transition-opacity hover:opacity-90\"\n )}\n >\n <Plus className=\"size-4\" />\n {headerActionLabel}\n </button>\n )}\n </header>\n\n {/* Content */}\n <main className=\"flex-1 overflow-auto p-6\">{children}</main>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { AuthContextProvider } from \"../core/auth/AuthContext\";\nimport { AuthGuard } from \"./guards/AuthGuard\";\nimport { AppShell } from \"./layout/AppShell\";\nimport type { AuthProvider } from \"../types/auth\";\nimport type { DataProvider, BackofficeConfig } from \"../types/resource\";\nimport type { NavLinkComponent } from \"./layout/Sidebar\";\nimport type { LoginPageProps } from \"./auth/LoginPage\";\n\nexport interface BackofficeAppProps {\n /** Global configuration: app name, resources, sidebar groups, etc. */\n config: BackofficeConfig;\n\n /** Auth backend adapter — login, logout, checkAuth, getUser */\n authProvider: AuthProvider;\n\n /**\n * Data backend adapter — getList, getOne, create, update, delete.\n * Optional: only needed when using built-in data-aware components.\n */\n dataProvider?: DataProvider;\n\n /**\n * Custom NavLink component for framework-specific routing.\n *\n * @example\n * // Next.js App Router\n * import Link from \"next/link\"\n * const NavLink = ({ href, children, className }) => (\n * <Link href={href} className={className}>{children}</Link>\n * )\n */\n NavLink?: NavLinkComponent;\n\n /**\n * Current path used to highlight the active sidebar item.\n * In Next.js: use `usePathname()` from \"next/navigation\".\n */\n currentPath?: string;\n\n /**\n * Props forwarded to the default LoginPage.\n * Ignored when `renderLogin` is provided.\n */\n loginPageProps?: Omit<LoginPageProps, \"onLoginSuccess\">;\n\n /**\n * Render a completely custom login page instead of the default.\n * The custom component MUST call the `login` method from `useAuth()`.\n */\n renderLogin?: () => React.ReactNode;\n\n /**\n * Render a custom loading screen shown during the auth boot phase.\n */\n renderLoading?: () => React.ReactNode;\n\n /**\n * Label for the primary action button in the top-right of the header.\n */\n headerActionLabel?: string;\n\n /** Callback for the primary action button */\n onHeaderAction?: () => void;\n\n /**\n * Called after a successful login (e.g. router.push to the default resource).\n */\n onLoginSuccess?: () => void;\n\n /**\n * Page content — your routes/pages rendered inside the main area.\n * In Next.js App Router, pass `{children}` from your layout.\n */\n children?: React.ReactNode;\n}\n\n/**\n * Root component of the backoffice framework.\n *\n * Sets up:\n * - AuthContext (boot flow: checkAuth → getUser → store state)\n * - AuthGuard (shows LoginPage when unauthenticated)\n * - AppShell (sidebar + header + main content area)\n *\n * @example\n * // app/layout.tsx (Next.js App Router)\n * export default function RootLayout({ children }) {\n * return (\n * <BackofficeApp\n * config={config}\n * authProvider={authProvider}\n * currentPath={usePathname()}\n * NavLink={NextNavLink}\n * >\n * {children}\n * </BackofficeApp>\n * )\n * }\n */\nexport function BackofficeApp({\n config,\n authProvider,\n NavLink,\n currentPath,\n loginPageProps,\n renderLogin,\n renderLoading,\n headerActionLabel,\n onHeaderAction,\n onLoginSuccess,\n children,\n}: BackofficeAppProps) {\n return (\n <AuthContextProvider authProvider={authProvider}>\n <AuthGuard\n loginPageProps={loginPageProps}\n renderLogin={renderLogin}\n renderLoading={renderLoading}\n onLoginSuccess={onLoginSuccess}\n >\n <AppShell\n config={config}\n currentPath={currentPath}\n NavLink={NavLink}\n headerActionLabel={headerActionLabel}\n onHeaderAction={onHeaderAction}\n >\n {children ?? config.children}\n </AppShell>\n </AuthGuard>\n </AuthContextProvider>\n );\n}\n","\"use client\";\n\nimport { useAuthContext } from \"../core/auth/AuthContext\";\nimport type { AuthState } from \"../types/auth\";\n\nexport interface UseAuthReturn extends AuthState {\n login(params: { email: string; password: string }): Promise<void>;\n logout(): Promise<void>;\n refreshUser(): Promise<void>;\n}\n\n/**\n * Access the current authentication state and login/logout actions.\n *\n * @example\n * const { isAuthenticated, user, login, logout } = useAuth()\n */\nexport function useAuth(): UseAuthReturn {\n const { isLoading, isAuthenticated, user, error, login, logout, refreshUser } =\n useAuthContext();\n\n return { isLoading, isAuthenticated, user, error, login, logout, refreshUser };\n}\n","\"use client\";\n\nimport { useAuthContext } from \"../core/auth/AuthContext\";\n\nexport interface UsePermissionsReturn {\n /** All roles assigned to the current user */\n roles: string[];\n\n /** All permissions assigned to the current user */\n permissions: string[];\n\n /**\n * Returns true if the user has the specified permission.\n * Always returns false when the user is not authenticated.\n *\n * @example\n * can(\"users.delete\") // true | false\n */\n can(permission: string): boolean;\n\n /**\n * Returns true if the user has ANY of the specified permissions.\n *\n * @example\n * canAny([\"posts.edit\", \"posts.create\"])\n */\n canAny(permissions: string[]): boolean;\n\n /**\n * Returns true if the user has ALL of the specified permissions.\n *\n * @example\n * canAll([\"orders.view\", \"orders.export\"])\n */\n canAll(permissions: string[]): boolean;\n\n /**\n * Returns true if the user has the specified role.\n * Always returns false when the user is not authenticated.\n *\n * @example\n * hasRole(\"admin\") // true | false\n */\n hasRole(role: string): boolean;\n}\n\n/**\n * Access the current user's RBAC permissions and roles.\n *\n * @example\n * const { can, hasRole } = usePermissions()\n * can(\"users.create\") // true | false\n * hasRole(\"admin\") // true | false\n */\nexport function usePermissions(): UsePermissionsReturn {\n const { user, can, canAny, canAll, hasRole } = useAuthContext();\n\n return {\n roles: user?.roles ?? [],\n permissions: user?.permissions ?? [],\n can,\n canAny,\n canAll,\n hasRole,\n };\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { ShieldOff } from \"lucide-react\";\nimport { Button } from \"../ui/button\";\n\nexport interface AccessDeniedProps {\n /** Custom message. Default: \"You do not have permission to access this page.\" */\n message?: string;\n /** Label for the action button. If provided, onAction must also be set. */\n actionLabel?: string;\n /** Callback for the action button (e.g. navigate back or to home) */\n onAction?: () => void;\n}\n\n/**\n * Default access-denied page shown when a user attempts to access\n * a resource they are not authorized to view.\n */\nexport function AccessDenied({\n message = \"You do not have permission to access this page.\",\n actionLabel,\n onAction,\n}: AccessDeniedProps) {\n return (\n <div className=\"flex min-h-full w-full flex-col items-center justify-center gap-6 p-10 text-center\">\n <div className=\"flex size-14 items-center justify-center rounded-full bg-muted\">\n <ShieldOff className=\"size-7 text-muted-foreground\" />\n </div>\n\n <div className=\"flex flex-col gap-2\">\n <h2 className=\"text-lg font-semibold text-foreground\">Access Denied</h2>\n <p className=\"max-w-sm text-sm text-muted-foreground\">{message}</p>\n </div>\n\n {actionLabel && onAction && (\n <Button variant=\"outline\" onClick={onAction}>\n {actionLabel}\n </Button>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { useAuthContext } from \"../../core/auth/AuthContext\";\nimport { canAccessResource } from \"../../core/rbac/evaluator\";\nimport type { ResourceMeta } from \"../../types/resource\";\nimport { AccessDenied } from \"../feedback/AccessDenied\";\n\nexport interface ResourceGuardProps {\n /** The access requirements to evaluate */\n meta: ResourceMeta;\n /** Protected content */\n children: React.ReactNode;\n /** Custom fallback rendered when access is denied. Defaults to <AccessDenied /> */\n fallback?: React.ReactNode;\n}\n\n/**\n * Renders `children` only when the current user satisfies the resource's\n * `requiredRoles` and `requiredPermissions` constraints.\n *\n * @example\n * <ResourceGuard meta={{ requiredPermissions: [\"users.read\"] }}>\n * <UsersPage />\n * </ResourceGuard>\n */\nexport function ResourceGuard({ meta, children, fallback }: ResourceGuardProps) {\n const { user, isLoading } = useAuthContext();\n\n if (isLoading) return null;\n\n if (!canAccessResource(user, meta)) {\n return fallback !== undefined ? <>{fallback}</> : <AccessDenied />;\n }\n\n return <>{children}</>;\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { useAuthContext } from \"../../core/auth/AuthContext\";\n\nexport interface CanProps {\n /** Permission string to check */\n permission?: string;\n /** Role string to check */\n role?: string;\n /** If true, checks ALL listed permissions instead of just one */\n permissions?: string[];\n /** Content rendered when access is granted */\n children: React.ReactNode;\n /**\n * Content rendered when access is denied.\n * Pass a disabled button or any placeholder. Defaults to null (hidden).\n */\n fallback?: React.ReactNode;\n}\n\n/**\n * Conditionally renders `children` based on a permission or role check.\n *\n * @example\n * // Hide a button when user lacks the permission\n * <Can permission=\"users.delete\">\n * <DeleteButton />\n * </Can>\n *\n * // Disable a button instead of hiding it\n * <Can permission=\"users.create\" fallback={<CreateButton disabled />}>\n * <CreateButton />\n * </Can>\n *\n * // Role-based\n * <Can role=\"admin\">\n * <AdminPanel />\n * </Can>\n */\nexport function Can({ permission, role, permissions, children, fallback = null }: CanProps) {\n const { can, hasRole, canAll } = useAuthContext();\n\n let granted = true;\n\n if (permission) {\n granted = can(permission);\n } else if (role) {\n granted = hasRole(role);\n } else if (permissions && permissions.length > 0) {\n granted = canAll(permissions);\n }\n\n return granted ? <>{children}</> : <>{fallback}</>;\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as SelectPrimitive from \"@radix-ui/react-select\";\nimport { Check, ChevronDown } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\n\nconst Select = SelectPrimitive.Root;\nconst SelectGroup = SelectPrimitive.Group;\nconst SelectValue = SelectPrimitive.Value;\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-9 w-full items-center justify-between rounded-lg border border-input bg-background px-3 py-2 text-base shadow-xs placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n));\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n \"flex cursor-pointer items-center justify-center py-1\",\n className,\n )}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n));\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n \"flex cursor-pointer items-center justify-center py-1\",\n className,\n )}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n));\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName;\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 max-h-96 min-w-32 overflow-hidden rounded-lg border border-border bg-background shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className,\n )}\n position={position}\n {...props}\n >\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\",\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n));\nSelectContent.displayName = SelectPrimitive.Content.displayName;\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full cursor-pointer select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-base outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className,\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n));\nSelectItem.displayName = SelectPrimitive.Item.displayName;\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n));\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName;\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n};\n","\"use client\";\n\nimport React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\n\ntype ModalWidth = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"full\";\n\nconst WIDTH_CLASS_MAP: Record<ModalWidth, string> = {\n sm: \"max-w-md\",\n md: \"max-w-lg\",\n lg: \"max-w-2xl\",\n xl: \"max-w-4xl\",\n \"2xl\": \"max-w-6xl\",\n full: \"max-w-[95vw]\",\n};\n\nexport interface RenderModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title?: React.ReactNode;\n description?: React.ReactNode;\n children?: React.ReactNode;\n renderContent?: () => React.ReactNode;\n footer?: React.ReactNode;\n width?: ModalWidth;\n closeOnOverlayClick?: boolean;\n showCloseButton?: boolean;\n overlayClassName?: string;\n panelClassName?: string;\n contentClassName?: string;\n}\n\nexport function RenderModal({\n open,\n onOpenChange,\n title,\n description,\n children,\n renderContent,\n footer,\n width = \"lg\",\n closeOnOverlayClick = true,\n showCloseButton = true,\n overlayClassName,\n panelClassName,\n contentClassName,\n}: RenderModalProps) {\n React.useEffect(() => {\n if (!open) return;\n\n function handleEscape(event: KeyboardEvent) {\n if (event.key === \"Escape\") {\n onOpenChange(false);\n }\n }\n\n window.addEventListener(\"keydown\", handleEscape);\n return () => window.removeEventListener(\"keydown\", handleEscape);\n }, [open, onOpenChange]);\n\n if (!open) return null;\n\n const hasHeader = Boolean(title || description || showCloseButton);\n const content = renderContent ? renderContent() : children;\n\n return createPortal(\n <div\n className={cn(\n \"fixed inset-0 z-[2147483647] flex items-center justify-center bg-black/30 p-4 backdrop-blur-[1px]\",\n overlayClassName,\n )}\n onMouseDown={(event) => {\n if (!closeOnOverlayClick) return;\n if (event.target === event.currentTarget) {\n onOpenChange(false);\n }\n }}\n >\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n className={cn(\n \"w-full overflow-hidden rounded-xl border border-border bg-background shadow-xl\",\n WIDTH_CLASS_MAP[width],\n panelClassName,\n )}\n >\n {hasHeader && (\n <header className=\"flex items-start justify-between gap-4 px-5 py-4\">\n <div className=\"min-w-0\">\n {title && (\n <h2 className=\"truncate text-lg font-semibold text-foreground\">\n {title}\n </h2>\n )}\n {description && (\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n\n {showCloseButton && (\n <button\n type=\"button\"\n aria-label=\"Close modal\"\n className=\"inline-flex size-8 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\"\n onClick={() => onOpenChange(false)}\n >\n <X className=\"size-4\" />\n </button>\n )}\n </header>\n )}\n\n <div\n className={cn(\n \"max-h-[80vh] overflow-auto px-5 py-4\",\n contentClassName,\n )}\n >\n {content}\n </div>\n\n {footer && <footer className=\"px-5 py-4\">{footer}</footer>}\n </div>\n </div>,\n document.body,\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport {\n ChevronDown,\n ChevronRight,\n CircleDot,\n Settings,\n UserCog,\n X,\n} from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\nimport { RenderModal } from \"./render-modal\";\nimport type { RenderModalProps } from \"./render-modal\";\n\nexport type SettingsSection = \"general\" | \"personalization\" | \"users\";\n\nexport interface AccentOption {\n value: string;\n label: string;\n previewClassName?: string;\n}\n\nexport interface SettingsModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n mode: \"light\" | \"dark\";\n onModeChange: (mode: \"light\" | \"dark\") => void;\n accent: string;\n onAccentChange: (accent: string) => void;\n accentOptions?: AccentOption[];\n personalizationContent?: React.ReactNode;\n usersContent?: React.ReactNode;\n defaultSection?: SettingsSection;\n width?: RenderModalProps[\"width\"];\n closeOnOverlayClick?: boolean;\n overlayClassName?: string;\n panelClassName?: string;\n contentClassName?: string;\n sidebarClassName?: string;\n bodyClassName?: string;\n}\n\nconst DEFAULT_ACCENT_OPTIONS: AccentOption[] = [\n { value: \"neutral\", label: \"Neutral\", previewClassName: \"bg-foreground\" },\n { value: \"blue\", label: \"Blue\", previewClassName: \"bg-blue-600\" },\n { value: \"green\", label: \"Green\", previewClassName: \"bg-emerald-600\" },\n { value: \"orange\", label: \"Orange\", previewClassName: \"bg-orange-500\" },\n];\n\nexport function SettingsModal({\n open,\n onOpenChange,\n mode,\n onModeChange,\n accent,\n onAccentChange,\n accentOptions = DEFAULT_ACCENT_OPTIONS,\n personalizationContent,\n usersContent,\n defaultSection = \"general\",\n width = \"xl\",\n closeOnOverlayClick = true,\n overlayClassName,\n panelClassName,\n contentClassName,\n sidebarClassName,\n bodyClassName,\n}: SettingsModalProps) {\n const [section, setSection] = React.useState<SettingsSection>(defaultSection);\n\n React.useEffect(() => {\n if (open) {\n setSection(defaultSection);\n }\n }, [open, defaultSection]);\n\n if (!open) return null;\n\n return (\n <RenderModal\n open={open}\n onOpenChange={onOpenChange}\n width={width}\n closeOnOverlayClick={closeOnOverlayClick}\n showCloseButton={false}\n overlayClassName={overlayClassName}\n contentClassName={cn(\n \"relative h-full overflow-hidden p-0\",\n contentClassName,\n )}\n panelClassName={cn(\"h-[500px] max-w-[800px]\", panelClassName)}\n >\n <div className=\"flex h-full\">\n <button\n type=\"button\"\n onClick={() => onOpenChange(false)}\n className=\"absolute right-4 top-4 z-10 inline-flex size-8 items-center justify-center rounded-md text-foreground/70 transition-colors hover:bg-accent hover:text-foreground\"\n aria-label=\"Close settings\"\n >\n <X className=\"size-4\" />\n </button>\n\n <aside\n className={cn(\n \"flex h-full w-64 shrink-0 flex-col gap-1 overflow-y-auto bg-sidebar p-2\",\n sidebarClassName,\n )}\n >\n <SettingsSectionButton\n icon={Settings}\n label=\"General\"\n active={section === \"general\"}\n onClick={() => setSection(\"general\")}\n />\n <SettingsSectionButton\n icon={CircleDot}\n label=\"Personalization\"\n active={section === \"personalization\"}\n onClick={() => setSection(\"personalization\")}\n />\n <SettingsSectionButton\n icon={UserCog}\n label=\"Users\"\n active={section === \"users\"}\n onClick={() => setSection(\"users\")}\n />\n </aside>\n\n <div className={cn(\"flex min-w-0 flex-1 flex-col\", bodyClassName)}>\n <header className=\"flex h-16 items-center pr-12\">\n <div className=\"flex items-center gap-2 px-4\">\n <span className=\"text-sm text-muted-foreground\">Settings</span>\n <ChevronRight className=\"size-3.5 text-muted-foreground\" />\n <span className=\"text-sm text-foreground capitalize\">\n {section}\n </span>\n </div>\n </header>\n\n <div className=\"flex min-h-0 flex-1 flex-col overflow-y-auto px-4 pb-4\">\n <div className=\"h-px w-full bg-border\" />\n\n {section === \"general\" && (\n <div className=\"flex flex-col\">\n <SettingsRow label=\"Appearance\">\n <div className=\"relative inline-flex items-center\">\n <select\n value={mode}\n onChange={(e) =>\n onModeChange(e.target.value as \"light\" | \"dark\")\n }\n className=\"h-8 appearance-none rounded-lg px-2.5 pr-7 text-sm font-medium text-foreground outline-none transition-colors hover:bg-accent\"\n >\n <option value=\"light\">Light</option>\n <option value=\"dark\">Dark</option>\n </select>\n <ChevronDown className=\"pointer-events-none absolute right-2 size-4 text-foreground\" />\n </div>\n </SettingsRow>\n\n <SettingsRow label=\"Accent color\">\n <div className=\"relative inline-flex items-center\">\n <select\n value={accent}\n onChange={(e) => onAccentChange(e.target.value)}\n className=\"h-8 appearance-none rounded-lg pl-8 pr-7 text-sm font-medium text-foreground outline-none transition-colors hover:bg-accent\"\n >\n {accentOptions.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n <span\n className={cn(\n \"pointer-events-none absolute left-2.5 inline-flex size-2 rounded-full\",\n accentOptions.find((o) => o.value === accent)\n ?.previewClassName ?? \"bg-foreground\",\n )}\n />\n <ChevronDown className=\"pointer-events-none absolute right-2 size-4 text-foreground\" />\n </div>\n </SettingsRow>\n </div>\n )}\n\n {section === \"personalization\" && (\n <div className=\"pt-3\">{personalizationContent}</div>\n )}\n\n {section === \"users\" && <div className=\"pt-3\">{usersContent}</div>}\n </div>\n </div>\n </div>\n </RenderModal>\n );\n}\n\ninterface SettingsSectionButtonProps {\n icon: React.ComponentType<{ className?: string }>;\n label: string;\n active?: boolean;\n onClick: () => void;\n}\n\nfunction SettingsSectionButton({\n icon: Icon,\n label,\n active,\n onClick,\n}: SettingsSectionButtonProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n \"flex h-8 w-full items-center gap-2 rounded-md px-2 text-left text-sm text-sidebar-foreground\",\n \"transition-colors hover:bg-sidebar-accent\",\n active && \"bg-sidebar-accent font-medium\",\n )}\n >\n <Icon className=\"size-4 shrink-0\" />\n <span className=\"truncate\">{label}</span>\n </button>\n );\n}\n\ninterface SettingsRowProps {\n label: string;\n children: React.ReactNode;\n}\n\nfunction SettingsRow({ label, children }: SettingsRowProps) {\n return (\n <>\n <div className=\"flex items-center justify-between py-3\">\n <p className=\"text-sm text-foreground\">{label}</p>\n <div className=\"flex items-center\">{children}</div>\n </div>\n <div className=\"h-px w-full bg-border\" />\n </>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { MoreHorizontal } from \"lucide-react\";\nimport { Button } from \"./button\";\nimport { cn } from \"../../lib/utils\";\n\nexport interface TableActionConfirmOptions {\n title?: string;\n description?: string;\n confirmLabel?: string;\n cancelLabel?: string;\n}\n\nexport interface TableActionItem {\n key: string;\n label: string;\n onSelect: () => void;\n disabled?: boolean;\n variant?: \"default\" | \"destructive\";\n confirm?: boolean | TableActionConfirmOptions;\n}\n\nexport interface TableActionMenuProps {\n items: TableActionItem[];\n ariaLabel?: string;\n}\n\nexport function TableActionMenu({\n items,\n ariaLabel = \"Open actions\",\n}: TableActionMenuProps) {\n const [open, setOpen] = React.useState(false);\n const [confirmingItem, setConfirmingItem] =\n React.useState<TableActionItem | null>(null);\n const [menuPosition, setMenuPosition] = React.useState({ top: 0, left: 0 });\n const dropdownRef = React.useRef<HTMLDivElement | null>(null);\n const triggerRef = React.useRef<HTMLButtonElement | null>(null);\n\n const getConfirmOptions = React.useCallback(\n (item: TableActionItem): TableActionConfirmOptions | null => {\n if (item.confirm === false) return null;\n if (typeof item.confirm === \"object\") return item.confirm;\n if (item.confirm || item.variant === \"destructive\") {\n return {};\n }\n return null;\n },\n [],\n );\n\n const confirmOptions = confirmingItem\n ? getConfirmOptions(confirmingItem)\n : null;\n\n const confirmTitle =\n confirmOptions?.title ??\n (confirmingItem?.variant === \"destructive\"\n ? \"Confirm deletion\"\n : \"Confirm action\");\n\n const confirmDescription =\n confirmOptions?.description ??\n (confirmingItem?.variant === \"destructive\"\n ? \"This action cannot be undone.\"\n : \"Please confirm that you want to continue.\");\n\n const confirmLabel = confirmOptions?.confirmLabel ?? \"OK\";\n const cancelLabel = confirmOptions?.cancelLabel ?? \"Cancel\";\n\n const handleItemSelect = React.useCallback(\n (item: TableActionItem) => {\n const nextConfirmOptions = getConfirmOptions(item);\n if (nextConfirmOptions) {\n setConfirmingItem(item);\n setOpen(false);\n return;\n }\n\n item.onSelect();\n setOpen(false);\n },\n [getConfirmOptions],\n );\n\n const handleConfirm = React.useCallback(() => {\n if (!confirmingItem) return;\n confirmingItem.onSelect();\n setConfirmingItem(null);\n }, [confirmingItem]);\n\n const updateMenuPosition = React.useCallback(() => {\n if (!triggerRef.current) return;\n const rect = triggerRef.current.getBoundingClientRect();\n setMenuPosition({\n top: rect.bottom + 4,\n left: rect.right,\n });\n }, []);\n\n React.useEffect(() => {\n function handleOutsideClick(event: MouseEvent) {\n const target = event.target as Node;\n if (dropdownRef.current?.contains(target)) return;\n if (triggerRef.current?.contains(target)) return;\n setOpen(false);\n }\n\n function handleEscape(event: KeyboardEvent) {\n if (event.key === \"Escape\") {\n if (confirmingItem) {\n setConfirmingItem(null);\n return;\n }\n\n setOpen(false);\n }\n }\n\n if (open || confirmingItem) {\n updateMenuPosition();\n document.addEventListener(\"mousedown\", handleOutsideClick);\n window.addEventListener(\"resize\", updateMenuPosition);\n window.addEventListener(\"scroll\", updateMenuPosition, true);\n document.addEventListener(\"keydown\", handleEscape);\n }\n\n return () => {\n document.removeEventListener(\"mousedown\", handleOutsideClick);\n window.removeEventListener(\"resize\", updateMenuPosition);\n window.removeEventListener(\"scroll\", updateMenuPosition, true);\n document.removeEventListener(\"keydown\", handleEscape);\n };\n }, [confirmingItem, open, updateMenuPosition]);\n\n const visibleItems = items.filter(Boolean);\n if (visibleItems.length === 0) return null;\n\n return (\n <div className=\"relative inline-flex\">\n <button\n ref={triggerRef}\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n className=\"inline-flex size-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label={ariaLabel}\n >\n <MoreHorizontal className=\"size-4\" />\n </button>\n\n {open &&\n createPortal(\n <div\n ref={dropdownRef}\n role=\"menu\"\n className=\"fixed z-[2147483647] min-w-[120px] -translate-x-full rounded-lg border border-border bg-popover p-1 shadow-md\"\n style={{ top: menuPosition.top, left: menuPosition.left }}\n >\n {visibleItems.map((item) => (\n <button\n key={item.key}\n type=\"button\"\n role=\"menuitem\"\n disabled={item.disabled}\n onClick={() => handleItemSelect(item)}\n className={cn(\n \"flex w-full items-center rounded-md px-2 py-1.5 text-left text-sm transition-colors\",\n \"hover:bg-accent disabled:cursor-not-allowed disabled:opacity-50\",\n item.variant === \"destructive\"\n ? \"text-destructive\"\n : \"text-popover-foreground\",\n )}\n >\n {item.label}\n </button>\n ))}\n </div>,\n document.body,\n )}\n\n {confirmingItem &&\n createPortal(\n <div className=\"fixed inset-0 z-[2147483647] flex items-center justify-center bg-neutral-950/30 p-4 backdrop-blur-[1.5px]\">\n <div className=\"w-full max-w-md rounded-xl border border-border bg-background p-6 shadow-lg\">\n <div className=\"space-y-2\">\n <h2 className=\"text-lg font-semibold text-foreground\">\n {confirmTitle}\n </h2>\n <p className=\"text-sm text-muted-foreground\">\n {confirmDescription}\n </p>\n </div>\n\n <div className=\"mt-6 flex justify-end gap-2\">\n <Button\n variant=\"outline\"\n onClick={() => setConfirmingItem(null)}\n >\n {cancelLabel}\n </Button>\n <Button\n variant={\n confirmingItem.variant === \"destructive\"\n ? \"destructive\"\n : \"default\"\n }\n onClick={handleConfirm}\n >\n {confirmLabel}\n </Button>\n </div>\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nexport interface TableBadgeProps {\n children: React.ReactNode;\n tone?: \"neutral\" | \"success\" | \"danger\" | \"warning\";\n className?: string;\n}\n\nconst toneClasses: Record<NonNullable<TableBadgeProps[\"tone\"]>, string> = {\n neutral: \"bg-secondary text-secondary-foreground\",\n success: \"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300\",\n danger: \"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-300\",\n warning: \"bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-300\",\n};\n\nexport function TableBadge({\n children,\n tone = \"neutral\",\n className,\n}: TableBadgeProps) {\n return (\n <span\n className={cn(\n \"inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium\",\n toneClasses[tone],\n className\n )}\n >\n {children}\n </span>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nexport const Table = React.forwardRef<\n HTMLTableElement,\n React.TableHTMLAttributes<HTMLTableElement>\n>(({ className, ...props }, ref) => (\n <div className=\"relative w-full overflow-auto\">\n <table\n ref={ref}\n className={cn(\"w-full caption-bottom text-sm bg-background\", className)}\n {...props}\n />\n </div>\n));\nTable.displayName = \"Table\";\n\nexport const TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead\n ref={ref}\n className={cn(\"bg-muted/50 [&_tr]:border-b\", className)}\n {...props}\n />\n));\nTableHeader.displayName = \"TableHeader\";\n\nexport const TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n));\nTableBody.displayName = \"TableBody\";\n\nexport const TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn(\n \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n));\nTableFooter.displayName = \"TableFooter\";\n\nexport const TableRow = React.forwardRef<\n HTMLTableRowElement,\n React.HTMLAttributes<HTMLTableRowElement>\n>(({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\"h-[53px] border-b transition-colors hover:bg-muted/30 data-[state=selected]:bg-muted\", className)}\n {...props}\n />\n));\nTableRow.displayName = \"TableRow\";\n\nexport const TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n \"h-10 px-2 text-left align-middle text-sm font-medium text-foreground\",\n className\n )}\n {...props}\n />\n));\nTableHead.displayName = \"TableHead\";\n\nexport const TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(\"px-2 py-2 align-middle text-sm\", className)}\n {...props}\n />\n));\nTableCell.displayName = \"TableCell\";\n\nexport const TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nTableCaption.displayName = \"TableCaption\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport {\n closestCenter,\n DndContext,\n KeyboardSensor,\n PointerSensor,\n type DragEndEvent,\n type UniqueIdentifier,\n useSensor,\n useSensors,\n} from \"@dnd-kit/core\";\nimport {\n SortableContext,\n arrayMove,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport {\n type ColumnDef,\n type Row,\n flexRender,\n getCoreRowModel,\n useReactTable,\n} from \"@tanstack/react-table\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"./table\";\nimport { cn } from \"../../lib/utils\";\n\ninterface DataTableRowDragOptions<TData> {\n getRowId: (row: TData) => string;\n onReorder: (reorderedRows: TData[]) => void;\n}\n\nexport interface DataTableProps<TData, TValue> {\n columns: ColumnDef<TData, TValue>[];\n data: TData[];\n className?: string;\n emptyMessage?: string;\n rowDragOptions?: DataTableRowDragOptions<TData>;\n}\n\ninterface SortableDataTableRowProps<TData> {\n row: Row<TData>;\n rowId: string;\n}\n\nfunction SortableDataTableRow<TData>({\n row,\n rowId,\n}: SortableDataTableRowProps<TData>) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: rowId });\n const verticalOnlyTransform = transform\n ? {\n ...transform,\n x: 0,\n }\n : null;\n\n return (\n <TableRow\n ref={setNodeRef}\n data-state={row.getIsSelected() && \"selected\"}\n className=\"cursor-grab active:cursor-grabbing\"\n style={{\n transform: CSS.Transform.toString(verticalOnlyTransform),\n transition,\n opacity: isDragging ? 0.5 : 1,\n position: \"relative\",\n zIndex: isDragging ? 1 : 0,\n willChange: \"transform\",\n touchAction: \"none\",\n }}\n {...attributes}\n {...listeners}\n >\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n </TableRow>\n );\n}\n\nexport function DataTable<TData, TValue>({\n columns,\n data,\n className,\n emptyMessage = \"No results.\",\n rowDragOptions,\n}: DataTableProps<TData, TValue>) {\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 6,\n },\n }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n );\n\n const table = useReactTable({\n data,\n columns,\n getCoreRowModel: getCoreRowModel(),\n });\n\n const rowIds = React.useMemo<UniqueIdentifier[]>(\n () =>\n rowDragOptions ? data.map((row) => rowDragOptions.getRowId(row)) : [],\n [data, rowDragOptions],\n );\n\n const handleDragEnd = React.useCallback(\n (event: DragEndEvent) => {\n const { active, over } = event;\n\n if (!rowDragOptions || !over || active.id === over.id) {\n return;\n }\n\n const oldIndex = data.findIndex(\n (row) => rowDragOptions.getRowId(row) === String(active.id),\n );\n const newIndex = data.findIndex(\n (row) => rowDragOptions.getRowId(row) === String(over.id),\n );\n\n if (oldIndex < 0 || newIndex < 0 || oldIndex === newIndex) {\n return;\n }\n\n rowDragOptions.onReorder(arrayMove(data, oldIndex, newIndex));\n },\n [data, rowDragOptions],\n );\n\n return (\n <DndContext\n sensors={rowDragOptions ? sensors : undefined}\n collisionDetection={closestCenter}\n onDragEnd={rowDragOptions ? handleDragEnd : undefined}\n >\n <div className={cn(\"rounded-md border\", className)}>\n <Table>\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead key={header.id}>\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {table.getRowModel().rows.length ? (\n rowDragOptions ? (\n <SortableContext\n items={rowIds}\n strategy={verticalListSortingStrategy}\n >\n {table.getRowModel().rows.map((row) => {\n const rowId = rowDragOptions.getRowId(row.original);\n\n return (\n <SortableDataTableRow\n key={rowId}\n row={row}\n rowId={rowId}\n />\n );\n })}\n </SortableContext>\n ) : (\n table.getRowModel().rows.map((row) => (\n <TableRow\n key={row.id}\n data-state={row.getIsSelected() && \"selected\"}\n >\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id}>\n {flexRender(\n cell.column.columnDef.cell,\n cell.getContext(),\n )}\n </TableCell>\n ))}\n </TableRow>\n ))\n )\n ) : (\n <TableRow>\n <TableCell\n colSpan={columns.length}\n className=\"h-24 text-center\"\n >\n {emptyMessage}\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </div>\n </DndContext>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { ChevronsLeft, ChevronLeft, ChevronRight, ChevronsRight } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\n\nexport type TablePageSizeOption = number | \"all\";\n\nexport interface TablePaginationProps {\n totalRows: number;\n selectedRows?: number;\n page: number;\n pageSize: number;\n pageSizeOptions?: TablePageSizeOption[];\n onPageChange: (page: number) => void;\n onPageSizeChange: (pageSize: number) => void;\n className?: string;\n}\n\nexport function TablePagination({\n totalRows,\n selectedRows,\n page,\n pageSize,\n pageSizeOptions = [10, 20, 50, 100, \"all\"],\n onPageChange,\n onPageSizeChange,\n className,\n}: TablePaginationProps) {\n const safePageSize = Math.max(1, pageSize);\n const totalPages = Math.max(1, Math.ceil(totalRows / safePageSize));\n const safePage = Math.min(Math.max(1, page), totalPages);\n\n const canGoPrev = safePage > 1;\n const canGoNext = safePage < totalPages;\n const hasAllOption = pageSizeOptions.includes(\"all\");\n const currentPageSizeValue =\n hasAllOption && totalRows > 0 && safePageSize === totalRows\n ? \"all\"\n : String(safePageSize);\n\n const selectedCount = selectedRows ?? 0;\n const rowsText = `${selectedCount} of ${totalRows} row(s) selected.`;\n\n return (\n <div className={cn(\"flex h-9 w-full items-center justify-between gap-2\", className)}>\n <p className=\"text-sm text-muted-foreground\">{rowsText}</p>\n\n <div className=\"flex items-center gap-8 text-foreground\">\n <div className=\"flex items-center gap-2\">\n <span className=\"pr-2 text-sm font-medium text-foreground\">Rows per page</span>\n <select\n value={currentPageSizeValue}\n onChange={(event) => {\n const nextValue = event.target.value;\n if (nextValue === \"all\") {\n onPageSizeChange(Math.max(1, totalRows));\n return;\n }\n onPageSizeChange(Number(nextValue));\n }}\n className=\"h-9 w-20 rounded-md border border-input bg-background px-3 text-sm shadow-sm\"\n aria-label=\"Rows per page\"\n >\n {pageSizeOptions.map((option) => (\n <option key={String(option)} value={String(option)}>\n {option === \"all\" ? \"All\" : option}\n </option>\n ))}\n </select>\n </div>\n\n <span className=\"pr-2 text-sm font-medium\">Page {safePage} of {totalPages}</span>\n\n <div className=\"flex items-center gap-2\">\n <IconButton\n label=\"Previous page\"\n disabled={!canGoPrev}\n onClick={() => onPageChange(safePage - 1)}\n icon={<ChevronLeft className=\"size-4\" />}\n />\n <IconButton\n label=\"First page\"\n disabled={!canGoPrev}\n onClick={() => onPageChange(1)}\n icon={<ChevronsLeft className=\"size-4\" />}\n />\n <IconButton\n label=\"Next page\"\n disabled={!canGoNext}\n onClick={() => onPageChange(safePage + 1)}\n icon={<ChevronRight className=\"size-4\" />}\n />\n <IconButton\n label=\"Last page\"\n disabled={!canGoNext}\n onClick={() => onPageChange(totalPages)}\n icon={<ChevronsRight className=\"size-4\" />}\n />\n </div>\n </div>\n </div>\n );\n}\n\ninterface IconButtonProps {\n label: string;\n icon: React.ReactNode;\n disabled?: boolean;\n onClick: () => void;\n}\n\nfunction IconButton({ label, icon, disabled, onClick }: IconButtonProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n aria-label={label}\n className=\"inline-flex size-8 items-center justify-center rounded-md border border-input bg-background text-foreground shadow-sm transition-colors hover:bg-accent disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {icon}\n </button>\n );\n}\n"]}