@tomny-dev/uzi 0.1.5 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +109 -166
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +16 -16
- package/dist/index.css.map +1 -1
- package/dist/index.js +109 -166
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/components/button/Button.tsx","../src/utils/cx.ts","../src/components/button/button.module.css","../src/components/avatar/Avatar.tsx","../src/components/avatar/avatar.module.css","../src/components/card/card.module.css","../src/components/card/Card.tsx","../src/components/pill/pill.module.css","../src/components/pill/Pill.tsx","../src/components/modal/Modal.tsx","../src/components/modal/modal.module.css","../src/components/alert/alert.module.css","../src/components/alert/Alert.tsx","../src/components/toast/ToastContext.tsx","../src/components/toast/toast.module.css","../src/components/input/Input.tsx","../src/components/input/input.module.css","../src/components/label/Label.tsx","../src/components/label/label.module.css","../src/components/checkbox/Checkbox.tsx","../src/components/checkbox/checkbox.module.css","../src/components/dropdown/Dropdown.tsx","../src/components/dropdown/dropdown.module.css","../src/components/dropdown-menu/DropdownMenu.tsx","../src/components/dropdown-menu/dropdown-menu.module.css","../src/components/app-shell/AppShell.tsx","../src/theme/ThemeProvider.tsx","../src/theme/constants.ts","../src/components/theme-toggle-button/theme-toggle-button.module.css","../src/components/theme-toggle-button/ThemeToggleButton.tsx","../src/components/top-bar/top-bar.module.css","../src/components/top-bar/TopBar.tsx","../src/components/app-shell/app-shell.module.css","../src/components/sidebar-nav/sidebar-nav.module.css","../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 styles from \"./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: styles[\"variant-primary\"],\n primary: styles[\"variant-primary\"],\n secondary: styles[\"variant-secondary\"],\n outline: styles[\"variant-outline\"],\n ghost: styles[\"variant-ghost\"],\n destructive: styles[\"variant-destructive\"],\n link: styles[\"variant-link\"],\n};\n\nconst sizeClass: Record<ButtonSize, string> = {\n default: styles[\"size-md\"],\n sm: styles[\"size-sm\"],\n md: styles[\"size-md\"],\n lg: styles[\"size-lg\"],\n icon: styles[\"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 styles.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",".button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n font-family: inherit;\n font-weight: 600;\n border-radius: 8px;\n border: 1px solid transparent;\n cursor: pointer;\n text-decoration: none;\n transition:\n opacity 0.15s,\n border-color 0.15s,\n color 0.15s,\n background 0.15s;\n white-space: nowrap;\n line-height: 1;\n}\n\n.button:focus-visible {\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n}\n\n.button svg {\n width: 1rem;\n height: 1rem;\n flex-shrink: 0;\n}\n\n.button:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n}\n\n/* Sizes */\n.size-sm {\n font-size: 0.82rem;\n min-height: 2rem;\n padding: 6px 14px;\n}\n\n.size-md {\n font-size: 0.95rem;\n min-height: 2.25rem;\n padding: 10px 22px;\n}\n\n.size-lg {\n font-size: 1rem;\n min-height: 2.5rem;\n padding: 12px 28px;\n}\n\n.size-icon {\n width: 2.25rem;\n height: 2.25rem;\n padding: 0;\n}\n\n/* Variants */\n.variant-primary {\n background: var(--ts-btn-primary-bg, var(--primary, #22d3ee));\n color: var(--ts-btn-primary-text, var(--primary-foreground, #0f172a));\n}\n\n.variant-primary:hover:not(:disabled) {\n opacity: 0.88;\n}\n\n.variant-secondary {\n background: var(--ts-btn-secondary-bg, var(--secondary, rgba(255, 255, 255, 0.06)));\n color: var(--ts-btn-secondary-text, var(--secondary-foreground, var(--text, #e2e8f0)));\n border-color: var(--ts-btn-secondary-border, var(--border, #1f2937));\n}\n\n.variant-secondary:hover:not(:disabled) {\n background: var(--ts-btn-secondary-hover-bg, color-mix(in srgb, var(--secondary, rgba(255, 255, 255, 0.06)) 90%, black));\n}\n\n.variant-outline {\n background: var(--ts-btn-outline-bg, var(--background, transparent));\n color: var(--ts-btn-outline-text, var(--foreground, var(--text, #e2e8f0)));\n border-color: var(--ts-btn-outline-border, var(--border, #1f2937));\n}\n\n.variant-outline:hover:not(:disabled) {\n background: var(--ts-btn-outline-hover-bg, var(--accent, rgba(255, 255, 255, 0.06)));\n color: var(--ts-btn-outline-hover-text, var(--accent-foreground, var(--foreground, #e2e8f0)));\n}\n\n.variant-ghost {\n background: transparent;\n color: var(--ts-btn-ghost-text, var(--muted-foreground, var(--muted, #94a3b8)));\n padding-left: 8px;\n padding-right: 8px;\n}\n\n.variant-ghost:hover:not(:disabled) {\n background: var(--ts-btn-ghost-hover-bg, var(--accent, rgba(255, 255, 255, 0.05)));\n color: var(--ts-btn-ghost-hover-text, var(--accent-foreground, var(--foreground, #e2e8f0)));\n}\n\n.variant-destructive {\n background: var(--ts-btn-danger-bg, var(--destructive, #f87171));\n color: var(--ts-btn-danger-text, var(--destructive-foreground, #fff));\n}\n\n.variant-destructive:hover:not(:disabled) {\n opacity: 0.9;\n}\n\n.variant-link {\n background: transparent;\n color: var(--ts-btn-link-text, var(--primary, #22d3ee));\n border-color: transparent;\n min-height: auto;\n padding: 0;\n border-radius: 0;\n}\n\n.variant-link:hover:not(:disabled) {\n text-decoration: underline;\n text-underline-offset: 0.2em;\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\";\nimport { cx } from \"../../utils/cx\";\nimport styles from \"./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(styles.avatar, styles[`size-${size}`], 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(styles.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(styles.fallback, className)}\n {...props}\n />\n );\n}\n",".avatar {\n position: relative;\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n border-radius: 999px;\n background: var(--ts-avatar-bg, var(--muted, rgba(255, 255, 255, 0.08)));\n color: var(--ts-avatar-fg, var(--muted-foreground, var(--text, #e2e8f0)));\n}\n\n.size-sm {\n width: 1.75rem;\n height: 1.75rem;\n}\n\n.size-md {\n width: 2rem;\n height: 2rem;\n}\n\n.size-lg {\n width: 2.25rem;\n height: 2.25rem;\n}\n\n.image {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.fallback {\n display: flex;\n width: 100%;\n height: 100%;\n align-items: center;\n justify-content: center;\n border-radius: inherit;\n background: var(--ts-avatar-fallback-bg, var(--muted, rgba(255, 255, 255, 0.08)));\n color: var(--ts-avatar-fallback-fg, var(--muted-foreground, var(--text, #e2e8f0)));\n font-size: 0.85rem;\n font-weight: 700;\n line-height: 1;\n text-transform: uppercase;\n}\n",".card {\n position: relative;\n overflow: visible;\n border-radius: var(--ts-card-radius, 12px);\n border: 1px solid var(--ts-card-border, var(--border, #1f2937));\n background: var(--ts-card-bg, var(--panel, #111827));\n color: var(--ts-card-fg, var(--text, #e2e8f0));\n box-shadow: var(--ts-card-shadow, 0 16px 36px rgba(0, 0, 0, 0.28));\n padding: var(--ts-card-padding, 16px);\n transition:\n transform 140ms ease,\n box-shadow 140ms ease,\n border-color 140ms ease,\n background-color 140ms ease;\n}\n\n.tone-default {\n --ts-card-bg: var(--panel, #111827);\n --ts-card-border: var(--border, #1f2937);\n --ts-card-shadow: 0 16px 36px rgba(0, 0, 0, 0.28);\n}\n\n.tone-muted {\n --ts-card-bg: var(--ts-card-muted-bg, rgba(255, 255, 255, 0.02));\n --ts-card-border: var(--ts-card-muted-border, rgba(255, 255, 255, 0.06));\n --ts-card-shadow: 0 10px 26px rgba(0, 0, 0, 0.22);\n}\n\n.tone-contrast {\n --ts-card-bg: var(--ts-card-contrast-bg, #0b1224);\n --ts-card-border: var(--ts-card-contrast-border, rgba(255, 255, 255, 0.1));\n --ts-card-shadow: 0 18px 50px rgba(0, 0, 0, 0.32);\n}\n\n.interactive {\n cursor: default;\n}\n\n.interactive:hover {\n transform: translateY(-1px);\n box-shadow: 0 22px 60px rgba(0, 0, 0, 0.32);\n border-color: var(--ts-card-hover-border, rgba(34, 211, 238, 0.4));\n}\n\n.interactive:focus-within {\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n}\n\n.padding-none {\n --ts-card-padding: 0;\n}\n\n.padding-sm {\n --ts-card-padding: 10px;\n}\n\n.padding-md {\n --ts-card-padding: 16px;\n}\n\n.padding-lg {\n --ts-card-padding: 20px;\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 styles from \"./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 toneClass = tone !== \"default\" ? styles[`tone-${tone}`] : null;\n const classes = cx(\n styles.card,\n toneClass,\n styles[`padding-${padding}`],\n interactive && styles.interactive,\n className,\n );\n\n return (\n <Component className={classes} {...rest}>\n {children}\n </Component>\n );\n}\n",".pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 999px;\n border: 1px solid var(--ts-pill-border, var(--border, #1f2937));\n background: var(--ts-pill-bg, rgba(255, 255, 255, 0.04));\n color: var(--ts-pill-fg, var(--muted, #94a3b8));\n font-size: 12px;\n font-weight: 700;\n letter-spacing: 0.05em;\n text-transform: uppercase;\n line-height: 1.2;\n white-space: nowrap;\n}\n\n.size-sm {\n padding: 3px 8px;\n font-size: 11px;\n}\n\n.size-md {\n padding: 4px 10px;\n}\n\n.tone-neutral {\n background: var(--ts-pill-bg, rgba(255, 255, 255, 0.04));\n border-color: var(--ts-pill-border, var(--border, #1f2937));\n color: var(--ts-pill-fg, var(--muted, #94a3b8));\n}\n\n.tone-success {\n color: #22c55e;\n border-color: rgba(34, 197, 94, 0.45);\n background: rgba(34, 197, 94, 0.12);\n}\n\n.tone-warning {\n color: #f59e0b;\n border-color: rgba(245, 158, 11, 0.45);\n background: rgba(245, 158, 11, 0.12);\n}\n\n.tone-info {\n color: #22d3ee;\n border-color: rgba(34, 211, 238, 0.5);\n background: rgba(34, 211, 238, 0.12);\n}\n\n.tone-danger {\n color: #f87171;\n border-color: rgba(248, 113, 113, 0.45);\n background: rgba(248, 113, 113, 0.12);\n}\n\n.icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n}\n\n.content {\n display: inline-flex;\n align-items: center;\n gap: 4px;\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 styles from \"./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(styles.pill, styles[`tone-${tone}`], styles[`size-${size}`], className);\n\n return (\n <Component className={classes} {...rest}>\n {icon ? (\n <span className={styles.icon} aria-hidden=\"true\">\n {icon}\n </span>\n ) : null}\n <span className={styles.content}>{children}</span>\n </Component>\n );\n}\n","\"use client\";\n\nimport { useRef, useEffect, type ReactNode } from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport styles from \"./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(styles.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(styles.modal, styles[`size-${size}`])}>\n <div className={styles.header}>\n <div className={styles.titles}>\n <div className={styles.title}>{title}</div>\n {subtitle && <div className={styles.subtitle}>{subtitle}</div>}\n </div>\n <button className={styles.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={styles.body}>{children}</div>\n\n {footer && <div className={styles.footer}>{footer}</div>}\n </div>\n </ModalOverlay>\n );\n}\n",".backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.55);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 16px;\n z-index: 100;\n}\n\n.modal {\n background: var(--background, #0f172a);\n border: 1px solid var(--border, #1f2937);\n border-radius: 14px;\n padding: 24px;\n width: min(500px, 100%);\n box-shadow: 0 24px 64px rgba(0, 0, 0, 0.55);\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n\n/* Size variants */\n.size-sm { width: min(380px, 100%); }\n.size-md { width: min(500px, 100%); }\n.size-lg { width: min(640px, 100%); }\n.size-xl { width: min(900px, 100%); }\n\n.header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 16px;\n}\n\n.titles {\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n\n.title {\n font-weight: 700;\n font-size: 16px;\n color: var(--text, #e2e8f0);\n line-height: 1.3;\n}\n\n.subtitle {\n font-size: 13px;\n color: var(--muted, #94a3b8);\n line-height: 1.4;\n}\n\n.closeButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n flex-shrink: 0;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 6px;\n color: var(--muted, #94a3b8);\n cursor: pointer;\n transition: background 0.12s, color 0.12s;\n padding: 0;\n}\n\n.closeButton:hover {\n background: rgba(255, 255, 255, 0.07);\n color: var(--text, #e2e8f0);\n}\n\n.closeButton:focus-visible {\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n}\n\n.body {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.footer {\n display: flex;\n gap: 8px;\n margin-top: 20px;\n}\n",".alert {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n border-radius: 0.375rem;\n border: 1px solid;\n padding: 0.625rem 0.875rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.success {\n border-color: color-mix(in srgb, var(--success, hsl(142 71% 45%)) 35%, transparent);\n background: color-mix(in srgb, var(--success, hsl(142 71% 45%)) 10%, transparent);\n color: color-mix(in srgb, var(--success, hsl(142 71% 45%)) 90%, var(--foreground, #e2e8f0));\n}\n\n.error {\n border-color: color-mix(in srgb, var(--destructive, #f87171) 35%, transparent);\n background: color-mix(in srgb, var(--destructive, #f87171) 10%, transparent);\n color: color-mix(in srgb, var(--destructive, #f87171) 90%, var(--foreground, #e2e8f0));\n}\n\n.warning {\n border-color: color-mix(in srgb, var(--warning, hsl(38 92% 50%)) 35%, transparent);\n background: color-mix(in srgb, var(--warning, hsl(38 92% 50%)) 10%, transparent);\n color: color-mix(in srgb, var(--warning, hsl(38 92% 50%)) 90%, var(--foreground, #e2e8f0));\n}\n\n.info {\n border-color: color-mix(in srgb, var(--primary, #22d3ee) 35%, transparent);\n background: color-mix(in srgb, var(--primary, #22d3ee) 10%, transparent);\n color: color-mix(in srgb, var(--primary, #22d3ee) 90%, var(--foreground, #e2e8f0));\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport styles from \"./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\nexport function Alert({ tone, children, className }: AlertProps) {\n return (\n <div className={cx(styles.alert, styles[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 styles from \"./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 styles.topLeft;\n case \"top-center\":\n return styles.topCenter;\n case \"bottom-right\":\n return styles.bottomRight;\n case \"bottom-left\":\n return styles.bottomLeft;\n case \"bottom-center\":\n return styles.bottomCenter;\n case \"top-right\":\n default:\n return styles.topRight;\n }\n })();\n\n return (\n <div\n className={cx(styles.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(styles.toast, exiting && styles.exit)} style={styleVars} role=\"status\" aria-live=\"polite\">\n <span className={styles.icon} aria-hidden>\n {icon}\n </span>\n <div className={styles.body}>\n <div className={styles.message}>{toast.message}</div>\n {toast.action && (\n <div className={styles.actions}>\n <button\n type=\"button\"\n className={styles.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={styles.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",".stack {\n position: fixed;\n z-index: 2147483000;\n display: flex;\n flex-direction: column;\n gap: 10px;\n pointer-events: none;\n}\n\n.topRight {\n top: 16px;\n right: 16px;\n align-items: flex-end;\n}\n\n.topLeft {\n top: 16px;\n left: 16px;\n align-items: flex-start;\n}\n\n.topCenter {\n top: 16px;\n left: 50%;\n transform: translateX(-50%);\n align-items: center;\n}\n\n.bottomRight {\n bottom: 16px;\n right: 16px;\n align-items: flex-end;\n}\n\n.bottomLeft {\n bottom: 16px;\n left: 16px;\n align-items: flex-start;\n}\n\n.bottomCenter {\n bottom: 16px;\n left: 50%;\n transform: translateX(-50%);\n align-items: center;\n}\n\n.toast {\n pointer-events: auto;\n display: flex;\n align-items: flex-start;\n gap: 10px;\n min-width: 280px;\n max-width: min(420px, calc(100vw - 32px));\n padding: 12px 14px;\n border-radius: 10px;\n border: 1px solid var(--toast-border, #1f2937);\n background: var(--toast-bg, #111827);\n color: var(--toast-text, #e2e8f0);\n box-shadow: 0 12px 32px rgba(0, 0, 0, 0.35);\n animation: toastSlideIn 180ms ease-out;\n}\n\n.toast.exit {\n animation: toastSlideOut 160ms ease-in forwards;\n}\n\n.icon {\n width: 18px;\n height: 18px;\n flex-shrink: 0;\n}\n\n.body {\n flex: 1;\n min-width: 0;\n display: grid;\n gap: 6px;\n}\n\n.message {\n word-break: break-word;\n font-size: 14px;\n line-height: 1.4;\n}\n\n.actions {\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.actionButton {\n padding: 5px 10px;\n font-size: 12px;\n font-weight: 600;\n border-radius: 6px;\n border: 1px solid var(--toast-action-border, rgba(0, 0, 0, 0.2));\n background: var(--toast-action-bg, rgba(0, 0, 0, 0.1));\n color: var(--toast-text, #e2e8f0);\n cursor: pointer;\n transition: background 120ms ease;\n}\n\n.actionButton:hover {\n background: var(--toast-button-bg, rgba(0, 0, 0, 0.15));\n}\n\n.closeButton {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n padding: 0;\n margin: -2px -4px -2px 0;\n border: none;\n border-radius: 4px;\n background: transparent;\n color: var(--toast-text, #e2e8f0);\n opacity: 0.6;\n cursor: pointer;\n transition: opacity 120ms ease, background 120ms ease;\n}\n\n.closeButton:hover {\n opacity: 1;\n background: var(--toast-button-bg, rgba(0, 0, 0, 0.1));\n}\n\n@keyframes toastSlideIn {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes toastSlideOut {\n from {\n opacity: 1;\n transform: translateY(0);\n }\n to {\n opacity: 0;\n transform: translateY(-6px);\n }\n}\n","import * as React from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport styles from \"./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(styles.input, className)}\n {...props}\n />\n );\n },\n);\n\nInput.displayName = \"Input\";\n",".input {\n display: flex;\n width: 100%;\n min-height: 2.25rem;\n border-radius: 0.5rem;\n border: 1px solid var(--ts-input-border, var(--input, var(--border, #1f2937)));\n background: var(--ts-input-bg, var(--background, #fff));\n color: var(--ts-input-fg, var(--foreground, var(--text, #e2e8f0)));\n padding: 0.25rem 0.75rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n box-shadow: var(--ts-input-shadow, 0 1px 2px rgba(0, 0, 0, 0.04));\n transition: border-color 0.15s ease, background 0.15s ease;\n}\n\n.input::placeholder {\n color: var(--ts-input-placeholder, var(--muted-foreground, var(--muted, #94a3b8)));\n}\n\n.input:focus-visible {\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n}\n\n.input:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n","import * as React from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport styles from \"./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(styles.label, className)} {...props} />\n ),\n);\n\nLabel.displayName = \"Label\";\n",".label {\n font-size: 0.875rem;\n font-weight: 500;\n line-height: 1.2;\n color: var(--ts-label-fg, inherit);\n}\n","import * as React from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport styles from \"./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(styles.checkbox, className)}\n {...props}\n />\n );\n },\n);\n\nCheckbox.displayName = \"Checkbox\";\n",".checkbox {\n width: 1rem;\n height: 1rem;\n margin: 0;\n border-radius: 0.25rem;\n border: 1px solid var(--ts-checkbox-border, var(--primary, var(--border, #1f2937)));\n background: var(--ts-checkbox-bg, var(--background, #fff));\n accent-color: var(--ts-checkbox-accent, var(--primary, #0f172a));\n cursor: pointer;\n}\n\n.checkbox:focus-visible {\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n}\n\n.checkbox:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n","\"use client\";\n\nimport { useState, useRef, useEffect } from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport styles from \"./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(styles.wrapper, className)} ref={ref}>\n <button\n type=\"button\"\n className={cx(styles.trigger, isActive && styles[\"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(styles.chevron, open && styles[\"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={styles.menu}>\n {allowClear && (\n <button\n type=\"button\"\n className={cx(styles.option, value === \"\" && styles[\"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(styles.option, value === opt.value && styles[\"option-selected\"])}\n onClick={() => { onChange(opt.value); setOpen(false); }}\n >\n {opt.label}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n",".wrapper {\n position: relative;\n display: inline-block;\n}\n\n.trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 6px 10px 6px 14px;\n background: var(--ts-dropdown-bg, var(--panel, #111827));\n border: 1px solid var(--ts-dropdown-border, var(--border, #1f2937));\n border-radius: 8px;\n color: var(--ts-dropdown-text, var(--text, #e2e8f0));\n font-size: 0.85rem;\n font-weight: 500;\n cursor: pointer;\n white-space: nowrap;\n transition: border-color 0.15s;\n user-select: none;\n}\n\n.trigger:hover {\n border-color: var(--ts-dropdown-accent, var(--accent, #22d3ee));\n}\n\n.trigger:focus-visible {\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n}\n\n.trigger-active {\n border-color: var(--ts-dropdown-accent, var(--accent, #22d3ee));\n color: var(--ts-dropdown-accent, var(--accent, #22d3ee));\n}\n\n.chevron {\n width: 10px;\n height: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: transform 0.15s;\n color: var(--muted, #94a3b8);\n flex-shrink: 0;\n}\n\n.chevron-open {\n transform: rotate(180deg);\n}\n\n.menu {\n position: absolute;\n top: calc(100% + 6px);\n left: 0;\n min-width: 100%;\n background: var(--ts-dropdown-bg, var(--panel, #111827));\n border: 1px solid var(--ts-dropdown-border, var(--border, #1f2937));\n border-radius: 10px;\n padding: 4px;\n z-index: 50;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);\n animation: dropdownFadeIn 0.1s ease;\n}\n\n@keyframes dropdownFadeIn {\n from { opacity: 0; transform: translateY(-4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n.option {\n display: block;\n width: 100%;\n padding: 8px 12px;\n border-radius: 6px;\n font-size: 0.85rem;\n font-weight: 500;\n color: var(--muted, #94a3b8);\n background: none;\n border: none;\n cursor: pointer;\n text-align: left;\n white-space: nowrap;\n transition: background 0.1s, color 0.1s;\n}\n\n.option:hover {\n background: rgba(255, 255, 255, 0.05);\n color: var(--ts-dropdown-text, var(--text, #e2e8f0));\n}\n\n.option:focus-visible {\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n}\n\n.option-selected {\n color: var(--ts-dropdown-accent, var(--accent, #22d3ee));\n background: rgba(34, 211, 238, 0.08);\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 styles from \"./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(styles.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 styles.item,\n variant === \"destructive\" && styles.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(styles.item, styles.insetItem, className)}\n {...props}\n >\n <span className={styles.indicator}>\n <DropdownMenuPrimitive.ItemIndicator>\n <svg\n viewBox=\"0 0 16 16\"\n width=\"16\"\n height=\"16\"\n aria-hidden=\"true\"\n className={styles.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(styles.item, styles.insetItem, className)}\n {...props}\n >\n <span className={styles.indicator}>\n <DropdownMenuPrimitive.ItemIndicator>\n <span className={styles.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(styles.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(styles.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(styles.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={styles.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(styles.content, className)}\n {...props}\n />\n );\n}\n",".content {\n z-index: 50;\n min-width: 8rem;\n max-height: var(--radix-dropdown-menu-content-available-height);\n overflow-x: hidden;\n overflow-y: auto;\n border: 1px solid var(--ts-menu-border, var(--border, #1f2937));\n border-radius: 0.5rem;\n background: var(--ts-menu-bg, var(--popover, var(--panel, #111827)));\n color: var(--ts-menu-fg, var(--popover-foreground, var(--text, #e2e8f0)));\n padding: 0.25rem;\n box-shadow: 0 12px 32px rgba(0, 0, 0, 0.18);\n transform-origin: var(--radix-dropdown-menu-content-transform-origin);\n animation: menuFadeIn 140ms ease;\n}\n\n.item {\n position: relative;\n display: flex;\n width: 100%;\n cursor: default;\n user-select: none;\n align-items: center;\n gap: 0.5rem;\n border-radius: 0.375rem;\n padding: 0.375rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n outline: none;\n}\n\n.item[data-inset=\"true\"] {\n padding-left: 2rem;\n}\n\n.item[data-highlighted] {\n background: var(--ts-menu-hover-bg, var(--accent, rgba(255, 255, 255, 0.06)));\n color: var(--ts-menu-hover-fg, var(--accent-foreground, var(--foreground, #e2e8f0)));\n}\n\n.item[data-disabled] {\n pointer-events: none;\n opacity: 0.5;\n}\n\n.destructive {\n color: var(--ts-menu-danger, var(--destructive, #f87171));\n}\n\n.destructive[data-highlighted] {\n background: color-mix(in srgb, var(--destructive, #f87171) 15%, transparent);\n color: var(--ts-menu-danger-fg, var(--destructive, #f87171));\n}\n\n.insetItem {\n padding-left: 2rem;\n}\n\n.indicator {\n position: absolute;\n left: 0.5rem;\n display: inline-flex;\n width: 1rem;\n height: 1rem;\n align-items: center;\n justify-content: center;\n color: currentColor;\n}\n\n.indicatorIcon {\n display: block;\n}\n\n.radioDot {\n display: block;\n width: 0.5rem;\n height: 0.5rem;\n border-radius: 999px;\n background: currentColor;\n}\n\n.label {\n padding: 0.375rem 0.5rem;\n font-size: 0.875rem;\n font-weight: 600;\n line-height: 1.25rem;\n}\n\n.label[data-inset=\"true\"] {\n padding-left: 2rem;\n}\n\n.separator {\n height: 1px;\n margin: 0.25rem -0.25rem;\n background: var(--ts-menu-separator, var(--border, rgba(255, 255, 255, 0.12)));\n}\n\n.chevron {\n margin-left: auto;\n flex-shrink: 0;\n}\n\n@keyframes menuFadeIn {\n from {\n opacity: 0;\n transform: translateY(-4px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\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 styles from \"./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 styles.appShell,\n transitionsReady && styles.appShellAnimated,\n sidebarOpen ? styles.appShellOpen : styles.appShellCollapsed,\n className,\n );\n\n const sidebarClasses = cx(styles.appShellSidebar, sidebarOpen && styles.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(styles.appShellTopbar, topbarClassName)}\n leading={\n <button\n ref={hamburgerRef}\n type=\"button\"\n className={styles.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={styles.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(styles.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",".withLabel {\n padding-left: 12px;\n padding-right: 12px;\n}\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 styles from \"./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 && styles.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",".topBar {\n position: sticky;\n top: 0;\n z-index: 30;\n border-bottom: 1px solid var(--ts-topbar-border, var(--border, rgba(15, 23, 42, 0.1)));\n background: var(--ts-topbar-bg, color-mix(in srgb, var(--background, #fff) 92%, transparent));\n box-shadow: var(--ts-topbar-shadow, 0 1px 2px rgba(15, 23, 42, 0.06));\n backdrop-filter: blur(12px);\n}\n\n.topBarStatic {\n position: relative;\n}\n\n.topBarInner {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1rem;\n min-height: 4.25rem;\n padding: env(safe-area-inset-top) 1rem 0 1rem;\n}\n\n.topBarStart {\n display: flex;\n align-items: center;\n gap: 0.875rem;\n min-width: 0;\n flex: 1 1 auto;\n}\n\n.topBarBrand {\n display: inline-flex;\n align-items: center;\n gap: 0.625rem;\n min-width: 0;\n color: var(--ts-topbar-brand-fg, var(--foreground, var(--text, #0f172a)));\n text-decoration: none;\n}\n\n.topBarBrandContent {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.topBarCenter {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 0 1 auto;\n min-width: 0;\n}\n\n.topBarCenterGroup {\n display: inline-flex;\n align-items: center;\n gap: 1rem;\n min-width: 0;\n}\n\n.topBarActions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 0.75rem;\n min-width: 0;\n flex: 1 1 auto;\n}\n\n@media (max-width: 768px) {\n .topBarInner {\n min-height: 4rem;\n gap: 0.75rem;\n padding-left: max(0.75rem, env(safe-area-inset-left));\n padding-right: max(0.75rem, env(safe-area-inset-right));\n }\n\n .topBarStart {\n gap: 0.75rem;\n }\n\n .topBarActions {\n gap: 0.5rem;\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 styles from \"./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={styles.topBarBrand}>\n <span className={styles.topBarBrandContent}>{brand}</span>\n </a>\n ) : (\n <div className={styles.topBarBrand}>\n <span className={styles.topBarBrandContent}>{brand}</span>\n </div>\n );\n\n return (\n <header\n className={cx(styles.topBar, !shouldStick && styles.topBarStatic, className)}\n {...rest}\n >\n <div className={cx(styles.topBarInner, innerClassName)}>\n <div className={styles.topBarStart}>\n {leading}\n {brandingLocation === \"left\" && brandNode}\n {start}\n </div>\n {(brandNode && brandingLocation === \"center\") || center || children ? (\n <div className={styles.topBarCenter}>\n <div className={styles.topBarCenterGroup}>\n {brandingLocation === \"center\" && brandNode}\n {center ?? children}\n </div>\n </div>\n ) : null}\n <div className={styles.topBarActions}>\n {showThemeToggle && <ThemeToggleButton {...themeToggleProps} />}\n {actions}\n </div>\n </div>\n </header>\n );\n}\n",".appShell {\n display: grid;\n grid-template-rows: calc(var(--app-shell-topbar-height, 64px) + env(safe-area-inset-top)) 1fr;\n grid-template-columns: var(--app-shell-sidebar-width, 240px) 1fr;\n min-height: 100vh;\n min-height: 100dvh;\n}\n\n.appShellAnimated {\n transition: grid-template-columns 200ms ease;\n}\n\n.appShell.appShellOpen {\n grid-template-columns: var(--app-shell-sidebar-width, 240px) 1fr;\n}\n\n.appShell.appShellCollapsed {\n grid-template-columns: 0 1fr;\n}\n\n.appShellTopbar {\n --ts-topbar-bg: var(--surface-topbar, var(--surface-elevated, color-mix(in srgb, var(--background, #fff) 90%, transparent)));\n --ts-topbar-border: var(--border);\n --ts-topbar-brand-fg: var(--foreground, var(--text, #0f172a));\n grid-column: 1 / -1;\n min-height: calc(var(--app-shell-topbar-height, 64px) + env(safe-area-inset-top));\n padding-left: 0;\n padding-right: 0;\n box-shadow: none;\n}\n\n.appShellTopbarLeft {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 0;\n}\n\n.appShellTopbarStart {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n}\n\n.appShellTopbarRight {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n flex-shrink: 0;\n}\n\n.appShellTopbarRight > * {\n min-width: 0;\n}\n\n.appShellBrand {\n font-size: 26px;\n color: var(--text);\n text-decoration: none;\n display: flex;\n align-items: center;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.appShellHamburger {\n background: transparent;\n border: none;\n padding: 0;\n width: 40px;\n height: 40px;\n border-radius: 8px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: var(--text);\n cursor: pointer;\n transition: background 120ms ease;\n}\n\n.appShellHamburger:hover {\n background: var(--accent);\n}\n\n.appShellHamburger:focus-visible {\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n}\n\n.appShellHamburger svg {\n width: 28px;\n height: 28px;\n}\n\n.appShellSidebar {\n border-right: 1px solid var(--border);\n background: var(--panel, var(--card, #111827));\n padding: 24px;\n}\n\n.appShellAnimated .appShellSidebar {\n transition: transform 200ms ease, opacity 200ms ease;\n}\n\n.appShell.appShellCollapsed .appShellSidebar {\n transform: translateX(-110%);\n opacity: 0;\n pointer-events: none;\n}\n\n.appShellMain {\n overflow-y: auto;\n min-height: 0;\n flex: 1 1 0;\n}\n\n.appShellBackdrop {\n display: none;\n}\n\n@media (max-width: 960px) {\n .appShellBackdrop {\n display: block;\n position: fixed;\n inset: 0;\n top: calc(var(--app-shell-topbar-height, 56px) + env(safe-area-inset-top));\n background: rgba(0, 0, 0, 0.5);\n z-index: 14;\n }\n\n .appShell {\n --app-shell-topbar-height: 56px;\n grid-template-columns: 1fr;\n grid-template-rows: calc(var(--app-shell-topbar-height, 56px) + env(safe-area-inset-top)) 1fr;\n }\n\n .appShell.appShellOpen,\n .appShell.appShellCollapsed {\n grid-template-columns: 1fr;\n }\n\n .appShellSidebar {\n display: block;\n position: fixed;\n top: calc(var(--app-shell-topbar-height, 56px) + env(safe-area-inset-top));\n left: 0;\n bottom: 0;\n width: var(--app-shell-sidebar-width, 240px);\n max-width: 80vw;\n background: var(--panel, var(--card, #111827));\n padding: 16px 12px;\n transform: translateX(-105%);\n z-index: 15;\n box-shadow: 0 20px 40px rgba(0, 0, 0, 0.35);\n }\n\n .appShellSidebar.appShellSidebarOpen {\n transform: translateX(0);\n }\n\n .appShellTopbar {\n padding-left: max(12px, env(safe-area-inset-left));\n padding-right: max(12px, env(safe-area-inset-right));\n gap: 10px;\n }\n\n .appShellTopbarLeft {\n gap: 10px;\n flex: 1;\n }\n\n .appShellTopbarStart {\n min-width: 0;\n }\n\n .appShellTopbarRight {\n gap: 6px;\n }\n\n .appShellBrand {\n font-size: 24px;\n max-width: 50vw;\n }\n\n .appShellHamburger {\n width: 40px;\n height: 40px;\n border-radius: 8px;\n }\n\n .appShellHamburger svg {\n width: 24px;\n height: 24px;\n }\n\n}\n\n@media (max-width: 640px) {\n .appShellTopbar {\n gap: 8px;\n }\n\n .appShellBrand {\n font-size: 22px;\n max-width: 34vw;\n }\n\n .appShellTopbarRight {\n max-width: 44vw;\n }\n}\n\n@media (max-width: 480px) {\n .appShellBrand {\n font-size: 20px;\n max-width: 30vw;\n }\n}\n",".uziSidebarNav {\n --sidebar-nav-icon-size: 18px;\n --sidebar-nav-icon-size-mobile: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n align-items: stretch;\n min-height: 100%;\n}\n\n.uziSidebarNavCollapsed {\n gap: 10px;\n}\n\n.uziSidebarNavHeader,\n.uziSidebarNavFooter {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.uziSidebarNavFooter {\n margin-top: auto;\n padding-top: 12px;\n border-top: 1px solid var(--border, #1f2937);\n}\n\n.uziSidebarNavSections {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n gap: 14px;\n}\n\n.uziSidebarNavSection {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.uziSidebarNavSectionItems {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.uziSidebarNavSectionLabel {\n padding: 0 10px;\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--muted-foreground, #94a3b8);\n opacity: 0.75;\n}\n\n.uziSidebarNavItem {\n color: var(--foreground, #e2e8f0);\n background: transparent;\n border: none;\n box-shadow: none;\n padding: 10px 12px 10px 10px;\n border-radius: 10px;\n text-decoration: none;\n font-size: 14px;\n display: grid;\n grid-template-columns: var(--sidebar-nav-icon-size) minmax(0, 1fr);\n align-items: center;\n column-gap: 10px;\n width: 100%;\n text-align: left;\n box-sizing: border-box;\n line-height: 1.2;\n transition: background 120ms ease, color 120ms ease;\n}\n\nbutton.uziSidebarNavItem {\n font-family: inherit;\n cursor: pointer;\n}\n\n.uziSidebarNavItem:focus-visible {\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n}\n\n.uziSidebarNavItem:hover {\n background: color-mix(in srgb, var(--primary, #22d3ee) 10%, transparent);\n}\n\n.uziSidebarNavItem.uziSidebarNavItemActive {\n background: color-mix(in srgb, var(--primary, #22d3ee) 18%, transparent);\n color: var(--foreground, #e2e8f0);\n font-weight: 700;\n}\n\n.uziSidebarNavItemCollapsed {\n grid-template-columns: 1fr;\n justify-items: center;\n padding-right: 10px;\n padding-left: 10px;\n}\n\n.uziSidebarNavItemDisabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.uziSidebarNavIcon {\n width: var(--sidebar-nav-icon-size);\n height: var(--sidebar-nav-icon-size);\n min-width: var(--sidebar-nav-icon-size);\n color: var(--muted-foreground, #94a3b8);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n vertical-align: middle;\n}\n\n.uziSidebarNavIcon > * {\n width: 100% !important;\n height: 100% !important;\n max-width: 100%;\n max-height: 100%;\n}\n\n.uziSidebarNavIcon :where(svg) {\n width: 100%;\n height: 100%;\n display: block;\n stroke: currentColor;\n}\n\n.uziSidebarNavItem.uziSidebarNavItemActive .uziSidebarNavIcon {\n color: var(--primary, #22d3ee);\n}\n\n.uziSidebarNavItemBody {\n display: flex;\n min-width: 0;\n flex: 1 1 auto;\n flex-direction: column;\n gap: 3px;\n overflow: hidden;\n}\n\n.uziSidebarNavLabelRow {\n display: flex;\n min-width: 0;\n align-items: center;\n gap: 8px;\n}\n\n.uziSidebarNavLabel {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.uziSidebarNavDescription {\n color: var(--muted-foreground, #94a3b8);\n font-size: 12px;\n line-height: 1.35;\n}\n\n.uziSidebarNavBadge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 4px 8px;\n border-radius: 999px;\n border: 1px solid var(--border, #1f2937);\n background: rgba(255, 255, 255, 0.04);\n color: var(--muted-foreground, #94a3b8);\n font-size: 11px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n}\n\n@media (max-width: 960px) {\n .uziSidebarNav {\n gap: 10px;\n }\n\n .uziSidebarNavSections {\n gap: 12px;\n }\n\n .uziSidebarNavSectionItems {\n gap: 6px;\n }\n\n .uziSidebarNavItem {\n padding: 9px 10px 9px 8px;\n border-radius: 9px;\n font-size: 14px;\n grid-template-columns: var(--sidebar-nav-icon-size-mobile) minmax(0, 1fr);\n column-gap: 8px;\n }\n\n .uziSidebarNavIcon {\n width: var(--sidebar-nav-icon-size-mobile);\n height: var(--sidebar-nav-icon-size-mobile);\n min-width: var(--sidebar-nav-icon-size-mobile);\n }\n\n .uziSidebarNavIcon :where(svg) {\n width: var(--sidebar-nav-icon-size-mobile);\n height: var(--sidebar-nav-icon-size-mobile);\n }\n\n .uziSidebarNavDescription {\n font-size: 11px;\n }\n}\n\n@media (max-width: 480px) {\n .uziSidebarNavItem {\n padding: 8px 9px 8px 7px;\n font-size: 13px;\n }\n}\n","\"use client\";\n\nimport { type AnchorHTMLAttributes, type CSSProperties, type ReactNode } from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport styles from \"./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(styles.uziSidebarNav, collapsed && styles.uziSidebarNavCollapsed, className)}\n aria-label={ariaLabel}\n style={style}\n >\n {header ? <div className={styles.uziSidebarNavHeader}>{header}</div> : null}\n <div className={styles.uziSidebarNavSections}>\n {resolvedSections.map((section, sectionIndex) => (\n <div\n key={section.id ?? `section-${sectionIndex}`}\n className={cx(styles.uziSidebarNavSection, sectionClassName)}\n >\n {section.label && !collapsed ? (\n <div className={styles.uziSidebarNavSectionLabel}>{section.label}</div>\n ) : null}\n <div className={styles.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={styles.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 styles.uziSidebarNavItem,\n active && styles.uziSidebarNavItemActive,\n collapsed && styles.uziSidebarNavItemCollapsed,\n item.disabled && styles.uziSidebarNavItemDisabled,\n itemClassName,\n );\n const content = (\n <>\n {item.icon && <span className={styles.uziSidebarNavIcon}>{item.icon}</span>}\n {!collapsed ? (\n <span className={styles.uziSidebarNavItemBody}>\n <span className={styles.uziSidebarNavLabelRow}>\n <span className={styles.uziSidebarNavLabel}>{item.label}</span>\n {item.badge && <span className={styles.uziSidebarNavBadge}>{item.badge}</span>}\n </span>\n {item.description ? <span className={styles.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","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"],"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"]}
|
package/dist/index.css
CHANGED
|
@@ -278,7 +278,7 @@
|
|
|
278
278
|
.interactive:hover {
|
|
279
279
|
transform: translateY(-1px);
|
|
280
280
|
box-shadow: 0 22px 60px rgba(0, 0, 0, 0.32);
|
|
281
|
-
border-color: var(--ts-card-hover-border,
|
|
281
|
+
border-color: var(--ts-card-hover-border, color-mix(in srgb, var(--primary, #22d3ee) 40%, transparent));
|
|
282
282
|
}
|
|
283
283
|
.interactive:focus-within {
|
|
284
284
|
outline: var(--focus-ring);
|
|
@@ -327,24 +327,24 @@
|
|
|
327
327
|
color: var(--ts-pill-fg, var(--muted, #94a3b8));
|
|
328
328
|
}
|
|
329
329
|
.tone-success {
|
|
330
|
-
color:
|
|
331
|
-
border-color:
|
|
332
|
-
background:
|
|
330
|
+
color: var(--success, hsl(142 71% 45%));
|
|
331
|
+
border-color: color-mix(in srgb, var(--success, hsl(142 71% 45%)) 45%, transparent);
|
|
332
|
+
background: color-mix(in srgb, var(--success, hsl(142 71% 45%)) 12%, transparent);
|
|
333
333
|
}
|
|
334
334
|
.tone-warning {
|
|
335
|
-
color:
|
|
336
|
-
border-color:
|
|
337
|
-
background:
|
|
335
|
+
color: var(--warning, hsl(38 92% 50%));
|
|
336
|
+
border-color: color-mix(in srgb, var(--warning, hsl(38 92% 50%)) 45%, transparent);
|
|
337
|
+
background: color-mix(in srgb, var(--warning, hsl(38 92% 50%)) 12%, transparent);
|
|
338
338
|
}
|
|
339
339
|
.tone-info {
|
|
340
|
-
color: #22d3ee;
|
|
341
|
-
border-color:
|
|
342
|
-
background:
|
|
340
|
+
color: var(--primary, #22d3ee);
|
|
341
|
+
border-color: color-mix(in srgb, var(--primary, #22d3ee) 50%, transparent);
|
|
342
|
+
background: color-mix(in srgb, var(--primary, #22d3ee) 12%, transparent);
|
|
343
343
|
}
|
|
344
344
|
.tone-danger {
|
|
345
|
-
color: #f87171;
|
|
346
|
-
border-color:
|
|
347
|
-
background:
|
|
345
|
+
color: var(--destructive, #f87171);
|
|
346
|
+
border-color: color-mix(in srgb, var(--destructive, #f87171) 45%, transparent);
|
|
347
|
+
background: color-mix(in srgb, var(--destructive, #f87171) 12%, transparent);
|
|
348
348
|
}
|
|
349
349
|
.icon {
|
|
350
350
|
display: inline-flex;
|
|
@@ -758,7 +758,7 @@
|
|
|
758
758
|
transition: background 0.1s, color 0.1s;
|
|
759
759
|
}
|
|
760
760
|
.option:hover {
|
|
761
|
-
background:
|
|
761
|
+
background: var(--accent, color-mix(in srgb, var(--primary, #22d3ee) 8%, transparent));
|
|
762
762
|
color: var(--ts-dropdown-text, var(--text, #e2e8f0));
|
|
763
763
|
}
|
|
764
764
|
.option:focus-visible {
|
|
@@ -766,8 +766,8 @@
|
|
|
766
766
|
outline-offset: var(--focus-ring-offset);
|
|
767
767
|
}
|
|
768
768
|
.option-selected {
|
|
769
|
-
color: var(--
|
|
770
|
-
background:
|
|
769
|
+
color: var(--primary, #22d3ee);
|
|
770
|
+
background: color-mix(in srgb, var(--primary, #22d3ee) 8%, transparent);
|
|
771
771
|
}
|
|
772
772
|
|
|
773
773
|
/* src/components/dropdown-menu/dropdown-menu.module.css */
|