@dimaan/ui 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/dashboard-layout/context.ts","../src/lib/utils.ts","../src/components/dashboard-layout/DashboardContent.tsx","../src/components/dashboard-layout/DashboardLayout.tsx","../src/components/dashboard-layout/DashboardMain.tsx","../src/components/header/DashboardHeader.tsx","../src/components/header/HeaderActions.tsx","../src/components/button/buttonVariants.ts","../src/components/button/Button.tsx","../src/components/header/HeaderCollapseTrigger.tsx","../src/components/header/HeaderMobileTrigger.tsx","../src/components/header/HeaderSearch.tsx","../src/components/header/HeaderTitle.tsx","../src/components/sidebar/Sidebar.tsx","../src/components/sidebar/SidebarFooter.tsx","../src/components/sidebar/SidebarGroup.tsx","../src/components/sidebar/SidebarHeader.tsx","../src/components/sidebar/SidebarNav.tsx","../src/components/sidebar/SidebarNavGroup.tsx","../src/components/sidebar/SidebarNavItem.tsx","../src/components/app-shell/AppShell.tsx","../src/components/avatar/Avatar.tsx","../src/components/checkbox/Checkbox.tsx","../src/components/input/inputVariants.ts","../src/components/input/Input.tsx","../src/components/language-switcher/LanguageSwitcher.tsx","../src/hooks/use-direction.ts","../src/components/table/components/Pagination.tsx","../src/components/table/components/Toolbar.tsx","../src/components/table/tableVariants.ts","../src/components/table/useTableState.ts","../src/components/table/Table.tsx"],"names":["jsx","Button","forwardRef","jsxs","Fragment","useState","useCallback","useEffect","sizeClass","Checkbox","Input","useId","ChevronLeft","useMemo","ChevronDown"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext } from 'react';\n\nexport interface DashboardLayoutContextValue {\n collapsed: boolean;\n setCollapsed: (next: boolean) => void;\n toggleCollapsed: () => void;\n mobileOpen: boolean;\n setMobileOpen: (next: boolean) => void;\n toggleMobileOpen: () => void;\n}\n\nexport const DashboardLayoutContext = createContext<DashboardLayoutContextValue | null>(null);\n\nexport function useDashboardLayout(): DashboardLayoutContextValue {\n const ctx = useContext(DashboardLayoutContext);\n if (!ctx) {\n throw new Error('useDashboardLayout must be used within a <DashboardLayout> component.');\n }\n return ctx;\n}\n","import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type DashboardContentProps = HTMLAttributes<HTMLElement>;\n\nexport function DashboardContent({ className, children, ...props }: DashboardContentProps) {\n return (\n <main\n className={cn(\n 'flex min-h-[calc(100vh-var(--header-height))] flex-1 flex-col gap-6 p-4 sm:p-6 lg:p-8',\n className\n )}\n {...props}\n >\n {children}\n </main>\n );\n}\n","import { type HTMLAttributes, type ReactNode, useCallback, useMemo, useState } from 'react';\nimport { cn } from '../../lib/utils';\nimport { DashboardLayoutContext, type DashboardLayoutContextValue } from './context';\n\nexport interface DashboardLayoutProps extends HTMLAttributes<HTMLDivElement> {\n defaultCollapsed?: boolean;\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n children: ReactNode;\n}\n\nexport function DashboardLayout({\n defaultCollapsed = false,\n collapsed: collapsedProp,\n onCollapsedChange,\n className,\n children,\n ...props\n}: DashboardLayoutProps) {\n const [internalCollapsed, setInternalCollapsed] = useState(defaultCollapsed);\n const [mobileOpen, setMobileOpenState] = useState(false);\n\n const isControlled = collapsedProp !== undefined;\n const collapsed = isControlled ? collapsedProp : internalCollapsed;\n\n const setCollapsed = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalCollapsed(next);\n onCollapsedChange?.(next);\n },\n [isControlled, onCollapsedChange]\n );\n\n const toggleCollapsed = useCallback(() => {\n setCollapsed(!collapsed);\n }, [collapsed, setCollapsed]);\n\n const setMobileOpen = useCallback((next: boolean) => {\n setMobileOpenState(next);\n }, []);\n\n const toggleMobileOpen = useCallback(() => {\n setMobileOpenState((prev) => !prev);\n }, []);\n\n const value = useMemo<DashboardLayoutContextValue>(\n () => ({\n collapsed,\n setCollapsed,\n toggleCollapsed,\n mobileOpen,\n setMobileOpen,\n toggleMobileOpen,\n }),\n [collapsed, setCollapsed, toggleCollapsed, mobileOpen, setMobileOpen, toggleMobileOpen]\n );\n\n return (\n <DashboardLayoutContext.Provider value={value}>\n <div\n data-collapsed={collapsed ? 'true' : 'false'}\n className={cn(\n 'relative flex min-h-screen w-full bg-background text-foreground font-sans antialiased',\n className\n )}\n {...props}\n >\n {children}\n </div>\n </DashboardLayoutContext.Provider>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\nimport { useDashboardLayout } from './context';\n\nexport type DashboardMainProps = HTMLAttributes<HTMLDivElement>;\n\nexport function DashboardMain({ className, children, ...props }: DashboardMainProps) {\n const { collapsed } = useDashboardLayout();\n\n return (\n <div\n className={cn(\n 'flex min-h-screen flex-1 flex-col transition-[margin] duration-200 ease-out',\n // On desktop, push the main column past the fixed sidebar using logical margin.\n collapsed ? 'lg:ms-[var(--sidebar-width-collapsed)]' : 'lg:ms-[var(--sidebar-width)]',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type DashboardHeaderProps = HTMLAttributes<HTMLElement>;\n\nexport function DashboardHeader({ className, children, ...props }: DashboardHeaderProps) {\n return (\n <header\n className={cn(\n 'sticky top-0 z-20 flex h-[var(--header-height)] shrink-0 items-center gap-3 border-b border-header-border bg-header/80 px-4 text-header-foreground backdrop-blur-md sm:px-6',\n className\n )}\n {...props}\n >\n {children}\n </header>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type HeaderActionsProps = HTMLAttributes<HTMLDivElement>;\n\nexport function HeaderActions({ className, children, ...props }: HeaderActionsProps) {\n return (\n <div className={cn('ms-auto flex items-center gap-1', className)} {...props}>\n {children}\n </div>\n );\n}\n","export type ButtonVariant =\n | 'primary'\n | 'secondary'\n | 'outline'\n | 'ghost'\n | 'destructive'\n | 'success'\n | 'warning'\n | 'link';\n\nexport type ButtonSize = 'sm' | 'md' | 'lg' | 'icon' | 'icon-sm';\n\nexport const buttonVariantClass: Record<ButtonVariant, string> = {\n primary:\n 'bg-primary text-primary-foreground shadow-sm hover:bg-primary/90 focus-visible:ring-primary/40',\n secondary: 'bg-muted text-foreground hover:bg-muted/80 focus-visible:ring-muted-foreground/30',\n outline:\n 'border border-input bg-background text-foreground hover:bg-accent hover:text-accent-foreground focus-visible:ring-ring/40',\n ghost:\n 'bg-transparent text-foreground hover:bg-accent hover:text-accent-foreground focus-visible:ring-ring/40',\n destructive:\n 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90 focus-visible:ring-destructive/40',\n success:\n 'bg-success text-success-foreground shadow-sm hover:bg-success/90 focus-visible:ring-success/40',\n warning:\n 'bg-warning text-warning-foreground shadow-sm hover:bg-warning/90 focus-visible:ring-warning/40',\n link: 'text-primary underline-offset-4 hover:underline focus-visible:ring-primary/40 px-0 shadow-none',\n};\n\nexport const buttonSizeClass: Record<ButtonSize, string> = {\n sm: 'h-8 gap-1.5 rounded-md px-3 text-sm',\n md: 'h-9 gap-2 rounded-md px-4 text-sm',\n lg: 'h-11 gap-2.5 rounded-md px-6 text-base',\n icon: 'h-9 w-9 shrink-0 rounded-md p-0',\n 'icon-sm': 'h-8 w-8 shrink-0 rounded-md p-0',\n};\n\nexport const buttonBaseClass =\n 'group/button relative inline-flex items-center justify-center font-medium select-none whitespace-nowrap outline-none transition-[background-color,color,box-shadow,opacity] focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0';\n","import { Loader2 } from 'lucide-react';\nimport {\n type ButtonHTMLAttributes,\n Children,\n cloneElement,\n forwardRef,\n isValidElement,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n type ButtonSize,\n type ButtonVariant,\n buttonBaseClass,\n buttonSizeClass,\n buttonVariantClass,\n} from './buttonVariants';\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n /** Show a leading spinner and disable interaction. */\n loading?: boolean;\n /** Optional text shown beside the spinner while loading. Defaults to keeping `children` visible. */\n loadingText?: ReactNode;\n /** Element rendered before the label (auto-hidden while loading). */\n leadingIcon?: ReactNode;\n /** Element rendered after the label (auto-hidden while loading). */\n trailingIcon?: ReactNode;\n /** Stretch to fill the parent's inline width. */\n fullWidth?: boolean;\n /**\n * Render the button's classes onto the single child element instead of a `<button>`.\n * Useful for routing libraries — e.g. `<Button asChild><Link to=\"/x\">Go</Link></Button>`.\n */\n asChild?: boolean;\n}\n\ntype SlottableChild = ReactElement<{\n className?: string;\n children?: ReactNode;\n 'data-loading'?: 'true';\n 'aria-disabled'?: boolean | 'true' | 'false';\n}>;\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n {\n variant = 'primary',\n size = 'md',\n loading = false,\n loadingText,\n leadingIcon,\n trailingIcon,\n fullWidth = false,\n asChild = false,\n type,\n disabled,\n className,\n children,\n ...props\n },\n ref\n) {\n const isDisabled = disabled || loading;\n\n const composedClass = cn(\n buttonBaseClass,\n buttonVariantClass[variant],\n buttonSizeClass[size],\n fullWidth && 'w-full',\n className\n );\n\n const content = (\n <>\n {loading ? <Spinner /> : leadingIcon ? <Slot>{leadingIcon}</Slot> : null}\n {loading && loadingText !== undefined ? loadingText : children}\n {!loading && trailingIcon ? <Slot>{trailingIcon}</Slot> : null}\n </>\n );\n\n if (asChild) {\n const child = Children.only(children) as SlottableChild;\n if (!isValidElement(child)) {\n throw new Error('Button: `asChild` requires a single valid React element as a child.');\n }\n\n const mergedClassName = cn(composedClass, child.props.className);\n\n return cloneElement(child, {\n ...child.props,\n className: mergedClassName,\n 'aria-disabled': isDisabled ? true : undefined,\n 'data-loading': loading ? 'true' : undefined,\n children: (\n <>\n {loading ? <Spinner /> : leadingIcon ? <Slot>{leadingIcon}</Slot> : null}\n {loading && loadingText !== undefined ? loadingText : child.props.children}\n {!loading && trailingIcon ? <Slot>{trailingIcon}</Slot> : null}\n </>\n ),\n });\n }\n\n return (\n <button\n ref={ref}\n type={type ?? 'button'}\n disabled={isDisabled}\n data-loading={loading ? 'true' : undefined}\n className={composedClass}\n {...props}\n >\n {content}\n </button>\n );\n});\n\nfunction Slot({ children }: { children: ReactNode }) {\n return (\n <span aria-hidden=\"true\" className=\"inline-flex h-4 w-4 items-center justify-center\">\n {children}\n </span>\n );\n}\n\nfunction Spinner() {\n return (\n <Loader2 aria-hidden=\"true\" className=\"h-4 w-4 animate-spin\" data-testid=\"button-spinner\" />\n );\n}\n","import { ChevronLeft } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { cn } from '../../lib/utils';\nimport { Button, type ButtonProps } from '../button';\nimport { useDashboardLayout } from '../dashboard-layout/context';\n\nexport interface HeaderCollapseTriggerProps extends Omit<ButtonProps, 'aria-label' | 'children'> {\n 'aria-label'?: string;\n icon?: ReactNode;\n}\n\nexport function HeaderCollapseTrigger({\n icon,\n className,\n onClick,\n variant = 'ghost',\n size = 'icon',\n 'aria-label': ariaLabel = 'Toggle sidebar',\n ...props\n}: HeaderCollapseTriggerProps) {\n const { toggleCollapsed, collapsed } = useDashboardLayout();\n\n return (\n <Button\n aria-label={ariaLabel}\n aria-pressed={collapsed}\n variant={variant}\n size={size}\n onClick={(e) => {\n toggleCollapsed();\n onClick?.(e);\n }}\n className={cn('hidden lg:inline-flex', className)}\n {...props}\n >\n {icon ?? <ChevronIcon collapsed={collapsed} />}\n </Button>\n );\n}\n\nfunction ChevronIcon({ collapsed }: { collapsed: boolean }) {\n // Chevron points toward the inline-start edge; in RTL it flips automatically\n // because we use a CSS transform tied to dir.\n return (\n <ChevronLeft\n aria-hidden=\"true\"\n className={cn(\n 'h-[18px] w-[18px] transition-transform duration-200 rtl:-scale-x-100',\n collapsed && 'rotate-180'\n )}\n />\n );\n}\n","import { Menu } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { Button, type ButtonProps } from '../button';\nimport { useDashboardLayout } from '../dashboard-layout/context';\n\nexport interface HeaderMobileTriggerProps extends Omit<ButtonProps, 'aria-label' | 'children'> {\n 'aria-label'?: string;\n icon?: ReactNode;\n}\n\nexport function HeaderMobileTrigger({\n icon,\n className,\n onClick,\n variant = 'ghost',\n size = 'icon',\n 'aria-label': ariaLabel = 'Toggle navigation',\n ...props\n}: HeaderMobileTriggerProps) {\n const { toggleMobileOpen, mobileOpen } = useDashboardLayout();\n\n return (\n <Button\n aria-label={ariaLabel}\n aria-expanded={mobileOpen}\n variant={variant}\n size={size}\n onClick={(e) => {\n toggleMobileOpen();\n onClick?.(e);\n }}\n className={className ? `lg:hidden ${className}` : 'lg:hidden'}\n {...props}\n >\n {icon ?? <DefaultMenuIcon />}\n </Button>\n );\n}\n\nfunction DefaultMenuIcon() {\n return <Menu aria-hidden=\"true\" className=\"h-[18px] w-[18px]\" />;\n}\n","import { forwardRef, type InputHTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport interface HeaderSearchProps extends InputHTMLAttributes<HTMLInputElement> {\n icon?: ReactNode;\n containerClassName?: string;\n}\n\nexport const HeaderSearch = forwardRef<HTMLInputElement, HeaderSearchProps>(\n ({ icon, containerClassName, className, type = 'search', ...props }, ref) => (\n <div\n className={cn('relative hidden h-9 w-full max-w-sm items-center md:flex', containerClassName)}\n >\n {icon ? (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute start-3 flex h-4 w-4 items-center justify-center text-muted-foreground\"\n >\n {icon}\n </span>\n ) : null}\n <input\n ref={ref}\n type={type}\n className={cn(\n 'h-9 w-full rounded-md border border-input bg-background text-sm transition-colors',\n 'placeholder:text-muted-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n icon ? 'ps-9 pe-3' : 'px-3',\n className\n )}\n {...props}\n />\n </div>\n )\n);\nHeaderSearch.displayName = 'HeaderSearch';\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type HeaderTitleProps = HTMLAttributes<HTMLDivElement>;\n\nexport function HeaderTitle({ className, children, ...props }: HeaderTitleProps) {\n return (\n <div\n className={cn('flex min-w-0 flex-1 items-center gap-2 text-base font-semibold', className)}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import { type HTMLAttributes, useEffect } from 'react';\nimport { cn } from '../../lib/utils';\nimport { useDashboardLayout } from '../dashboard-layout/context';\n\nexport type SidebarProps = HTMLAttributes<HTMLElement>;\n\nexport function Sidebar({ className, children, ...props }: SidebarProps) {\n const { collapsed, mobileOpen, setMobileOpen } = useDashboardLayout();\n\n useEffect(() => {\n if (!mobileOpen) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setMobileOpen(false);\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [mobileOpen, setMobileOpen]);\n\n return (\n <>\n {/* Mobile backdrop */}\n <div\n aria-hidden=\"true\"\n onClick={() => setMobileOpen(false)}\n className={cn(\n 'fixed inset-0 z-30 bg-foreground/40 backdrop-blur-sm transition-opacity duration-200 lg:hidden',\n mobileOpen ? 'opacity-100' : 'pointer-events-none opacity-0'\n )}\n />\n\n <aside\n data-collapsed={collapsed ? 'true' : 'false'}\n data-mobile-open={mobileOpen ? 'true' : 'false'}\n className={cn(\n // Positioning\n 'fixed inset-y-0 start-0 z-40 flex flex-col',\n // Surface\n 'bg-sidebar text-sidebar-foreground border-e border-sidebar-border',\n // Sizing — width animates between full and collapsed\n collapsed ? 'w-[var(--sidebar-width-collapsed)]' : 'w-[var(--sidebar-width)]',\n // Motion\n 'transition-[transform,width] duration-200 ease-out',\n // Mobile slide: hidden by default, visible when mobileOpen.\n // Logical translate via rtl variant so it slides off the inline-start edge\n // in both LTR and RTL.\n mobileOpen\n ? 'translate-x-0'\n : '-translate-x-full rtl:translate-x-full lg:translate-x-0 lg:rtl:translate-x-0',\n className\n )}\n {...props}\n >\n {children}\n </aside>\n </>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type SidebarFooterProps = HTMLAttributes<HTMLDivElement>;\n\nexport function SidebarFooter({ className, children, ...props }: SidebarFooterProps) {\n return (\n <div\n className={cn(\n 'mt-auto flex shrink-0 items-center gap-2 border-t border-sidebar-border p-3',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport { cn } from '../../lib/utils';\nimport { useDashboardLayout } from '../dashboard-layout/context';\n\nexport interface SidebarGroupProps extends HTMLAttributes<HTMLDivElement> {\n label?: ReactNode;\n}\n\nexport function SidebarGroup({ label, className, children, ...props }: SidebarGroupProps) {\n const { collapsed } = useDashboardLayout();\n\n return (\n <div className={cn('flex flex-col gap-1 py-2', className)} {...props}>\n {label ? (\n <div\n className={cn(\n 'px-3 pb-1 text-xs font-medium uppercase tracking-wider text-muted-foreground transition-opacity',\n collapsed && 'pointer-events-none h-0 overflow-hidden opacity-0'\n )}\n >\n {label}\n </div>\n ) : null}\n <div className=\"flex flex-col gap-0.5\">{children}</div>\n </div>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type SidebarHeaderProps = HTMLAttributes<HTMLDivElement>;\n\nexport function SidebarHeader({ className, children, ...props }: SidebarHeaderProps) {\n return (\n <div\n className={cn(\n 'flex h-[var(--header-height)] shrink-0 items-center gap-2 border-b border-sidebar-border px-3',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type SidebarNavProps = HTMLAttributes<HTMLElement>;\n\nexport function SidebarNav({ className, children, ...props }: SidebarNavProps) {\n return (\n <nav className={cn('flex flex-1 flex-col gap-1 overflow-y-auto p-2', className)} {...props}>\n {children}\n </nav>\n );\n}\n","import { ChevronDown } from 'lucide-react';\nimport {\n type ButtonHTMLAttributes,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useState,\n} from 'react';\nimport { cn } from '../../lib/utils';\nimport { useDashboardLayout } from '../dashboard-layout/context';\n\nexport interface SidebarNavGroupProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {\n icon?: ReactNode;\n label?: ReactNode;\n endSlot?: ReactNode;\n /** Highlight the parent (e.g. when one of its children is active). */\n active?: boolean;\n /** Uncontrolled initial state. */\n defaultOpen?: boolean;\n /** Controlled open state. */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n children: ReactNode;\n}\n\nexport function SidebarNavGroup({\n icon,\n label,\n endSlot,\n active = false,\n defaultOpen = false,\n open: openProp,\n onOpenChange,\n className,\n children,\n onClick,\n ...props\n}: SidebarNavGroupProps) {\n const { collapsed } = useDashboardLayout();\n const submenuId = useId();\n\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const isControlled = openProp !== undefined;\n const open = isControlled ? openProp : internalOpen;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n // When the sidebar collapses to icon-only, force submenu shut so it doesn't\n // try to render in a 4rem-wide rail.\n useEffect(() => {\n if (collapsed && open) setOpen(false);\n }, [collapsed, open, setOpen]);\n\n const titleAttr = collapsed && typeof label === 'string' ? label : (props.title ?? undefined);\n\n // Hide children entirely when the sidebar is collapsed — flyout TBD.\n const showChildren = !collapsed;\n\n return (\n <div className=\"flex flex-col\">\n <button\n type=\"button\"\n aria-expanded={showChildren ? open : undefined}\n aria-controls={showChildren ? submenuId : undefined}\n data-active={active ? 'true' : undefined}\n title={titleAttr}\n onClick={(e) => {\n if (showChildren) setOpen(!open);\n onClick?.(e);\n }}\n className={cn(\n 'group relative flex h-9 w-full items-center gap-3 rounded-md px-3 text-sm font-medium outline-none transition-colors',\n 'text-sidebar-foreground/80 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',\n 'focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-sidebar',\n active && 'bg-sidebar-accent text-sidebar-accent-foreground',\n collapsed && 'justify-center px-0',\n className\n )}\n {...props}\n >\n {icon ? (\n <span aria-hidden=\"true\" className=\"flex h-5 w-5 shrink-0 items-center justify-center\">\n {icon}\n </span>\n ) : null}\n <span\n className={cn(\n 'flex-1 truncate text-start transition-[opacity,width]',\n collapsed && 'pointer-events-none w-0 opacity-0'\n )}\n >\n {label}\n </span>\n {endSlot && !collapsed ? (\n <span className=\"flex shrink-0 items-center\">{endSlot}</span>\n ) : null}\n {showChildren ? <ChevronCaret open={open} /> : null}\n </button>\n\n <div\n id={submenuId}\n hidden={!showChildren || !open}\n className={cn(\n 'grid transition-[grid-template-rows] duration-200 ease-out',\n showChildren && open ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'\n )}\n >\n <div className=\"overflow-hidden\">\n <div className=\"flex flex-col gap-0.5 ps-7 pt-1\">{children}</div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ChevronCaret({ open }: { open: boolean }) {\n return (\n <ChevronDown\n aria-hidden=\"true\"\n className={cn(\n 'h-3.5 w-3.5 shrink-0 text-muted-foreground transition-transform duration-200',\n open && 'rotate-180'\n )}\n />\n );\n}\n","import type { AnchorHTMLAttributes, ReactElement, ReactNode } from 'react';\nimport { cn } from '../../lib/utils';\nimport { useDashboardLayout } from '../dashboard-layout/context';\n\nexport type SidebarNavItemRenderProps = {\n className: string;\n children: ReactNode;\n title?: string;\n 'aria-current'?: 'page';\n 'data-active'?: 'true';\n};\n\nexport interface SidebarNavItemProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n icon?: ReactNode;\n active?: boolean;\n label?: ReactNode;\n endSlot?: ReactNode;\n /**\n * Override the rendered element. Use this to plug in routing-library link\n * components (e.g. react-router `<Link>`) while keeping the styling.\n */\n render?: (props: SidebarNavItemRenderProps) => ReactElement;\n}\n\nexport function SidebarNavItem({\n icon,\n active = false,\n label,\n endSlot,\n className,\n children,\n render,\n ...props\n}: SidebarNavItemProps) {\n const { collapsed } = useDashboardLayout();\n const labelContent = label ?? children;\n const titleAttr = collapsed && typeof labelContent === 'string' ? labelContent : props.title;\n\n const inner = (\n <>\n {icon ? (\n <span aria-hidden=\"true\" className=\"flex h-5 w-5 shrink-0 items-center justify-center\">\n {icon}\n </span>\n ) : null}\n <span\n className={cn(\n 'flex-1 truncate text-start transition-[opacity,width]',\n collapsed && 'pointer-events-none w-0 opacity-0'\n )}\n >\n {labelContent}\n </span>\n {endSlot && !collapsed ? (\n <span className=\"ms-auto flex shrink-0 items-center\">{endSlot}</span>\n ) : null}\n </>\n );\n\n const computedClass = cn(\n 'group relative flex h-9 items-center gap-3 rounded-md px-3 text-sm font-medium outline-none transition-colors',\n 'text-sidebar-foreground/80 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',\n 'focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-sidebar',\n active && 'bg-sidebar-accent text-sidebar-accent-foreground',\n collapsed && 'justify-center px-0',\n className\n );\n\n if (render) {\n return render({\n className: computedClass,\n children: inner,\n title: titleAttr,\n 'aria-current': active ? 'page' : undefined,\n 'data-active': active ? 'true' : undefined,\n });\n }\n\n return (\n <a\n aria-current={active ? 'page' : undefined}\n data-active={active ? 'true' : undefined}\n title={titleAttr}\n className={computedClass}\n {...props}\n >\n {inner}\n </a>\n );\n}\n","import type { ReactElement, ReactNode } from 'react';\nimport {\n DashboardContent,\n DashboardLayout,\n type DashboardLayoutProps,\n DashboardMain,\n} from '../dashboard-layout';\nimport {\n DashboardHeader,\n HeaderActions,\n HeaderCollapseTrigger,\n HeaderMobileTrigger,\n HeaderSearch,\n HeaderTitle,\n} from '../header';\nimport {\n Sidebar,\n SidebarFooter,\n SidebarHeader,\n SidebarNav,\n SidebarNavGroup,\n SidebarNavItem,\n} from '../sidebar';\n\ntype RenderLink = (props: {\n href?: string;\n className?: string;\n children: ReactNode;\n 'aria-current'?: 'page';\n}) => ReactElement;\n\nexport interface AppShellNavItem {\n /** Optional stable key. Falls back to array index if omitted — only safe for static nav. */\n key?: string;\n label: ReactNode;\n href?: string;\n icon?: ReactNode;\n active?: boolean;\n endSlot?: ReactNode;\n /** Optional render prop for routing libraries (e.g. react-router <Link>). */\n render?: RenderLink;\n}\n\nexport interface AppShellNavGroup {\n /** Optional stable key. Falls back to array index if omitted — only safe for static nav. */\n key?: string;\n label: ReactNode;\n icon?: ReactNode;\n active?: boolean;\n defaultOpen?: boolean;\n items: AppShellNavItem[];\n}\n\nexport interface AppShellBrand {\n logo?: ReactNode;\n name?: ReactNode;\n href?: string;\n}\n\nexport interface AppShellProps\n extends Pick<DashboardLayoutProps, 'defaultCollapsed' | 'collapsed' | 'onCollapsedChange'> {\n brand?: AppShellBrand;\n /**\n * Flat list of nav entries: leaf items (with `href` or `render`) and/or\n * collapsible groups (with `items`). For more advanced layouts (sections,\n * dividers, custom structure), compose `Sidebar` + `SidebarNav` directly.\n */\n nav: Array<AppShellNavItem | AppShellNavGroup>;\n title?: ReactNode;\n searchPlaceholder?: string;\n onSearch?: (value: string) => void;\n /** Slot rendered after the search box (e.g. notifications, user menu). */\n headerActions?: ReactNode;\n /** Slot rendered at the bottom of the sidebar (e.g. user badge). */\n sidebarFooter?: ReactNode;\n children: ReactNode;\n}\n\nfunction isGroup(entry: AppShellNavItem | AppShellNavGroup): entry is AppShellNavGroup {\n return 'items' in entry && Array.isArray((entry as AppShellNavGroup).items);\n}\n\nfunction renderItem(item: AppShellNavItem, fallbackKey: string | number) {\n const key = item.key ?? fallbackKey;\n if (item.render) {\n return (\n <SidebarNavItem\n key={key}\n icon={item.icon}\n active={item.active}\n endSlot={item.endSlot}\n render={item.render}\n >\n {item.label}\n </SidebarNavItem>\n );\n }\n return (\n <SidebarNavItem\n key={key}\n href={item.href}\n icon={item.icon}\n active={item.active}\n endSlot={item.endSlot}\n >\n {item.label}\n </SidebarNavItem>\n );\n}\n\nexport function AppShell({\n brand,\n nav,\n title,\n searchPlaceholder,\n onSearch,\n headerActions,\n sidebarFooter,\n defaultCollapsed,\n collapsed,\n onCollapsedChange,\n children,\n}: AppShellProps) {\n return (\n <DashboardLayout\n defaultCollapsed={defaultCollapsed}\n collapsed={collapsed}\n onCollapsedChange={onCollapsedChange}\n >\n <Sidebar>\n {(brand?.logo || brand?.name) && (\n <SidebarHeader>\n {brand.logo}\n {brand.name ? (\n <span className=\"truncate text-sm font-semibold\">{brand.name}</span>\n ) : null}\n </SidebarHeader>\n )}\n\n <SidebarNav>\n {nav.map((entry, index) =>\n isGroup(entry) ? (\n <SidebarNavGroup\n key={entry.key ?? index}\n label={entry.label}\n icon={entry.icon}\n active={entry.active}\n defaultOpen={entry.defaultOpen ?? entry.items.some((i) => i.active)}\n >\n {entry.items.map((item, itemIndex) => renderItem(item, itemIndex))}\n </SidebarNavGroup>\n ) : (\n renderItem(entry, index)\n )\n )}\n </SidebarNav>\n\n {sidebarFooter ? <SidebarFooter>{sidebarFooter}</SidebarFooter> : null}\n </Sidebar>\n\n <DashboardMain>\n <DashboardHeader>\n <HeaderMobileTrigger />\n <HeaderCollapseTrigger />\n {title ? (\n <HeaderTitle>\n <span className=\"truncate\">{title}</span>\n </HeaderTitle>\n ) : null}\n {searchPlaceholder ? (\n <HeaderSearch\n placeholder={searchPlaceholder}\n onChange={onSearch ? (e) => onSearch(e.target.value) : undefined}\n />\n ) : null}\n {headerActions ? <HeaderActions>{headerActions}</HeaderActions> : null}\n </DashboardHeader>\n\n <DashboardContent>{children}</DashboardContent>\n </DashboardMain>\n </DashboardLayout>\n );\n}\n","import { type HTMLAttributes, useState } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport interface AvatarProps extends HTMLAttributes<HTMLSpanElement> {\n src?: string;\n alt?: string;\n fallback?: string;\n size?: 'sm' | 'md' | 'lg';\n}\n\nconst sizeClass = {\n sm: 'h-7 w-7 text-xs',\n md: 'h-9 w-9 text-sm',\n lg: 'h-11 w-11 text-base',\n};\n\nexport function Avatar({ src, alt = '', fallback, size = 'md', className, ...props }: AvatarProps) {\n const [errored, setErrored] = useState(false);\n const showImage = Boolean(src) && !errored;\n\n return (\n <span\n className={cn(\n 'inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full bg-muted text-muted-foreground font-medium select-none',\n sizeClass[size],\n className\n )}\n {...props}\n >\n {showImage ? (\n <img\n src={src}\n alt={alt}\n onError={() => setErrored(true)}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <span aria-hidden={!fallback}>{fallback ?? '?'}</span>\n )}\n </span>\n );\n}\n","import { Check, Minus } from 'lucide-react';\nimport {\n type ChangeEvent,\n forwardRef,\n type InputHTMLAttributes,\n useImperativeHandle,\n useLayoutEffect,\n useRef,\n} from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type CheckboxSize = 'sm' | 'md';\n\nexport interface CheckboxProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size' | 'onChange'> {\n /** Tri-state visual: when true, renders a dash and sets `aria-checked=\"mixed\"`. */\n indeterminate?: boolean;\n /** Convenience handler that receives the new checked boolean. */\n onCheckedChange?: (checked: boolean) => void;\n /** Standard change handler. Fires alongside `onCheckedChange`. */\n onChange?: (event: ChangeEvent<HTMLInputElement>) => void;\n size?: CheckboxSize;\n}\n\nconst sizeClass: Record<CheckboxSize, string> = {\n sm: 'h-3.5 w-3.5',\n md: 'h-4 w-4',\n};\n\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(function Checkbox(\n {\n checked,\n defaultChecked,\n indeterminate = false,\n onCheckedChange,\n onChange,\n disabled,\n size = 'md',\n className,\n 'aria-checked': ariaCheckedProp,\n ...rest\n },\n forwardedRef\n) {\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n useImperativeHandle(forwardedRef, () => inputRef.current as HTMLInputElement, []);\n\n useLayoutEffect(() => {\n if (inputRef.current) {\n inputRef.current.indeterminate = indeterminate;\n }\n }, [indeterminate]);\n\n const ariaChecked = ariaCheckedProp ?? (indeterminate ? 'mixed' : undefined);\n\n return (\n <span className={cn('relative inline-flex shrink-0', sizeClass[size], className)}>\n <input\n ref={inputRef}\n type=\"checkbox\"\n checked={checked}\n defaultChecked={defaultChecked}\n disabled={disabled}\n aria-checked={ariaChecked}\n onChange={(event) => {\n onChange?.(event);\n onCheckedChange?.(event.currentTarget.checked);\n }}\n className={cn(\n 'peer absolute inset-0 m-0 cursor-pointer appearance-none rounded-sm border border-input bg-background',\n 'transition-colors',\n 'checked:border-primary checked:bg-primary',\n 'indeterminate:border-primary indeterminate:bg-primary',\n 'hover:border-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background'\n )}\n {...rest}\n />\n <Check\n aria-hidden=\"true\"\n strokeWidth={3}\n className=\"pointer-events-none absolute inset-0 m-auto h-3 w-3 text-primary-foreground opacity-0 peer-checked:opacity-100 peer-indeterminate:opacity-0\"\n />\n <Minus\n aria-hidden=\"true\"\n strokeWidth={3}\n className=\"pointer-events-none absolute inset-0 m-auto h-3 w-3 text-primary-foreground opacity-0 peer-indeterminate:opacity-100\"\n />\n </span>\n );\n});\n","export type InputVariant = 'default' | 'filled' | 'ghost';\n\nexport type InputSize = 'sm' | 'md' | 'lg';\n\nexport const inputVariantClass: Record<InputVariant, string> = {\n default: 'border border-input bg-background hover:border-ring',\n filled: 'border border-transparent bg-muted hover:bg-muted/80',\n ghost: 'border border-transparent bg-transparent hover:bg-accent',\n};\n\nexport const inputSizeClass: Record<InputSize, string> = {\n sm: 'h-8 rounded-md px-2.5 text-sm gap-1.5',\n md: 'h-9 rounded-md px-3 text-sm gap-2',\n lg: 'h-11 rounded-md px-4 text-base gap-2.5',\n};\n\nexport const inputBaseClass =\n 'group/input relative inline-flex w-full items-center text-foreground outline-none transition-[background-color,border-color,box-shadow] focus-within:ring-2 focus-within:ring-ring/40 focus-within:ring-offset-1 focus-within:ring-offset-background aria-[invalid=true]:border-destructive aria-[invalid=true]:focus-within:ring-destructive/40 has-[input:disabled]:pointer-events-none has-[input:disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0';\n","import { forwardRef, type InputHTMLAttributes, type ReactNode, useId } from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n type InputSize,\n type InputVariant,\n inputBaseClass,\n inputSizeClass,\n inputVariantClass,\n} from './inputVariants';\n\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix'> {\n variant?: InputVariant;\n inputSize?: InputSize;\n /** Optional label rendered above the field. */\n label?: ReactNode;\n /** Helper text rendered under the field when not in an error state. */\n helperText?: ReactNode;\n /** Error message — renders in destructive style and sets aria-invalid. */\n error?: ReactNode;\n /** Element rendered before the input (icon, prefix text, etc.). */\n leadingIcon?: ReactNode;\n /** Element rendered after the input (icon, suffix text, etc.). */\n trailingIcon?: ReactNode;\n /** Stretch the wrapper to fill the parent's inline width. Defaults to `true`. */\n fullWidth?: boolean;\n /** Class applied to the outer wrapper that holds the icons + input. */\n wrapperClassName?: string;\n /** Class applied to the field container (`<label>` block). */\n containerClassName?: string;\n}\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n {\n variant = 'default',\n inputSize = 'md',\n label,\n helperText,\n error,\n leadingIcon,\n trailingIcon,\n fullWidth = true,\n type = 'text',\n id,\n className,\n wrapperClassName,\n containerClassName,\n 'aria-invalid': ariaInvalidProp,\n 'aria-describedby': ariaDescribedByProp,\n disabled,\n ...props\n },\n ref\n) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const helperId = `${inputId}-helper`;\n const errorId = `${inputId}-error`;\n\n const hasError = error !== undefined && error !== null && error !== false;\n const ariaInvalid = ariaInvalidProp ?? (hasError ? true : undefined);\n\n const describedByIds = [\n ariaDescribedByProp,\n hasError ? errorId : null,\n !hasError && helperText ? helperId : null,\n ]\n .filter(Boolean)\n .join(' ');\n const ariaDescribedBy = describedByIds.length > 0 ? describedByIds : undefined;\n\n return (\n <div className={cn('flex flex-col gap-1.5', fullWidth && 'w-full', containerClassName)}>\n {label !== undefined && label !== null && (\n <label htmlFor={inputId} className=\"text-sm font-medium text-foreground select-none\">\n {label}\n </label>\n )}\n\n <div\n data-slot=\"input-wrapper\"\n className={cn(\n inputBaseClass,\n inputVariantClass[variant],\n inputSizeClass[inputSize],\n wrapperClassName\n )}\n aria-invalid={ariaInvalid}\n data-disabled={disabled ? 'true' : undefined}\n >\n {leadingIcon ? (\n <span\n aria-hidden=\"true\"\n className=\"inline-flex h-4 w-4 items-center justify-center text-muted-foreground\"\n >\n {leadingIcon}\n </span>\n ) : null}\n\n <input\n ref={ref}\n id={inputId}\n type={type}\n disabled={disabled}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n className={cn(\n 'h-full w-full min-w-0 flex-1 bg-transparent outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed',\n className\n )}\n {...props}\n />\n\n {trailingIcon ? (\n <span\n aria-hidden=\"true\"\n className=\"inline-flex h-4 w-4 items-center justify-center text-muted-foreground\"\n >\n {trailingIcon}\n </span>\n ) : null}\n </div>\n\n {hasError ? (\n <p id={errorId} className=\"text-xs text-destructive\">\n {error}\n </p>\n ) : helperText ? (\n <p id={helperId} className=\"text-xs text-muted-foreground\">\n {helperText}\n </p>\n ) : null}\n </div>\n );\n});\n","import type { FieldsetHTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport interface LanguageOption<TCode extends string = string> {\n code: TCode;\n label?: string;\n}\n\nexport interface LanguageSwitcherProps<TCode extends string = string>\n extends Omit<FieldsetHTMLAttributes<HTMLFieldSetElement>, 'onChange'> {\n languages: ReadonlyArray<LanguageOption<TCode>>;\n value: TCode;\n onChange: (next: TCode) => void;\n /** Accessible label for the group. Defaults to \"Language\". */\n ariaLabel?: string;\n}\n\nexport function LanguageSwitcher<TCode extends string = string>({\n languages,\n value,\n onChange,\n ariaLabel = 'Language',\n className,\n ...props\n}: LanguageSwitcherProps<TCode>) {\n return (\n <fieldset\n aria-label={ariaLabel}\n className={cn(\n 'inline-flex items-center rounded-md border border-border bg-background p-0.5 text-xs',\n className\n )}\n {...props}\n >\n {languages.map((lang) => {\n const isActive = lang.code === value;\n return (\n <button\n key={lang.code}\n type=\"button\"\n onClick={() => onChange(lang.code)}\n aria-pressed={isActive}\n className={cn(\n 'rounded px-2 py-1 font-medium transition-colors',\n isActive\n ? 'bg-primary text-primary-foreground'\n : 'text-muted-foreground hover:text-foreground'\n )}\n >\n {lang.label ?? lang.code.toUpperCase()}\n </button>\n );\n })}\n </fieldset>\n );\n}\n","import { useEffect, useState } from 'react';\n\nexport type Direction = 'ltr' | 'rtl';\n\nfunction readDocumentDirection(): Direction {\n if (typeof document === 'undefined') return 'ltr';\n const dir = document.documentElement.getAttribute('dir');\n return dir === 'rtl' ? 'rtl' : 'ltr';\n}\n\nexport function useDirection(): Direction {\n const [dir, setDir] = useState<Direction>(() => readDocumentDirection());\n\n useEffect(() => {\n setDir(readDocumentDirection());\n\n const observer = new MutationObserver(() => {\n setDir(readDocumentDirection());\n });\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['dir'],\n });\n\n return () => observer.disconnect();\n }, []);\n\n return dir;\n}\n","import { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { useDirection } from '../../../hooks/use-direction';\nimport { Button } from '../../button';\nimport type { PaginationState } from '../types';\n\ninterface PaginationProps {\n pageIndex: number;\n pageSize: number;\n pageCount: number;\n totalRowCount: number;\n pageSizeOptions: readonly number[];\n onChange: (next: PaginationState) => void;\n}\n\nexport function Pagination({\n pageIndex,\n pageSize,\n pageCount,\n totalRowCount,\n pageSizeOptions,\n onChange,\n}: PaginationProps) {\n const dir = useDirection();\n const isRtl = dir === 'rtl';\n\n const isFirst = pageIndex <= 0;\n const isLast = pageIndex >= pageCount - 1;\n\n const goPrev = () => {\n if (!isFirst) onChange({ pageIndex: pageIndex - 1, pageSize });\n };\n const goNext = () => {\n if (!isLast) onChange({ pageIndex: pageIndex + 1, pageSize });\n };\n\n const start = totalRowCount === 0 ? 0 : pageIndex * pageSize + 1;\n const end = Math.min(totalRowCount, (pageIndex + 1) * pageSize);\n\n return (\n <div className=\"flex flex-wrap items-center justify-between gap-3 text-sm text-muted-foreground\">\n <div className=\"flex items-center gap-2\">\n <label className=\"flex items-center gap-2\">\n <span>Rows per page</span>\n <select\n className=\"h-8 rounded-md border border-input bg-background px-2 text-sm text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n value={pageSize}\n onChange={(event) => {\n const nextSize = Number(event.target.value);\n onChange({ pageIndex: 0, pageSize: nextSize });\n }}\n >\n {pageSizeOptions.map((option) => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </select>\n </label>\n </div>\n\n <div className=\"flex items-center gap-3\">\n <span aria-live=\"polite\">\n {start}–{end} of {totalRowCount}\n </span>\n <div className=\"flex items-center gap-1\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={isFirst}\n onClick={goPrev}\n aria-label=\"Previous page\"\n >\n {isRtl ? (\n <ChevronRight aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n ) : (\n <ChevronLeft aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n <span className=\"px-1 text-foreground\">\n {pageIndex + 1} / {pageCount}\n </span>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={isLast}\n onClick={goNext}\n aria-label=\"Next page\"\n >\n {isRtl ? (\n <ChevronLeft aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n ) : (\n <ChevronRight aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { Button } from '../../button';\n\ninterface ToolbarProps {\n count: number;\n onClear: () => void;\n renderLabel?: (count: number) => ReactNode;\n clearLabel?: ReactNode;\n children?: ReactNode;\n}\n\nexport function Toolbar({ count, onClear, renderLabel, clearLabel, children }: ToolbarProps) {\n return (\n <div\n role=\"toolbar\"\n aria-label=\"Bulk actions\"\n className=\"flex flex-wrap items-center gap-3 rounded-md border border-border bg-muted/40 px-3 py-2 text-sm\"\n >\n <span className=\"font-medium text-foreground\">\n {renderLabel ? renderLabel(count) : `${count} selected`}\n </span>\n <div className=\"ms-auto flex flex-wrap items-center gap-2\">\n {children}\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onClear}>\n {clearLabel ?? 'Clear'}\n </Button>\n </div>\n </div>\n );\n}\n","import type { ColumnAlign } from './types';\n\nexport type TableSize = 'sm' | 'md' | 'lg';\n\nexport interface TableSizeClasses {\n /** Applied to <tr> when needed (currently empty — present for symmetry). */\n row: string;\n /** Applied to <td>. */\n cell: string;\n /** Applied to <th>. */\n head: string;\n}\n\nexport const tableSizeClass: Record<TableSize, TableSizeClasses> = {\n sm: {\n row: '',\n cell: 'px-3 py-1.5 text-xs',\n head: 'px-3 py-2 text-xs font-medium',\n },\n md: {\n row: '',\n cell: 'px-4 py-2.5 text-sm',\n head: 'px-4 py-2.5 text-xs font-medium uppercase tracking-wide',\n },\n lg: {\n row: '',\n cell: 'px-5 py-3.5 text-sm',\n head: 'px-5 py-3 text-sm font-medium',\n },\n};\n\nexport const tableBaseClass = 'w-full caption-bottom border-collapse';\n\nexport const selectedRowClass = 'bg-muted/40';\n\nexport const sortIconClass = 'inline-flex h-3 w-3 shrink-0 items-center justify-center';\n\nexport const alignClass: Record<ColumnAlign, string> = {\n start: 'text-start',\n center: 'text-center',\n end: 'text-end',\n};\n","import { useCallback, useState } from 'react';\nimport type { PaginationState, RowSelectionState, SortState, TableProps } from './types';\n\ninterface UseTableStateResult {\n sort: SortState;\n setSort: (next: SortState) => void;\n pagination: PaginationState;\n setPagination: (next: PaginationState) => void;\n selected: RowSelectionState;\n setSelected: (next: RowSelectionState) => void;\n isServerSide: boolean;\n}\n\nconst EMPTY_SELECTION: RowSelectionState = new Set<string>();\nconst NO_SORT: SortState = { columnId: null, direction: 'asc' };\n\nexport function useTableState<T>(props: TableProps<T>): UseTableStateResult {\n const {\n defaultSort,\n sort: sortProp,\n onSortChange,\n defaultPagination,\n pagination: paginationProp,\n onPaginationChange,\n pageSizeOptions,\n defaultSelectedRowIds,\n selectedRowIds: selectedRowIdsProp,\n onSelectedRowIdsChange,\n totalCount,\n } = props;\n\n // ── Sort ───────────────────────────────────────────────────────────────────\n const [internalSort, setInternalSort] = useState<SortState>(defaultSort ?? NO_SORT);\n const isSortControlled = sortProp !== undefined;\n const sort = isSortControlled ? sortProp : internalSort;\n const setSort = useCallback(\n (next: SortState) => {\n if (!isSortControlled) setInternalSort(next);\n onSortChange?.(next);\n },\n [isSortControlled, onSortChange]\n );\n\n // ── Pagination ─────────────────────────────────────────────────────────────\n const [internalPagination, setInternalPagination] = useState<PaginationState>(\n defaultPagination ?? { pageIndex: 0, pageSize: pageSizeOptions?.[0] ?? 10 }\n );\n const isPaginationControlled = paginationProp !== undefined;\n const pagination = isPaginationControlled ? paginationProp : internalPagination;\n const setPagination = useCallback(\n (next: PaginationState) => {\n if (!isPaginationControlled) setInternalPagination(next);\n onPaginationChange?.(next);\n },\n [isPaginationControlled, onPaginationChange]\n );\n\n // ── Selection ──────────────────────────────────────────────────────────────\n const [internalSelected, setInternalSelected] = useState<RowSelectionState>(\n defaultSelectedRowIds ?? EMPTY_SELECTION\n );\n const isSelectionControlled = selectedRowIdsProp !== undefined;\n const selected = isSelectionControlled ? selectedRowIdsProp : internalSelected;\n const setSelected = useCallback(\n (next: RowSelectionState) => {\n if (!isSelectionControlled) setInternalSelected(next);\n onSelectedRowIdsChange?.(next);\n },\n [isSelectionControlled, onSelectedRowIdsChange]\n );\n\n return {\n sort,\n setSort,\n pagination,\n setPagination,\n selected,\n setSelected,\n isServerSide: totalCount !== undefined,\n };\n}\n","import { ChevronDown, ChevronsUpDown, ChevronUp } from 'lucide-react';\nimport type { MouseEvent, ReactNode } from 'react';\nimport { useMemo } from 'react';\nimport { cn } from '../../lib/utils';\nimport { Checkbox } from '../checkbox';\nimport { Pagination } from './components/Pagination';\nimport { Toolbar } from './components/Toolbar';\nimport { alignClass, selectedRowClass, tableBaseClass, tableSizeClass } from './tableVariants';\nimport type { Column, SortableValue, SortDirection, SortState, TableProps } from './types';\nimport { useTableState } from './useTableState';\n\nconst DEFAULT_PAGE_SIZE_OPTIONS = [10, 25, 50] as const;\n\nexport function Table<T>(props: TableProps<T>) {\n const {\n data,\n columns,\n getRowId,\n enableRowSelection = false,\n isRowSelectable,\n bulkActions,\n renderSelectionLabel,\n clearSelectionLabel,\n loading = false,\n loadingRowCount,\n emptyState,\n size = 'md',\n className,\n tableClassName,\n maxHeight,\n striped = false,\n onRowClick,\n tableRef,\n pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS,\n showPagination,\n caption,\n } = props;\n\n const ariaLabel = props['aria-label'];\n const ariaLabelledBy = props['aria-labelledby'];\n\n const { sort, setSort, pagination, setPagination, selected, setSelected, isServerSide } =\n useTableState(props);\n\n // ── Data pipeline: sort → paginate ──────────────────────────────────────\n const sortedRows = useMemo<readonly T[]>(() => {\n if (isServerSide || sort.columnId === null) return data;\n const col = columns.find((c) => c.id === sort.columnId);\n if (!col) return data;\n const get = resolveSortGetter(col);\n if (!get) return data;\n const tagged = data.map((row, index) => ({ row, index }));\n tagged.sort((a, b) => {\n const cmp = compareValues(get(a.row), get(b.row));\n if (cmp !== 0) return sort.direction === 'asc' ? cmp : -cmp;\n return a.index - b.index;\n });\n return tagged.map((entry) => entry.row);\n }, [data, columns, sort, isServerSide]);\n\n const pagedRows = useMemo<readonly T[]>(() => {\n if (isServerSide) return sortedRows;\n const start = pagination.pageIndex * pagination.pageSize;\n return sortedRows.slice(start, start + pagination.pageSize);\n }, [sortedRows, pagination, isServerSide]);\n\n const totalRowCount = isServerSide ? (props.totalCount ?? 0) : data.length;\n const pageCount = Math.max(1, Math.ceil(totalRowCount / pagination.pageSize));\n\n // ── Selection helpers ────────────────────────────────────────────────────\n const selectableRowIds = useMemo<string[]>(() => {\n if (!enableRowSelection) return [];\n return pagedRows\n .map((row, index) => ({ row, index }))\n .filter(({ row }) => (isRowSelectable ? isRowSelectable(row) : true))\n .map(({ row, index }) => getRowId(row, index));\n }, [pagedRows, enableRowSelection, isRowSelectable, getRowId]);\n\n const selectedOnPageCount = selectableRowIds.reduce(\n (acc, id) => (selected.has(id) ? acc + 1 : acc),\n 0\n );\n const allOnPageSelected =\n selectableRowIds.length > 0 && selectedOnPageCount === selectableRowIds.length;\n const someOnPageSelected = selectedOnPageCount > 0 && !allOnPageSelected;\n\n const selectedRowsInData = useMemo<T[]>(() => {\n if (selected.size === 0) return [];\n return data.filter((row, index) => selected.has(getRowId(row, index)));\n }, [data, selected, getRowId]);\n\n const toggleHeader = (next: boolean) => {\n const updated = new Set(selected);\n if (next) {\n for (const id of selectableRowIds) updated.add(id);\n } else {\n for (const id of selectableRowIds) updated.delete(id);\n }\n setSelected(updated);\n };\n\n const toggleRow = (id: string, next: boolean) => {\n const updated = new Set(selected);\n if (next) updated.add(id);\n else updated.delete(id);\n setSelected(updated);\n };\n\n const clearSelection = () => setSelected(new Set<string>());\n\n const handleSortClick = (columnId: string) => {\n setSort(nextSort(sort, columnId));\n };\n\n const totalColumnCount = columns.length + (enableRowSelection ? 1 : 0);\n const paginationVisible = showPagination ?? totalRowCount > pagination.pageSize;\n const sizeClasses = tableSizeClass[size];\n const showToolbar = enableRowSelection && bulkActions !== undefined && selected.size > 0;\n const skeletonCount = loadingRowCount ?? pagination.pageSize;\n\n return (\n <div className={cn('flex w-full flex-col gap-3', className)}>\n {showToolbar && (\n <Toolbar\n count={selected.size}\n onClear={clearSelection}\n renderLabel={renderSelectionLabel}\n clearLabel={clearSelectionLabel}\n >\n {bulkActions(selectedRowsInData)}\n </Toolbar>\n )}\n\n <div\n className={cn(\n 'overflow-x-auto rounded-md border border-border bg-background',\n maxHeight !== undefined && 'overflow-y-auto'\n )}\n style={maxHeight !== undefined ? { maxHeight } : undefined}\n >\n <table\n ref={tableRef}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-rowcount={totalRowCount}\n className={cn(tableBaseClass, 'text-sm text-foreground', tableClassName)}\n >\n {caption ? <caption className=\"sr-only\">{caption}</caption> : null}\n <thead\n className={cn(\n 'bg-muted/40 text-muted-foreground',\n maxHeight !== undefined && 'sticky top-0 z-10'\n )}\n >\n <tr>\n {enableRowSelection ? (\n <th scope=\"col\" className={cn('w-10', sizeClasses.head)}>\n <Checkbox\n aria-label=\"Select all rows on this page\"\n checked={allOnPageSelected}\n indeterminate={someOnPageSelected}\n disabled={selectableRowIds.length === 0}\n onCheckedChange={toggleHeader}\n />\n </th>\n ) : null}\n {columns.map((column) => {\n const isSorted = sort.columnId === column.id;\n const ariaSort = isSorted\n ? sort.direction === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none';\n return (\n <th\n key={column.id}\n scope=\"col\"\n aria-sort={column.sortable ? ariaSort : undefined}\n className={cn(\n sizeClasses.head,\n alignClass[column.align ?? 'start'],\n column.className\n )}\n >\n {column.sortable ? (\n <button\n type=\"button\"\n onClick={() => handleSortClick(column.id)}\n className=\"inline-flex items-center gap-1.5 font-inherit uppercase tracking-inherit text-inherit hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background\"\n aria-label={sortAriaLabel(column, sort)}\n >\n <span>{renderHeader(column.header)}</span>\n <SortIndicator\n active={isSorted}\n direction={isSorted ? sort.direction : null}\n />\n </button>\n ) : (\n renderHeader(column.header)\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {loading ? (\n <SkeletonRows\n rowCount={skeletonCount}\n columnCount={totalColumnCount}\n cellClassName={sizeClasses.cell}\n />\n ) : pagedRows.length === 0 ? (\n <tr>\n <td\n colSpan={totalColumnCount}\n className={cn(sizeClasses.cell, 'py-10 text-center text-muted-foreground')}\n >\n {emptyState ?? 'No data'}\n </td>\n </tr>\n ) : (\n pagedRows.map((row, rowIndex) => {\n const id = getRowId(row, rowIndex);\n const isSelected = selected.has(id);\n const rowSelectable = isRowSelectable ? isRowSelectable(row) : true;\n return (\n <tr\n key={id}\n data-selected={isSelected ? 'true' : undefined}\n aria-selected={enableRowSelection ? isSelected : undefined}\n className={cn(\n 'border-t border-border transition-colors',\n 'hover:bg-accent',\n striped && rowIndex % 2 === 1 && 'bg-muted/20',\n isSelected && selectedRowClass,\n onRowClick && 'cursor-pointer'\n )}\n onClick={onRowClick ? () => onRowClick(row, rowIndex) : undefined}\n >\n {enableRowSelection ? (\n <td className={cn(sizeClasses.cell, 'w-10')}>\n <Checkbox\n aria-label={`Select row ${rowIndex + 1}`}\n checked={isSelected}\n disabled={!rowSelectable}\n onCheckedChange={(next) => toggleRow(id, next)}\n onClick={stopRowClickPropagation}\n />\n </td>\n ) : null}\n {columns.map((column) => (\n <td\n key={column.id}\n className={cn(\n sizeClasses.cell,\n alignClass[column.align ?? 'start'],\n column.className\n )}\n >\n {renderCell(column, row, rowIndex)}\n </td>\n ))}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n\n {paginationVisible ? (\n <Pagination\n pageIndex={pagination.pageIndex}\n pageSize={pagination.pageSize}\n pageCount={pageCount}\n totalRowCount={totalRowCount}\n pageSizeOptions={pageSizeOptions}\n onChange={setPagination}\n />\n ) : null}\n </div>\n );\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\nfunction renderHeader(header: Column<unknown>['header']): ReactNode {\n return typeof header === 'function' ? header() : header;\n}\n\nfunction renderCell<T>(column: Column<T>, row: T, rowIndex: number): ReactNode {\n if (column.render) return column.render(row, rowIndex);\n if (column.accessor !== undefined) {\n const value = row[column.accessor];\n return value === null || value === undefined ? '' : String(value);\n }\n return null;\n}\n\nfunction resolveSortGetter<T>(column: Column<T>): ((row: T) => SortableValue) | null {\n if (column.sortAccessor) return column.sortAccessor;\n if (column.accessor !== undefined) {\n const key = column.accessor;\n return (row: T) => row[key] as SortableValue;\n }\n return null;\n}\n\nfunction compareValues(a: SortableValue, b: SortableValue): number {\n if (a === b) return 0;\n if (a === null || a === undefined) return 1;\n if (b === null || b === undefined) return -1;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n if (typeof a === 'bigint' && typeof b === 'bigint') return a < b ? -1 : 1;\n if (typeof a === 'boolean' && typeof b === 'boolean') return a === b ? 0 : a ? 1 : -1;\n return String(a).localeCompare(String(b), undefined, { numeric: true, sensitivity: 'base' });\n}\n\nfunction nextSort(current: SortState, columnId: string): SortState {\n if (current.columnId !== columnId) return { columnId, direction: 'asc' };\n if (current.direction === 'asc') return { columnId, direction: 'desc' };\n return { columnId: null, direction: 'asc' };\n}\n\nfunction sortAriaLabel<T>(column: Column<T>, sort: SortState): string {\n const headerText = typeof column.header === 'string' ? column.header : column.id;\n if (sort.columnId !== column.id) return `Sort by ${headerText}`;\n return sort.direction === 'asc'\n ? `Sort by ${headerText}, currently ascending`\n : `Sort by ${headerText}, currently descending`;\n}\n\nfunction stopRowClickPropagation(event: MouseEvent<HTMLInputElement>) {\n event.stopPropagation();\n}\n\ninterface SkeletonRowsProps {\n rowCount: number;\n columnCount: number;\n cellClassName: string;\n}\n\nfunction SkeletonRows({ rowCount, columnCount, cellClassName }: SkeletonRowsProps) {\n const rowKeys = Array.from({ length: Math.max(0, rowCount) }, (_, i) => `skeleton-row-${i}`);\n const colKeys = Array.from({ length: Math.max(1, columnCount) }, (_, i) => `skeleton-col-${i}`);\n return (\n <>\n {rowKeys.map((rowKey) => (\n <tr key={rowKey} className=\"border-t border-border\" data-testid=\"table-skeleton-row\">\n {colKeys.map((colKey) => (\n <td key={`${rowKey}-${colKey}`} className={cellClassName}>\n <span className=\"block h-3 w-full animate-pulse rounded bg-muted\" />\n </td>\n ))}\n </tr>\n ))}\n </>\n );\n}\n\ninterface SortIndicatorProps {\n active: boolean;\n direction: SortDirection | null;\n}\n\nfunction SortIndicator({ active, direction }: SortIndicatorProps) {\n const className = cn(\n 'h-3.5 w-3.5 shrink-0',\n active ? 'text-foreground' : 'text-muted-foreground'\n );\n if (!active) return <ChevronsUpDown aria-hidden=\"true\" className={className} />;\n return direction === 'asc' ? (\n <ChevronUp aria-hidden=\"true\" className={className} />\n ) : (\n <ChevronDown aria-hidden=\"true\" className={className} />\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/dashboard-layout/context.ts","../src/lib/utils.ts","../src/components/dashboard-layout/DashboardContent.tsx","../src/components/dashboard-layout/DashboardLayout.tsx","../src/components/dashboard-layout/DashboardMain.tsx","../src/components/header/DashboardHeader.tsx","../src/components/header/HeaderActions.tsx","../src/components/button/buttonVariants.ts","../src/components/button/Button.tsx","../src/components/header/HeaderCollapseTrigger.tsx","../src/components/header/HeaderMobileTrigger.tsx","../src/components/header/HeaderSearch.tsx","../src/components/header/HeaderTitle.tsx","../src/components/sidebar/Sidebar.tsx","../src/components/sidebar/SidebarFooter.tsx","../src/components/sidebar/SidebarGroup.tsx","../src/components/sidebar/SidebarHeader.tsx","../src/components/sidebar/SidebarNav.tsx","../src/components/sidebar/SidebarNavGroup.tsx","../src/components/sidebar/SidebarNavItem.tsx","../src/components/app-shell/AppShell.tsx","../src/components/avatar/Avatar.tsx","../src/components/checkbox/Checkbox.tsx","../src/components/input/inputVariants.ts","../src/components/input/Input.tsx","../src/components/language-switcher/LanguageSwitcher.tsx","../src/hooks/use-direction.ts","../src/components/table/components/Pagination.tsx","../src/components/table/components/Toolbar.tsx","../src/components/table/tableVariants.ts","../src/components/table/useTableState.ts","../src/components/table/Table.tsx","../src/components/textarea/textareaVariants.ts","../src/components/textarea/Textarea.tsx"],"names":["jsx","Button","forwardRef","jsxs","Fragment","useState","useCallback","useEffect","sizeClass","Checkbox","Input","useId","ChevronLeft","useMemo","ChevronDown","Textarea"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext } from 'react';\n\nexport interface DashboardLayoutContextValue {\n collapsed: boolean;\n setCollapsed: (next: boolean) => void;\n toggleCollapsed: () => void;\n mobileOpen: boolean;\n setMobileOpen: (next: boolean) => void;\n toggleMobileOpen: () => void;\n}\n\nexport const DashboardLayoutContext = createContext<DashboardLayoutContextValue | null>(null);\n\nexport function useDashboardLayout(): DashboardLayoutContextValue {\n const ctx = useContext(DashboardLayoutContext);\n if (!ctx) {\n throw new Error('useDashboardLayout must be used within a <DashboardLayout> component.');\n }\n return ctx;\n}\n","import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type DashboardContentProps = HTMLAttributes<HTMLElement>;\n\nexport function DashboardContent({ className, children, ...props }: DashboardContentProps) {\n return (\n <main\n className={cn(\n 'flex min-h-[calc(100vh-var(--header-height))] flex-1 flex-col gap-6 p-4 sm:p-6 lg:p-8',\n className\n )}\n {...props}\n >\n {children}\n </main>\n );\n}\n","import { type HTMLAttributes, type ReactNode, useCallback, useMemo, useState } from 'react';\nimport { cn } from '../../lib/utils';\nimport { DashboardLayoutContext, type DashboardLayoutContextValue } from './context';\n\nexport interface DashboardLayoutProps extends HTMLAttributes<HTMLDivElement> {\n defaultCollapsed?: boolean;\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n children: ReactNode;\n}\n\nexport function DashboardLayout({\n defaultCollapsed = false,\n collapsed: collapsedProp,\n onCollapsedChange,\n className,\n children,\n ...props\n}: DashboardLayoutProps) {\n const [internalCollapsed, setInternalCollapsed] = useState(defaultCollapsed);\n const [mobileOpen, setMobileOpenState] = useState(false);\n\n const isControlled = collapsedProp !== undefined;\n const collapsed = isControlled ? collapsedProp : internalCollapsed;\n\n const setCollapsed = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalCollapsed(next);\n onCollapsedChange?.(next);\n },\n [isControlled, onCollapsedChange]\n );\n\n const toggleCollapsed = useCallback(() => {\n setCollapsed(!collapsed);\n }, [collapsed, setCollapsed]);\n\n const setMobileOpen = useCallback((next: boolean) => {\n setMobileOpenState(next);\n }, []);\n\n const toggleMobileOpen = useCallback(() => {\n setMobileOpenState((prev) => !prev);\n }, []);\n\n const value = useMemo<DashboardLayoutContextValue>(\n () => ({\n collapsed,\n setCollapsed,\n toggleCollapsed,\n mobileOpen,\n setMobileOpen,\n toggleMobileOpen,\n }),\n [collapsed, setCollapsed, toggleCollapsed, mobileOpen, setMobileOpen, toggleMobileOpen]\n );\n\n return (\n <DashboardLayoutContext.Provider value={value}>\n <div\n data-collapsed={collapsed ? 'true' : 'false'}\n className={cn(\n 'relative flex min-h-screen w-full bg-background text-foreground font-sans antialiased',\n className\n )}\n {...props}\n >\n {children}\n </div>\n </DashboardLayoutContext.Provider>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\nimport { useDashboardLayout } from './context';\n\nexport type DashboardMainProps = HTMLAttributes<HTMLDivElement>;\n\nexport function DashboardMain({ className, children, ...props }: DashboardMainProps) {\n const { collapsed } = useDashboardLayout();\n\n return (\n <div\n className={cn(\n 'flex min-h-screen flex-1 flex-col transition-[margin] duration-200 ease-out',\n // On desktop, push the main column past the fixed sidebar using logical margin.\n collapsed ? 'lg:ms-[var(--sidebar-width-collapsed)]' : 'lg:ms-[var(--sidebar-width)]',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type DashboardHeaderProps = HTMLAttributes<HTMLElement>;\n\nexport function DashboardHeader({ className, children, ...props }: DashboardHeaderProps) {\n return (\n <header\n className={cn(\n 'sticky top-0 z-20 flex h-[var(--header-height)] shrink-0 items-center gap-3 border-b border-header-border bg-header/80 px-4 text-header-foreground backdrop-blur-md sm:px-6',\n className\n )}\n {...props}\n >\n {children}\n </header>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type HeaderActionsProps = HTMLAttributes<HTMLDivElement>;\n\nexport function HeaderActions({ className, children, ...props }: HeaderActionsProps) {\n return (\n <div className={cn('ms-auto flex items-center gap-1', className)} {...props}>\n {children}\n </div>\n );\n}\n","export type ButtonVariant =\n | 'primary'\n | 'secondary'\n | 'outline'\n | 'ghost'\n | 'destructive'\n | 'success'\n | 'warning'\n | 'link';\n\nexport type ButtonSize = 'sm' | 'md' | 'lg' | 'icon' | 'icon-sm';\n\nexport const buttonVariantClass: Record<ButtonVariant, string> = {\n primary:\n 'bg-primary text-primary-foreground shadow-sm hover:bg-primary/90 focus-visible:ring-primary/40',\n secondary: 'bg-muted text-foreground hover:bg-muted/80 focus-visible:ring-muted-foreground/30',\n outline:\n 'border border-input bg-background text-foreground hover:bg-accent hover:text-accent-foreground focus-visible:ring-ring/40',\n ghost:\n 'bg-transparent text-foreground hover:bg-accent hover:text-accent-foreground focus-visible:ring-ring/40',\n destructive:\n 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90 focus-visible:ring-destructive/40',\n success:\n 'bg-success text-success-foreground shadow-sm hover:bg-success/90 focus-visible:ring-success/40',\n warning:\n 'bg-warning text-warning-foreground shadow-sm hover:bg-warning/90 focus-visible:ring-warning/40',\n link: 'text-primary underline-offset-4 hover:underline focus-visible:ring-primary/40 px-0 shadow-none',\n};\n\nexport const buttonSizeClass: Record<ButtonSize, string> = {\n sm: 'h-8 gap-1.5 rounded-md px-3 text-sm',\n md: 'h-9 gap-2 rounded-md px-4 text-sm',\n lg: 'h-11 gap-2.5 rounded-md px-6 text-base',\n icon: 'h-9 w-9 shrink-0 rounded-md p-0',\n 'icon-sm': 'h-8 w-8 shrink-0 rounded-md p-0',\n};\n\nexport const buttonBaseClass =\n 'group/button relative inline-flex items-center justify-center font-medium select-none whitespace-nowrap outline-none transition-[background-color,color,box-shadow,opacity] focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0';\n","import { Loader2 } from 'lucide-react';\nimport {\n type ButtonHTMLAttributes,\n Children,\n cloneElement,\n forwardRef,\n isValidElement,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n type ButtonSize,\n type ButtonVariant,\n buttonBaseClass,\n buttonSizeClass,\n buttonVariantClass,\n} from './buttonVariants';\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n /** Show a leading spinner and disable interaction. */\n loading?: boolean;\n /** Optional text shown beside the spinner while loading. Defaults to keeping `children` visible. */\n loadingText?: ReactNode;\n /** Element rendered before the label (auto-hidden while loading). */\n leadingIcon?: ReactNode;\n /** Element rendered after the label (auto-hidden while loading). */\n trailingIcon?: ReactNode;\n /** Stretch to fill the parent's inline width. */\n fullWidth?: boolean;\n /**\n * Render the button's classes onto the single child element instead of a `<button>`.\n * Useful for routing libraries — e.g. `<Button asChild><Link to=\"/x\">Go</Link></Button>`.\n */\n asChild?: boolean;\n}\n\ntype SlottableChild = ReactElement<{\n className?: string;\n children?: ReactNode;\n 'data-loading'?: 'true';\n 'aria-disabled'?: boolean | 'true' | 'false';\n}>;\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n {\n variant = 'primary',\n size = 'md',\n loading = false,\n loadingText,\n leadingIcon,\n trailingIcon,\n fullWidth = false,\n asChild = false,\n type,\n disabled,\n className,\n children,\n ...props\n },\n ref\n) {\n const isDisabled = disabled || loading;\n\n const composedClass = cn(\n buttonBaseClass,\n buttonVariantClass[variant],\n buttonSizeClass[size],\n fullWidth && 'w-full',\n className\n );\n\n const content = (\n <>\n {loading ? <Spinner /> : leadingIcon ? <Slot>{leadingIcon}</Slot> : null}\n {loading && loadingText !== undefined ? loadingText : children}\n {!loading && trailingIcon ? <Slot>{trailingIcon}</Slot> : null}\n </>\n );\n\n if (asChild) {\n const child = Children.only(children) as SlottableChild;\n if (!isValidElement(child)) {\n throw new Error('Button: `asChild` requires a single valid React element as a child.');\n }\n\n const mergedClassName = cn(composedClass, child.props.className);\n\n return cloneElement(child, {\n ...child.props,\n className: mergedClassName,\n 'aria-disabled': isDisabled ? true : undefined,\n 'data-loading': loading ? 'true' : undefined,\n children: (\n <>\n {loading ? <Spinner /> : leadingIcon ? <Slot>{leadingIcon}</Slot> : null}\n {loading && loadingText !== undefined ? loadingText : child.props.children}\n {!loading && trailingIcon ? <Slot>{trailingIcon}</Slot> : null}\n </>\n ),\n });\n }\n\n return (\n <button\n ref={ref}\n type={type ?? 'button'}\n disabled={isDisabled}\n data-loading={loading ? 'true' : undefined}\n className={composedClass}\n {...props}\n >\n {content}\n </button>\n );\n});\n\nfunction Slot({ children }: { children: ReactNode }) {\n return (\n <span aria-hidden=\"true\" className=\"inline-flex h-4 w-4 items-center justify-center\">\n {children}\n </span>\n );\n}\n\nfunction Spinner() {\n return (\n <Loader2 aria-hidden=\"true\" className=\"h-4 w-4 animate-spin\" data-testid=\"button-spinner\" />\n );\n}\n","import { ChevronLeft } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { cn } from '../../lib/utils';\nimport { Button, type ButtonProps } from '../button';\nimport { useDashboardLayout } from '../dashboard-layout/context';\n\nexport interface HeaderCollapseTriggerProps extends Omit<ButtonProps, 'aria-label' | 'children'> {\n 'aria-label'?: string;\n icon?: ReactNode;\n}\n\nexport function HeaderCollapseTrigger({\n icon,\n className,\n onClick,\n variant = 'ghost',\n size = 'icon',\n 'aria-label': ariaLabel = 'Toggle sidebar',\n ...props\n}: HeaderCollapseTriggerProps) {\n const { toggleCollapsed, collapsed } = useDashboardLayout();\n\n return (\n <Button\n aria-label={ariaLabel}\n aria-pressed={collapsed}\n variant={variant}\n size={size}\n onClick={(e) => {\n toggleCollapsed();\n onClick?.(e);\n }}\n className={cn('hidden lg:inline-flex', className)}\n {...props}\n >\n {icon ?? <ChevronIcon collapsed={collapsed} />}\n </Button>\n );\n}\n\nfunction ChevronIcon({ collapsed }: { collapsed: boolean }) {\n // Chevron points toward the inline-start edge; in RTL it flips automatically\n // because we use a CSS transform tied to dir.\n return (\n <ChevronLeft\n aria-hidden=\"true\"\n className={cn(\n 'h-[18px] w-[18px] transition-transform duration-200 rtl:-scale-x-100',\n collapsed && 'rotate-180'\n )}\n />\n );\n}\n","import { Menu } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { Button, type ButtonProps } from '../button';\nimport { useDashboardLayout } from '../dashboard-layout/context';\n\nexport interface HeaderMobileTriggerProps extends Omit<ButtonProps, 'aria-label' | 'children'> {\n 'aria-label'?: string;\n icon?: ReactNode;\n}\n\nexport function HeaderMobileTrigger({\n icon,\n className,\n onClick,\n variant = 'ghost',\n size = 'icon',\n 'aria-label': ariaLabel = 'Toggle navigation',\n ...props\n}: HeaderMobileTriggerProps) {\n const { toggleMobileOpen, mobileOpen } = useDashboardLayout();\n\n return (\n <Button\n aria-label={ariaLabel}\n aria-expanded={mobileOpen}\n variant={variant}\n size={size}\n onClick={(e) => {\n toggleMobileOpen();\n onClick?.(e);\n }}\n className={className ? `lg:hidden ${className}` : 'lg:hidden'}\n {...props}\n >\n {icon ?? <DefaultMenuIcon />}\n </Button>\n );\n}\n\nfunction DefaultMenuIcon() {\n return <Menu aria-hidden=\"true\" className=\"h-[18px] w-[18px]\" />;\n}\n","import { forwardRef, type InputHTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport interface HeaderSearchProps extends InputHTMLAttributes<HTMLInputElement> {\n icon?: ReactNode;\n containerClassName?: string;\n}\n\nexport const HeaderSearch = forwardRef<HTMLInputElement, HeaderSearchProps>(\n ({ icon, containerClassName, className, type = 'search', ...props }, ref) => (\n <div\n className={cn('relative hidden h-9 w-full max-w-sm items-center md:flex', containerClassName)}\n >\n {icon ? (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute start-3 flex h-4 w-4 items-center justify-center text-muted-foreground\"\n >\n {icon}\n </span>\n ) : null}\n <input\n ref={ref}\n type={type}\n className={cn(\n 'h-9 w-full rounded-md border border-input bg-background text-sm transition-colors',\n 'placeholder:text-muted-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n icon ? 'ps-9 pe-3' : 'px-3',\n className\n )}\n {...props}\n />\n </div>\n )\n);\nHeaderSearch.displayName = 'HeaderSearch';\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type HeaderTitleProps = HTMLAttributes<HTMLDivElement>;\n\nexport function HeaderTitle({ className, children, ...props }: HeaderTitleProps) {\n return (\n <div\n className={cn('flex min-w-0 flex-1 items-center gap-2 text-base font-semibold', className)}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import { type HTMLAttributes, useEffect } from 'react';\nimport { cn } from '../../lib/utils';\nimport { useDashboardLayout } from '../dashboard-layout/context';\n\nexport type SidebarProps = HTMLAttributes<HTMLElement>;\n\nexport function Sidebar({ className, children, ...props }: SidebarProps) {\n const { collapsed, mobileOpen, setMobileOpen } = useDashboardLayout();\n\n useEffect(() => {\n if (!mobileOpen) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setMobileOpen(false);\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [mobileOpen, setMobileOpen]);\n\n return (\n <>\n {/* Mobile backdrop */}\n <div\n aria-hidden=\"true\"\n onClick={() => setMobileOpen(false)}\n className={cn(\n 'fixed inset-0 z-30 bg-foreground/40 backdrop-blur-sm transition-opacity duration-200 lg:hidden',\n mobileOpen ? 'opacity-100' : 'pointer-events-none opacity-0'\n )}\n />\n\n <aside\n data-collapsed={collapsed ? 'true' : 'false'}\n data-mobile-open={mobileOpen ? 'true' : 'false'}\n className={cn(\n // Positioning\n 'fixed inset-y-0 start-0 z-40 flex flex-col',\n // Surface\n 'bg-sidebar text-sidebar-foreground border-e border-sidebar-border',\n // Sizing — width animates between full and collapsed\n collapsed ? 'w-[var(--sidebar-width-collapsed)]' : 'w-[var(--sidebar-width)]',\n // Motion\n 'transition-[transform,width] duration-200 ease-out',\n // Mobile slide: hidden by default, visible when mobileOpen.\n // Logical translate via rtl variant so it slides off the inline-start edge\n // in both LTR and RTL.\n mobileOpen\n ? 'translate-x-0'\n : '-translate-x-full rtl:translate-x-full lg:translate-x-0 lg:rtl:translate-x-0',\n className\n )}\n {...props}\n >\n {children}\n </aside>\n </>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type SidebarFooterProps = HTMLAttributes<HTMLDivElement>;\n\nexport function SidebarFooter({ className, children, ...props }: SidebarFooterProps) {\n return (\n <div\n className={cn(\n 'mt-auto flex shrink-0 items-center gap-2 border-t border-sidebar-border p-3',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport { cn } from '../../lib/utils';\nimport { useDashboardLayout } from '../dashboard-layout/context';\n\nexport interface SidebarGroupProps extends HTMLAttributes<HTMLDivElement> {\n label?: ReactNode;\n}\n\nexport function SidebarGroup({ label, className, children, ...props }: SidebarGroupProps) {\n const { collapsed } = useDashboardLayout();\n\n return (\n <div className={cn('flex flex-col gap-1 py-2', className)} {...props}>\n {label ? (\n <div\n className={cn(\n 'px-3 pb-1 text-xs font-medium uppercase tracking-wider text-muted-foreground transition-opacity',\n collapsed && 'pointer-events-none h-0 overflow-hidden opacity-0'\n )}\n >\n {label}\n </div>\n ) : null}\n <div className=\"flex flex-col gap-0.5\">{children}</div>\n </div>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type SidebarHeaderProps = HTMLAttributes<HTMLDivElement>;\n\nexport function SidebarHeader({ className, children, ...props }: SidebarHeaderProps) {\n return (\n <div\n className={cn(\n 'flex h-[var(--header-height)] shrink-0 items-center gap-2 border-b border-sidebar-border px-3',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type SidebarNavProps = HTMLAttributes<HTMLElement>;\n\nexport function SidebarNav({ className, children, ...props }: SidebarNavProps) {\n return (\n <nav className={cn('flex flex-1 flex-col gap-1 overflow-y-auto p-2', className)} {...props}>\n {children}\n </nav>\n );\n}\n","import { ChevronDown } from 'lucide-react';\nimport {\n type ButtonHTMLAttributes,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useState,\n} from 'react';\nimport { cn } from '../../lib/utils';\nimport { useDashboardLayout } from '../dashboard-layout/context';\n\nexport interface SidebarNavGroupProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {\n icon?: ReactNode;\n label?: ReactNode;\n endSlot?: ReactNode;\n /** Highlight the parent (e.g. when one of its children is active). */\n active?: boolean;\n /** Uncontrolled initial state. */\n defaultOpen?: boolean;\n /** Controlled open state. */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n children: ReactNode;\n}\n\nexport function SidebarNavGroup({\n icon,\n label,\n endSlot,\n active = false,\n defaultOpen = false,\n open: openProp,\n onOpenChange,\n className,\n children,\n onClick,\n ...props\n}: SidebarNavGroupProps) {\n const { collapsed } = useDashboardLayout();\n const submenuId = useId();\n\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const isControlled = openProp !== undefined;\n const open = isControlled ? openProp : internalOpen;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n // When the sidebar collapses to icon-only, force submenu shut so it doesn't\n // try to render in a 4rem-wide rail.\n useEffect(() => {\n if (collapsed && open) setOpen(false);\n }, [collapsed, open, setOpen]);\n\n const titleAttr = collapsed && typeof label === 'string' ? label : (props.title ?? undefined);\n\n // Hide children entirely when the sidebar is collapsed — flyout TBD.\n const showChildren = !collapsed;\n\n return (\n <div className=\"flex flex-col\">\n <button\n type=\"button\"\n aria-expanded={showChildren ? open : undefined}\n aria-controls={showChildren ? submenuId : undefined}\n data-active={active ? 'true' : undefined}\n title={titleAttr}\n onClick={(e) => {\n if (showChildren) setOpen(!open);\n onClick?.(e);\n }}\n className={cn(\n 'group relative flex h-9 w-full items-center gap-3 rounded-md px-3 text-sm font-medium outline-none transition-colors',\n 'text-sidebar-foreground/80 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',\n 'focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-sidebar',\n active && 'bg-sidebar-accent text-sidebar-accent-foreground',\n collapsed && 'justify-center px-0',\n className\n )}\n {...props}\n >\n {icon ? (\n <span aria-hidden=\"true\" className=\"flex h-5 w-5 shrink-0 items-center justify-center\">\n {icon}\n </span>\n ) : null}\n <span\n className={cn(\n 'flex-1 truncate text-start transition-[opacity,width]',\n collapsed && 'pointer-events-none w-0 opacity-0'\n )}\n >\n {label}\n </span>\n {endSlot && !collapsed ? (\n <span className=\"flex shrink-0 items-center\">{endSlot}</span>\n ) : null}\n {showChildren ? <ChevronCaret open={open} /> : null}\n </button>\n\n <div\n id={submenuId}\n hidden={!showChildren || !open}\n className={cn(\n 'grid transition-[grid-template-rows] duration-200 ease-out',\n showChildren && open ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'\n )}\n >\n <div className=\"overflow-hidden\">\n <div className=\"flex flex-col gap-0.5 ps-7 pt-1\">{children}</div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ChevronCaret({ open }: { open: boolean }) {\n return (\n <ChevronDown\n aria-hidden=\"true\"\n className={cn(\n 'h-3.5 w-3.5 shrink-0 text-muted-foreground transition-transform duration-200',\n open && 'rotate-180'\n )}\n />\n );\n}\n","import type { AnchorHTMLAttributes, ReactElement, ReactNode } from 'react';\nimport { cn } from '../../lib/utils';\nimport { useDashboardLayout } from '../dashboard-layout/context';\n\nexport type SidebarNavItemRenderProps = {\n className: string;\n children: ReactNode;\n title?: string;\n 'aria-current'?: 'page';\n 'data-active'?: 'true';\n};\n\nexport interface SidebarNavItemProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n icon?: ReactNode;\n active?: boolean;\n label?: ReactNode;\n endSlot?: ReactNode;\n /**\n * Override the rendered element. Use this to plug in routing-library link\n * components (e.g. react-router `<Link>`) while keeping the styling.\n */\n render?: (props: SidebarNavItemRenderProps) => ReactElement;\n}\n\nexport function SidebarNavItem({\n icon,\n active = false,\n label,\n endSlot,\n className,\n children,\n render,\n ...props\n}: SidebarNavItemProps) {\n const { collapsed } = useDashboardLayout();\n const labelContent = label ?? children;\n const titleAttr = collapsed && typeof labelContent === 'string' ? labelContent : props.title;\n\n const inner = (\n <>\n {icon ? (\n <span aria-hidden=\"true\" className=\"flex h-5 w-5 shrink-0 items-center justify-center\">\n {icon}\n </span>\n ) : null}\n <span\n className={cn(\n 'flex-1 truncate text-start transition-[opacity,width]',\n collapsed && 'pointer-events-none w-0 opacity-0'\n )}\n >\n {labelContent}\n </span>\n {endSlot && !collapsed ? (\n <span className=\"ms-auto flex shrink-0 items-center\">{endSlot}</span>\n ) : null}\n </>\n );\n\n const computedClass = cn(\n 'group relative flex h-9 items-center gap-3 rounded-md px-3 text-sm font-medium outline-none transition-colors',\n 'text-sidebar-foreground/80 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',\n 'focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-sidebar',\n active && 'bg-sidebar-accent text-sidebar-accent-foreground',\n collapsed && 'justify-center px-0',\n className\n );\n\n if (render) {\n return render({\n className: computedClass,\n children: inner,\n title: titleAttr,\n 'aria-current': active ? 'page' : undefined,\n 'data-active': active ? 'true' : undefined,\n });\n }\n\n return (\n <a\n aria-current={active ? 'page' : undefined}\n data-active={active ? 'true' : undefined}\n title={titleAttr}\n className={computedClass}\n {...props}\n >\n {inner}\n </a>\n );\n}\n","import type { ReactElement, ReactNode } from 'react';\nimport {\n DashboardContent,\n DashboardLayout,\n type DashboardLayoutProps,\n DashboardMain,\n} from '../dashboard-layout';\nimport {\n DashboardHeader,\n HeaderActions,\n HeaderCollapseTrigger,\n HeaderMobileTrigger,\n HeaderSearch,\n HeaderTitle,\n} from '../header';\nimport {\n Sidebar,\n SidebarFooter,\n SidebarHeader,\n SidebarNav,\n SidebarNavGroup,\n SidebarNavItem,\n} from '../sidebar';\n\ntype RenderLink = (props: {\n href?: string;\n className?: string;\n children: ReactNode;\n 'aria-current'?: 'page';\n}) => ReactElement;\n\nexport interface AppShellNavItem {\n /** Optional stable key. Falls back to array index if omitted — only safe for static nav. */\n key?: string;\n label: ReactNode;\n href?: string;\n icon?: ReactNode;\n active?: boolean;\n endSlot?: ReactNode;\n /** Optional render prop for routing libraries (e.g. react-router <Link>). */\n render?: RenderLink;\n}\n\nexport interface AppShellNavGroup {\n /** Optional stable key. Falls back to array index if omitted — only safe for static nav. */\n key?: string;\n label: ReactNode;\n icon?: ReactNode;\n active?: boolean;\n defaultOpen?: boolean;\n items: AppShellNavItem[];\n}\n\nexport interface AppShellBrand {\n logo?: ReactNode;\n name?: ReactNode;\n href?: string;\n}\n\nexport interface AppShellProps\n extends Pick<DashboardLayoutProps, 'defaultCollapsed' | 'collapsed' | 'onCollapsedChange'> {\n brand?: AppShellBrand;\n /**\n * Flat list of nav entries: leaf items (with `href` or `render`) and/or\n * collapsible groups (with `items`). For more advanced layouts (sections,\n * dividers, custom structure), compose `Sidebar` + `SidebarNav` directly.\n */\n nav: Array<AppShellNavItem | AppShellNavGroup>;\n title?: ReactNode;\n searchPlaceholder?: string;\n onSearch?: (value: string) => void;\n /** Slot rendered after the search box (e.g. notifications, user menu). */\n headerActions?: ReactNode;\n /** Slot rendered at the bottom of the sidebar (e.g. user badge). */\n sidebarFooter?: ReactNode;\n children: ReactNode;\n}\n\nfunction isGroup(entry: AppShellNavItem | AppShellNavGroup): entry is AppShellNavGroup {\n return 'items' in entry && Array.isArray((entry as AppShellNavGroup).items);\n}\n\nfunction renderItem(item: AppShellNavItem, fallbackKey: string | number) {\n const key = item.key ?? fallbackKey;\n if (item.render) {\n return (\n <SidebarNavItem\n key={key}\n icon={item.icon}\n active={item.active}\n endSlot={item.endSlot}\n render={item.render}\n >\n {item.label}\n </SidebarNavItem>\n );\n }\n return (\n <SidebarNavItem\n key={key}\n href={item.href}\n icon={item.icon}\n active={item.active}\n endSlot={item.endSlot}\n >\n {item.label}\n </SidebarNavItem>\n );\n}\n\nexport function AppShell({\n brand,\n nav,\n title,\n searchPlaceholder,\n onSearch,\n headerActions,\n sidebarFooter,\n defaultCollapsed,\n collapsed,\n onCollapsedChange,\n children,\n}: AppShellProps) {\n return (\n <DashboardLayout\n defaultCollapsed={defaultCollapsed}\n collapsed={collapsed}\n onCollapsedChange={onCollapsedChange}\n >\n <Sidebar>\n {(brand?.logo || brand?.name) && (\n <SidebarHeader>\n {brand.logo}\n {brand.name ? (\n <span className=\"truncate text-sm font-semibold\">{brand.name}</span>\n ) : null}\n </SidebarHeader>\n )}\n\n <SidebarNav>\n {nav.map((entry, index) =>\n isGroup(entry) ? (\n <SidebarNavGroup\n key={entry.key ?? index}\n label={entry.label}\n icon={entry.icon}\n active={entry.active}\n defaultOpen={entry.defaultOpen ?? entry.items.some((i) => i.active)}\n >\n {entry.items.map((item, itemIndex) => renderItem(item, itemIndex))}\n </SidebarNavGroup>\n ) : (\n renderItem(entry, index)\n )\n )}\n </SidebarNav>\n\n {sidebarFooter ? <SidebarFooter>{sidebarFooter}</SidebarFooter> : null}\n </Sidebar>\n\n <DashboardMain>\n <DashboardHeader>\n <HeaderMobileTrigger />\n <HeaderCollapseTrigger />\n {title ? (\n <HeaderTitle>\n <span className=\"truncate\">{title}</span>\n </HeaderTitle>\n ) : null}\n {searchPlaceholder ? (\n <HeaderSearch\n placeholder={searchPlaceholder}\n onChange={onSearch ? (e) => onSearch(e.target.value) : undefined}\n />\n ) : null}\n {headerActions ? <HeaderActions>{headerActions}</HeaderActions> : null}\n </DashboardHeader>\n\n <DashboardContent>{children}</DashboardContent>\n </DashboardMain>\n </DashboardLayout>\n );\n}\n","import { type HTMLAttributes, useState } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport interface AvatarProps extends HTMLAttributes<HTMLSpanElement> {\n src?: string;\n alt?: string;\n fallback?: string;\n size?: 'sm' | 'md' | 'lg';\n}\n\nconst sizeClass = {\n sm: 'h-7 w-7 text-xs',\n md: 'h-9 w-9 text-sm',\n lg: 'h-11 w-11 text-base',\n};\n\nexport function Avatar({ src, alt = '', fallback, size = 'md', className, ...props }: AvatarProps) {\n const [errored, setErrored] = useState(false);\n const showImage = Boolean(src) && !errored;\n\n return (\n <span\n className={cn(\n 'inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full bg-muted text-muted-foreground font-medium select-none',\n sizeClass[size],\n className\n )}\n {...props}\n >\n {showImage ? (\n <img\n src={src}\n alt={alt}\n onError={() => setErrored(true)}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <span aria-hidden={!fallback}>{fallback ?? '?'}</span>\n )}\n </span>\n );\n}\n","import { Check, Minus } from 'lucide-react';\nimport {\n type ChangeEvent,\n forwardRef,\n type InputHTMLAttributes,\n useImperativeHandle,\n useLayoutEffect,\n useRef,\n} from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type CheckboxSize = 'sm' | 'md';\n\nexport interface CheckboxProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size' | 'onChange'> {\n /** Tri-state visual: when true, renders a dash and sets `aria-checked=\"mixed\"`. */\n indeterminate?: boolean;\n /** Convenience handler that receives the new checked boolean. */\n onCheckedChange?: (checked: boolean) => void;\n /** Standard change handler. Fires alongside `onCheckedChange`. */\n onChange?: (event: ChangeEvent<HTMLInputElement>) => void;\n size?: CheckboxSize;\n}\n\nconst sizeClass: Record<CheckboxSize, string> = {\n sm: 'h-3.5 w-3.5',\n md: 'h-4 w-4',\n};\n\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(function Checkbox(\n {\n checked,\n defaultChecked,\n indeterminate = false,\n onCheckedChange,\n onChange,\n disabled,\n size = 'md',\n className,\n 'aria-checked': ariaCheckedProp,\n ...rest\n },\n forwardedRef\n) {\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n useImperativeHandle(forwardedRef, () => inputRef.current as HTMLInputElement, []);\n\n useLayoutEffect(() => {\n if (inputRef.current) {\n inputRef.current.indeterminate = indeterminate;\n }\n }, [indeterminate]);\n\n const ariaChecked = ariaCheckedProp ?? (indeterminate ? 'mixed' : undefined);\n\n return (\n <span className={cn('relative inline-flex shrink-0', sizeClass[size], className)}>\n <input\n ref={inputRef}\n type=\"checkbox\"\n checked={checked}\n defaultChecked={defaultChecked}\n disabled={disabled}\n aria-checked={ariaChecked}\n onChange={(event) => {\n onChange?.(event);\n onCheckedChange?.(event.currentTarget.checked);\n }}\n className={cn(\n 'peer absolute inset-0 m-0 cursor-pointer appearance-none rounded-sm border border-input bg-background',\n 'transition-colors',\n 'checked:border-primary checked:bg-primary',\n 'indeterminate:border-primary indeterminate:bg-primary',\n 'hover:border-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background'\n )}\n {...rest}\n />\n <Check\n aria-hidden=\"true\"\n strokeWidth={3}\n className=\"pointer-events-none absolute inset-0 m-auto h-3 w-3 text-primary-foreground opacity-0 peer-checked:opacity-100 peer-indeterminate:opacity-0\"\n />\n <Minus\n aria-hidden=\"true\"\n strokeWidth={3}\n className=\"pointer-events-none absolute inset-0 m-auto h-3 w-3 text-primary-foreground opacity-0 peer-indeterminate:opacity-100\"\n />\n </span>\n );\n});\n","export type InputVariant = 'default' | 'filled' | 'ghost';\n\nexport type InputSize = 'sm' | 'md' | 'lg';\n\nexport const inputVariantClass: Record<InputVariant, string> = {\n default: 'border border-input bg-background hover:border-ring',\n filled: 'border border-transparent bg-muted hover:bg-muted/80',\n ghost: 'border border-transparent bg-transparent hover:bg-accent',\n};\n\nexport const inputSizeClass: Record<InputSize, string> = {\n sm: 'h-8 rounded-md px-2.5 text-sm gap-1.5',\n md: 'h-9 rounded-md px-3 text-sm gap-2',\n lg: 'h-11 rounded-md px-4 text-base gap-2.5',\n};\n\nexport const inputBaseClass =\n 'group/input relative inline-flex w-full items-center text-foreground outline-none transition-[background-color,border-color,box-shadow] focus-within:ring-2 focus-within:ring-ring/40 focus-within:ring-offset-1 focus-within:ring-offset-background aria-[invalid=true]:border-destructive aria-[invalid=true]:focus-within:ring-destructive/40 has-[input:disabled]:pointer-events-none has-[input:disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0';\n","import { forwardRef, type InputHTMLAttributes, type ReactNode, useId } from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n type InputSize,\n type InputVariant,\n inputBaseClass,\n inputSizeClass,\n inputVariantClass,\n} from './inputVariants';\n\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix'> {\n variant?: InputVariant;\n inputSize?: InputSize;\n /** Optional label rendered above the field. */\n label?: ReactNode;\n /** Helper text rendered under the field when not in an error state. */\n helperText?: ReactNode;\n /** Error message — renders in destructive style and sets aria-invalid. */\n error?: ReactNode;\n /** Element rendered before the input (icon, prefix text, etc.). */\n leadingIcon?: ReactNode;\n /** Element rendered after the input (icon, suffix text, etc.). */\n trailingIcon?: ReactNode;\n /** Stretch the wrapper to fill the parent's inline width. Defaults to `true`. */\n fullWidth?: boolean;\n /** Class applied to the outer wrapper that holds the icons + input. */\n wrapperClassName?: string;\n /** Class applied to the field container (`<label>` block). */\n containerClassName?: string;\n}\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n {\n variant = 'default',\n inputSize = 'md',\n label,\n helperText,\n error,\n leadingIcon,\n trailingIcon,\n fullWidth = true,\n type = 'text',\n id,\n className,\n wrapperClassName,\n containerClassName,\n 'aria-invalid': ariaInvalidProp,\n 'aria-describedby': ariaDescribedByProp,\n disabled,\n ...props\n },\n ref\n) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const helperId = `${inputId}-helper`;\n const errorId = `${inputId}-error`;\n\n const hasError = error !== undefined && error !== null && error !== false;\n const ariaInvalid = ariaInvalidProp ?? (hasError ? true : undefined);\n\n const describedByIds = [\n ariaDescribedByProp,\n hasError ? errorId : null,\n !hasError && helperText ? helperId : null,\n ]\n .filter(Boolean)\n .join(' ');\n const ariaDescribedBy = describedByIds.length > 0 ? describedByIds : undefined;\n\n return (\n <div className={cn('flex flex-col gap-1.5', fullWidth && 'w-full', containerClassName)}>\n {label !== undefined && label !== null && (\n <label htmlFor={inputId} className=\"text-sm font-medium text-foreground select-none\">\n {label}\n </label>\n )}\n\n <div\n data-slot=\"input-wrapper\"\n className={cn(\n inputBaseClass,\n inputVariantClass[variant],\n inputSizeClass[inputSize],\n wrapperClassName\n )}\n aria-invalid={ariaInvalid}\n data-disabled={disabled ? 'true' : undefined}\n >\n {leadingIcon ? (\n <span\n aria-hidden=\"true\"\n className=\"inline-flex h-4 w-4 items-center justify-center text-muted-foreground\"\n >\n {leadingIcon}\n </span>\n ) : null}\n\n <input\n ref={ref}\n id={inputId}\n type={type}\n disabled={disabled}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n className={cn(\n 'h-full w-full min-w-0 flex-1 bg-transparent outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed',\n className\n )}\n {...props}\n />\n\n {trailingIcon ? (\n <span\n aria-hidden=\"true\"\n className=\"inline-flex h-4 w-4 items-center justify-center text-muted-foreground\"\n >\n {trailingIcon}\n </span>\n ) : null}\n </div>\n\n {hasError ? (\n <p id={errorId} className=\"text-xs text-destructive\">\n {error}\n </p>\n ) : helperText ? (\n <p id={helperId} className=\"text-xs text-muted-foreground\">\n {helperText}\n </p>\n ) : null}\n </div>\n );\n});\n","import type { FieldsetHTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport interface LanguageOption<TCode extends string = string> {\n code: TCode;\n label?: string;\n}\n\nexport interface LanguageSwitcherProps<TCode extends string = string>\n extends Omit<FieldsetHTMLAttributes<HTMLFieldSetElement>, 'onChange'> {\n languages: ReadonlyArray<LanguageOption<TCode>>;\n value: TCode;\n onChange: (next: TCode) => void;\n /** Accessible label for the group. Defaults to \"Language\". */\n ariaLabel?: string;\n}\n\nexport function LanguageSwitcher<TCode extends string = string>({\n languages,\n value,\n onChange,\n ariaLabel = 'Language',\n className,\n ...props\n}: LanguageSwitcherProps<TCode>) {\n return (\n <fieldset\n aria-label={ariaLabel}\n className={cn(\n 'inline-flex items-center rounded-md border border-border bg-background p-0.5 text-xs',\n className\n )}\n {...props}\n >\n {languages.map((lang) => {\n const isActive = lang.code === value;\n return (\n <button\n key={lang.code}\n type=\"button\"\n onClick={() => onChange(lang.code)}\n aria-pressed={isActive}\n className={cn(\n 'rounded px-2 py-1 font-medium transition-colors',\n isActive\n ? 'bg-primary text-primary-foreground'\n : 'text-muted-foreground hover:text-foreground'\n )}\n >\n {lang.label ?? lang.code.toUpperCase()}\n </button>\n );\n })}\n </fieldset>\n );\n}\n","import { useEffect, useState } from 'react';\n\nexport type Direction = 'ltr' | 'rtl';\n\nfunction readDocumentDirection(): Direction {\n if (typeof document === 'undefined') return 'ltr';\n const dir = document.documentElement.getAttribute('dir');\n return dir === 'rtl' ? 'rtl' : 'ltr';\n}\n\nexport function useDirection(): Direction {\n const [dir, setDir] = useState<Direction>(() => readDocumentDirection());\n\n useEffect(() => {\n setDir(readDocumentDirection());\n\n const observer = new MutationObserver(() => {\n setDir(readDocumentDirection());\n });\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['dir'],\n });\n\n return () => observer.disconnect();\n }, []);\n\n return dir;\n}\n","import { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { useDirection } from '../../../hooks/use-direction';\nimport { Button } from '../../button';\nimport type { PaginationState } from '../types';\n\ninterface PaginationProps {\n pageIndex: number;\n pageSize: number;\n pageCount: number;\n totalRowCount: number;\n pageSizeOptions: readonly number[];\n onChange: (next: PaginationState) => void;\n}\n\nexport function Pagination({\n pageIndex,\n pageSize,\n pageCount,\n totalRowCount,\n pageSizeOptions,\n onChange,\n}: PaginationProps) {\n const dir = useDirection();\n const isRtl = dir === 'rtl';\n\n const isFirst = pageIndex <= 0;\n const isLast = pageIndex >= pageCount - 1;\n\n const goPrev = () => {\n if (!isFirst) onChange({ pageIndex: pageIndex - 1, pageSize });\n };\n const goNext = () => {\n if (!isLast) onChange({ pageIndex: pageIndex + 1, pageSize });\n };\n\n const start = totalRowCount === 0 ? 0 : pageIndex * pageSize + 1;\n const end = Math.min(totalRowCount, (pageIndex + 1) * pageSize);\n\n return (\n <div className=\"flex flex-wrap items-center justify-between gap-3 text-sm text-muted-foreground\">\n <div className=\"flex items-center gap-2\">\n <label className=\"flex items-center gap-2\">\n <span>Rows per page</span>\n <select\n className=\"h-8 rounded-md border border-input bg-background px-2 text-sm text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n value={pageSize}\n onChange={(event) => {\n const nextSize = Number(event.target.value);\n onChange({ pageIndex: 0, pageSize: nextSize });\n }}\n >\n {pageSizeOptions.map((option) => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </select>\n </label>\n </div>\n\n <div className=\"flex items-center gap-3\">\n <span aria-live=\"polite\">\n {start}–{end} of {totalRowCount}\n </span>\n <div className=\"flex items-center gap-1\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={isFirst}\n onClick={goPrev}\n aria-label=\"Previous page\"\n >\n {isRtl ? (\n <ChevronRight aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n ) : (\n <ChevronLeft aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n <span className=\"px-1 text-foreground\">\n {pageIndex + 1} / {pageCount}\n </span>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={isLast}\n onClick={goNext}\n aria-label=\"Next page\"\n >\n {isRtl ? (\n <ChevronLeft aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n ) : (\n <ChevronRight aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { Button } from '../../button';\n\ninterface ToolbarProps {\n count: number;\n onClear: () => void;\n renderLabel?: (count: number) => ReactNode;\n clearLabel?: ReactNode;\n children?: ReactNode;\n}\n\nexport function Toolbar({ count, onClear, renderLabel, clearLabel, children }: ToolbarProps) {\n return (\n <div\n role=\"toolbar\"\n aria-label=\"Bulk actions\"\n className=\"flex flex-wrap items-center gap-3 rounded-md border border-border bg-muted/40 px-3 py-2 text-sm\"\n >\n <span className=\"font-medium text-foreground\">\n {renderLabel ? renderLabel(count) : `${count} selected`}\n </span>\n <div className=\"ms-auto flex flex-wrap items-center gap-2\">\n {children}\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onClear}>\n {clearLabel ?? 'Clear'}\n </Button>\n </div>\n </div>\n );\n}\n","import type { ColumnAlign } from './types';\n\nexport type TableSize = 'sm' | 'md' | 'lg';\n\nexport interface TableSizeClasses {\n /** Applied to <tr> when needed (currently empty — present for symmetry). */\n row: string;\n /** Applied to <td>. */\n cell: string;\n /** Applied to <th>. */\n head: string;\n}\n\nexport const tableSizeClass: Record<TableSize, TableSizeClasses> = {\n sm: {\n row: '',\n cell: 'px-3 py-1.5 text-xs',\n head: 'px-3 py-2 text-xs font-medium',\n },\n md: {\n row: '',\n cell: 'px-4 py-2.5 text-sm',\n head: 'px-4 py-2.5 text-xs font-medium uppercase tracking-wide',\n },\n lg: {\n row: '',\n cell: 'px-5 py-3.5 text-sm',\n head: 'px-5 py-3 text-sm font-medium',\n },\n};\n\nexport const tableBaseClass = 'w-full caption-bottom border-collapse';\n\nexport const selectedRowClass = 'bg-muted/40';\n\nexport const sortIconClass = 'inline-flex h-3 w-3 shrink-0 items-center justify-center';\n\nexport const alignClass: Record<ColumnAlign, string> = {\n start: 'text-start',\n center: 'text-center',\n end: 'text-end',\n};\n","import { useCallback, useState } from 'react';\nimport type { PaginationState, RowSelectionState, SortState, TableProps } from './types';\n\ninterface UseTableStateResult {\n sort: SortState;\n setSort: (next: SortState) => void;\n pagination: PaginationState;\n setPagination: (next: PaginationState) => void;\n selected: RowSelectionState;\n setSelected: (next: RowSelectionState) => void;\n isServerSide: boolean;\n}\n\nconst EMPTY_SELECTION: RowSelectionState = new Set<string>();\nconst NO_SORT: SortState = { columnId: null, direction: 'asc' };\n\nexport function useTableState<T>(props: TableProps<T>): UseTableStateResult {\n const {\n defaultSort,\n sort: sortProp,\n onSortChange,\n defaultPagination,\n pagination: paginationProp,\n onPaginationChange,\n pageSizeOptions,\n defaultSelectedRowIds,\n selectedRowIds: selectedRowIdsProp,\n onSelectedRowIdsChange,\n totalCount,\n } = props;\n\n // ── Sort ───────────────────────────────────────────────────────────────────\n const [internalSort, setInternalSort] = useState<SortState>(defaultSort ?? NO_SORT);\n const isSortControlled = sortProp !== undefined;\n const sort = isSortControlled ? sortProp : internalSort;\n const setSort = useCallback(\n (next: SortState) => {\n if (!isSortControlled) setInternalSort(next);\n onSortChange?.(next);\n },\n [isSortControlled, onSortChange]\n );\n\n // ── Pagination ─────────────────────────────────────────────────────────────\n const [internalPagination, setInternalPagination] = useState<PaginationState>(\n defaultPagination ?? { pageIndex: 0, pageSize: pageSizeOptions?.[0] ?? 10 }\n );\n const isPaginationControlled = paginationProp !== undefined;\n const pagination = isPaginationControlled ? paginationProp : internalPagination;\n const setPagination = useCallback(\n (next: PaginationState) => {\n if (!isPaginationControlled) setInternalPagination(next);\n onPaginationChange?.(next);\n },\n [isPaginationControlled, onPaginationChange]\n );\n\n // ── Selection ──────────────────────────────────────────────────────────────\n const [internalSelected, setInternalSelected] = useState<RowSelectionState>(\n defaultSelectedRowIds ?? EMPTY_SELECTION\n );\n const isSelectionControlled = selectedRowIdsProp !== undefined;\n const selected = isSelectionControlled ? selectedRowIdsProp : internalSelected;\n const setSelected = useCallback(\n (next: RowSelectionState) => {\n if (!isSelectionControlled) setInternalSelected(next);\n onSelectedRowIdsChange?.(next);\n },\n [isSelectionControlled, onSelectedRowIdsChange]\n );\n\n return {\n sort,\n setSort,\n pagination,\n setPagination,\n selected,\n setSelected,\n isServerSide: totalCount !== undefined,\n };\n}\n","import { ChevronDown, ChevronsUpDown, ChevronUp } from 'lucide-react';\nimport type { MouseEvent, ReactNode } from 'react';\nimport { useMemo } from 'react';\nimport { cn } from '../../lib/utils';\nimport { Checkbox } from '../checkbox';\nimport { Pagination } from './components/Pagination';\nimport { Toolbar } from './components/Toolbar';\nimport { alignClass, selectedRowClass, tableBaseClass, tableSizeClass } from './tableVariants';\nimport type { Column, SortableValue, SortDirection, SortState, TableProps } from './types';\nimport { useTableState } from './useTableState';\n\nconst DEFAULT_PAGE_SIZE_OPTIONS = [10, 25, 50] as const;\n\nexport function Table<T>(props: TableProps<T>) {\n const {\n data,\n columns,\n getRowId,\n enableRowSelection = false,\n isRowSelectable,\n bulkActions,\n renderSelectionLabel,\n clearSelectionLabel,\n loading = false,\n loadingRowCount,\n emptyState,\n size = 'md',\n className,\n tableClassName,\n maxHeight,\n striped = false,\n onRowClick,\n tableRef,\n pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS,\n showPagination,\n caption,\n } = props;\n\n const ariaLabel = props['aria-label'];\n const ariaLabelledBy = props['aria-labelledby'];\n\n const { sort, setSort, pagination, setPagination, selected, setSelected, isServerSide } =\n useTableState(props);\n\n // ── Data pipeline: sort → paginate ──────────────────────────────────────\n const sortedRows = useMemo<readonly T[]>(() => {\n if (isServerSide || sort.columnId === null) return data;\n const col = columns.find((c) => c.id === sort.columnId);\n if (!col) return data;\n const get = resolveSortGetter(col);\n if (!get) return data;\n const tagged = data.map((row, index) => ({ row, index }));\n tagged.sort((a, b) => {\n const cmp = compareValues(get(a.row), get(b.row));\n if (cmp !== 0) return sort.direction === 'asc' ? cmp : -cmp;\n return a.index - b.index;\n });\n return tagged.map((entry) => entry.row);\n }, [data, columns, sort, isServerSide]);\n\n const pagedRows = useMemo<readonly T[]>(() => {\n if (isServerSide) return sortedRows;\n const start = pagination.pageIndex * pagination.pageSize;\n return sortedRows.slice(start, start + pagination.pageSize);\n }, [sortedRows, pagination, isServerSide]);\n\n const totalRowCount = isServerSide ? (props.totalCount ?? 0) : data.length;\n const pageCount = Math.max(1, Math.ceil(totalRowCount / pagination.pageSize));\n\n // ── Selection helpers ────────────────────────────────────────────────────\n const selectableRowIds = useMemo<string[]>(() => {\n if (!enableRowSelection) return [];\n return pagedRows\n .map((row, index) => ({ row, index }))\n .filter(({ row }) => (isRowSelectable ? isRowSelectable(row) : true))\n .map(({ row, index }) => getRowId(row, index));\n }, [pagedRows, enableRowSelection, isRowSelectable, getRowId]);\n\n const selectedOnPageCount = selectableRowIds.reduce(\n (acc, id) => (selected.has(id) ? acc + 1 : acc),\n 0\n );\n const allOnPageSelected =\n selectableRowIds.length > 0 && selectedOnPageCount === selectableRowIds.length;\n const someOnPageSelected = selectedOnPageCount > 0 && !allOnPageSelected;\n\n const selectedRowsInData = useMemo<T[]>(() => {\n if (selected.size === 0) return [];\n return data.filter((row, index) => selected.has(getRowId(row, index)));\n }, [data, selected, getRowId]);\n\n const toggleHeader = (next: boolean) => {\n const updated = new Set(selected);\n if (next) {\n for (const id of selectableRowIds) updated.add(id);\n } else {\n for (const id of selectableRowIds) updated.delete(id);\n }\n setSelected(updated);\n };\n\n const toggleRow = (id: string, next: boolean) => {\n const updated = new Set(selected);\n if (next) updated.add(id);\n else updated.delete(id);\n setSelected(updated);\n };\n\n const clearSelection = () => setSelected(new Set<string>());\n\n const handleSortClick = (columnId: string) => {\n setSort(nextSort(sort, columnId));\n };\n\n const totalColumnCount = columns.length + (enableRowSelection ? 1 : 0);\n const paginationVisible = showPagination ?? totalRowCount > pagination.pageSize;\n const sizeClasses = tableSizeClass[size];\n const showToolbar = enableRowSelection && bulkActions !== undefined && selected.size > 0;\n const skeletonCount = loadingRowCount ?? pagination.pageSize;\n\n return (\n <div className={cn('flex w-full flex-col gap-3', className)}>\n {showToolbar && (\n <Toolbar\n count={selected.size}\n onClear={clearSelection}\n renderLabel={renderSelectionLabel}\n clearLabel={clearSelectionLabel}\n >\n {bulkActions(selectedRowsInData)}\n </Toolbar>\n )}\n\n <div\n className={cn(\n 'overflow-x-auto rounded-md border border-border bg-background',\n maxHeight !== undefined && 'overflow-y-auto'\n )}\n style={maxHeight !== undefined ? { maxHeight } : undefined}\n >\n <table\n ref={tableRef}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-rowcount={totalRowCount}\n className={cn(tableBaseClass, 'text-sm text-foreground', tableClassName)}\n >\n {caption ? <caption className=\"sr-only\">{caption}</caption> : null}\n <thead\n className={cn(\n 'bg-muted/40 text-muted-foreground',\n maxHeight !== undefined && 'sticky top-0 z-10'\n )}\n >\n <tr>\n {enableRowSelection ? (\n <th scope=\"col\" className={cn('w-10', sizeClasses.head)}>\n <Checkbox\n aria-label=\"Select all rows on this page\"\n checked={allOnPageSelected}\n indeterminate={someOnPageSelected}\n disabled={selectableRowIds.length === 0}\n onCheckedChange={toggleHeader}\n />\n </th>\n ) : null}\n {columns.map((column) => {\n const isSorted = sort.columnId === column.id;\n const ariaSort = isSorted\n ? sort.direction === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none';\n return (\n <th\n key={column.id}\n scope=\"col\"\n aria-sort={column.sortable ? ariaSort : undefined}\n className={cn(\n sizeClasses.head,\n alignClass[column.align ?? 'start'],\n column.className\n )}\n >\n {column.sortable ? (\n <button\n type=\"button\"\n onClick={() => handleSortClick(column.id)}\n className=\"inline-flex items-center gap-1.5 font-inherit uppercase tracking-inherit text-inherit hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background\"\n aria-label={sortAriaLabel(column, sort)}\n >\n <span>{renderHeader(column.header)}</span>\n <SortIndicator\n active={isSorted}\n direction={isSorted ? sort.direction : null}\n />\n </button>\n ) : (\n renderHeader(column.header)\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {loading ? (\n <SkeletonRows\n rowCount={skeletonCount}\n columnCount={totalColumnCount}\n cellClassName={sizeClasses.cell}\n />\n ) : pagedRows.length === 0 ? (\n <tr>\n <td\n colSpan={totalColumnCount}\n className={cn(sizeClasses.cell, 'py-10 text-center text-muted-foreground')}\n >\n {emptyState ?? 'No data'}\n </td>\n </tr>\n ) : (\n pagedRows.map((row, rowIndex) => {\n const id = getRowId(row, rowIndex);\n const isSelected = selected.has(id);\n const rowSelectable = isRowSelectable ? isRowSelectable(row) : true;\n return (\n <tr\n key={id}\n data-selected={isSelected ? 'true' : undefined}\n aria-selected={enableRowSelection ? isSelected : undefined}\n className={cn(\n 'border-t border-border transition-colors',\n 'hover:bg-accent',\n striped && rowIndex % 2 === 1 && 'bg-muted/20',\n isSelected && selectedRowClass,\n onRowClick && 'cursor-pointer'\n )}\n onClick={onRowClick ? () => onRowClick(row, rowIndex) : undefined}\n >\n {enableRowSelection ? (\n <td className={cn(sizeClasses.cell, 'w-10')}>\n <Checkbox\n aria-label={`Select row ${rowIndex + 1}`}\n checked={isSelected}\n disabled={!rowSelectable}\n onCheckedChange={(next) => toggleRow(id, next)}\n onClick={stopRowClickPropagation}\n />\n </td>\n ) : null}\n {columns.map((column) => (\n <td\n key={column.id}\n className={cn(\n sizeClasses.cell,\n alignClass[column.align ?? 'start'],\n column.className\n )}\n >\n {renderCell(column, row, rowIndex)}\n </td>\n ))}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n\n {paginationVisible ? (\n <Pagination\n pageIndex={pagination.pageIndex}\n pageSize={pagination.pageSize}\n pageCount={pageCount}\n totalRowCount={totalRowCount}\n pageSizeOptions={pageSizeOptions}\n onChange={setPagination}\n />\n ) : null}\n </div>\n );\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\nfunction renderHeader(header: Column<unknown>['header']): ReactNode {\n return typeof header === 'function' ? header() : header;\n}\n\nfunction renderCell<T>(column: Column<T>, row: T, rowIndex: number): ReactNode {\n if (column.render) return column.render(row, rowIndex);\n if (column.accessor !== undefined) {\n const value = row[column.accessor];\n return value === null || value === undefined ? '' : String(value);\n }\n return null;\n}\n\nfunction resolveSortGetter<T>(column: Column<T>): ((row: T) => SortableValue) | null {\n if (column.sortAccessor) return column.sortAccessor;\n if (column.accessor !== undefined) {\n const key = column.accessor;\n return (row: T) => row[key] as SortableValue;\n }\n return null;\n}\n\nfunction compareValues(a: SortableValue, b: SortableValue): number {\n if (a === b) return 0;\n if (a === null || a === undefined) return 1;\n if (b === null || b === undefined) return -1;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n if (typeof a === 'bigint' && typeof b === 'bigint') return a < b ? -1 : 1;\n if (typeof a === 'boolean' && typeof b === 'boolean') return a === b ? 0 : a ? 1 : -1;\n return String(a).localeCompare(String(b), undefined, { numeric: true, sensitivity: 'base' });\n}\n\nfunction nextSort(current: SortState, columnId: string): SortState {\n if (current.columnId !== columnId) return { columnId, direction: 'asc' };\n if (current.direction === 'asc') return { columnId, direction: 'desc' };\n return { columnId: null, direction: 'asc' };\n}\n\nfunction sortAriaLabel<T>(column: Column<T>, sort: SortState): string {\n const headerText = typeof column.header === 'string' ? column.header : column.id;\n if (sort.columnId !== column.id) return `Sort by ${headerText}`;\n return sort.direction === 'asc'\n ? `Sort by ${headerText}, currently ascending`\n : `Sort by ${headerText}, currently descending`;\n}\n\nfunction stopRowClickPropagation(event: MouseEvent<HTMLInputElement>) {\n event.stopPropagation();\n}\n\ninterface SkeletonRowsProps {\n rowCount: number;\n columnCount: number;\n cellClassName: string;\n}\n\nfunction SkeletonRows({ rowCount, columnCount, cellClassName }: SkeletonRowsProps) {\n const rowKeys = Array.from({ length: Math.max(0, rowCount) }, (_, i) => `skeleton-row-${i}`);\n const colKeys = Array.from({ length: Math.max(1, columnCount) }, (_, i) => `skeleton-col-${i}`);\n return (\n <>\n {rowKeys.map((rowKey) => (\n <tr key={rowKey} className=\"border-t border-border\" data-testid=\"table-skeleton-row\">\n {colKeys.map((colKey) => (\n <td key={`${rowKey}-${colKey}`} className={cellClassName}>\n <span className=\"block h-3 w-full animate-pulse rounded bg-muted\" />\n </td>\n ))}\n </tr>\n ))}\n </>\n );\n}\n\ninterface SortIndicatorProps {\n active: boolean;\n direction: SortDirection | null;\n}\n\nfunction SortIndicator({ active, direction }: SortIndicatorProps) {\n const className = cn(\n 'h-3.5 w-3.5 shrink-0',\n active ? 'text-foreground' : 'text-muted-foreground'\n );\n if (!active) return <ChevronsUpDown aria-hidden=\"true\" className={className} />;\n return direction === 'asc' ? (\n <ChevronUp aria-hidden=\"true\" className={className} />\n ) : (\n <ChevronDown aria-hidden=\"true\" className={className} />\n );\n}\n","export type TextareaVariant = 'default' | 'filled' | 'ghost';\n\nexport type TextareaSize = 'sm' | 'md' | 'lg';\n\nexport type TextareaResize = 'none' | 'vertical' | 'horizontal' | 'both';\n\nexport const textareaVariantClass: Record<TextareaVariant, string> = {\n default: 'border border-input bg-background hover:border-ring',\n filled: 'border border-transparent bg-muted hover:bg-muted/80',\n ghost: 'border border-transparent bg-transparent hover:bg-accent',\n};\n\nexport const textareaSizeClass: Record<TextareaSize, string> = {\n sm: 'rounded-md px-2.5 py-1.5 text-sm',\n md: 'rounded-md px-3 py-2 text-sm',\n lg: 'rounded-md px-4 py-2.5 text-base',\n};\n\nexport const textareaResizeClass: Record<TextareaResize, string> = {\n none: 'resize-none',\n vertical: 'resize-y',\n horizontal: 'resize-x',\n both: 'resize',\n};\n\nexport const textareaBaseClass =\n 'group/textarea relative flex w-full text-foreground outline-none transition-[background-color,border-color,box-shadow] focus-within:ring-2 focus-within:ring-ring/40 focus-within:ring-offset-1 focus-within:ring-offset-background aria-[invalid=true]:border-destructive aria-[invalid=true]:focus-within:ring-destructive/40 has-[textarea:disabled]:pointer-events-none has-[textarea:disabled]:opacity-50';\n","import { forwardRef, type ReactNode, type TextareaHTMLAttributes, useId } from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n type TextareaResize,\n type TextareaSize,\n type TextareaVariant,\n textareaBaseClass,\n textareaResizeClass,\n textareaSizeClass,\n textareaVariantClass,\n} from './textareaVariants';\n\nexport interface TextareaProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> {\n variant?: TextareaVariant;\n textareaSize?: TextareaSize;\n /** Controls the native CSS `resize` behaviour. Defaults to `'vertical'`. */\n resize?: TextareaResize;\n /** Optional label rendered above the field. */\n label?: ReactNode;\n /** Helper text rendered under the field when not in an error state. */\n helperText?: ReactNode;\n /** Error message — renders in destructive style and sets aria-invalid. */\n error?: ReactNode;\n /** Stretch the wrapper to fill the parent's inline width. Defaults to `true`. */\n fullWidth?: boolean;\n /** Class applied to the outer wrapper that frames the textarea. */\n wrapperClassName?: string;\n /** Class applied to the field container (`<label>` block). */\n containerClassName?: string;\n}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n {\n variant = 'default',\n textareaSize = 'md',\n resize = 'vertical',\n label,\n helperText,\n error,\n fullWidth = true,\n rows = 4,\n id,\n className,\n wrapperClassName,\n containerClassName,\n 'aria-invalid': ariaInvalidProp,\n 'aria-describedby': ariaDescribedByProp,\n disabled,\n ...props\n },\n ref\n) {\n const generatedId = useId();\n const textareaId = id ?? generatedId;\n const helperId = `${textareaId}-helper`;\n const errorId = `${textareaId}-error`;\n\n const hasError = error !== undefined && error !== null && error !== false;\n const ariaInvalid = ariaInvalidProp ?? (hasError ? true : undefined);\n\n const describedByIds = [\n ariaDescribedByProp,\n hasError ? errorId : null,\n !hasError && helperText ? helperId : null,\n ]\n .filter(Boolean)\n .join(' ');\n const ariaDescribedBy = describedByIds.length > 0 ? describedByIds : undefined;\n\n return (\n <div className={cn('flex flex-col gap-1.5', fullWidth && 'w-full', containerClassName)}>\n {label !== undefined && label !== null && (\n <label htmlFor={textareaId} className=\"text-sm font-medium text-foreground select-none\">\n {label}\n </label>\n )}\n\n <div\n data-slot=\"textarea-wrapper\"\n className={cn(\n textareaBaseClass,\n textareaVariantClass[variant],\n textareaSizeClass[textareaSize],\n wrapperClassName\n )}\n aria-invalid={ariaInvalid}\n data-disabled={disabled ? 'true' : undefined}\n >\n <textarea\n ref={ref}\n id={textareaId}\n rows={rows}\n disabled={disabled}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n className={cn(\n 'w-full min-w-0 flex-1 bg-transparent outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed',\n textareaResizeClass[resize],\n className\n )}\n {...props}\n />\n </div>\n\n {hasError ? (\n <p id={errorId} className=\"text-xs text-destructive\">\n {error}\n </p>\n ) : helperText ? (\n <p id={helperId} className=\"text-xs text-muted-foreground\">\n {helperText}\n </p>\n ) : null}\n </div>\n );\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dimaan/ui",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "description": "Shared React UI component library for Diman company projects.",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,