@tomny-dev/uzi 0.1.8 → 0.1.9

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/components/button/Button.tsx","../src/utils/cx.ts","../src/components/avatar/Avatar.tsx","../src/components/card/Card.tsx","../src/components/pill/Pill.tsx","../src/components/modal/Modal.tsx","../src/components/alert/Alert.tsx","../src/components/toast/ToastContext.tsx","../src/components/input/Input.tsx","../src/components/label/Label.tsx","../src/components/checkbox/Checkbox.tsx","../src/components/dropdown/Dropdown.tsx","../src/components/dropdown-menu/DropdownMenu.tsx","../src/components/app-shell/AppShell.tsx","../src/theme/ThemeProvider.tsx","../src/theme/constants.ts","../src/components/theme-toggle-button/ThemeToggleButton.tsx","../src/components/top-bar/TopBar.tsx","../src/components/sidebar-nav/SidebarNav.tsx"],"sourcesContent":["import \"./theme/theme.css\";\n\n// Primitives\nexport type { ButtonProps, ButtonVariant, ButtonSize } from \"./components/button/Button\";\nexport { Button } from \"./components/button/Button\";\n\nexport type { AvatarProps, AvatarSize } from \"./components/avatar/Avatar\";\nexport { Avatar, AvatarFallback, AvatarImage } from \"./components/avatar/Avatar\";\n\nexport type { CardProps, CardPadding, CardTone } from \"./components/card/Card\";\nexport { Card } from \"./components/card/Card\";\n\nexport type { PillProps, PillSize, PillTone } from \"./components/pill/Pill\";\nexport { Pill } from \"./components/pill/Pill\";\n\n// Overlays\nexport type { ModalOverlayProps, ModalProps, ModalSize } from \"./components/modal/Modal\";\nexport { Modal, ModalOverlay } from \"./components/modal/Modal\";\n\n// Feedback\nexport type { AlertProps, AlertTone } from \"./components/alert/Alert\";\nexport { Alert } from \"./components/alert/Alert\";\n\nexport { ToastProvider, useToast } from \"./components/toast/ToastContext\";\nexport type {\n Toast,\n ToastConfig,\n ToastContextValue,\n ToastOptions,\n ToastPosition,\n ToastType,\n} from \"./components/toast/types\";\n\n// Inputs\nexport type { InputProps } from \"./components/input/Input\";\nexport { Input } from \"./components/input/Input\";\n\nexport type { LabelProps } from \"./components/label/Label\";\nexport { Label } from \"./components/label/Label\";\n\nexport type { CheckboxProps } from \"./components/checkbox/Checkbox\";\nexport { Checkbox } from \"./components/checkbox/Checkbox\";\n\nexport type { DropdownProps, DropdownOption } from \"./components/dropdown/Dropdown\";\nexport { Dropdown } from \"./components/dropdown/Dropdown\";\n\nexport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuPortal,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from \"./components/dropdown-menu/DropdownMenu\";\n\n// Layout\nexport type { AppShellProps } from \"./components/app-shell/AppShell\";\nexport { AppShell } from \"./components/app-shell/AppShell\";\n\nexport type { SidebarNavItem, SidebarNavProps, SidebarNavSection } from \"./components/sidebar-nav/SidebarNav\";\nexport { SidebarNav } from \"./components/sidebar-nav/SidebarNav\";\n\nexport type { TopBarProps } from \"./components/top-bar/TopBar\";\nexport { TopBar } from \"./components/top-bar/TopBar\";\n\nexport type { ThemeToggleButtonProps } from \"./components/theme-toggle-button/ThemeToggleButton\";\nexport { ThemeToggleButton } from \"./components/theme-toggle-button/ThemeToggleButton\";\n\n// Theme\nexport type { UziAccent, UziResolvedTheme, UziTheme } from \"./theme/ThemeProvider\";\nexport { ThemeProvider, useTheme } from \"./theme/ThemeProvider\";\n\n// Utils\nexport { cx } from \"./utils/cx\";\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cx } from \"../../utils/cx\";\nimport \"./button.module.css\";\n\nexport type ButtonVariant =\n | \"default\"\n | \"primary\"\n | \"secondary\"\n | \"outline\"\n | \"ghost\"\n | \"destructive\"\n | \"link\";\nexport type ButtonSize = \"default\" | \"sm\" | \"md\" | \"lg\" | \"icon\";\n\ntype BaseProps = {\n variant?: ButtonVariant;\n size?: ButtonSize;\n className?: string;\n children?: React.ReactNode;\n asChild?: boolean;\n};\n\ntype AsButton = BaseProps &\n React.ButtonHTMLAttributes<HTMLButtonElement> & { as?: \"button\" };\n\ntype AsAnchor = BaseProps &\n React.AnchorHTMLAttributes<HTMLAnchorElement> & { as: \"a\" };\n\nexport type ButtonProps = AsButton | AsAnchor;\n\nconst variantClass: Record<ButtonVariant, string> = {\n default: \"variant-primary\",\n primary: \"variant-primary\",\n secondary: \"variant-secondary\",\n outline: \"variant-outline\",\n ghost: \"variant-ghost\",\n destructive: \"variant-destructive\",\n link: \"variant-link\",\n};\n\nconst sizeClass: Record<ButtonSize, string> = {\n default: \"size-md\",\n sm: \"size-sm\",\n md: \"size-md\",\n lg: \"size-lg\",\n icon: \"size-icon\",\n};\n\nexport function Button({\n as,\n variant = \"default\",\n size = \"default\",\n className,\n children,\n asChild = false,\n ...rest\n}: ButtonProps) {\n const classes = cx(\n \"button\",\n variantClass[variant],\n sizeClass[size],\n className,\n );\n\n if (asChild) {\n return (\n <Slot className={classes} {...rest}>\n {children}\n </Slot>\n );\n }\n\n if (as === \"a\") {\n return (\n <a\n className={classes}\n {...(rest as React.AnchorHTMLAttributes<HTMLAnchorElement>)}\n >\n {children}\n </a>\n );\n }\n\n return (\n <button\n type=\"button\"\n className={classes}\n {...(rest as React.ButtonHTMLAttributes<HTMLButtonElement>)}\n >\n {children}\n </button>\n );\n}\n","export function cx(...values: Array<string | false | null | undefined>): string {\n return values.filter(Boolean).join(\" \");\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\";\nimport { cx } from \"../../utils/cx\";\nimport \"./avatar.module.css\";\n\nexport type AvatarSize = \"sm\" | \"md\" | \"lg\";\n\nexport type AvatarProps = React.ComponentProps<typeof AvatarPrimitive.Root> & {\n size?: AvatarSize;\n};\n\nexport function Avatar({\n className,\n size = \"md\",\n ...props\n}: AvatarProps) {\n return (\n <AvatarPrimitive.Root\n className={cx(\"avatar\", size === \"sm\" ? \"size-sm\" : size === \"lg\" ? \"size-lg\" : \"size-md\", className)}\n {...props}\n />\n );\n}\n\nexport function AvatarImage({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n className={cx(\"image\", className)}\n {...props}\n />\n );\n}\n\nexport function AvatarFallback({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n className={cx(\"fallback\", className)}\n {...props}\n />\n );\n}\n","/**\n * Lightweight container component used for panels across the app.\n *\n * @remarks\n * Supports tone variants, padding presets, and an optional interactive affordance.\n *\n * @param props.as - Semantic element to render (defaults to `div`).\n * @param props.tone - Visual tone variant.\n * @param props.padding - Padding preset.\n * @param props.interactive - Enables hover/focus affordance.\n */\nimport type { HTMLAttributes } from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport \"./card.module.css\";\n\nexport type CardTone = \"default\" | \"muted\" | \"contrast\";\nexport type CardPadding = \"none\" | \"sm\" | \"md\" | \"lg\";\n\ntype CardElement = \"div\" | \"section\" | \"article\";\n\nexport type CardProps = HTMLAttributes<HTMLElement> & {\n /** Optional semantic element type. Defaults to `div`. */\n as?: CardElement;\n /** Visual tone; drives background/border CSS vars. */\n tone?: CardTone;\n /** Padding preset; maps to CSS variables so consumers can override globally. */\n padding?: CardPadding;\n /** Adds hover/focus affordance (lift + outline). */\n interactive?: boolean;\n};\n\nexport function Card({\n as,\n tone = \"default\",\n padding = \"md\",\n interactive = false,\n className,\n children,\n ...rest\n}: CardProps) {\n const Component: CardElement = as ?? \"div\";\n const TONE_CLASS: Record<CardTone, string | null> = { default: null, muted: \"tone-muted\", contrast: \"tone-contrast\" };\n const PADDING_CLASS: Record<CardPadding, string> = { none: \"padding-none\", sm: \"padding-sm\", md: \"padding-md\", lg: \"padding-lg\" };\n const classes = cx(\n \"card\",\n TONE_CLASS[tone],\n PADDING_CLASS[padding],\n interactive && \"interactive\",\n className,\n );\n\n return (\n <Component className={classes} {...rest}>\n {children}\n </Component>\n );\n}\n","/**\n * Compact label component for status chips and tags.\n *\n * @remarks\n * Supports tone and size presets, and can render any inline element.\n *\n * @param props.as - Element to render (defaults to `span`).\n * @param props.tone - Visual tone variant.\n * @param props.size - Size preset.\n * @param props.icon - Optional leading icon.\n */\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport \"./pill.module.css\";\n\nexport type PillTone = \"neutral\" | \"success\" | \"warning\" | \"info\" | \"danger\";\nexport type PillSize = \"sm\" | \"md\";\n\ntype PillElement = \"span\" | \"div\" | \"button\";\n\nexport type PillProps = HTMLAttributes<HTMLElement> & {\n /** Optional rendered element; defaults to `span`. */\n as?: PillElement;\n /** Visual tone; adjusts color and border. */\n tone?: PillTone;\n /** Size preset. */\n size?: PillSize;\n /** Leading icon node (not focusable). */\n icon?: ReactNode;\n};\n\nexport function Pill({\n as,\n tone = \"neutral\",\n size = \"md\",\n icon,\n className,\n children,\n ...rest\n}: PillProps) {\n const Component: PillElement = as ?? \"span\";\n const classes = cx(\"pill\", `tone-${tone}`, `size-${size}`, className);\n\n return (\n <Component className={classes} {...rest}>\n {icon ? (\n <span className={\"icon\"} aria-hidden=\"true\">\n {icon}\n </span>\n ) : null}\n <span className={\"content\"}>{children}</span>\n </Component>\n );\n}\n","\"use client\";\n\nimport { useRef, useEffect, type ReactNode } from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport \"./modal.module.css\";\n\n// ── ModalOverlay ─────────────────────────────────────────────────────────────\n// Bare backdrop + container. No opinions on layout inside.\n// Use this when you need a full-custom layout (e.g. wide media modals).\n\nexport type ModalOverlayProps = {\n open: boolean;\n onClose: () => void;\n /** Extra class applied to the backdrop */\n className?: string;\n children: ReactNode;\n};\n\nexport function ModalOverlay({ open, onClose, className, children }: ModalOverlayProps) {\n const mouseDownOnBackdrop = useRef(false);\n\n useEffect(() => {\n if (!open) return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n onClose();\n }\n };\n // Capture phase so the innermost modal handles Escape first\n window.addEventListener(\"keydown\", handleKeyDown, true);\n return () => window.removeEventListener(\"keydown\", handleKeyDown, true);\n }, [open, onClose]);\n\n if (!open) return null;\n\n return (\n <div\n className={cx(\"backdrop\", className)}\n role=\"dialog\"\n aria-modal=\"true\"\n onMouseDown={(e) => { mouseDownOnBackdrop.current = e.target === e.currentTarget; }}\n onMouseUp={(e) => {\n if (mouseDownOnBackdrop.current && e.target === e.currentTarget) onClose();\n mouseDownOnBackdrop.current = false;\n }}\n >\n {children}\n </div>\n );\n}\n\n// ── Modal ─────────────────────────────────────────────────────────────────────\n// Opinionated dialog: header (title + close button), scrollable body, footer.\n\nexport type ModalSize = \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport type ModalProps = {\n open: boolean;\n onClose: () => void;\n title: string;\n subtitle?: string;\n size?: ModalSize;\n children: ReactNode;\n footer?: ReactNode;\n};\n\nexport function Modal({ open, onClose, title, subtitle, size = \"md\", children, footer }: ModalProps) {\n return (\n <ModalOverlay open={open} onClose={onClose}>\n <div className={cx(\"modal\", `size-${size}`)}>\n <div className={\"header\"}>\n <div className={\"titles\"}>\n <div className={\"title\"}>{title}</div>\n {subtitle && <div className={\"subtitle\"}>{subtitle}</div>}\n </div>\n <button className={\"closeButton\"} onClick={onClose} aria-label=\"Close\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n\n <div className={\"body\"}>{children}</div>\n\n {footer && <div className={\"footer\"}>{footer}</div>}\n </div>\n </ModalOverlay>\n );\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport \"./alert.module.css\";\n\nexport type AlertTone = \"success\" | \"error\" | \"warning\" | \"info\";\n\nexport type AlertProps = {\n tone: AlertTone;\n children: ReactNode;\n className?: string;\n};\n\nconst TONE_CLASS: Record<AlertTone, string> = {\n success: \"success\",\n error: \"error\",\n warning: \"warning\",\n info: \"info\",\n};\n\nexport function Alert({ tone, children, className }: AlertProps) {\n return (\n <div className={cx(\"alert\", TONE_CLASS[tone], className)} role=\"alert\">\n {children}\n </div>\n );\n}\n","\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport type {\n Toast,\n ToastConfig,\n ToastContextValue,\n ToastOptions,\n ToastPosition,\n ToastType,\n} from \"./types\";\nimport \"./toast.module.css\";\n\n/** Default provider configuration. */\nconst DEFAULT_CONFIG: Required<ToastConfig> = {\n position: \"top-right\",\n maxToasts: 5,\n defaultDuration: 4000,\n pauseOnHover: true,\n pauseOnFocusLoss: true,\n};\n\nconst ToastContext = createContext<ToastContextValue | undefined>(undefined);\n\nlet toastIdCounter = 0;\nconst generateToastId = () => `toast-${++toastIdCounter}-${Date.now()}`;\n\n/**\n * Toast notification context provider.\n *\n * @remarks\n * Wrap your app (or a section) to enable `useToast` calls. Supports configurable placement,\n * maximum visible toasts, and pause behavior on hover or window blur.\n *\n * @param props.children - React subtree that can consume the toast context.\n * @param props.config - Optional provider configuration overrides.\n */\nexport function ToastProvider({\n children,\n config,\n}: {\n children: ReactNode;\n config?: ToastConfig;\n}) {\n const [toasts, setToasts] = useState<Toast[]>([]);\n const [isPaused, setIsPaused] = useState(false);\n const merged = useMemo(() => ({ ...DEFAULT_CONFIG, ...config }), [config]);\n\n const push = useCallback(\n (message: string, options: ToastOptions = {}) => {\n const id = generateToastId();\n setToasts((prev) => {\n const next: Toast[] = [\n ...prev,\n {\n id,\n message,\n type: options.type ?? \"info\",\n duration: options.duration ?? (options.type === \"error\" ? 6000 : merged.defaultDuration),\n dismissible: options.dismissible ?? true,\n action: options.action,\n },\n ];\n if (next.length > merged.maxToasts) next.shift();\n return next;\n });\n return id;\n },\n [merged.defaultDuration, merged.maxToasts],\n );\n\n const success = useCallback(\n (message: string, options?: Omit<ToastOptions, \"type\">) => push(message, { ...options, type: \"success\" }),\n [push],\n );\n const error = useCallback(\n (message: string, options?: Omit<ToastOptions, \"type\">) =>\n push(message, { ...options, type: \"error\", duration: options?.duration ?? 6000 }),\n [push],\n );\n const warning = useCallback(\n (message: string, options?: Omit<ToastOptions, \"type\">) => push(message, { ...options, type: \"warning\" }),\n [push],\n );\n const info = useCallback(\n (message: string, options?: Omit<ToastOptions, \"type\">) => push(message, { ...options, type: \"info\" }),\n [push],\n );\n\n const dismiss = useCallback((id: string) => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, []);\n\n const dismissAll = useCallback(() => setToasts([]), []);\n\n useEffect(() => {\n if (!merged.pauseOnFocusLoss) return;\n const handleVisibility = () => setIsPaused(document.visibilityState !== \"visible\");\n document.addEventListener(\"visibilitychange\", handleVisibility);\n return () => document.removeEventListener(\"visibilitychange\", handleVisibility);\n }, [merged.pauseOnFocusLoss]);\n\n const value = useMemo<ToastContextValue>(\n () => ({ toasts, push, success, error, warning, info, dismiss, dismissAll }),\n [toasts, push, success, error, warning, info, dismiss, dismissAll],\n );\n\n return (\n <ToastContext.Provider value={value}>\n {children}\n <ToastContainer\n toasts={toasts}\n position={merged.position}\n pauseOnHover={merged.pauseOnHover}\n isPaused={isPaused}\n onDismiss={dismiss}\n onPauseChange={setIsPaused}\n />\n </ToastContext.Provider>\n );\n}\n\n/**\n * Hook to access the toast API.\n *\n * @remarks\n * Exposes `push`, intent helpers (`success`, `error`, `warning`, `info`), and dismissal helpers.\n * Must be called within a `ToastProvider`.\n *\n * @throws Error if used outside of a `ToastProvider`.\n */\nexport function useToast(): ToastContextValue {\n const ctx = useContext(ToastContext);\n if (!ctx) throw new Error(\"useToast must be used within a ToastProvider\");\n return ctx;\n}\n\n/** Renders the positioned toast stack. */\nfunction ToastContainer({\n toasts,\n position,\n pauseOnHover,\n isPaused,\n onDismiss,\n onPauseChange,\n}: {\n toasts: Toast[];\n position: ToastPosition;\n pauseOnHover: boolean;\n isPaused: boolean;\n onDismiss: (id: string) => void;\n onPauseChange: (paused: boolean) => void;\n}) {\n const posClass = (() => {\n switch (position) {\n case \"top-left\":\n return \"topLeft\";\n case \"top-center\":\n return \"topCenter\";\n case \"bottom-right\":\n return \"bottomRight\";\n case \"bottom-left\":\n return \"bottomLeft\";\n case \"bottom-center\":\n return \"bottomCenter\";\n case \"top-right\":\n default:\n return \"topRight\";\n }\n })();\n\n return (\n <div\n className={cx(\"stack\", posClass)}\n role=\"presentation\"\n onMouseEnter={() => pauseOnHover && onPauseChange(true)}\n onMouseLeave={() => pauseOnHover && onPauseChange(false)}\n >\n {toasts.map((toast) => (\n <ToastItem key={toast.id} toast={toast} isPaused={isPaused} onDismiss={onDismiss} />\n ))}\n </div>\n );\n}\n\n/** Individual toast item with timers and actions. */\nfunction ToastItem({\n toast,\n isPaused,\n onDismiss,\n}: {\n toast: Toast;\n isPaused: boolean;\n onDismiss: (id: string) => void;\n}) {\n const [exiting, setExiting] = useState(false);\n const timerRef = useRef<number | null>(null);\n const startRef = useRef<number>(0);\n const remainingRef = useRef<number>(toast.duration ?? 0);\n\n const palette = getPalette(toast.type);\n const styleVars: CSSProperties = {\n [\"--toast-bg\" as any]: palette.background,\n [\"--toast-border\" as any]: palette.border,\n [\"--toast-text\" as any]: palette.text,\n [\"--toast-button-bg\" as any]: palette.buttonBg,\n [\"--toast-button-border\" as any]: palette.buttonBorder,\n [\"--toast-action-bg\" as any]: palette.actionBg,\n [\"--toast-action-border\" as any]: palette.actionBorder,\n };\n\n const stopTimer = () => {\n if (timerRef.current) {\n window.clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n };\n\n const triggerDismiss = useCallback(() => {\n setExiting(true);\n stopTimer();\n window.setTimeout(() => onDismiss(toast.id), 160);\n }, [onDismiss, toast.id]);\n\n const schedule = useCallback(\n (delay: number) => {\n if (!delay || delay <= 0) {\n triggerDismiss();\n return;\n }\n startRef.current = performance.now();\n stopTimer();\n timerRef.current = window.setTimeout(() => triggerDismiss(), delay);\n },\n [triggerDismiss],\n );\n\n useEffect(() => {\n if (!toast.duration || toast.duration <= 0) return undefined;\n schedule(toast.duration);\n return stopTimer;\n }, [schedule, toast.duration]);\n\n useEffect(() => {\n if (!toast.duration || toast.duration <= 0) return;\n if (isPaused) {\n const elapsed = performance.now() - startRef.current;\n remainingRef.current = Math.max(0, remainingRef.current - elapsed);\n stopTimer();\n } else {\n schedule(remainingRef.current);\n }\n }, [isPaused, schedule, toast.duration]);\n\n const icon = getIcon(toast.type);\n\n return (\n <div className={cx(\"toast\", exiting && \"exit\")} style={styleVars} role=\"status\" aria-live=\"polite\">\n <span className={\"icon\"} aria-hidden>\n {icon}\n </span>\n <div className={\"body\"}>\n <div className={\"message\"}>{toast.message}</div>\n {toast.action && (\n <div className={\"actions\"}>\n <button\n type=\"button\"\n className={\"actionButton\"}\n onClick={() => {\n toast.action?.onClick();\n triggerDismiss();\n }}\n >\n {toast.action.label}\n </button>\n </div>\n )}\n </div>\n {toast.dismissible !== false && (\n <button\n type=\"button\"\n className={\"closeButton\"}\n onClick={triggerDismiss}\n aria-label=\"Dismiss notification\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden>\n <path\n d=\"M11 3L3 11M3 3l8 8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n );\n}\n\nfunction getPalette(type: ToastType) {\n switch (type) {\n case \"success\":\n return {\n background: \"#22c55e\",\n border: \"#16a34a\",\n text: \"#0b1224\",\n buttonBg: \"rgba(0, 0, 0, 0.08)\",\n buttonBorder: \"rgba(0, 0, 0, 0.2)\",\n actionBg: \"rgba(0, 0, 0, 0.1)\",\n actionBorder: \"rgba(0, 0, 0, 0.2)\",\n };\n case \"error\":\n return {\n background: \"#f87171\",\n border: \"#ef4444\",\n text: \"#0b1224\",\n buttonBg: \"rgba(0, 0, 0, 0.08)\",\n buttonBorder: \"rgba(0, 0, 0, 0.2)\",\n actionBg: \"rgba(0, 0, 0, 0.1)\",\n actionBorder: \"rgba(0, 0, 0, 0.2)\",\n };\n case \"warning\":\n return {\n background: \"#fbbf24\",\n border: \"#f59e0b\",\n text: \"#0b1224\",\n buttonBg: \"rgba(0, 0, 0, 0.08)\",\n buttonBorder: \"rgba(0, 0, 0, 0.2)\",\n actionBg: \"rgba(0, 0, 0, 0.1)\",\n actionBorder: \"rgba(0, 0, 0, 0.2)\",\n };\n case \"info\":\n default:\n return {\n background: \"#38bdf8\",\n border: \"#0ea5e9\",\n text: \"#0b1224\",\n buttonBg: \"rgba(0, 0, 0, 0.08)\",\n buttonBorder: \"rgba(0, 0, 0, 0.2)\",\n actionBg: \"rgba(0, 0, 0, 0.1)\",\n actionBorder: \"rgba(0, 0, 0, 0.2)\",\n };\n }\n}\n\nfunction getIcon(type: ToastType) {\n switch (type) {\n case \"success\":\n return \"OK\";\n case \"error\":\n return \"X\";\n case \"warning\":\n return \"!\";\n case \"info\":\n default:\n return \"i\";\n }\n}\n","import * as React from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport \"./input.module.css\";\n\nexport type InputProps = React.InputHTMLAttributes<HTMLInputElement>;\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n ref={ref}\n type={type}\n className={cx(\"input\", className)}\n {...props}\n />\n );\n },\n);\n\nInput.displayName = \"Input\";\n","import * as React from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport \"./label.module.css\";\n\nexport type LabelProps = React.LabelHTMLAttributes<HTMLLabelElement>;\n\nexport const Label = React.forwardRef<HTMLLabelElement, LabelProps>(\n ({ className, ...props }, ref) => (\n <label ref={ref} className={cx(\"label\", className)} {...props} />\n ),\n);\n\nLabel.displayName = \"Label\";\n","import * as React from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport \"./checkbox.module.css\";\n\nexport type CheckboxProps = React.InputHTMLAttributes<HTMLInputElement>;\n\nexport const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n ({ className, ...props }, ref) => {\n return (\n <input\n ref={ref}\n type=\"checkbox\"\n className={cx(\"checkbox\", className)}\n {...props}\n />\n );\n },\n);\n\nCheckbox.displayName = \"Checkbox\";\n","\"use client\";\n\nimport { useState, useRef, useEffect } from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport \"./dropdown.module.css\";\n\nexport interface DropdownOption {\n label: string;\n value: string;\n}\n\nexport interface DropdownProps {\n /** List of options to display in the menu. */\n options: DropdownOption[];\n /** Currently selected value. Use empty string for \"no selection\". */\n value: string;\n /** Called when the user selects an option. */\n onChange: (value: string) => void;\n /** Label shown when no option is selected. Defaults to \"All\". */\n placeholder?: string;\n /** Additional class name for the wrapper element. */\n className?: string;\n /** Whether to show the placeholder as a clearable option. Defaults to true. */\n allowClear?: boolean;\n /** Associates the trigger button with an external label element via its id. */\n \"aria-labelledby\"?: string;\n /** Provides an accessible label directly on the trigger button. */\n \"aria-label\"?: string;\n}\n\nexport function Dropdown({\n options,\n value,\n onChange,\n placeholder = \"All\",\n className,\n allowClear = true,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-label\": ariaLabel,\n}: DropdownProps) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n const selected = options.find((o) => o.value === value);\n const isActive = allowClear && value !== \"\";\n\n useEffect(() => {\n function handleClickOutside(e: MouseEvent) {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n setOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n return (\n <div className={cx(\"wrapper\", className)} ref={ref}>\n <button\n type=\"button\"\n className={cx(\"trigger\", isActive && \"trigger-active\")}\n onClick={() => setOpen((o) => !o)}\n aria-labelledby={ariaLabelledBy}\n aria-label={ariaLabel}\n >\n {selected ? selected.label : placeholder}\n <span className={cx(\"chevron\", open && \"chevron-open\")}>\n <svg viewBox=\"0 0 10 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\">\n <path d=\"M2 3.5L5 6.5L8 3.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n </button>\n\n {open && (\n <div className={\"menu\"}>\n {allowClear && (\n <button\n type=\"button\"\n className={cx(\"option\", value === \"\" && \"option-selected\")}\n onClick={() => { onChange(\"\"); setOpen(false); }}\n >\n {placeholder}\n </button>\n )}\n {options.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n className={cx(\"option\", value === opt.value && \"option-selected\")}\n onClick={() => { onChange(opt.value); setOpen(false); }}\n >\n {opt.label}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\";\nimport { cx } from \"../../utils/cx\";\nimport \"./dropdown-menu.module.css\";\n\nexport function DropdownMenu(\n props: React.ComponentProps<typeof DropdownMenuPrimitive.Root>,\n) {\n return <DropdownMenuPrimitive.Root {...props} />;\n}\n\nexport function DropdownMenuTrigger(\n props: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>,\n) {\n return <DropdownMenuPrimitive.Trigger {...props} />;\n}\n\nexport function DropdownMenuGroup(\n props: React.ComponentProps<typeof DropdownMenuPrimitive.Group>,\n) {\n return <DropdownMenuPrimitive.Group {...props} />;\n}\n\nexport function DropdownMenuPortal(\n props: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>,\n) {\n return <DropdownMenuPrimitive.Portal {...props} />;\n}\n\nexport function DropdownMenuSub(\n props: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>,\n) {\n return <DropdownMenuPrimitive.Sub {...props} />;\n}\n\nexport function DropdownMenuRadioGroup(\n props: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>,\n) {\n return <DropdownMenuPrimitive.RadioGroup {...props} />;\n}\n\nexport function DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n sideOffset={sideOffset}\n className={cx(\"content\", className)}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n );\n}\n\nexport function DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n variant?: \"default\" | \"destructive\";\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-inset={inset ? \"true\" : undefined}\n className={cx(\n \"item\",\n variant === \"destructive\" && \"destructive\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function DropdownMenuCheckboxItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n className={cx(\"item\", \"insetItem\", className)}\n {...props}\n >\n <span className={\"indicator\"}>\n <DropdownMenuPrimitive.ItemIndicator>\n <svg\n viewBox=\"0 0 16 16\"\n width=\"16\"\n height=\"16\"\n aria-hidden=\"true\"\n className={\"indicatorIcon\"}\n >\n <path\n d=\"M3.5 8.5 6.5 11.5 12.5 4.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n );\n}\n\nexport function DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n className={cx(\"item\", \"insetItem\", className)}\n {...props}\n >\n <span className={\"indicator\"}>\n <DropdownMenuPrimitive.ItemIndicator>\n <span className={\"radioDot\"} />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n );\n}\n\nexport function DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-inset={inset ? \"true\" : undefined}\n className={cx(\"label\", className)}\n {...props}\n />\n );\n}\n\nexport function DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n className={cx(\"separator\", className)}\n {...props}\n />\n );\n}\n\nexport function DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-inset={inset ? \"true\" : undefined}\n className={cx(\"item\", className)}\n {...props}\n >\n {children}\n <svg\n viewBox=\"0 0 16 16\"\n width=\"16\"\n height=\"16\"\n aria-hidden=\"true\"\n className={\"chevron\"}\n >\n <path\n d=\"M6 3.5 10.5 8 6 12.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </DropdownMenuPrimitive.SubTrigger>\n );\n}\n\nexport function DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n className={cx(\"content\", className)}\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport {\n useEffect,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport { TopBar, type TopBarProps } from \"../top-bar/TopBar\";\nimport \"./app-shell.module.css\";\n\nconst DESKTOP_BREAKPOINT = 960;\n\nfunction getIsDesktop() {\n if (typeof window === \"undefined\") return false;\n return window.innerWidth >= DESKTOP_BREAKPOINT;\n}\n\nexport type AppShellProps = {\n /** Primary page content rendered in the main area. */\n children: ReactNode;\n /** Sidebar navigation or custom content. */\n sidebar: ReactNode;\n /** Brand element rendered next to the hamburger (text or JSX). */\n brand?: ReactNode;\n /** Optional brand href; when provided the brand renders as an anchor. */\n brandHref?: string;\n /** Optional content after the brand on the left side of the top bar. */\n topbarStart?: ReactNode;\n /** Optional content aligned to the right side of the top bar. */\n topbarEnd?: ReactNode;\n /** Optional built-in theme toggle for the top bar. */\n showThemeToggle?: boolean;\n themeToggleProps?: TopBarProps[\"themeToggleProps\"];\n topBarBrandingLocation?: TopBarProps[\"brandingLocation\"];\n /** Custom class names for styling overrides. */\n className?: string;\n sidebarClassName?: string;\n topbarClassName?: string;\n mainClassName?: string;\n /** Sets the sidebar width (e.g., `260`, `\"18rem\"`). */\n sidebarWidth?: number | string;\n /**\n * Closes the sidebar on mobile whenever this value changes.\n * Useful for reacting to route/pathname changes.\n */\n closeSidebarOnChangeKey?: unknown;\n /** Label for the hamburger button (aria-label). */\n hamburgerLabel?: string;\n /** Optional callback fired whenever the sidebar open state changes. */\n onSidebarToggle?: (open: boolean) => void;\n};\n\n/**\n * Responsive application shell with a collapsible sidebar and sticky top bar.\n *\n * - Sidebar opens by default on desktop, collapses on mobile.\n * - Closes on outside click/scroll/touch when in mobile mode.\n * - Provides optional hook to close the sidebar when a prop value changes\n * (e.g., route transitions).\n */\nexport function AppShell({\n children,\n sidebar,\n brand,\n brandHref,\n topbarStart,\n topbarEnd,\n showThemeToggle = false,\n themeToggleProps,\n topBarBrandingLocation = \"left\",\n className,\n sidebarClassName,\n topbarClassName,\n mainClassName,\n sidebarWidth,\n closeSidebarOnChangeKey,\n hamburgerLabel = \"Toggle navigation\",\n onSidebarToggle,\n}: AppShellProps) {\n const [isDesktop, setIsDesktop] = useState(false);\n const [sidebarOpen, setSidebarOpen] = useState(false);\n const [transitionsReady, setTransitionsReady] = useState(false);\n const prevIsDesktopRef = useRef(false);\n const closeKeyRef = useRef(closeSidebarOnChangeKey);\n\n const sidebarRef = useRef<HTMLElement | null>(null);\n const hamburgerRef = useRef<HTMLButtonElement | null>(null);\n const mainRef = useRef<HTMLElement | null>(null);\n const sidebarId = useId();\n\n useEffect(() => {\n const desktop = getIsDesktop();\n setIsDesktop(desktop);\n setSidebarOpen(desktop);\n prevIsDesktopRef.current = desktop;\n const transitionFrame = window.requestAnimationFrame(() => {\n setTransitionsReady(true);\n });\n\n const handleResize = () => {\n const nowDesktop = getIsDesktop();\n setIsDesktop(nowDesktop);\n if (nowDesktop !== prevIsDesktopRef.current) {\n setSidebarOpen(nowDesktop);\n prevIsDesktopRef.current = nowDesktop;\n }\n };\n\n window.addEventListener(\"resize\", handleResize);\n return () => {\n window.cancelAnimationFrame(transitionFrame);\n window.removeEventListener(\"resize\", handleResize);\n };\n }, []);\n\n // Close the sidebar when clicking outside or scrolling on mobile.\n useEffect(() => {\n if (isDesktop || !sidebarOpen) return;\n\n const mainElement = mainRef.current;\n const closeSidebar = () => setSidebarOpen(false);\n\n const onPointerDown = (e: PointerEvent) => {\n const target = e.target as Node | null;\n if (!target) return;\n if (sidebarRef.current?.contains(target)) return;\n if (hamburgerRef.current?.contains(target)) return;\n closeSidebar();\n };\n\n const timeoutId = window.setTimeout(() => {\n document.addEventListener(\"pointerdown\", onPointerDown);\n window.addEventListener(\"scroll\", closeSidebar, { passive: true });\n mainElement?.addEventListener(\"scroll\", closeSidebar, { passive: true });\n document.addEventListener(\"touchmove\", closeSidebar, { passive: true });\n }, 10);\n\n return () => {\n window.clearTimeout(timeoutId);\n document.removeEventListener(\"pointerdown\", onPointerDown);\n window.removeEventListener(\"scroll\", closeSidebar);\n mainElement?.removeEventListener(\"scroll\", closeSidebar);\n document.removeEventListener(\"touchmove\", closeSidebar);\n };\n }, [sidebarOpen, isDesktop]);\n\n // Allow consumers to request a mobile sidebar close when a value changes (e.g., pathname).\n useEffect(() => {\n if (!isDesktop && closeKeyRef.current !== closeSidebarOnChangeKey) {\n setSidebarOpen(false);\n }\n closeKeyRef.current = closeSidebarOnChangeKey;\n }, [closeSidebarOnChangeKey, isDesktop]);\n\n useEffect(() => {\n onSidebarToggle?.(sidebarOpen);\n }, [sidebarOpen, onSidebarToggle]);\n\n const toggleSidebar = () => setSidebarOpen((open) => !open);\n\n const sidebarWidthValue =\n sidebarWidth === undefined\n ? undefined\n : typeof sidebarWidth === \"number\"\n ? `${sidebarWidth}px`\n : sidebarWidth;\n\n const shellStyle: CSSProperties | undefined = sidebarWidthValue\n ? { [\"--app-shell-sidebar-width\" as string]: sidebarWidthValue }\n : undefined;\n\n const shellClasses = cx(\n \"appShell\",\n transitionsReady && \"appShellAnimated\",\n sidebarOpen ? \"appShellOpen\" : \"appShellCollapsed\",\n className,\n );\n\n const sidebarClasses = cx(\"appShellSidebar\", sidebarOpen && \"appShellSidebarOpen\", sidebarClassName);\n\n return (\n <div\n className={shellClasses}\n style={shellStyle}\n data-app-shell\n data-desktop={isDesktop ? \"true\" : \"false\"}\n data-sidebar-open={sidebarOpen ? \"true\" : \"false\"}\n >\n <TopBar\n className={cx(\"appShellTopbar\", topbarClassName)}\n leading={\n <button\n ref={hamburgerRef}\n type=\"button\"\n className={\"appShellHamburger\"}\n onClick={toggleSidebar}\n aria-label={hamburgerLabel}\n aria-expanded={sidebarOpen}\n aria-controls={sidebarId}\n >\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M3 6h18M3 12h18M3 18h18\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n }\n brand={brand}\n brandHref={brandHref}\n brandingLocation={topBarBrandingLocation}\n start={topbarStart}\n actions={topbarEnd}\n showThemeToggle={showThemeToggle}\n themeToggleProps={themeToggleProps}\n />\n {!isDesktop && sidebarOpen && (\n <div className={\"appShellBackdrop\"} onClick={() => setSidebarOpen(false)} onTouchStart={() => setSidebarOpen(false)} aria-hidden=\"true\" />\n )}\n <aside ref={sidebarRef} id={sidebarId} className={sidebarClasses} aria-label=\"Sidebar navigation\">\n {sidebar}\n </aside>\n <main ref={mainRef} className={cx(\"appShellMain\", mainClassName)}>\n {children}\n </main>\n </div>\n );\n}\n","\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from \"react\";\nimport { UZI_THEMES, UZI_ACCENTS, THEME_STORAGE_KEY as DEFAULT_THEME_KEY, ACCENT_STORAGE_KEY as DEFAULT_ACCENT_KEY } from \"./constants\";\n\nexport type UziTheme = typeof UZI_THEMES[number];\nexport type UziResolvedTheme = \"light\" | \"dark\";\nexport type UziAccent = typeof UZI_ACCENTS[number];\n\ntype ThemeContextValue = {\n theme: UziTheme;\n resolvedTheme: UziResolvedTheme;\n accent: UziAccent;\n setTheme: (theme: UziTheme) => void;\n setAccent: (accent: UziAccent) => void;\n toggleTheme: () => void;\n};\n\ntype ThemeProviderProps = {\n children: ReactNode;\n theme?: UziTheme;\n defaultTheme?: UziTheme;\n accent?: UziAccent;\n defaultAccent?: UziAccent;\n onThemeChange?: (theme: UziTheme) => void;\n onAccentChange?: (accent: UziAccent) => void;\n storageKey?: string;\n accentStorageKey?: string;\n disableStorage?: boolean;\n};\n\nconst THEME_STORAGE_KEY = DEFAULT_THEME_KEY;\nconst ACCENT_STORAGE_KEY = DEFAULT_ACCENT_KEY;\nconst THEME_ATTRIBUTE = \"data-uzi-theme\";\nconst ACCENT_ATTRIBUTE = \"data-uzi-accent\";\n\nconst ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\n\nfunction isTheme(value: string | null): value is UziTheme {\n return UZI_THEMES.includes(value as UziTheme);\n}\n\nfunction isAccent(value: string | null): value is UziAccent {\n return UZI_ACCENTS.includes(value as UziAccent);\n}\n\nfunction getSystemTheme(): UziResolvedTheme {\n if (typeof window === \"undefined\") return \"light\";\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\";\n}\n\nexport function ThemeProvider({\n children,\n theme,\n defaultTheme = \"system\",\n accent,\n defaultAccent = \"blue\",\n onThemeChange,\n onAccentChange,\n storageKey = THEME_STORAGE_KEY,\n accentStorageKey = ACCENT_STORAGE_KEY,\n disableStorage = false,\n}: ThemeProviderProps) {\n const [internalTheme, setInternalTheme] = useState<UziTheme>(defaultTheme);\n const [internalAccent, setInternalAccent] = useState<UziAccent>(defaultAccent);\n const [systemTheme, setSystemTheme] = useState<UziResolvedTheme>(\"light\");\n\n useEffect(() => {\n setSystemTheme(getSystemTheme());\n if (!disableStorage) {\n const storedTheme = window.localStorage.getItem(storageKey);\n if (isTheme(storedTheme)) setInternalTheme(storedTheme);\n const storedAccent = window.localStorage.getItem(accentStorageKey);\n if (isAccent(storedAccent)) setInternalAccent(storedAccent);\n }\n }, [disableStorage, storageKey, accentStorageKey]);\n\n const isThemeControlled = theme !== undefined;\n const isAccentControlled = accent !== undefined;\n\n const currentTheme = isThemeControlled ? theme : internalTheme;\n const currentAccent = isAccentControlled ? accent : internalAccent;\n const resolvedTheme = currentTheme === \"system\" ? systemTheme : currentTheme;\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const handleChange = () => setSystemTheme(mediaQuery.matches ? \"dark\" : \"light\");\n\n handleChange();\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n }, []);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const root = document.documentElement;\n root.setAttribute(THEME_ATTRIBUTE, resolvedTheme);\n root.setAttribute(ACCENT_ATTRIBUTE, currentAccent);\n root.style.colorScheme = resolvedTheme;\n root.classList.toggle(\"dark\", resolvedTheme === \"dark\");\n }, [currentAccent, resolvedTheme]);\n\n const setTheme = useCallback(\n (nextTheme: UziTheme) => {\n if (!isThemeControlled) setInternalTheme(nextTheme);\n if (!disableStorage && typeof window !== \"undefined\") {\n window.localStorage.setItem(storageKey, nextTheme);\n }\n onThemeChange?.(nextTheme);\n },\n [disableStorage, isThemeControlled, onThemeChange, storageKey],\n );\n\n const setAccent = useCallback(\n (nextAccent: UziAccent) => {\n if (!isAccentControlled) setInternalAccent(nextAccent);\n if (!disableStorage && typeof window !== \"undefined\") {\n window.localStorage.setItem(accentStorageKey, nextAccent);\n }\n onAccentChange?.(nextAccent);\n },\n [accentStorageKey, disableStorage, isAccentControlled, onAccentChange],\n );\n\n const toggleTheme = useCallback(() => {\n setTheme(resolvedTheme === \"dark\" ? \"light\" : \"dark\");\n }, [resolvedTheme, setTheme]);\n\n const value = useMemo<ThemeContextValue>(\n () => ({\n theme: currentTheme,\n resolvedTheme,\n accent: currentAccent,\n setTheme,\n setAccent,\n toggleTheme,\n }),\n [currentAccent, currentTheme, resolvedTheme, setAccent, setTheme, toggleTheme],\n );\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n\nexport function useTheme() {\n const context = useContext(ThemeContext);\n if (!context) throw new Error(\"useTheme must be used within a ThemeProvider\");\n return context;\n}\n","export const UZI_THEMES = [\"light\", \"dark\", \"system\"] as const;\nexport const UZI_ACCENTS = [\"blue\", \"cyan\", \"violet\", \"emerald\", \"amber\", \"rose\"] as const;\n\nexport const THEME_STORAGE_KEY = \"uzi-theme\";\nexport const ACCENT_STORAGE_KEY = \"uzi-accent\";\n","\"use client\";\n\nimport type { ButtonHTMLAttributes } from \"react\";\nimport { Button } from \"../button/Button\";\nimport { useTheme } from \"../../theme/ThemeProvider\";\nimport { cx } from \"../../utils/cx\";\nimport \"./theme-toggle-button.module.css\";\n\nexport type ThemeToggleButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\"\n> & {\n showLabel?: boolean;\n lightLabel?: string;\n darkLabel?: string;\n};\n\nfunction MoonIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" width=\"16\" height=\"16\" fill=\"none\">\n <path\n d=\"M20 15.2A8.5 8.5 0 0 1 8.8 4 9 9 0 1 0 20 15.2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction SunIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" width=\"16\" height=\"16\" fill=\"none\">\n <circle cx=\"12\" cy=\"12\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <path\n d=\"M12 2.75v2.5M12 18.75v2.5M21.25 12h-2.5M5.25 12h-2.5M18.54 5.46l-1.77 1.77M7.23 16.77l-1.77 1.77M18.54 18.54l-1.77-1.77M7.23 7.23 5.46 5.46\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function ThemeToggleButton({\n showLabel = false,\n lightLabel = \"Light mode\",\n darkLabel = \"Dark mode\",\n className,\n onClick,\n ...rest\n}: ThemeToggleButtonProps) {\n const { resolvedTheme, toggleTheme } = useTheme();\n const nextThemeLabel = resolvedTheme === \"dark\" ? lightLabel : darkLabel;\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size={showLabel ? \"sm\" : \"icon\"}\n className={cx(showLabel && \"withLabel\", className)}\n aria-label={`Switch to ${nextThemeLabel.toLowerCase()}`}\n title={`Switch to ${nextThemeLabel.toLowerCase()}`}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) toggleTheme();\n }}\n {...rest}\n >\n {resolvedTheme === \"dark\" ? <SunIcon /> : <MoonIcon />}\n {showLabel && <span>{nextThemeLabel}</span>}\n </Button>\n );\n}\n","\"use client\";\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport {\n ThemeToggleButton,\n type ThemeToggleButtonProps,\n} from \"../theme-toggle-button/ThemeToggleButton\";\nimport \"./top-bar.module.css\";\n\nexport type TopBarProps = HTMLAttributes<HTMLElement> & {\n leading?: ReactNode;\n brand?: ReactNode;\n brandHref?: string;\n brandingLocation?: \"left\" | \"center\";\n /** Content rendered after the brand in the left region (e.g. breadcrumbs, search). */\n start?: ReactNode;\n /** Content rendered in the center region. */\n center?: ReactNode;\n actions?: ReactNode;\n showThemeToggle?: boolean;\n themeToggleProps?: ThemeToggleButtonProps;\n innerClassName?: string;\n isSticky?: boolean;\n sticky?: boolean;\n};\n\nexport function TopBar({\n leading,\n brand,\n brandHref,\n brandingLocation = \"left\",\n start,\n center,\n actions,\n showThemeToggle = false,\n themeToggleProps,\n className,\n innerClassName,\n isSticky,\n sticky = true,\n children,\n ...rest\n}: TopBarProps) {\n const shouldStick = isSticky ?? sticky;\n const brandNode = !brand ? null : brandHref ? (\n <a href={brandHref} className={\"topBarBrand\"}>\n <span className={\"topBarBrandContent\"}>{brand}</span>\n </a>\n ) : (\n <div className={\"topBarBrand\"}>\n <span className={\"topBarBrandContent\"}>{brand}</span>\n </div>\n );\n\n return (\n <header\n className={cx(\"topBar\", !shouldStick && \"topBarStatic\", className)}\n {...rest}\n >\n <div className={cx(\"topBarInner\", innerClassName)}>\n <div className={\"topBarStart\"}>\n {leading}\n {brandingLocation === \"left\" && brandNode}\n {start}\n </div>\n {(brandNode && brandingLocation === \"center\") || center || children ? (\n <div className={\"topBarCenter\"}>\n <div className={\"topBarCenterGroup\"}>\n {brandingLocation === \"center\" && brandNode}\n {center ?? children}\n </div>\n </div>\n ) : null}\n <div className={\"topBarActions\"}>\n {showThemeToggle && <ThemeToggleButton {...themeToggleProps} />}\n {actions}\n </div>\n </div>\n </header>\n );\n}\n","\"use client\";\n\nimport { type AnchorHTMLAttributes, type CSSProperties, type ReactNode } from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport \"./sidebar-nav.module.css\";\n\nexport type SidebarNavItem = {\n label: string;\n href?: string;\n icon?: ReactNode;\n description?: ReactNode;\n badge?: ReactNode;\n active?: boolean;\n disabled?: boolean;\n title?: string;\n target?: AnchorHTMLAttributes<HTMLAnchorElement>[\"target\"];\n rel?: AnchorHTMLAttributes<HTMLAnchorElement>[\"rel\"];\n onClick?: () => void;\n};\n\nexport type SidebarNavSection = {\n id?: string;\n label?: ReactNode;\n items: SidebarNavItem[];\n};\n\nexport type SidebarNavProps = {\n items?: SidebarNavItem[];\n sections?: SidebarNavSection[];\n currentPath?: string;\n getIsActive?: (item: SidebarNavItem, currentPath?: string) => boolean;\n onItemClick?: (item: SidebarNavItem) => void;\n header?: ReactNode;\n footer?: ReactNode;\n ariaLabel?: string;\n collapsed?: boolean;\n iconSize?: number | string;\n className?: string;\n itemClassName?: string;\n sectionClassName?: string;\n};\n\nconst defaultIsActive = (item: SidebarNavItem, path?: string) => {\n if (item.active !== undefined) return item.active;\n if (!item.href) return false;\n if (!path) return false;\n if (item.href === \"/\") return path === \"/\";\n return path.startsWith(item.href);\n};\n\nexport function SidebarNav({\n items = [],\n sections,\n currentPath,\n getIsActive = defaultIsActive,\n onItemClick,\n header,\n footer,\n ariaLabel = \"Sidebar navigation\",\n collapsed = false,\n iconSize,\n className,\n itemClassName,\n sectionClassName,\n}: SidebarNavProps) {\n const resolvedSections = sections?.length\n ? sections\n : [{ id: \"default\", items }];\n const style =\n iconSize !== undefined\n ? ({\n [\"--sidebar-nav-icon-size\" as string]:\n typeof iconSize === \"number\" ? `${iconSize}px` : iconSize,\n } satisfies CSSProperties)\n : undefined;\n\n return (\n <nav\n className={cx(\"uziSidebarNav\", collapsed && \"uziSidebarNavCollapsed\", className)}\n aria-label={ariaLabel}\n style={style}\n >\n {header ? <div className={\"uziSidebarNavHeader\"}>{header}</div> : null}\n <div className={\"uziSidebarNavSections\"}>\n {resolvedSections.map((section, sectionIndex) => (\n <div\n key={section.id ?? `section-${sectionIndex}`}\n className={cx(\"uziSidebarNavSection\", sectionClassName)}\n >\n {section.label && !collapsed ? (\n <div className={\"uziSidebarNavSectionLabel\"}>{section.label}</div>\n ) : null}\n <div className={\"uziSidebarNavSectionItems\"}>\n {section.items.map((item, itemIndex) => (\n <SidebarNavEntry\n key={`${section.id ?? sectionIndex}-${item.href ?? item.title ?? itemIndex}`}\n item={item}\n active={getIsActive(item, currentPath)}\n collapsed={collapsed}\n itemClassName={itemClassName}\n onItemClick={onItemClick}\n />\n ))}\n </div>\n </div>\n ))}\n </div>\n {footer ? <div className={\"uziSidebarNavFooter\"}>{footer}</div> : null}\n </nav>\n );\n}\n\ntype SidebarNavEntryProps = {\n item: SidebarNavItem;\n active: boolean;\n collapsed: boolean;\n itemClassName?: string;\n onItemClick?: (item: SidebarNavItem) => void;\n};\n\nfunction SidebarNavEntry({\n item,\n active,\n collapsed,\n itemClassName,\n onItemClick,\n}: SidebarNavEntryProps) {\n const rel = item.rel ?? (item.target === \"_blank\" ? \"noreferrer\" : undefined);\n const title = item.title ?? (typeof item.label === \"string\" ? item.label : undefined);\n const classes = cx(\n \"uziSidebarNavItem\",\n active && \"uziSidebarNavItemActive\",\n collapsed && \"uziSidebarNavItemCollapsed\",\n item.disabled && \"uziSidebarNavItemDisabled\",\n itemClassName,\n );\n const content = (\n <>\n {item.icon && <span className={\"uziSidebarNavIcon\"}>{item.icon}</span>}\n {!collapsed ? (\n <span className={\"uziSidebarNavItemBody\"}>\n <span className={\"uziSidebarNavLabelRow\"}>\n <span className={\"uziSidebarNavLabel\"}>{item.label}</span>\n {item.badge && <span className={\"uziSidebarNavBadge\"}>{item.badge}</span>}\n </span>\n {item.description ? <span className={\"uziSidebarNavDescription\"}>{item.description}</span> : null}\n </span>\n ) : null}\n </>\n );\n\n const handleClick = () => {\n if (item.disabled) return;\n item.onClick?.();\n onItemClick?.(item);\n };\n\n if (!item.href) {\n return (\n <button\n type=\"button\"\n className={classes}\n aria-current={active ? \"page\" : undefined}\n aria-disabled={item.disabled ? \"true\" : undefined}\n disabled={item.disabled}\n title={collapsed ? title : undefined}\n onClick={handleClick}\n >\n {content}\n </button>\n );\n }\n\n if (item.disabled) {\n return (\n <div\n className={classes}\n aria-current={active ? \"page\" : undefined}\n aria-disabled=\"true\"\n title={collapsed ? title : undefined}\n >\n {content}\n </div>\n );\n }\n\n return (\n <a\n className={classes}\n href={item.href}\n target={item.target}\n rel={rel}\n aria-current={active ? \"page\" : undefined}\n title={collapsed ? title : undefined}\n onClick={handleClick}\n >\n {content}\n </a>\n );\n}\n"],"mappings":"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","names":["import_jsx_runtime","import_jsx_runtime","TONE_CLASS","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_jsx_runtime","THEME_STORAGE_KEY","ACCENT_STORAGE_KEY","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/components/button/Button.tsx","../src/utils/cx.ts","../src/components/avatar/Avatar.tsx","../src/components/card/Card.tsx","../src/components/pill/Pill.tsx","../src/components/modal/Modal.tsx","../src/components/alert/Alert.tsx","../src/components/toast/ToastContext.tsx","../src/components/input/Input.tsx","../src/components/label/Label.tsx","../src/components/checkbox/Checkbox.tsx","../src/components/dropdown/Dropdown.tsx","../src/components/dropdown-menu/DropdownMenu.tsx","../src/components/app-shell/AppShell.tsx","../src/theme/ThemeProvider.tsx","../src/theme/constants.ts","../src/components/theme-toggle-button/ThemeToggleButton.tsx","../src/components/top-bar/TopBar.tsx","../src/components/sidebar-nav/SidebarNav.tsx","../src/components/skeleton/Skeleton.tsx","../src/components/progress/Progress.tsx","../src/components/select/Select.tsx"],"sourcesContent":["import \"./theme/theme.css\";\r\n\r\n// Primitives\r\nexport type { ButtonProps, ButtonVariant, ButtonSize } from \"./components/button/Button\";\r\nexport { Button } from \"./components/button/Button\";\r\n\r\nexport type { AvatarProps, AvatarSize } from \"./components/avatar/Avatar\";\r\nexport { Avatar, AvatarFallback, AvatarImage } from \"./components/avatar/Avatar\";\r\n\r\nexport type { CardProps, CardPadding, CardTone } from \"./components/card/Card\";\r\nexport { Card } from \"./components/card/Card\";\r\n\r\nexport type { PillProps, PillSize, PillTone } from \"./components/pill/Pill\";\r\nexport { Pill } from \"./components/pill/Pill\";\r\n\r\n// Overlays\r\nexport type { ModalOverlayProps, ModalProps, ModalSize } from \"./components/modal/Modal\";\r\nexport { Modal, ModalOverlay } from \"./components/modal/Modal\";\r\n\r\n// Feedback\r\nexport type { AlertProps, AlertTone } from \"./components/alert/Alert\";\r\nexport { Alert } from \"./components/alert/Alert\";\r\n\r\nexport { ToastProvider, useToast } from \"./components/toast/ToastContext\";\r\nexport type {\r\n Toast,\r\n ToastConfig,\r\n ToastContextValue,\r\n ToastOptions,\r\n ToastPosition,\r\n ToastType,\r\n} from \"./components/toast/types\";\r\n\r\n// Inputs\r\nexport type { InputProps } from \"./components/input/Input\";\r\nexport { Input } from \"./components/input/Input\";\r\n\r\nexport type { LabelProps } from \"./components/label/Label\";\r\nexport { Label } from \"./components/label/Label\";\r\n\r\nexport type { CheckboxProps } from \"./components/checkbox/Checkbox\";\r\nexport { Checkbox } from \"./components/checkbox/Checkbox\";\r\n\r\nexport type { DropdownProps, DropdownOption } from \"./components/dropdown/Dropdown\";\r\nexport { Dropdown } from \"./components/dropdown/Dropdown\";\r\n\r\nexport {\r\n DropdownMenu,\r\n DropdownMenuCheckboxItem,\r\n DropdownMenuContent,\r\n DropdownMenuGroup,\r\n DropdownMenuItem,\r\n DropdownMenuLabel,\r\n DropdownMenuPortal,\r\n DropdownMenuRadioGroup,\r\n DropdownMenuRadioItem,\r\n DropdownMenuSeparator,\r\n DropdownMenuSub,\r\n DropdownMenuSubContent,\r\n DropdownMenuSubTrigger,\r\n DropdownMenuTrigger,\r\n} from \"./components/dropdown-menu/DropdownMenu\";\r\n\r\n// Layout\r\nexport type { AppShellProps } from \"./components/app-shell/AppShell\";\r\nexport { AppShell } from \"./components/app-shell/AppShell\";\r\n\r\nexport type { SidebarNavItem, SidebarNavProps, SidebarNavSection } from \"./components/sidebar-nav/SidebarNav\";\r\nexport { SidebarNav } from \"./components/sidebar-nav/SidebarNav\";\r\n\r\nexport type { TopBarProps } from \"./components/top-bar/TopBar\";\r\nexport { TopBar } from \"./components/top-bar/TopBar\";\r\n\r\nexport type { ThemeToggleButtonProps } from \"./components/theme-toggle-button/ThemeToggleButton\";\r\nexport { ThemeToggleButton } from \"./components/theme-toggle-button/ThemeToggleButton\";\r\n\r\n// Theme\r\nexport type { UziAccent, UziResolvedTheme, UziTheme } from \"./theme/ThemeProvider\";\r\nexport { ThemeProvider, useTheme } from \"./theme/ThemeProvider\";\r\n\r\n// Utils\r\nexport { cx } from \"./utils/cx\";\r\n\r\n// Feedback / display\r\nexport type { SkeletonProps } from \"./components/skeleton/Skeleton\";\r\nexport { Skeleton } from \"./components/skeleton/Skeleton\";\r\n\r\nexport type { ProgressProps, ProgressTone } from \"./components/progress/Progress\";\r\nexport { Progress } from \"./components/progress/Progress\";\r\n\r\n// Inputs\r\nexport type { SelectProps, SelectOption } from \"./components/select/Select\";\r\nexport { Select } from \"./components/select/Select\";\r\n","import * as React from \"react\";\r\nimport { Slot } from \"@radix-ui/react-slot\";\r\nimport { cx } from \"../../utils/cx\";\r\nimport \"./button.module.css\";\r\n\r\nexport type ButtonVariant =\r\n | \"default\"\r\n | \"primary\"\r\n | \"secondary\"\r\n | \"outline\"\r\n | \"ghost\"\r\n | \"destructive\"\r\n | \"link\";\r\nexport type ButtonSize = \"default\" | \"sm\" | \"md\" | \"lg\" | \"icon\";\r\n\r\ntype BaseProps = {\r\n variant?: ButtonVariant;\r\n size?: ButtonSize;\r\n className?: string;\r\n children?: React.ReactNode;\r\n asChild?: boolean;\r\n};\r\n\r\ntype AsButton = BaseProps &\r\n React.ButtonHTMLAttributes<HTMLButtonElement> & { as?: \"button\" };\r\n\r\ntype AsAnchor = BaseProps &\r\n React.AnchorHTMLAttributes<HTMLAnchorElement> & { as: \"a\" };\r\n\r\nexport type ButtonProps = AsButton | AsAnchor;\r\n\r\nconst variantClass: Record<ButtonVariant, string> = {\r\n default: \"variant-primary\",\r\n primary: \"variant-primary\",\r\n secondary: \"variant-secondary\",\r\n outline: \"variant-outline\",\r\n ghost: \"variant-ghost\",\r\n destructive: \"variant-destructive\",\r\n link: \"variant-link\",\r\n};\r\n\r\nconst sizeClass: Record<ButtonSize, string> = {\r\n default: \"size-md\",\r\n sm: \"size-sm\",\r\n md: \"size-md\",\r\n lg: \"size-lg\",\r\n icon: \"size-icon\",\r\n};\r\n\r\nexport function Button({\r\n as,\r\n variant = \"default\",\r\n size = \"default\",\r\n className,\r\n children,\r\n asChild = false,\r\n ...rest\r\n}: ButtonProps) {\r\n const classes = cx(\r\n \"button\",\r\n variantClass[variant],\r\n sizeClass[size],\r\n className,\r\n );\r\n\r\n if (asChild) {\r\n return (\r\n <Slot className={classes} {...rest}>\r\n {children}\r\n </Slot>\r\n );\r\n }\r\n\r\n if (as === \"a\") {\r\n return (\r\n <a\r\n className={classes}\r\n {...(rest as React.AnchorHTMLAttributes<HTMLAnchorElement>)}\r\n >\r\n {children}\r\n </a>\r\n );\r\n }\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n className={classes}\r\n {...(rest as React.ButtonHTMLAttributes<HTMLButtonElement>)}\r\n >\r\n {children}\r\n </button>\r\n );\r\n}\r\n","export function cx(...values: Array<string | false | null | undefined>): string {\r\n return values.filter(Boolean).join(\" \");\r\n}\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\";\r\nimport { cx } from \"../../utils/cx\";\r\nimport \"./avatar.module.css\";\r\n\r\nexport type AvatarSize = \"sm\" | \"md\" | \"lg\";\r\n\r\nexport type AvatarProps = React.ComponentProps<typeof AvatarPrimitive.Root> & {\r\n size?: AvatarSize;\r\n};\r\n\r\nexport function Avatar({\r\n className,\r\n size = \"md\",\r\n ...props\r\n}: AvatarProps) {\r\n return (\r\n <AvatarPrimitive.Root\r\n className={cx(\"avatar\", size === \"sm\" ? \"size-sm\" : size === \"lg\" ? \"size-lg\" : \"size-md\", className)}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nexport function AvatarImage({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\r\n return (\r\n <AvatarPrimitive.Image\r\n className={cx(\"image\", className)}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nexport function AvatarFallback({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\r\n return (\r\n <AvatarPrimitive.Fallback\r\n className={cx(\"fallback\", className)}\r\n {...props}\r\n />\r\n );\r\n}\r\n","/**\r\n * Lightweight container component used for panels across the app.\r\n *\r\n * @remarks\r\n * Supports tone variants, padding presets, and an optional interactive affordance.\r\n *\r\n * @param props.as - Semantic element to render (defaults to `div`).\r\n * @param props.tone - Visual tone variant.\r\n * @param props.padding - Padding preset.\r\n * @param props.interactive - Enables hover/focus affordance.\r\n */\r\nimport type { HTMLAttributes } from \"react\";\r\nimport { cx } from \"../../utils/cx\";\r\nimport \"./card.module.css\";\r\n\r\nexport type CardTone = \"default\" | \"muted\" | \"contrast\";\r\nexport type CardPadding = \"none\" | \"sm\" | \"md\" | \"lg\";\r\n\r\ntype CardElement = \"div\" | \"section\" | \"article\";\r\n\r\nexport type CardProps = HTMLAttributes<HTMLElement> & {\r\n /** Optional semantic element type. Defaults to `div`. */\r\n as?: CardElement;\r\n /** Visual tone; drives background/border CSS vars. */\r\n tone?: CardTone;\r\n /** Padding preset; maps to CSS variables so consumers can override globally. */\r\n padding?: CardPadding;\r\n /** Adds hover/focus affordance (lift + outline). */\r\n interactive?: boolean;\r\n};\r\n\r\nexport function Card({\r\n as,\r\n tone = \"default\",\r\n padding = \"md\",\r\n interactive = false,\r\n className,\r\n children,\r\n ...rest\r\n}: CardProps) {\r\n const Component: CardElement = as ?? \"div\";\r\n const TONE_CLASS: Record<CardTone, string | null> = { default: null, muted: \"tone-muted\", contrast: \"tone-contrast\" };\r\n const PADDING_CLASS: Record<CardPadding, string> = { none: \"padding-none\", sm: \"padding-sm\", md: \"padding-md\", lg: \"padding-lg\" };\r\n const classes = cx(\r\n \"card\",\r\n TONE_CLASS[tone],\r\n PADDING_CLASS[padding],\r\n interactive && \"interactive\",\r\n className,\r\n );\r\n\r\n return (\r\n <Component className={classes} {...rest}>\r\n {children}\r\n </Component>\r\n );\r\n}\r\n","/**\r\n * Compact label component for status chips and tags.\r\n *\r\n * @remarks\r\n * Supports tone and size presets, and can render any inline element.\r\n *\r\n * @param props.as - Element to render (defaults to `span`).\r\n * @param props.tone - Visual tone variant.\r\n * @param props.size - Size preset.\r\n * @param props.icon - Optional leading icon.\r\n */\r\nimport type { HTMLAttributes, ReactNode } from \"react\";\r\nimport { cx } from \"../../utils/cx\";\r\nimport \"./pill.module.css\";\r\n\r\nexport type PillTone = \"neutral\" | \"success\" | \"warning\" | \"info\" | \"danger\";\r\nexport type PillSize = \"sm\" | \"md\";\r\n\r\ntype PillElement = \"span\" | \"div\" | \"button\";\r\n\r\nexport type PillProps = HTMLAttributes<HTMLElement> & {\r\n /** Optional rendered element; defaults to `span`. */\r\n as?: PillElement;\r\n /** Visual tone; adjusts color and border. */\r\n tone?: PillTone;\r\n /** Size preset. */\r\n size?: PillSize;\r\n /** Leading icon node (not focusable). */\r\n icon?: ReactNode;\r\n};\r\n\r\nexport function Pill({\r\n as,\r\n tone = \"neutral\",\r\n size = \"md\",\r\n icon,\r\n className,\r\n children,\r\n ...rest\r\n}: PillProps) {\r\n const Component: PillElement = as ?? \"span\";\r\n const classes = cx(\"pill\", `tone-${tone}`, `size-${size}`, className);\r\n\r\n return (\r\n <Component className={classes} {...rest}>\r\n {icon ? (\r\n <span className={\"icon\"} aria-hidden=\"true\">\r\n {icon}\r\n </span>\r\n ) : null}\r\n <span className={\"content\"}>{children}</span>\r\n </Component>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { useRef, useEffect, type ReactNode } from \"react\";\r\nimport { cx } from \"../../utils/cx\";\r\nimport \"./modal.module.css\";\r\n\r\n// ── ModalOverlay ─────────────────────────────────────────────────────────────\r\n// Bare backdrop + container. No opinions on layout inside.\r\n// Use this when you need a full-custom layout (e.g. wide media modals).\r\n\r\nexport type ModalOverlayProps = {\r\n open: boolean;\r\n onClose: () => void;\r\n /** Extra class applied to the backdrop */\r\n className?: string;\r\n children: ReactNode;\r\n};\r\n\r\nexport function ModalOverlay({ open, onClose, className, children }: ModalOverlayProps) {\r\n const mouseDownOnBackdrop = useRef(false);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\") {\r\n e.stopPropagation();\r\n onClose();\r\n }\r\n };\r\n // Capture phase so the innermost modal handles Escape first\r\n window.addEventListener(\"keydown\", handleKeyDown, true);\r\n return () => window.removeEventListener(\"keydown\", handleKeyDown, true);\r\n }, [open, onClose]);\r\n\r\n if (!open) return null;\r\n\r\n return (\r\n <div\r\n className={cx(\"backdrop\", className)}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n onMouseDown={(e) => { mouseDownOnBackdrop.current = e.target === e.currentTarget; }}\r\n onMouseUp={(e) => {\r\n if (mouseDownOnBackdrop.current && e.target === e.currentTarget) onClose();\r\n mouseDownOnBackdrop.current = false;\r\n }}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\n// ── Modal ─────────────────────────────────────────────────────────────────────\r\n// Opinionated dialog: header (title + close button), scrollable body, footer.\r\n\r\nexport type ModalSize = \"sm\" | \"md\" | \"lg\" | \"xl\";\r\n\r\nexport type ModalProps = {\r\n open: boolean;\r\n onClose: () => void;\r\n title: string;\r\n subtitle?: string;\r\n size?: ModalSize;\r\n children: ReactNode;\r\n footer?: ReactNode;\r\n};\r\n\r\nexport function Modal({ open, onClose, title, subtitle, size = \"md\", children, footer }: ModalProps) {\r\n return (\r\n <ModalOverlay open={open} onClose={onClose}>\r\n <div className={cx(\"modal\", `size-${size}`)}>\r\n <div className={\"header\"}>\r\n <div className={\"titles\"}>\r\n <div className={\"title\"}>{title}</div>\r\n {subtitle && <div className={\"subtitle\"}>{subtitle}</div>}\r\n </div>\r\n <button className={\"closeButton\"} onClick={onClose} aria-label=\"Close\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div className={\"body\"}>{children}</div>\r\n\r\n {footer && <div className={\"footer\"}>{footer}</div>}\r\n </div>\r\n </ModalOverlay>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport type { ReactNode } from \"react\";\r\nimport { cx } from \"../../utils/cx\";\r\nimport \"./alert.module.css\";\r\n\r\nexport type AlertTone = \"success\" | \"error\" | \"warning\" | \"info\";\r\n\r\nexport type AlertProps = {\r\n tone: AlertTone;\r\n children: ReactNode;\r\n className?: string;\r\n};\r\n\r\nconst TONE_CLASS: Record<AlertTone, string> = {\r\n success: \"success\",\r\n error: \"error\",\r\n warning: \"warning\",\r\n info: \"info\",\r\n};\r\n\r\nexport function Alert({ tone, children, className }: AlertProps) {\r\n return (\r\n <div className={cx(\"alert\", TONE_CLASS[tone], className)} role=\"alert\">\r\n {children}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport {\r\n createContext,\r\n useCallback,\r\n useContext,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n type CSSProperties,\r\n type ReactNode,\r\n} from \"react\";\r\nimport { cx } from \"../../utils/cx\";\r\nimport type {\r\n Toast,\r\n ToastConfig,\r\n ToastContextValue,\r\n ToastOptions,\r\n ToastPosition,\r\n ToastType,\r\n} from \"./types\";\r\nimport \"./toast.module.css\";\r\n\r\n/** Default provider configuration. */\r\nconst DEFAULT_CONFIG: Required<ToastConfig> = {\r\n position: \"top-right\",\r\n maxToasts: 5,\r\n defaultDuration: 4000,\r\n pauseOnHover: true,\r\n pauseOnFocusLoss: true,\r\n};\r\n\r\nconst ToastContext = createContext<ToastContextValue | undefined>(undefined);\r\n\r\nlet toastIdCounter = 0;\r\nconst generateToastId = () => `toast-${++toastIdCounter}-${Date.now()}`;\r\n\r\n/**\r\n * Toast notification context provider.\r\n *\r\n * @remarks\r\n * Wrap your app (or a section) to enable `useToast` calls. Supports configurable placement,\r\n * maximum visible toasts, and pause behavior on hover or window blur.\r\n *\r\n * @param props.children - React subtree that can consume the toast context.\r\n * @param props.config - Optional provider configuration overrides.\r\n */\r\nexport function ToastProvider({\r\n children,\r\n config,\r\n}: {\r\n children: ReactNode;\r\n config?: ToastConfig;\r\n}) {\r\n const [toasts, setToasts] = useState<Toast[]>([]);\r\n const [isPaused, setIsPaused] = useState(false);\r\n const merged = useMemo(() => ({ ...DEFAULT_CONFIG, ...config }), [config]);\r\n\r\n const push = useCallback(\r\n (message: string, options: ToastOptions = {}) => {\r\n const id = generateToastId();\r\n setToasts((prev) => {\r\n const next: Toast[] = [\r\n ...prev,\r\n {\r\n id,\r\n message,\r\n type: options.type ?? \"info\",\r\n duration: options.duration ?? (options.type === \"error\" ? 6000 : merged.defaultDuration),\r\n dismissible: options.dismissible ?? true,\r\n action: options.action,\r\n },\r\n ];\r\n if (next.length > merged.maxToasts) next.shift();\r\n return next;\r\n });\r\n return id;\r\n },\r\n [merged.defaultDuration, merged.maxToasts],\r\n );\r\n\r\n const success = useCallback(\r\n (message: string, options?: Omit<ToastOptions, \"type\">) => push(message, { ...options, type: \"success\" }),\r\n [push],\r\n );\r\n const error = useCallback(\r\n (message: string, options?: Omit<ToastOptions, \"type\">) =>\r\n push(message, { ...options, type: \"error\", duration: options?.duration ?? 6000 }),\r\n [push],\r\n );\r\n const warning = useCallback(\r\n (message: string, options?: Omit<ToastOptions, \"type\">) => push(message, { ...options, type: \"warning\" }),\r\n [push],\r\n );\r\n const info = useCallback(\r\n (message: string, options?: Omit<ToastOptions, \"type\">) => push(message, { ...options, type: \"info\" }),\r\n [push],\r\n );\r\n\r\n const dismiss = useCallback((id: string) => {\r\n setToasts((prev) => prev.filter((t) => t.id !== id));\r\n }, []);\r\n\r\n const dismissAll = useCallback(() => setToasts([]), []);\r\n\r\n useEffect(() => {\r\n if (!merged.pauseOnFocusLoss) return;\r\n const handleVisibility = () => setIsPaused(document.visibilityState !== \"visible\");\r\n document.addEventListener(\"visibilitychange\", handleVisibility);\r\n return () => document.removeEventListener(\"visibilitychange\", handleVisibility);\r\n }, [merged.pauseOnFocusLoss]);\r\n\r\n const value = useMemo<ToastContextValue>(\r\n () => ({ toasts, push, success, error, warning, info, dismiss, dismissAll }),\r\n [toasts, push, success, error, warning, info, dismiss, dismissAll],\r\n );\r\n\r\n return (\r\n <ToastContext.Provider value={value}>\r\n {children}\r\n <ToastContainer\r\n toasts={toasts}\r\n position={merged.position}\r\n pauseOnHover={merged.pauseOnHover}\r\n isPaused={isPaused}\r\n onDismiss={dismiss}\r\n onPauseChange={setIsPaused}\r\n />\r\n </ToastContext.Provider>\r\n );\r\n}\r\n\r\n/**\r\n * Hook to access the toast API.\r\n *\r\n * @remarks\r\n * Exposes `push`, intent helpers (`success`, `error`, `warning`, `info`), and dismissal helpers.\r\n * Must be called within a `ToastProvider`.\r\n *\r\n * @throws Error if used outside of a `ToastProvider`.\r\n */\r\nexport function useToast(): ToastContextValue {\r\n const ctx = useContext(ToastContext);\r\n if (!ctx) throw new Error(\"useToast must be used within a ToastProvider\");\r\n return ctx;\r\n}\r\n\r\n/** Renders the positioned toast stack. */\r\nfunction ToastContainer({\r\n toasts,\r\n position,\r\n pauseOnHover,\r\n isPaused,\r\n onDismiss,\r\n onPauseChange,\r\n}: {\r\n toasts: Toast[];\r\n position: ToastPosition;\r\n pauseOnHover: boolean;\r\n isPaused: boolean;\r\n onDismiss: (id: string) => void;\r\n onPauseChange: (paused: boolean) => void;\r\n}) {\r\n const posClass = (() => {\r\n switch (position) {\r\n case \"top-left\":\r\n return \"topLeft\";\r\n case \"top-center\":\r\n return \"topCenter\";\r\n case \"bottom-right\":\r\n return \"bottomRight\";\r\n case \"bottom-left\":\r\n return \"bottomLeft\";\r\n case \"bottom-center\":\r\n return \"bottomCenter\";\r\n case \"top-right\":\r\n default:\r\n return \"topRight\";\r\n }\r\n })();\r\n\r\n return (\r\n <div\r\n className={cx(\"stack\", posClass)}\r\n role=\"presentation\"\r\n onMouseEnter={() => pauseOnHover && onPauseChange(true)}\r\n onMouseLeave={() => pauseOnHover && onPauseChange(false)}\r\n >\r\n {toasts.map((toast) => (\r\n <ToastItem key={toast.id} toast={toast} isPaused={isPaused} onDismiss={onDismiss} />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n/** Individual toast item with timers and actions. */\r\nfunction ToastItem({\r\n toast,\r\n isPaused,\r\n onDismiss,\r\n}: {\r\n toast: Toast;\r\n isPaused: boolean;\r\n onDismiss: (id: string) => void;\r\n}) {\r\n const [exiting, setExiting] = useState(false);\r\n const timerRef = useRef<number | null>(null);\r\n const startRef = useRef<number>(0);\r\n const remainingRef = useRef<number>(toast.duration ?? 0);\r\n\r\n const palette = getPalette(toast.type);\r\n const styleVars: CSSProperties = {\r\n [\"--toast-bg\" as any]: palette.background,\r\n [\"--toast-border\" as any]: palette.border,\r\n [\"--toast-text\" as any]: palette.text,\r\n [\"--toast-button-bg\" as any]: palette.buttonBg,\r\n [\"--toast-button-border\" as any]: palette.buttonBorder,\r\n [\"--toast-action-bg\" as any]: palette.actionBg,\r\n [\"--toast-action-border\" as any]: palette.actionBorder,\r\n };\r\n\r\n const stopTimer = () => {\r\n if (timerRef.current) {\r\n window.clearTimeout(timerRef.current);\r\n timerRef.current = null;\r\n }\r\n };\r\n\r\n const triggerDismiss = useCallback(() => {\r\n setExiting(true);\r\n stopTimer();\r\n window.setTimeout(() => onDismiss(toast.id), 160);\r\n }, [onDismiss, toast.id]);\r\n\r\n const schedule = useCallback(\r\n (delay: number) => {\r\n if (!delay || delay <= 0) {\r\n triggerDismiss();\r\n return;\r\n }\r\n startRef.current = performance.now();\r\n stopTimer();\r\n timerRef.current = window.setTimeout(() => triggerDismiss(), delay);\r\n },\r\n [triggerDismiss],\r\n );\r\n\r\n useEffect(() => {\r\n if (!toast.duration || toast.duration <= 0) return undefined;\r\n schedule(toast.duration);\r\n return stopTimer;\r\n }, [schedule, toast.duration]);\r\n\r\n useEffect(() => {\r\n if (!toast.duration || toast.duration <= 0) return;\r\n if (isPaused) {\r\n const elapsed = performance.now() - startRef.current;\r\n remainingRef.current = Math.max(0, remainingRef.current - elapsed);\r\n stopTimer();\r\n } else {\r\n schedule(remainingRef.current);\r\n }\r\n }, [isPaused, schedule, toast.duration]);\r\n\r\n const icon = getIcon(toast.type);\r\n\r\n return (\r\n <div className={cx(\"toast\", exiting && \"exit\")} style={styleVars} role=\"status\" aria-live=\"polite\">\r\n <span className={\"icon\"} aria-hidden>\r\n {icon}\r\n </span>\r\n <div className={\"body\"}>\r\n <div className={\"message\"}>{toast.message}</div>\r\n {toast.action && (\r\n <div className={\"actions\"}>\r\n <button\r\n type=\"button\"\r\n className={\"actionButton\"}\r\n onClick={() => {\r\n toast.action?.onClick();\r\n triggerDismiss();\r\n }}\r\n >\r\n {toast.action.label}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n {toast.dismissible !== false && (\r\n <button\r\n type=\"button\"\r\n className={\"closeButton\"}\r\n onClick={triggerDismiss}\r\n aria-label=\"Dismiss notification\"\r\n >\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden>\r\n <path\r\n d=\"M11 3L3 11M3 3l8 8\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction getPalette(type: ToastType) {\r\n switch (type) {\r\n case \"success\":\r\n return {\r\n background: \"#22c55e\",\r\n border: \"#16a34a\",\r\n text: \"#0b1224\",\r\n buttonBg: \"rgba(0, 0, 0, 0.08)\",\r\n buttonBorder: \"rgba(0, 0, 0, 0.2)\",\r\n actionBg: \"rgba(0, 0, 0, 0.1)\",\r\n actionBorder: \"rgba(0, 0, 0, 0.2)\",\r\n };\r\n case \"error\":\r\n return {\r\n background: \"#f87171\",\r\n border: \"#ef4444\",\r\n text: \"#0b1224\",\r\n buttonBg: \"rgba(0, 0, 0, 0.08)\",\r\n buttonBorder: \"rgba(0, 0, 0, 0.2)\",\r\n actionBg: \"rgba(0, 0, 0, 0.1)\",\r\n actionBorder: \"rgba(0, 0, 0, 0.2)\",\r\n };\r\n case \"warning\":\r\n return {\r\n background: \"#fbbf24\",\r\n border: \"#f59e0b\",\r\n text: \"#0b1224\",\r\n buttonBg: \"rgba(0, 0, 0, 0.08)\",\r\n buttonBorder: \"rgba(0, 0, 0, 0.2)\",\r\n actionBg: \"rgba(0, 0, 0, 0.1)\",\r\n actionBorder: \"rgba(0, 0, 0, 0.2)\",\r\n };\r\n case \"info\":\r\n default:\r\n return {\r\n background: \"#38bdf8\",\r\n border: \"#0ea5e9\",\r\n text: \"#0b1224\",\r\n buttonBg: \"rgba(0, 0, 0, 0.08)\",\r\n buttonBorder: \"rgba(0, 0, 0, 0.2)\",\r\n actionBg: \"rgba(0, 0, 0, 0.1)\",\r\n actionBorder: \"rgba(0, 0, 0, 0.2)\",\r\n };\r\n }\r\n}\r\n\r\nfunction getIcon(type: ToastType) {\r\n switch (type) {\r\n case \"success\":\r\n return \"OK\";\r\n case \"error\":\r\n return \"X\";\r\n case \"warning\":\r\n return \"!\";\r\n case \"info\":\r\n default:\r\n return \"i\";\r\n }\r\n}\r\n","import * as React from \"react\";\r\nimport { cx } from \"../../utils/cx\";\r\nimport \"./input.module.css\";\r\n\r\nexport type InputProps = React.InputHTMLAttributes<HTMLInputElement>;\r\n\r\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\r\n ({ className, type, ...props }, ref) => {\r\n return (\r\n <input\r\n ref={ref}\r\n type={type}\r\n className={cx(\"input\", className)}\r\n {...props}\r\n />\r\n );\r\n },\r\n);\r\n\r\nInput.displayName = \"Input\";\r\n","import * as React from \"react\";\r\nimport { cx } from \"../../utils/cx\";\r\nimport \"./label.module.css\";\r\n\r\nexport type LabelProps = React.LabelHTMLAttributes<HTMLLabelElement>;\r\n\r\nexport const Label = React.forwardRef<HTMLLabelElement, LabelProps>(\r\n ({ className, ...props }, ref) => (\r\n <label ref={ref} className={cx(\"label\", className)} {...props} />\r\n ),\r\n);\r\n\r\nLabel.displayName = \"Label\";\r\n","import * as React from \"react\";\r\nimport { cx } from \"../../utils/cx\";\r\nimport \"./checkbox.module.css\";\r\n\r\nexport type CheckboxProps = React.InputHTMLAttributes<HTMLInputElement>;\r\n\r\nexport const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\r\n ({ className, ...props }, ref) => {\r\n return (\r\n <input\r\n ref={ref}\r\n type=\"checkbox\"\r\n className={cx(\"checkbox\", className)}\r\n {...props}\r\n />\r\n );\r\n },\r\n);\r\n\r\nCheckbox.displayName = \"Checkbox\";\r\n","\"use client\";\r\n\r\nimport { useState, useRef, useEffect } from \"react\";\r\nimport { cx } from \"../../utils/cx\";\r\nimport \"./dropdown.module.css\";\r\n\r\nexport interface DropdownOption {\r\n label: string;\r\n value: string;\r\n}\r\n\r\nexport interface DropdownProps {\r\n /** List of options to display in the menu. */\r\n options: DropdownOption[];\r\n /** Currently selected value. Use empty string for \"no selection\". */\r\n value: string;\r\n /** Called when the user selects an option. */\r\n onChange: (value: string) => void;\r\n /** Label shown when no option is selected. Defaults to \"All\". */\r\n placeholder?: string;\r\n /** Additional class name for the wrapper element. */\r\n className?: string;\r\n /** Whether to show the placeholder as a clearable option. Defaults to true. */\r\n allowClear?: boolean;\r\n /** Associates the trigger button with an external label element via its id. */\r\n \"aria-labelledby\"?: string;\r\n /** Provides an accessible label directly on the trigger button. */\r\n \"aria-label\"?: string;\r\n}\r\n\r\nexport function Dropdown({\r\n options,\r\n value,\r\n onChange,\r\n placeholder = \"All\",\r\n className,\r\n allowClear = true,\r\n \"aria-labelledby\": ariaLabelledBy,\r\n \"aria-label\": ariaLabel,\r\n}: DropdownProps) {\r\n const [open, setOpen] = useState(false);\r\n const ref = useRef<HTMLDivElement>(null);\r\n\r\n const selected = options.find((o) => o.value === value);\r\n const isActive = allowClear && value !== \"\";\r\n\r\n useEffect(() => {\r\n function handleClickOutside(e: MouseEvent) {\r\n if (ref.current && !ref.current.contains(e.target as Node)) {\r\n setOpen(false);\r\n }\r\n }\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, []);\r\n\r\n return (\r\n <div className={cx(\"wrapper\", className)} ref={ref}>\r\n <button\r\n type=\"button\"\r\n className={cx(\"trigger\", isActive && \"trigger-active\")}\r\n onClick={() => setOpen((o) => !o)}\r\n aria-labelledby={ariaLabelledBy}\r\n aria-label={ariaLabel}\r\n >\r\n {selected ? selected.label : placeholder}\r\n <span className={cx(\"chevron\", open && \"chevron-open\")}>\r\n <svg viewBox=\"0 0 10 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\">\r\n <path d=\"M2 3.5L5 6.5L8 3.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </button>\r\n\r\n {open && (\r\n <div className={\"menu\"}>\r\n {allowClear && (\r\n <button\r\n type=\"button\"\r\n className={cx(\"option\", value === \"\" && \"option-selected\")}\r\n onClick={() => { onChange(\"\"); setOpen(false); }}\r\n >\r\n {placeholder}\r\n </button>\r\n )}\r\n {options.map((opt) => (\r\n <button\r\n key={opt.value}\r\n type=\"button\"\r\n className={cx(\"option\", value === opt.value && \"option-selected\")}\r\n onClick={() => { onChange(opt.value); setOpen(false); }}\r\n >\r\n {opt.label}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\";\r\nimport { cx } from \"../../utils/cx\";\r\nimport \"./dropdown-menu.module.css\";\r\n\r\nexport function DropdownMenu(\r\n props: React.ComponentProps<typeof DropdownMenuPrimitive.Root>,\r\n) {\r\n return <DropdownMenuPrimitive.Root {...props} />;\r\n}\r\n\r\nexport function DropdownMenuTrigger(\r\n props: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>,\r\n) {\r\n return <DropdownMenuPrimitive.Trigger {...props} />;\r\n}\r\n\r\nexport function DropdownMenuGroup(\r\n props: React.ComponentProps<typeof DropdownMenuPrimitive.Group>,\r\n) {\r\n return <DropdownMenuPrimitive.Group {...props} />;\r\n}\r\n\r\nexport function DropdownMenuPortal(\r\n props: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>,\r\n) {\r\n return <DropdownMenuPrimitive.Portal {...props} />;\r\n}\r\n\r\nexport function DropdownMenuSub(\r\n props: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>,\r\n) {\r\n return <DropdownMenuPrimitive.Sub {...props} />;\r\n}\r\n\r\nexport function DropdownMenuRadioGroup(\r\n props: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>,\r\n) {\r\n return <DropdownMenuPrimitive.RadioGroup {...props} />;\r\n}\r\n\r\nexport function DropdownMenuContent({\r\n className,\r\n sideOffset = 4,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\r\n return (\r\n <DropdownMenuPrimitive.Portal>\r\n <DropdownMenuPrimitive.Content\r\n sideOffset={sideOffset}\r\n className={cx(\"content\", className)}\r\n {...props}\r\n />\r\n </DropdownMenuPrimitive.Portal>\r\n );\r\n}\r\n\r\nexport function DropdownMenuItem({\r\n className,\r\n inset,\r\n variant = \"default\",\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\r\n inset?: boolean;\r\n variant?: \"default\" | \"destructive\";\r\n}) {\r\n return (\r\n <DropdownMenuPrimitive.Item\r\n data-inset={inset ? \"true\" : undefined}\r\n className={cx(\r\n \"item\",\r\n variant === \"destructive\" && \"destructive\",\r\n className,\r\n )}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nexport function DropdownMenuCheckboxItem({\r\n className,\r\n children,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\r\n return (\r\n <DropdownMenuPrimitive.CheckboxItem\r\n className={cx(\"item\", \"insetItem\", className)}\r\n {...props}\r\n >\r\n <span className={\"indicator\"}>\r\n <DropdownMenuPrimitive.ItemIndicator>\r\n <svg\r\n viewBox=\"0 0 16 16\"\r\n width=\"16\"\r\n height=\"16\"\r\n aria-hidden=\"true\"\r\n className={\"indicatorIcon\"}\r\n >\r\n <path\r\n d=\"M3.5 8.5 6.5 11.5 12.5 4.5\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"1.8\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n </DropdownMenuPrimitive.ItemIndicator>\r\n </span>\r\n {children}\r\n </DropdownMenuPrimitive.CheckboxItem>\r\n );\r\n}\r\n\r\nexport function DropdownMenuRadioItem({\r\n className,\r\n children,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\r\n return (\r\n <DropdownMenuPrimitive.RadioItem\r\n className={cx(\"item\", \"insetItem\", className)}\r\n {...props}\r\n >\r\n <span className={\"indicator\"}>\r\n <DropdownMenuPrimitive.ItemIndicator>\r\n <span className={\"radioDot\"} />\r\n </DropdownMenuPrimitive.ItemIndicator>\r\n </span>\r\n {children}\r\n </DropdownMenuPrimitive.RadioItem>\r\n );\r\n}\r\n\r\nexport function DropdownMenuLabel({\r\n className,\r\n inset,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\r\n inset?: boolean;\r\n}) {\r\n return (\r\n <DropdownMenuPrimitive.Label\r\n data-inset={inset ? \"true\" : undefined}\r\n className={cx(\"label\", className)}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nexport function DropdownMenuSeparator({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\r\n return (\r\n <DropdownMenuPrimitive.Separator\r\n className={cx(\"separator\", className)}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nexport function DropdownMenuSubTrigger({\r\n className,\r\n inset,\r\n children,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\r\n inset?: boolean;\r\n}) {\r\n return (\r\n <DropdownMenuPrimitive.SubTrigger\r\n data-inset={inset ? \"true\" : undefined}\r\n className={cx(\"item\", className)}\r\n {...props}\r\n >\r\n {children}\r\n <svg\r\n viewBox=\"0 0 16 16\"\r\n width=\"16\"\r\n height=\"16\"\r\n aria-hidden=\"true\"\r\n className={\"chevron\"}\r\n >\r\n <path\r\n d=\"M6 3.5 10.5 8 6 12.5\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"1.6\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n </DropdownMenuPrimitive.SubTrigger>\r\n );\r\n}\r\n\r\nexport function DropdownMenuSubContent({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\r\n return (\r\n <DropdownMenuPrimitive.SubContent\r\n className={cx(\"content\", className)}\r\n {...props}\r\n />\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport {\r\n useEffect,\r\n useId,\r\n useRef,\r\n useState,\r\n type CSSProperties,\r\n type ReactNode,\r\n} from \"react\";\r\nimport { cx } from \"../../utils/cx\";\r\nimport { TopBar, type TopBarProps } from \"../top-bar/TopBar\";\r\nimport \"./app-shell.module.css\";\r\n\r\nconst DESKTOP_BREAKPOINT = 960;\r\n\r\nfunction getIsDesktop() {\r\n if (typeof window === \"undefined\") return false;\r\n return window.innerWidth >= DESKTOP_BREAKPOINT;\r\n}\r\n\r\nexport type AppShellProps = {\r\n /** Primary page content rendered in the main area. */\r\n children: ReactNode;\r\n /** Sidebar navigation or custom content. */\r\n sidebar: ReactNode;\r\n /** Brand element rendered next to the hamburger (text or JSX). */\r\n brand?: ReactNode;\r\n /** Optional brand href; when provided the brand renders as an anchor. */\r\n brandHref?: string;\r\n /** Optional content after the brand on the left side of the top bar. */\r\n topbarStart?: ReactNode;\r\n /** Optional content aligned to the right side of the top bar. */\r\n topbarEnd?: ReactNode;\r\n /** Optional built-in theme toggle for the top bar. */\r\n showThemeToggle?: boolean;\r\n themeToggleProps?: TopBarProps[\"themeToggleProps\"];\r\n topBarBrandingLocation?: TopBarProps[\"brandingLocation\"];\r\n /** Custom class names for styling overrides. */\r\n className?: string;\r\n sidebarClassName?: string;\r\n topbarClassName?: string;\r\n mainClassName?: string;\r\n /** Sets the sidebar width (e.g., `260`, `\"18rem\"`). */\r\n sidebarWidth?: number | string;\r\n /**\r\n * Closes the sidebar on mobile whenever this value changes.\r\n * Useful for reacting to route/pathname changes.\r\n */\r\n closeSidebarOnChangeKey?: unknown;\r\n /** Label for the hamburger button (aria-label). */\r\n hamburgerLabel?: string;\r\n /** Optional callback fired whenever the sidebar open state changes. */\r\n onSidebarToggle?: (open: boolean) => void;\r\n};\r\n\r\n/**\r\n * Responsive application shell with a collapsible sidebar and sticky top bar.\r\n *\r\n * - Sidebar opens by default on desktop, collapses on mobile.\r\n * - Closes on outside click/scroll/touch when in mobile mode.\r\n * - Provides optional hook to close the sidebar when a prop value changes\r\n * (e.g., route transitions).\r\n */\r\nexport function AppShell({\r\n children,\r\n sidebar,\r\n brand,\r\n brandHref,\r\n topbarStart,\r\n topbarEnd,\r\n showThemeToggle = false,\r\n themeToggleProps,\r\n topBarBrandingLocation = \"left\",\r\n className,\r\n sidebarClassName,\r\n topbarClassName,\r\n mainClassName,\r\n sidebarWidth,\r\n closeSidebarOnChangeKey,\r\n hamburgerLabel = \"Toggle navigation\",\r\n onSidebarToggle,\r\n}: AppShellProps) {\r\n const [isDesktop, setIsDesktop] = useState(false);\r\n const [sidebarOpen, setSidebarOpen] = useState(false);\r\n const [transitionsReady, setTransitionsReady] = useState(false);\r\n const prevIsDesktopRef = useRef(false);\r\n const closeKeyRef = useRef(closeSidebarOnChangeKey);\r\n\r\n const sidebarRef = useRef<HTMLElement | null>(null);\r\n const hamburgerRef = useRef<HTMLButtonElement | null>(null);\r\n const mainRef = useRef<HTMLElement | null>(null);\r\n const sidebarId = useId();\r\n\r\n useEffect(() => {\r\n const desktop = getIsDesktop();\r\n setIsDesktop(desktop);\r\n setSidebarOpen(desktop);\r\n prevIsDesktopRef.current = desktop;\r\n const transitionFrame = window.requestAnimationFrame(() => {\r\n setTransitionsReady(true);\r\n });\r\n\r\n const handleResize = () => {\r\n const nowDesktop = getIsDesktop();\r\n setIsDesktop(nowDesktop);\r\n if (nowDesktop !== prevIsDesktopRef.current) {\r\n setSidebarOpen(nowDesktop);\r\n prevIsDesktopRef.current = nowDesktop;\r\n }\r\n };\r\n\r\n window.addEventListener(\"resize\", handleResize);\r\n return () => {\r\n window.cancelAnimationFrame(transitionFrame);\r\n window.removeEventListener(\"resize\", handleResize);\r\n };\r\n }, []);\r\n\r\n // Close the sidebar when clicking outside or scrolling on mobile.\r\n useEffect(() => {\r\n if (isDesktop || !sidebarOpen) return;\r\n\r\n const mainElement = mainRef.current;\r\n const closeSidebar = () => setSidebarOpen(false);\r\n\r\n const onPointerDown = (e: PointerEvent) => {\r\n const target = e.target as Node | null;\r\n if (!target) return;\r\n if (sidebarRef.current?.contains(target)) return;\r\n if (hamburgerRef.current?.contains(target)) return;\r\n closeSidebar();\r\n };\r\n\r\n const timeoutId = window.setTimeout(() => {\r\n document.addEventListener(\"pointerdown\", onPointerDown);\r\n window.addEventListener(\"scroll\", closeSidebar, { passive: true });\r\n mainElement?.addEventListener(\"scroll\", closeSidebar, { passive: true });\r\n document.addEventListener(\"touchmove\", closeSidebar, { passive: true });\r\n }, 10);\r\n\r\n return () => {\r\n window.clearTimeout(timeoutId);\r\n document.removeEventListener(\"pointerdown\", onPointerDown);\r\n window.removeEventListener(\"scroll\", closeSidebar);\r\n mainElement?.removeEventListener(\"scroll\", closeSidebar);\r\n document.removeEventListener(\"touchmove\", closeSidebar);\r\n };\r\n }, [sidebarOpen, isDesktop]);\r\n\r\n // Allow consumers to request a mobile sidebar close when a value changes (e.g., pathname).\r\n useEffect(() => {\r\n if (!isDesktop && closeKeyRef.current !== closeSidebarOnChangeKey) {\r\n setSidebarOpen(false);\r\n }\r\n closeKeyRef.current = closeSidebarOnChangeKey;\r\n }, [closeSidebarOnChangeKey, isDesktop]);\r\n\r\n useEffect(() => {\r\n onSidebarToggle?.(sidebarOpen);\r\n }, [sidebarOpen, onSidebarToggle]);\r\n\r\n const toggleSidebar = () => setSidebarOpen((open) => !open);\r\n\r\n const sidebarWidthValue =\r\n sidebarWidth === undefined\r\n ? undefined\r\n : typeof sidebarWidth === \"number\"\r\n ? `${sidebarWidth}px`\r\n : sidebarWidth;\r\n\r\n const shellStyle: CSSProperties | undefined = sidebarWidthValue\r\n ? { [\"--app-shell-sidebar-width\" as string]: sidebarWidthValue }\r\n : undefined;\r\n\r\n const shellClasses = cx(\r\n \"appShell\",\r\n transitionsReady && \"appShellAnimated\",\r\n sidebarOpen ? \"appShellOpen\" : \"appShellCollapsed\",\r\n className,\r\n );\r\n\r\n const sidebarClasses = cx(\"appShellSidebar\", sidebarOpen && \"appShellSidebarOpen\", sidebarClassName);\r\n\r\n return (\r\n <div\r\n className={shellClasses}\r\n style={shellStyle}\r\n data-app-shell\r\n data-desktop={isDesktop ? \"true\" : \"false\"}\r\n data-sidebar-open={sidebarOpen ? \"true\" : \"false\"}\r\n >\r\n <TopBar\r\n className={cx(\"appShellTopbar\", topbarClassName)}\r\n leading={\r\n <button\r\n ref={hamburgerRef}\r\n type=\"button\"\r\n className={\"appShellHamburger\"}\r\n onClick={toggleSidebar}\r\n aria-label={hamburgerLabel}\r\n aria-expanded={sidebarOpen}\r\n aria-controls={sidebarId}\r\n >\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\r\n <path d=\"M3 6h18M3 12h18M3 18h18\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" />\r\n </svg>\r\n </button>\r\n }\r\n brand={brand}\r\n brandHref={brandHref}\r\n brandingLocation={topBarBrandingLocation}\r\n start={topbarStart}\r\n actions={topbarEnd}\r\n showThemeToggle={showThemeToggle}\r\n themeToggleProps={themeToggleProps}\r\n />\r\n {!isDesktop && sidebarOpen && (\r\n <div className={\"appShellBackdrop\"} onClick={() => setSidebarOpen(false)} onTouchStart={() => setSidebarOpen(false)} aria-hidden=\"true\" />\r\n )}\r\n <aside ref={sidebarRef} id={sidebarId} className={sidebarClasses} aria-label=\"Sidebar navigation\">\r\n {sidebar}\r\n </aside>\r\n <main ref={mainRef} className={cx(\"appShellMain\", mainClassName)}>\r\n {children}\r\n </main>\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport {\r\n createContext,\r\n useCallback,\r\n useContext,\r\n useEffect,\r\n useMemo,\r\n useState,\r\n type ReactNode,\r\n} from \"react\";\r\nimport { UZI_THEMES, UZI_ACCENTS, THEME_STORAGE_KEY as DEFAULT_THEME_KEY, ACCENT_STORAGE_KEY as DEFAULT_ACCENT_KEY } from \"./constants\";\r\n\r\nexport type UziTheme = typeof UZI_THEMES[number];\r\nexport type UziResolvedTheme = \"light\" | \"dark\";\r\nexport type UziAccent = typeof UZI_ACCENTS[number];\r\n\r\ntype ThemeContextValue = {\r\n theme: UziTheme;\r\n resolvedTheme: UziResolvedTheme;\r\n accent: UziAccent;\r\n setTheme: (theme: UziTheme) => void;\r\n setAccent: (accent: UziAccent) => void;\r\n toggleTheme: () => void;\r\n};\r\n\r\ntype ThemeProviderProps = {\r\n children: ReactNode;\r\n theme?: UziTheme;\r\n defaultTheme?: UziTheme;\r\n accent?: UziAccent;\r\n defaultAccent?: UziAccent;\r\n onThemeChange?: (theme: UziTheme) => void;\r\n onAccentChange?: (accent: UziAccent) => void;\r\n storageKey?: string;\r\n accentStorageKey?: string;\r\n disableStorage?: boolean;\r\n};\r\n\r\nconst THEME_STORAGE_KEY = DEFAULT_THEME_KEY;\r\nconst ACCENT_STORAGE_KEY = DEFAULT_ACCENT_KEY;\r\nconst THEME_ATTRIBUTE = \"data-uzi-theme\";\r\nconst ACCENT_ATTRIBUTE = \"data-uzi-accent\";\r\n\r\nconst ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\r\n\r\nfunction isTheme(value: string | null): value is UziTheme {\r\n return UZI_THEMES.includes(value as UziTheme);\r\n}\r\n\r\nfunction isAccent(value: string | null): value is UziAccent {\r\n return UZI_ACCENTS.includes(value as UziAccent);\r\n}\r\n\r\nfunction getSystemTheme(): UziResolvedTheme {\r\n if (typeof window === \"undefined\") return \"light\";\r\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\";\r\n}\r\n\r\nexport function ThemeProvider({\r\n children,\r\n theme,\r\n defaultTheme = \"system\",\r\n accent,\r\n defaultAccent = \"blue\",\r\n onThemeChange,\r\n onAccentChange,\r\n storageKey = THEME_STORAGE_KEY,\r\n accentStorageKey = ACCENT_STORAGE_KEY,\r\n disableStorage = false,\r\n}: ThemeProviderProps) {\r\n const [internalTheme, setInternalTheme] = useState<UziTheme>(defaultTheme);\r\n const [internalAccent, setInternalAccent] = useState<UziAccent>(defaultAccent);\r\n const [systemTheme, setSystemTheme] = useState<UziResolvedTheme>(\"light\");\r\n\r\n useEffect(() => {\r\n setSystemTheme(getSystemTheme());\r\n if (!disableStorage) {\r\n const storedTheme = window.localStorage.getItem(storageKey);\r\n if (isTheme(storedTheme)) setInternalTheme(storedTheme);\r\n const storedAccent = window.localStorage.getItem(accentStorageKey);\r\n if (isAccent(storedAccent)) setInternalAccent(storedAccent);\r\n }\r\n }, [disableStorage, storageKey, accentStorageKey]);\r\n\r\n const isThemeControlled = theme !== undefined;\r\n const isAccentControlled = accent !== undefined;\r\n\r\n const currentTheme = isThemeControlled ? theme : internalTheme;\r\n const currentAccent = isAccentControlled ? accent : internalAccent;\r\n const resolvedTheme = currentTheme === \"system\" ? systemTheme : currentTheme;\r\n\r\n useEffect(() => {\r\n if (typeof window === \"undefined\") return;\r\n\r\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\r\n const handleChange = () => setSystemTheme(mediaQuery.matches ? \"dark\" : \"light\");\r\n\r\n handleChange();\r\n mediaQuery.addEventListener(\"change\", handleChange);\r\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (typeof document === \"undefined\") return;\r\n const root = document.documentElement;\r\n root.setAttribute(THEME_ATTRIBUTE, resolvedTheme);\r\n root.setAttribute(ACCENT_ATTRIBUTE, currentAccent);\r\n root.style.colorScheme = resolvedTheme;\r\n root.classList.toggle(\"dark\", resolvedTheme === \"dark\");\r\n }, [currentAccent, resolvedTheme]);\r\n\r\n const setTheme = useCallback(\r\n (nextTheme: UziTheme) => {\r\n if (!isThemeControlled) setInternalTheme(nextTheme);\r\n if (!disableStorage && typeof window !== \"undefined\") {\r\n window.localStorage.setItem(storageKey, nextTheme);\r\n }\r\n onThemeChange?.(nextTheme);\r\n },\r\n [disableStorage, isThemeControlled, onThemeChange, storageKey],\r\n );\r\n\r\n const setAccent = useCallback(\r\n (nextAccent: UziAccent) => {\r\n if (!isAccentControlled) setInternalAccent(nextAccent);\r\n if (!disableStorage && typeof window !== \"undefined\") {\r\n window.localStorage.setItem(accentStorageKey, nextAccent);\r\n }\r\n onAccentChange?.(nextAccent);\r\n },\r\n [accentStorageKey, disableStorage, isAccentControlled, onAccentChange],\r\n );\r\n\r\n const toggleTheme = useCallback(() => {\r\n setTheme(resolvedTheme === \"dark\" ? \"light\" : \"dark\");\r\n }, [resolvedTheme, setTheme]);\r\n\r\n const value = useMemo<ThemeContextValue>(\r\n () => ({\r\n theme: currentTheme,\r\n resolvedTheme,\r\n accent: currentAccent,\r\n setTheme,\r\n setAccent,\r\n toggleTheme,\r\n }),\r\n [currentAccent, currentTheme, resolvedTheme, setAccent, setTheme, toggleTheme],\r\n );\r\n\r\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\r\n}\r\n\r\nexport function useTheme() {\r\n const context = useContext(ThemeContext);\r\n if (!context) throw new Error(\"useTheme must be used within a ThemeProvider\");\r\n return context;\r\n}\r\n","export const UZI_THEMES = [\"light\", \"dark\", \"system\"] as const;\r\nexport const UZI_ACCENTS = [\"blue\", \"cyan\", \"violet\", \"emerald\", \"amber\", \"rose\"] as const;\r\n\r\nexport const THEME_STORAGE_KEY = \"uzi-theme\";\r\nexport const ACCENT_STORAGE_KEY = \"uzi-accent\";\r\n","\"use client\";\r\n\r\nimport type { ButtonHTMLAttributes } from \"react\";\r\nimport { Button } from \"../button/Button\";\r\nimport { useTheme } from \"../../theme/ThemeProvider\";\r\nimport { cx } from \"../../utils/cx\";\r\nimport \"./theme-toggle-button.module.css\";\r\n\r\nexport type ThemeToggleButtonProps = Omit<\r\n ButtonHTMLAttributes<HTMLButtonElement>,\r\n \"children\"\r\n> & {\r\n showLabel?: boolean;\r\n lightLabel?: string;\r\n darkLabel?: string;\r\n};\r\n\r\nfunction MoonIcon() {\r\n return (\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" width=\"16\" height=\"16\" fill=\"none\">\r\n <path\r\n d=\"M20 15.2A8.5 8.5 0 0 1 8.8 4 9 9 0 1 0 20 15.2Z\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"1.8\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction SunIcon() {\r\n return (\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" width=\"16\" height=\"16\" fill=\"none\">\r\n <circle cx=\"12\" cy=\"12\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\r\n <path\r\n d=\"M12 2.75v2.5M12 18.75v2.5M21.25 12h-2.5M5.25 12h-2.5M18.54 5.46l-1.77 1.77M7.23 16.77l-1.77 1.77M18.54 18.54l-1.77-1.77M7.23 7.23 5.46 5.46\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"1.8\"\r\n strokeLinecap=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function ThemeToggleButton({\r\n showLabel = false,\r\n lightLabel = \"Light mode\",\r\n darkLabel = \"Dark mode\",\r\n className,\r\n onClick,\r\n ...rest\r\n}: ThemeToggleButtonProps) {\r\n const { resolvedTheme, toggleTheme } = useTheme();\r\n const nextThemeLabel = resolvedTheme === \"dark\" ? lightLabel : darkLabel;\r\n\r\n return (\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size={showLabel ? \"sm\" : \"icon\"}\r\n className={cx(showLabel && \"withLabel\", className)}\r\n aria-label={`Switch to ${nextThemeLabel.toLowerCase()}`}\r\n title={`Switch to ${nextThemeLabel.toLowerCase()}`}\r\n onClick={(event) => {\r\n onClick?.(event);\r\n if (!event.defaultPrevented) toggleTheme();\r\n }}\r\n {...rest}\r\n >\r\n {resolvedTheme === \"dark\" ? <SunIcon /> : <MoonIcon />}\r\n {showLabel && <span>{nextThemeLabel}</span>}\r\n </Button>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport type { HTMLAttributes, ReactNode } from \"react\";\r\nimport { cx } from \"../../utils/cx\";\r\nimport {\r\n ThemeToggleButton,\r\n type ThemeToggleButtonProps,\r\n} from \"../theme-toggle-button/ThemeToggleButton\";\r\nimport \"./top-bar.module.css\";\r\n\r\nexport type TopBarProps = HTMLAttributes<HTMLElement> & {\r\n leading?: ReactNode;\r\n brand?: ReactNode;\r\n brandHref?: string;\r\n brandingLocation?: \"left\" | \"center\";\r\n /** Content rendered after the brand in the left region (e.g. breadcrumbs, search). */\r\n start?: ReactNode;\r\n /** Content rendered in the center region. */\r\n center?: ReactNode;\r\n actions?: ReactNode;\r\n showThemeToggle?: boolean;\r\n themeToggleProps?: ThemeToggleButtonProps;\r\n innerClassName?: string;\r\n isSticky?: boolean;\r\n sticky?: boolean;\r\n};\r\n\r\nexport function TopBar({\r\n leading,\r\n brand,\r\n brandHref,\r\n brandingLocation = \"left\",\r\n start,\r\n center,\r\n actions,\r\n showThemeToggle = false,\r\n themeToggleProps,\r\n className,\r\n innerClassName,\r\n isSticky,\r\n sticky = true,\r\n children,\r\n ...rest\r\n}: TopBarProps) {\r\n const shouldStick = isSticky ?? sticky;\r\n const brandNode = !brand ? null : brandHref ? (\r\n <a href={brandHref} className={\"topBarBrand\"}>\r\n <span className={\"topBarBrandContent\"}>{brand}</span>\r\n </a>\r\n ) : (\r\n <div className={\"topBarBrand\"}>\r\n <span className={\"topBarBrandContent\"}>{brand}</span>\r\n </div>\r\n );\r\n\r\n return (\r\n <header\r\n className={cx(\"topBar\", !shouldStick && \"topBarStatic\", className)}\r\n {...rest}\r\n >\r\n <div className={cx(\"topBarInner\", innerClassName)}>\r\n <div className={\"topBarStart\"}>\r\n {leading}\r\n {brandingLocation === \"left\" && brandNode}\r\n {start}\r\n </div>\r\n {(brandNode && brandingLocation === \"center\") || center || children ? (\r\n <div className={\"topBarCenter\"}>\r\n <div className={\"topBarCenterGroup\"}>\r\n {brandingLocation === \"center\" && brandNode}\r\n {center ?? children}\r\n </div>\r\n </div>\r\n ) : null}\r\n <div className={\"topBarActions\"}>\r\n {showThemeToggle && <ThemeToggleButton {...themeToggleProps} />}\r\n {actions}\r\n </div>\r\n </div>\r\n </header>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { type AnchorHTMLAttributes, type CSSProperties, type ReactNode } from \"react\";\r\nimport { cx } from \"../../utils/cx\";\r\nimport \"./sidebar-nav.module.css\";\r\n\r\nexport type SidebarNavItem = {\r\n label: string;\r\n href?: string;\r\n icon?: ReactNode;\r\n description?: ReactNode;\r\n badge?: ReactNode;\r\n active?: boolean;\r\n disabled?: boolean;\r\n title?: string;\r\n target?: AnchorHTMLAttributes<HTMLAnchorElement>[\"target\"];\r\n rel?: AnchorHTMLAttributes<HTMLAnchorElement>[\"rel\"];\r\n onClick?: () => void;\r\n};\r\n\r\nexport type SidebarNavSection = {\r\n id?: string;\r\n label?: ReactNode;\r\n items: SidebarNavItem[];\r\n};\r\n\r\nexport type SidebarNavProps = {\r\n items?: SidebarNavItem[];\r\n sections?: SidebarNavSection[];\r\n currentPath?: string;\r\n getIsActive?: (item: SidebarNavItem, currentPath?: string) => boolean;\r\n onItemClick?: (item: SidebarNavItem) => void;\r\n header?: ReactNode;\r\n footer?: ReactNode;\r\n ariaLabel?: string;\r\n collapsed?: boolean;\r\n iconSize?: number | string;\r\n className?: string;\r\n itemClassName?: string;\r\n sectionClassName?: string;\r\n};\r\n\r\nconst defaultIsActive = (item: SidebarNavItem, path?: string) => {\r\n if (item.active !== undefined) return item.active;\r\n if (!item.href) return false;\r\n if (!path) return false;\r\n if (item.href === \"/\") return path === \"/\";\r\n return path.startsWith(item.href);\r\n};\r\n\r\nexport function SidebarNav({\r\n items = [],\r\n sections,\r\n currentPath,\r\n getIsActive = defaultIsActive,\r\n onItemClick,\r\n header,\r\n footer,\r\n ariaLabel = \"Sidebar navigation\",\r\n collapsed = false,\r\n iconSize,\r\n className,\r\n itemClassName,\r\n sectionClassName,\r\n}: SidebarNavProps) {\r\n const resolvedSections = sections?.length\r\n ? sections\r\n : [{ id: \"default\", items }];\r\n const style =\r\n iconSize !== undefined\r\n ? ({\r\n [\"--sidebar-nav-icon-size\" as string]:\r\n typeof iconSize === \"number\" ? `${iconSize}px` : iconSize,\r\n } satisfies CSSProperties)\r\n : undefined;\r\n\r\n return (\r\n <nav\r\n className={cx(\"uziSidebarNav\", collapsed && \"uziSidebarNavCollapsed\", className)}\r\n aria-label={ariaLabel}\r\n style={style}\r\n >\r\n {header ? <div className={\"uziSidebarNavHeader\"}>{header}</div> : null}\r\n <div className={\"uziSidebarNavSections\"}>\r\n {resolvedSections.map((section, sectionIndex) => (\r\n <div\r\n key={section.id ?? `section-${sectionIndex}`}\r\n className={cx(\"uziSidebarNavSection\", sectionClassName)}\r\n >\r\n {section.label && !collapsed ? (\r\n <div className={\"uziSidebarNavSectionLabel\"}>{section.label}</div>\r\n ) : null}\r\n <div className={\"uziSidebarNavSectionItems\"}>\r\n {section.items.map((item, itemIndex) => (\r\n <SidebarNavEntry\r\n key={`${section.id ?? sectionIndex}-${item.href ?? item.title ?? itemIndex}`}\r\n item={item}\r\n active={getIsActive(item, currentPath)}\r\n collapsed={collapsed}\r\n itemClassName={itemClassName}\r\n onItemClick={onItemClick}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n {footer ? <div className={\"uziSidebarNavFooter\"}>{footer}</div> : null}\r\n </nav>\r\n );\r\n}\r\n\r\ntype SidebarNavEntryProps = {\r\n item: SidebarNavItem;\r\n active: boolean;\r\n collapsed: boolean;\r\n itemClassName?: string;\r\n onItemClick?: (item: SidebarNavItem) => void;\r\n};\r\n\r\nfunction SidebarNavEntry({\r\n item,\r\n active,\r\n collapsed,\r\n itemClassName,\r\n onItemClick,\r\n}: SidebarNavEntryProps) {\r\n const rel = item.rel ?? (item.target === \"_blank\" ? \"noreferrer\" : undefined);\r\n const title = item.title ?? (typeof item.label === \"string\" ? item.label : undefined);\r\n const classes = cx(\r\n \"uziSidebarNavItem\",\r\n active && \"uziSidebarNavItemActive\",\r\n collapsed && \"uziSidebarNavItemCollapsed\",\r\n item.disabled && \"uziSidebarNavItemDisabled\",\r\n itemClassName,\r\n );\r\n const content = (\r\n <>\r\n {item.icon && <span className={\"uziSidebarNavIcon\"}>{item.icon}</span>}\r\n {!collapsed ? (\r\n <span className={\"uziSidebarNavItemBody\"}>\r\n <span className={\"uziSidebarNavLabelRow\"}>\r\n <span className={\"uziSidebarNavLabel\"}>{item.label}</span>\r\n {item.badge && <span className={\"uziSidebarNavBadge\"}>{item.badge}</span>}\r\n </span>\r\n {item.description ? <span className={\"uziSidebarNavDescription\"}>{item.description}</span> : null}\r\n </span>\r\n ) : null}\r\n </>\r\n );\r\n\r\n const handleClick = () => {\r\n if (item.disabled) return;\r\n item.onClick?.();\r\n onItemClick?.(item);\r\n };\r\n\r\n if (!item.href) {\r\n return (\r\n <button\r\n type=\"button\"\r\n className={classes}\r\n aria-current={active ? \"page\" : undefined}\r\n aria-disabled={item.disabled ? \"true\" : undefined}\r\n disabled={item.disabled}\r\n title={collapsed ? title : undefined}\r\n onClick={handleClick}\r\n >\r\n {content}\r\n </button>\r\n );\r\n }\r\n\r\n if (item.disabled) {\r\n return (\r\n <div\r\n className={classes}\r\n aria-current={active ? \"page\" : undefined}\r\n aria-disabled=\"true\"\r\n title={collapsed ? title : undefined}\r\n >\r\n {content}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <a\r\n className={classes}\r\n href={item.href}\r\n target={item.target}\r\n rel={rel}\r\n aria-current={active ? \"page\" : undefined}\r\n title={collapsed ? title : undefined}\r\n onClick={handleClick}\r\n >\r\n {content}\r\n </a>\r\n );\r\n}\r\n","import type { HTMLAttributes } from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport \"./skeleton.module.css\";\n\nexport type SkeletonProps = HTMLAttributes<HTMLDivElement> & {\n /** Width as a CSS value. */\n width?: string;\n /** Height as a CSS value. */\n height?: string;\n /** Border radius preset. Defaults to \"md\". */\n radius?: \"sm\" | \"md\" | \"lg\" | \"full\";\n};\n\nexport function Skeleton({\n width,\n height,\n radius = \"md\",\n className,\n style,\n ...rest\n}: SkeletonProps) {\n return (\n <div\n className={cx(\"skeleton\", `radius-${radius}`, className)}\n style={{ width, height, ...style }}\n aria-hidden=\"true\"\n {...rest}\n />\n );\n}\n","import type { HTMLAttributes } from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport \"./progress.module.css\";\n\nexport type ProgressTone = \"default\" | \"success\" | \"warning\" | \"danger\";\n\nexport type ProgressProps = HTMLAttributes<HTMLDivElement> & {\n /** Value 0–100. */\n value: number;\n /** Visual tone. Defaults to \"default\". */\n tone?: ProgressTone;\n /** Accessible label. */\n \"aria-label\"?: string;\n};\n\nexport function Progress({\n value,\n tone = \"default\",\n className,\n \"aria-label\": ariaLabel,\n ...rest\n}: ProgressProps) {\n const clamped = Math.max(0, Math.min(100, value));\n return (\n <div\n className={cx(\"track\", className)}\n role=\"progressbar\"\n aria-valuenow={clamped}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={ariaLabel}\n {...rest}\n >\n <div\n className={cx(\"fill\", `tone-${tone}`)}\n style={{ width: `${clamped}%` }}\n />\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport \"./select.module.css\";\n\nexport type SelectOption = {\n label: string;\n value: string;\n};\n\nexport type SelectProps = Omit<React.SelectHTMLAttributes<HTMLSelectElement>, \"onChange\"> & {\n options: SelectOption[];\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n};\n\nexport const Select = React.forwardRef<HTMLSelectElement, SelectProps>(\n ({ options, value, onChange, placeholder, className, ...rest }, ref) => {\n return (\n <select\n ref={ref}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className={cx(\"select\", className)}\n {...rest}\n >\n {placeholder ? (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n ) : null}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n );\n },\n);\n\nSelect.displayName = \"Select\";\n"],"mappings":"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","names":["import_jsx_runtime","import_jsx_runtime","TONE_CLASS","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_jsx_runtime","THEME_STORAGE_KEY","ACCENT_STORAGE_KEY","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime"]}
package/dist/index.css CHANGED
@@ -1340,4 +1340,89 @@ button.uziSidebarNavItem {
1340
1340
  font-size: 13px;
1341
1341
  }
1342
1342
  }
1343
+
1344
+ /* src/components/skeleton/skeleton.module.css */
1345
+ .skeleton {
1346
+ background: color-mix(in srgb, var(--muted-foreground, #94a3b8) 14%, var(--background, #0f172a));
1347
+ animation: skeleton-pulse 1.6s ease-in-out infinite;
1348
+ }
1349
+ @keyframes skeleton-pulse {
1350
+ 0%, 100% {
1351
+ opacity: 1;
1352
+ }
1353
+ 50% {
1354
+ opacity: 0.45;
1355
+ }
1356
+ }
1357
+ .radius-sm {
1358
+ border-radius: 4px;
1359
+ }
1360
+ .radius-md {
1361
+ border-radius: 8px;
1362
+ }
1363
+ .radius-lg {
1364
+ border-radius: 12px;
1365
+ }
1366
+ .radius-full {
1367
+ border-radius: 9999px;
1368
+ }
1369
+
1370
+ /* src/components/progress/progress.module.css */
1371
+ .track {
1372
+ height: 8px;
1373
+ border-radius: 9999px;
1374
+ overflow: hidden;
1375
+ background: color-mix(in srgb, var(--border, #1f2937) 60%, transparent);
1376
+ }
1377
+ .fill {
1378
+ height: 100%;
1379
+ border-radius: 9999px;
1380
+ transition: width 0.4s ease;
1381
+ }
1382
+ .tone-default {
1383
+ background: var(--foreground, #e2e8f0);
1384
+ }
1385
+ .tone-success {
1386
+ background: var(--success, hsl(142 71% 45%));
1387
+ }
1388
+ .tone-warning {
1389
+ background: var(--warning, hsl(38 92% 50%));
1390
+ }
1391
+ .tone-danger {
1392
+ background: var(--destructive, #f87171);
1393
+ }
1394
+
1395
+ /* src/components/select/select.module.css */
1396
+ .select {
1397
+ display: flex;
1398
+ width: 100%;
1399
+ min-height: 2.25rem;
1400
+ border-radius: 0.5rem;
1401
+ border: 1px solid var(--ts-input-border, var(--input, var(--border, #1f2937)));
1402
+ background: var(--ts-input-bg, var(--background, #fff));
1403
+ color: var(--ts-input-fg, var(--foreground, var(--text, #e2e8f0)));
1404
+ padding: 0.25rem 2rem 0.25rem 0.75rem;
1405
+ font-size: 0.875rem;
1406
+ line-height: 1.25rem;
1407
+ font-family: inherit;
1408
+ box-shadow: var(--ts-input-shadow, 0 1px 2px rgba(0, 0, 0, 0.04));
1409
+ transition: border-color 0.15s ease, background 0.15s ease;
1410
+ appearance: none;
1411
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 10 10' fill='none'%3E%3Cpath d='M2 3.5L5 6.5L8 3.5' stroke='%2394a3b8' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
1412
+ background-repeat: no-repeat;
1413
+ background-position: right 0.625rem center;
1414
+ cursor: pointer;
1415
+ }
1416
+ .select:focus-visible {
1417
+ outline: var(--focus-ring);
1418
+ outline-offset: var(--focus-ring-offset);
1419
+ }
1420
+ .select:disabled {
1421
+ cursor: not-allowed;
1422
+ opacity: 0.5;
1423
+ }
1424
+ .select option {
1425
+ background: var(--background, #0f172a);
1426
+ color: var(--foreground, #e2e8f0);
1427
+ }
1343
1428
  /*# sourceMappingURL=index.css.map */