@sckyzo/cosmos-react 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/storybook-avatars.ts","../src/storybook-helpers.ts","../src/layout/Divider.tsx","../src/layout/MediaObject.tsx","../src/layout/Shell.tsx","../src/layout/Topbar.tsx","../src/layout/Sidebar.tsx","../src/templates/PageBreadcrumb.tsx","../src/templates/PageHeader.tsx","../src/templates/SectionCard.tsx","../src/templates/PageCard.tsx","../src/templates/ContentNarrow.tsx","../src/templates/ColBox.tsx","../src/feedback/LoadingState.tsx","../src/feedback/EmptyState.tsx","../src/feedback/ErrorState.tsx","../src/feedback/Skeleton.tsx","../src/status/StatusBadge.tsx","../src/status/types.ts","../src/status/HealthDot.tsx","../src/status/HealthBadge.tsx","../src/lists/StackedList.tsx","../src/lists/ContentStackedList.tsx","../src/lists/StackedListInCard.tsx","../src/lists/NarrowStackedList.tsx","../src/lists/SimpleRow.tsx","../src/lists/ClickableRow.tsx","../src/lists/StatusRow.tsx","../src/lists/ActivityFeed.tsx","../src/lists/GridList.tsx","../src/navigation/Breadcrumb.tsx","../src/navigation/Navbar.tsx","../src/navigation/Pagination.tsx","../src/navigation/Stepper.tsx","../src/navigation/VerticalNavigation.tsx","../src/ui/Button.tsx","../src/ui/Card.tsx","../src/ui/Badge.tsx","../src/ui/Avatar.tsx","../src/ui/Tooltip.tsx","../src/ui/Dropdown.tsx","../src/ui/Modal.tsx","../src/ui/Drawer.tsx","../src/ui/Tabs.tsx","../src/ui/Clipboard.tsx","../src/ui/CodeBlock.tsx","../src/ui/PageActionButton.tsx","../src/ui/RefreshButton.tsx","../src/ui/RowActionButton.tsx","../src/ui/Spinner.tsx","../src/ui/SectionLabel.tsx","../src/ui/IconBox.tsx","../src/ui/AlertBanner.tsx","../src/ui/SelectInput.tsx","../src/ui/Backdrop.tsx","../src/ui/StatefulSaveButton.tsx","../src/ui/UnsavedIndicator.tsx","../src/ui/ConfirmationModal.tsx","../src/ui/NotificationsPanel.tsx","../src/ui/NotificationCard.tsx","../src/ui/UserMenu.tsx","../src/ui/ThemeToggle.tsx","../src/ui/ThemeToggleTri.tsx","../src/ui/ButtonGroup.tsx","../src/ui/Carousel.tsx","../src/ui/Popover.tsx","../src/ui/ProgressBar.tsx","../src/ui/Ribbon.tsx","../src/ui/Link.tsx","../src/ui/List.tsx","../src/ui/Accordion.tsx","../src/ui/ImageGrid.tsx","../src/ui/VideoEmbed.tsx","../src/ui/Toast.tsx","../src/ui/AnnouncementBar.tsx","../src/ui/CookieBanner.tsx","../src/ui/CommandPalette.tsx","../src/ui/BackToTopFab.tsx","../src/ui/HelpOverlay.tsx","../src/forms/Input.tsx","../src/forms/SearchInput.tsx","../src/forms/Select.tsx","../src/forms/Toggle.tsx","../src/forms/FilterPills.tsx","../src/forms/SegmentedControl.tsx","../src/forms/StepperInput.tsx","../src/forms/NumberInput.tsx","../src/forms/ZoomBar.tsx","../src/forms/FormRow.tsx","../src/forms/AvatarUploader.tsx","../src/forms/PasswordInput.tsx","../src/forms/PasswordPolicyChecker.tsx","../src/forms/Textarea.tsx","../src/forms/Checkbox.tsx","../src/forms/Radio.tsx","../src/forms/FileInput.tsx","../src/forms/Dropzone.tsx","../src/forms/FormFooter.tsx","../src/forms/Calendar.tsx","../src/forms/DatePicker.tsx","../src/forms/TimePicker.tsx","../src/forms/OtpInput.tsx","../src/forms/ActionPanel.tsx","../src/forms/Combobox.tsx","../src/data/DescriptionList.tsx","../src/data/KpiCard.tsx","../src/data/Timeline.tsx","../src/data/MiniCalendar.tsx","../src/table/ColumnFilterDropdown.tsx","../src/table/ColumnHeader.tsx","../src/table/ActiveFiltersBar.tsx","../src/table/Pagination.tsx","../src/table/DataTable.tsx","../src/pages/ErrorPage.tsx","../src/pages/StickyScrollNav.tsx","../src/settings/ColorSwatch.tsx","../src/settings/AccentPicker.tsx","../src/settings/PaletteCard.tsx","../src/settings/PalettePicker.tsx","../src/settings/OptionCard.tsx","../src/settings/OptionPicker.tsx","../src/typography/Blockquote.tsx","../src/typography/Kbd.tsx","../src/typography/Figure.tsx"],"names":["Root","jsx","clsx","jsxs","Fragment","Icon","useState","ChevronRight","_","forwardRef","StackedListRoot","StackedListItem","ContentStackedListRoot","ContentStackedListItem","StackedListInCard","Children","cloneElement","NarrowStackedListRoot","NarrowStackedListHeader","NarrowStackedListItem","STATUS_CLASS","isValidElement","Item","SIZE_CLASS","Body","Footer","Card","ICON_SIZE","HelpCircle","ChevronDown","Check","useEffect","Header","Info","AlertTriangle","XCircle","createPortal","X","createContext","useContext","Clipboard","useRef","VARIANT_CLASS","useCallback","CheckCircle","AlertCircle","Loader2","Save","CheckCircle2","NotificationsPanelTrigger","positionStyle","NotificationsPanelHeaderAction","NotificationsPanelItem","useCtx","UserMenuTrigger","UserMenuItem","ThemeToggle","Sun","Moon","ThemeToggleTri","ChevronLeft","PopoverTrigger","INTENT_BG","Link","Dot","List","AccordionItem","AccordionTrigger","AccordionContent","Accordion","SonnerToaster","INTENT_ICON","CommandPaletteInput","CommandPaletteList","CommandPaletteGroup","CommandPaletteItem","CommandPaletteSeparator","CommandPaletteEmpty","CommandPaletteLoading","matchesHotkey","Input","Search","Select","PasswordInput","Textarea","Checkbox","useId","Minus","Radio","FileInput","formatBytes","FileIcon","CalendarIcon","TimePicker","ActionPanel","RootCmp","useMemo","ALIGN_CLASS","ChevronUp","Pagination","SIZE","Kbd","ALIGN"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Deterministic placeholder avatar for stories and docs.\n *\n * Returns a `data:image/svg+xml;…` URL — fully local, no network fetch — that\n * renders the seed's initials over a Cosmos-accent background colour picked\n * deterministically from a stable hash of the seed.\n *\n * Use inside `*.stories.tsx` whenever a face is needed but a real user photo\n * is not desirable: avoids reliance on `i.pravatar.cc` / `images.unsplash.com`,\n * works offline, and produces no licensing concerns. Real apps should plug\n * their own avatar service for production data.\n *\n * @example\n * ```tsx\n * import { placeholderAvatar } from '@sckyzo/cosmos-react';\n *\n * <img src={placeholderAvatar('Aiden Park', 64)} alt=\"\" className=\"size-8 rounded-full\" />\n * ```\n */\n\n// 10 Cosmos accent tones (background, foreground). Solid, slightly muted so\n// the white initials stay highly legible on every variant.\nconst PALETTE: Array<[string, string]> = [\n ['#6366f1', '#ffffff'], // indigo\n ['#8b5cf6', '#ffffff'], // violet\n ['#0ea5e9', '#ffffff'], // sky\n ['#10b981', '#ffffff'], // emerald\n ['#f59e0b', '#1f2937'], // amber (dark text on warm bg)\n ['#f43f5e', '#ffffff'], // rose\n ['#14b8a6', '#ffffff'], // teal\n ['#ec4899', '#ffffff'], // pink\n ['#64748b', '#ffffff'], // slate\n ['#a855f7', '#ffffff'], // purple\n];\n\nconst hashSeed = (seed: string): number => {\n // djb2 — small, fast, well-distributed across short string seeds.\n let h = 5381;\n for (let i = 0; i < seed.length; i += 1) {\n h = ((h << 5) + h + seed.charCodeAt(i)) | 0;\n }\n return Math.abs(h);\n};\n\nconst extractInitials = (seed: string): string => {\n const cleaned = seed.replace(/[^\\p{L}\\p{N}\\s'.-]/gu, ' ').trim();\n if (!cleaned) return '?';\n const parts = cleaned.split(/[\\s.'-]+/).filter(Boolean);\n if (parts.length >= 2) {\n return (parts[0]![0]! + parts[parts.length - 1]![0]!).toUpperCase();\n }\n return cleaned.slice(0, 2).toUpperCase();\n};\n\nconst buildSvg = (initials: string, bg: string, fg: string, size: number): string => {\n // Use viewBox 0 0 100 100 so font sizing is independent of pixel size.\n const fontSize = initials.length === 1 ? 56 : 42;\n return (\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 100 100\">` +\n `<rect width=\"100\" height=\"100\" fill=\"${bg}\"/>` +\n `<text x=\"50\" y=\"50\" font-family=\"ui-sans-serif,system-ui,sans-serif\" ` +\n `font-size=\"${fontSize}\" font-weight=\"600\" fill=\"${fg}\" ` +\n `text-anchor=\"middle\" dominant-baseline=\"central\">${initials}</text>` +\n `</svg>`\n );\n};\n\nexport type PlaceholderAvatarOptions = {\n /** Override the auto-picked accent background (any CSS colour). */\n bg?: string;\n /** Override the foreground (initials) colour. */\n fg?: string;\n};\n\n/**\n * Build a deterministic placeholder avatar data URL.\n *\n * @param seed The string used both to derive the initials and to pick the\n * accent background. Same seed → same avatar.\n * @param size Square pixel size (default `64`).\n * @param opts Optional colour overrides.\n */\nexport const placeholderAvatar = (\n seed: string,\n size = 64,\n opts: PlaceholderAvatarOptions = {}\n): string => {\n const initials = extractInitials(seed);\n const [defaultBg, defaultFg] = PALETTE[hashSeed(seed) % PALETTE.length]!;\n const bg = opts.bg ?? defaultBg;\n const fg = opts.fg ?? defaultFg;\n const svg = buildSvg(initials, bg, fg, size);\n return `data:image/svg+xml;utf8,${encodeURIComponent(svg)}`;\n};\n\n// ── Landscape cover (blog headers, hero images, related-post tiles) ─────────\n\nexport type PlaceholderCoverOptions = {\n /** Override the two gradient stops. */\n from?: string;\n to?: string;\n};\n\nconst buildCoverSvg = (\n seed: string,\n from: string,\n to: string,\n width: number,\n height: number\n): string => {\n const h = hashSeed(seed);\n const angle = h % 180;\n // Three decorative circles placed deterministically from the hash.\n const cx1 = (h % 60) + 20;\n const cy1 = ((h >> 3) % 60) + 20;\n const r1 = ((h >> 5) % 35) + 25;\n const cx2 = ((h >> 7) % 60) + 20;\n const cy2 = ((h >> 9) % 60) + 20;\n const r2 = ((h >> 11) % 25) + 15;\n const gradientId = `g-${(h % 100000).toString(36)}`;\n return (\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" ` +\n `viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\">` +\n `<defs><linearGradient id=\"${gradientId}\" gradientTransform=\"rotate(${angle})\">` +\n `<stop offset=\"0\" stop-color=\"${from}\"/>` +\n `<stop offset=\"1\" stop-color=\"${to}\"/>` +\n `</linearGradient></defs>` +\n `<rect width=\"100\" height=\"100\" fill=\"url(#${gradientId})\"/>` +\n `<circle cx=\"${cx1}\" cy=\"${cy1}\" r=\"${r1}\" fill=\"rgba(255,255,255,0.08)\"/>` +\n `<circle cx=\"${cx2}\" cy=\"${cy2}\" r=\"${r2}\" fill=\"rgba(0,0,0,0.10)\"/>` +\n `</svg>`\n );\n};\n\n/**\n * Build a deterministic placeholder landscape cover data URL.\n *\n * Renders a brand-coherent SVG with a seed-derived gradient and two soft\n * decorative circles. Suitable for blog hero images, article tiles, and any\n * other \"cover\" slot where a real photo is not available.\n *\n * @example\n * ```tsx\n * <img src={placeholderCover('Cosmos release notes', 1600, 700)} alt=\"\" />\n * ```\n */\nexport const placeholderCover = (\n seed: string,\n width = 1600,\n height = 700,\n opts: PlaceholderCoverOptions = {}\n): string => {\n const h = hashSeed(seed);\n const [from] = PALETTE[h % PALETTE.length]!;\n const [to] = PALETTE[(h + 3) % PALETTE.length]!;\n const svg = buildCoverSvg(seed, opts.from ?? from, opts.to ?? to, width, height);\n return `data:image/svg+xml;utf8,${encodeURIComponent(svg)}`;\n};\n","/**\n * Storybook docs parameters preset for components that render via portals\n * (Modal, Drawer, Popover, NotificationsPanel, UserMenu, DatePicker,\n * CommandPalette, …).\n *\n * Background: Storybook's autodocs renders stories *inline* by default. This\n * means a story whose visible content lives in `document.body` (via React\n * portal) or floats with `position: fixed/absolute` doesn't push the autodocs\n * preview block to the right size — the panel either clips or vanishes.\n *\n * The official Storybook v10 fix is to render the story inside an iframe and\n * reserve a fixed iframe height. This helper bundles that pattern so consumers\n * don't repeat the boilerplate at every meta:\n *\n * @example\n * ```ts\n * const meta = {\n * title: 'Overlays/Command Palette',\n * component: CommandPalette,\n * parameters: portalDocsParams.lg(),\n * tags: ['autodocs'],\n * } satisfies Meta<typeof CommandPalette>;\n * ```\n *\n * Variants are sized to common portal footprints. Pass a custom number when\n * the preset doesn't fit:\n *\n * @example\n * ```ts\n * parameters: portalDocsParams(720)\n * ```\n */\n\nconst buildParams = (height: number) => ({\n layout: 'fullscreen' as const,\n docs: {\n story: {\n inline: false,\n iframeHeight: `${height}px`,\n },\n },\n});\n\ntype PortalDocsParams = ((height?: number) => ReturnType<typeof buildParams>) & {\n /** ~320 px — Tooltip, compact Popover. */\n sm: () => ReturnType<typeof buildParams>;\n /** ~480 px — Dropdown, small Modal, Date picker. */\n md: () => ReturnType<typeof buildParams>;\n /** ~640 px — Drawer, CommandPalette, large Modal. */\n lg: () => ReturnType<typeof buildParams>;\n /** ~800 px — Full-screen Modal, page templates. */\n full: () => ReturnType<typeof buildParams>;\n};\n\nconst fn = ((height = 480) => buildParams(height)) as PortalDocsParams;\nfn.sm = () => buildParams(320);\nfn.md = () => buildParams(480);\nfn.lg = () => buildParams(640);\nfn.full = () => buildParams(800);\n\nexport const portalDocsParams = fn;\n","import { clsx } from 'clsx';\nimport type { ElementType, HTMLAttributes, ReactNode } from 'react';\n\n// TUI Plus reference (Pattern 1 — \"With label\"):\n// <div class=\"relative\">\n// <div aria-hidden=\"true\" class=\"absolute inset-0 flex items-center\">\n// <div class=\"w-full border-t border-gray-300\"></div>\n// </div>\n// <div class=\"relative flex justify-center\">\n// <span class=\"bg-white px-2 text-sm text-gray-500\">Continue</span>\n// </div>\n// </div>\n//\n// Pattern 2 — \"With icon\": replaces the centered <span> with a circular\n// icon chip: <div class=\"bg-white px-2\"><PlusIcon class=\"size-5 text-gray-400\" /></div>\n//\n// Pattern 3 — \"With label on left\": flex justify-start instead of center, with\n// left padding so the line still touches the right edge.\n//\n// Pattern 4-5 — \"With title (left)\": same as 1/3 but the inset content is a\n// larger text-base font-semibold instead of text-sm gray-500.\n//\n// Pattern 6 — \"With button\": instead of a line + centered inset, this is a\n// plain horizontal flex row: title left, action button right, both above a\n// border-bottom of the parent container — not a \"line in the middle\" layout.\n//\n// Pattern 7-8 — \"With title and button\" / \"With toolbar\": title left, buttons\n// right, both flanking a horizontal border below.\n\nexport type DividerAlign = 'left' | 'center' | 'right';\n\nexport type DividerProps = HTMLAttributes<HTMLDivElement> & {\n /**\n * Render an inset label/icon centered (or aligned) on top of the line.\n * Mutually exclusive with `bordered` row helpers (use `Divider.Row` for those).\n */\n inset?: ReactNode;\n /** Position of the inset element along the line. Default `center`. */\n align?: DividerAlign;\n /**\n * When `true`, the inset slot uses larger text (`text-base font-semibold\n * text-gray-900`) instead of the default `text-sm text-gray-500`.\n * Maps to TUI \"With title\" / \"With title on left\".\n */\n emphasis?: boolean;\n /**\n * Background color of the inset slot — must match the surrounding surface\n * so the line appears to pass behind. Default `bg-white dark:bg-gray-900`.\n */\n insetBg?: string;\n};\n\n// ── Root: classic \"line with optional inset\" divider ────────────────────────\n\nconst Root = ({\n inset,\n align = 'center',\n emphasis = false,\n insetBg = 'bg-white dark:bg-gray-900',\n className,\n ...rest\n}: DividerProps) => {\n if (!inset) {\n return (\n <div\n role=\"separator\"\n className={clsx('h-px w-full border-t border-gray-200 dark:border-white/10', className)}\n {...rest}\n />\n );\n }\n const justify =\n align === 'left' ? 'justify-start' : align === 'right' ? 'justify-end' : 'justify-center';\n return (\n <div className={clsx('relative', className)} {...rest}>\n <div aria-hidden=\"true\" className=\"absolute inset-0 flex items-center\">\n <div className=\"w-full border-t border-gray-200 dark:border-white/10\" />\n </div>\n <div className={clsx('relative flex', justify)}>\n <span\n className={clsx(\n 'px-2',\n insetBg,\n emphasis\n ? 'text-base font-semibold text-gray-900 dark:text-white'\n : 'text-sm text-gray-500 dark:text-gray-400'\n )}\n >\n {inset}\n </span>\n </div>\n </div>\n );\n};\n\n// ── Icon variant: same shape as Root with inset, but inset is an icon chip ──\n\nexport type DividerIconProps = Omit<DividerProps, 'inset' | 'emphasis'> & {\n icon: ElementType;\n /** Icon CSS class for sizing/color. Default `size-5 text-gray-400`. */\n iconClassName?: string;\n};\n\nconst Icon = ({\n icon: IconCmp,\n iconClassName = 'size-5 text-gray-400 dark:text-gray-500',\n align = 'center',\n insetBg = 'bg-white dark:bg-gray-900',\n className,\n ...rest\n}: DividerIconProps) => {\n const justify =\n align === 'left' ? 'justify-start' : align === 'right' ? 'justify-end' : 'justify-center';\n return (\n <div className={clsx('relative', className)} {...rest}>\n <div aria-hidden=\"true\" className=\"absolute inset-0 flex items-center\">\n <div className=\"w-full border-t border-gray-200 dark:border-white/10\" />\n </div>\n <div className={clsx('relative flex', justify)}>\n <span className={clsx('flex px-2', insetBg)}>\n <IconCmp className={iconClassName} aria-hidden />\n </span>\n </div>\n </div>\n );\n};\n\n// ── Row variant: title + actions row above a horizontal border ──────────────\n\nexport type DividerRowProps = HTMLAttributes<HTMLDivElement> & {\n /** Left-aligned title. Use `null` to render only actions. */\n title?: ReactNode;\n /** Right-aligned trailing content — button, button group, toolbar, etc. */\n actions?: ReactNode;\n /**\n * Use a larger font size for the title (TUI \"With title and button\").\n * Default `true`. Set `false` to use plain text.\n */\n emphasis?: boolean;\n};\n\nconst Row = ({ title, actions, emphasis = true, className, ...rest }: DividerRowProps) => (\n <div\n className={clsx(\n 'flex items-center justify-between gap-x-4 border-b border-gray-200 pb-3 dark:border-white/10',\n className\n )}\n {...rest}\n >\n <div className=\"min-w-0\">\n {title && (\n <h3\n className={clsx(\n emphasis\n ? 'text-base font-semibold text-gray-900 dark:text-white'\n : 'text-sm text-gray-500 dark:text-gray-400'\n )}\n >\n {title}\n </h3>\n )}\n </div>\n {actions && <div className=\"ml-3 flex shrink-0 items-center gap-x-2\">{actions}</div>}\n </div>\n);\n\n// ── Compound export ──────────────────────────────────────────────────────────\n\nexport const Divider = Object.assign(Root, { Icon, Row });\n","import { clsx } from 'clsx';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n// TUI Plus reference (Pattern 1 — \"Basic\"):\n// <div class=\"flex\">\n// <div class=\"mr-4 shrink-0\">\n// <svg class=\"size-16\">…</svg> <!-- media (image/icon) -->\n// </div>\n// <div>\n// <h4 class=\"text-lg font-bold\">Lorem ipsum</h4>\n// <p class=\"mt-1\">Repudiandae sint…</p>\n// </div>\n// </div>\n//\n// Pattern 2 — \"Aligned to center\": adds `items-center` on the flex.\n// Pattern 3 — \"Aligned to bottom\": adds `items-end`.\n// Pattern 4 — \"Stretched to fit\": adds `items-stretch` + on the media,\n// use `self-stretch w-16 h-auto` so the\n// media spans the full body height.\n// Pattern 5 — \"Media on right\": reverses with `flex-row-reverse` and swaps\n// margin to `ml-4`.\n\nexport type MediaObjectAlign = 'start' | 'center' | 'bottom' | 'stretch';\nexport type MediaObjectPosition = 'left' | 'right';\n\nconst ALIGN_CLASS: Record<MediaObjectAlign, string> = {\n start: 'items-start',\n center: 'items-center',\n bottom: 'items-end',\n stretch: 'items-stretch',\n};\n\n// ── Root ─────────────────────────────────────────────────────────────────────\n\nexport type MediaObjectProps = HTMLAttributes<HTMLDivElement> & {\n align?: MediaObjectAlign;\n mediaPosition?: MediaObjectPosition;\n /** Gap between the media and the body. Default `gap-x-4` (16px). */\n gapClassName?: string;\n};\n\nconst Root = forwardRef<HTMLDivElement, MediaObjectProps>(function MediaObjectRoot(\n {\n align = 'start',\n mediaPosition = 'left',\n gapClassName = 'gap-x-4',\n className,\n children,\n ...rest\n },\n ref\n) {\n return (\n <div\n ref={ref}\n data-media-position={mediaPosition}\n className={clsx(\n 'flex',\n mediaPosition === 'right' && 'flex-row-reverse',\n ALIGN_CLASS[align],\n gapClassName,\n className\n )}\n {...rest}\n >\n {children}\n </div>\n );\n});\n\n// ── Media slot ──────────────────────────────────────────────────────────────\n\nexport type MediaObjectImageProps = HTMLAttributes<HTMLDivElement>;\n\nconst ImageSlot = forwardRef<HTMLDivElement, MediaObjectImageProps>(function MediaObjectImage(\n { className, children, ...rest },\n ref\n) {\n return (\n <div ref={ref} className={clsx('shrink-0', className)} {...rest}>\n {children}\n </div>\n );\n});\n\n// ── Body slot ───────────────────────────────────────────────────────────────\n\nexport type MediaObjectBodyProps = HTMLAttributes<HTMLDivElement>;\n\nconst Body = forwardRef<HTMLDivElement, MediaObjectBodyProps>(function MediaObjectBody(\n { className, children, ...rest },\n ref\n) {\n return (\n <div ref={ref} className={clsx('min-w-0 flex-1', className)} {...rest}>\n {children}\n </div>\n );\n});\n\n// ── Title + Description shortcuts (optional helpers) ────────────────────────\n\nconst Title = ({\n className,\n children,\n ...rest\n}: HTMLAttributes<HTMLHeadingElement> & { children?: ReactNode }) => (\n <h4 className={clsx('text-lg font-bold text-gray-900 dark:text-white', className)} {...rest}>\n {children}\n </h4>\n);\n\nconst Description = ({\n className,\n children,\n ...rest\n}: HTMLAttributes<HTMLParagraphElement> & { children?: ReactNode }) => (\n <p className={clsx('mt-1 text-sm text-gray-600 dark:text-gray-400', className)} {...rest}>\n {children}\n </p>\n);\n\n// ── Compound export ──────────────────────────────────────────────────────────\n\nexport const MediaObject = Object.assign(Root, {\n Image: ImageSlot,\n Body,\n Title,\n Description,\n});\n","import { cloneElement, useState, type ReactElement, type ReactNode } from 'react';\nimport { clsx } from 'clsx';\nimport type { TopbarProps } from './Topbar';\nimport type { SidebarProps } from './Sidebar';\n\nexport type ShellProps = {\n /** Top header bar — typically `<Topbar />`. */\n topbar?: ReactElement<TopbarProps>;\n /** Left sidebar — typically `<Sidebar />`. */\n sidebar?: ReactElement<SidebarProps>;\n /** Main content area. */\n children: ReactNode;\n /**\n * Optional right-aligned secondary panel — mirrors the TUI Plus \"Multi-\n * column\" application shell pattern (sidebar + main + secondary). Renders\n * after `children` inside a flex row below the topbar.\n */\n secondary?: ReactNode;\n /** Width class for the secondary panel. Default `w-80` (320px). */\n secondaryWidthClassName?: string;\n /** Initial collapsed state of the sidebar. Default: `false`. */\n defaultSidebarCollapsed?: boolean;\n /**\n * If you control the collapsed state externally (e.g. from a router or a\n * playlist context), pass it here. When set, Shell becomes a controlled\n * component and `defaultSidebarCollapsed` is ignored.\n */\n sidebarCollapsed?: boolean;\n /** Fired whenever the collapsed state toggles. */\n onSidebarToggle?: (collapsed: boolean) => void;\n /** Optional className override on the root element. */\n className?: string;\n};\n\n/**\n * Shell — application root layout.\n *\n * Owns the sidebar collapsed state and threads it down to both the\n * `Topbar` (built-in hamburger button) and the `Sidebar` (width animation\n * + brand). Pass `sidebarCollapsed` to make this controlled, otherwise\n * Shell manages it internally.\n *\n * Composition is automatic: clone the topbar/sidebar elements you pass in\n * and inject `sidebarCollapsed` + `onToggleSidebar` / `collapsed` props.\n * You only need to write\n *\n * <Shell topbar={<Topbar pageTitle=\"…\" />} sidebar={<Sidebar>…</Sidebar>}>\n * …\n * </Shell>\n */\nexport const Shell = ({\n topbar,\n sidebar,\n children,\n secondary,\n secondaryWidthClassName = 'w-80',\n defaultSidebarCollapsed = false,\n sidebarCollapsed: controlledCollapsed,\n onSidebarToggle,\n className,\n}: ShellProps) => {\n const [internalCollapsed, setInternalCollapsed] = useState(defaultSidebarCollapsed);\n const collapsed = controlledCollapsed ?? internalCollapsed;\n\n const handleToggle = () => {\n const next = !collapsed;\n if (controlledCollapsed === undefined) setInternalCollapsed(next);\n onSidebarToggle?.(next);\n };\n\n // Inject collapsed state into the children — keep the consumer-supplied\n // props as overrides so a story can opt out (e.g. `sidebarCollapsed={null}`\n // on the Topbar to hide the hamburger).\n const enhancedTopbar =\n topbar && sidebar\n ? cloneElement(topbar, {\n sidebarCollapsed: topbar.props.sidebarCollapsed ?? collapsed,\n onToggleSidebar: topbar.props.onToggleSidebar ?? handleToggle,\n })\n : topbar;\n\n const enhancedSidebar = sidebar\n ? cloneElement(sidebar, {\n collapsed: sidebar.props.collapsed ?? collapsed,\n })\n : sidebar;\n\n return (\n <div\n className={clsx(\n 'flex h-screen w-screen overflow-hidden bg-[var(--color-bg-base)] text-[var(--color-text-base)]',\n className\n )}\n >\n {enhancedSidebar && <aside className=\"shrink-0\">{enhancedSidebar}</aside>}\n <div className=\"flex min-w-0 flex-1 flex-col\">\n {enhancedTopbar && <div className=\"shrink-0\">{enhancedTopbar}</div>}\n <div className=\"flex min-h-0 flex-1\">\n <main className=\"min-w-0 flex-1 overflow-auto\">{children}</main>\n {secondary && (\n <aside\n className={clsx(\n 'shrink-0 overflow-auto border-l border-[var(--color-border)]',\n secondaryWidthClassName\n )}\n >\n {secondary}\n </aside>\n )}\n </div>\n </div>\n </div>\n );\n};\n","import { type ReactNode } from 'react';\nimport { clsx } from 'clsx';\n\nexport type TopbarProps = {\n /** Current page title (≠ site name — that lives in `Sidebar.Brand`). */\n pageTitle?: ReactNode;\n /**\n * Whether the sidebar is currently collapsed. Pass alongside `onToggleSidebar`\n * to render a built-in hamburger button. Pass `null` to hide the button\n * entirely (e.g. for pages without a sidebar).\n */\n sidebarCollapsed?: boolean | null;\n /** Callback fired when the built-in hamburger is clicked. */\n onToggleSidebar?: () => void;\n /** Extra slot rendered between the hamburger and the page title. */\n leftActions?: ReactNode;\n /** Center area — typically search, breadcrumb, or empty. */\n center?: ReactNode;\n /** Right-aligned actions — theme switcher, notifications, avatar… */\n rightActions?: ReactNode;\n /** Optional className override. */\n className?: string;\n};\n\n/**\n * Topbar — application header bar.\n *\n * Layout: [hamburger] [leftActions] [pageTitle] [center] [rightActions]\n *\n * The site brand belongs in `<Sidebar.Brand />` — the topbar carries only\n * the sidebar collapse button, the current page title, and contextual\n * actions. Matches the rackscope/TailAdmin pattern.\n *\n * Height: 72px. Background: `var(--color-bg-panel)` with a 500ms\n * background-color transition (eases the dark/light toggle).\n */\nexport const Topbar = ({\n pageTitle,\n sidebarCollapsed = null,\n onToggleSidebar,\n leftActions,\n center,\n rightActions,\n className,\n}: TopbarProps) => (\n <header\n className={clsx(\n 'flex h-[72px] items-center gap-3 border-b border-[var(--color-border)] bg-[var(--color-bg-panel)] px-4 text-[var(--color-text-primary)]',\n '[transition:background-color_500ms_ease,border-color_500ms_ease]',\n className\n )}\n >\n {/* Built-in sidebar collapse/expand button — hidden if sidebarCollapsed is null. */}\n {sidebarCollapsed !== null && onToggleSidebar && (\n <button\n type=\"button\"\n onClick={onToggleSidebar}\n title={sidebarCollapsed ? 'Expand sidebar' : 'Collapse sidebar'}\n aria-label={sidebarCollapsed ? 'Expand sidebar' : 'Collapse sidebar'}\n className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg border border-[var(--color-border)] text-[var(--color-text-secondary)] transition-colors hover:bg-black/5 dark:hover:bg-white/5\"\n >\n {/* TailAdmin asymmetric hamburger — distinctive 3-line glyph */}\n <svg\n className=\"fill-current\"\n width=\"16\"\n height=\"12\"\n viewBox=\"0 0 16 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M0.583252 1C0.583252 0.585788 0.919038 0.25 1.33325 0.25H14.6666C15.0808 0.25 15.4166 0.585786 15.4166 1C15.4166 1.41421 15.0808 1.75 14.6666 1.75L1.33325 1.75C0.919038 1.75 0.583252 1.41422 0.583252 1ZM0.583252 11C0.583252 10.5858 0.919038 10.25 1.33325 10.25L14.6666 10.25C15.0808 10.25 15.4166 10.5858 15.4166 11C15.4166 11.4142 15.0808 11.75 14.6666 11.75L1.33325 11.75C0.919038 11.75 0.583252 11.4142 0.583252 11ZM1.33325 5.25C0.919038 5.25 0.583252 5.58579 0.583252 6C0.583252 6.41421 0.919038 6.75 1.33325 6.75L7.99992 6.75C8.41413 6.75 8.74992 6.41421 8.74992 6C8.74992 5.58579 8.41413 5.25 7.99992 5.25L1.33325 5.25Z\"\n />\n </svg>\n </button>\n )}\n\n {leftActions}\n\n {pageTitle && (\n <h1 className=\"truncate text-lg font-semibold text-[var(--color-text-primary)]\">\n {pageTitle}\n </h1>\n )}\n\n {/* Center: stretches */}\n {center ? <div className=\"min-w-0 flex-1\">{center}</div> : <div className=\"flex-1\" />}\n\n {/* Right: actions */}\n {rightActions && <div className=\"flex shrink-0 items-center gap-2\">{rightActions}</div>}\n </header>\n);\n","import { createContext, useContext, useState, type ComponentType, type ReactNode } from 'react';\nimport { ChevronDown, ChevronRight } from 'lucide-react';\nimport { clsx } from 'clsx';\n\n// ─── Internal context ─────────────────────────────────────────────────────────\n// Threads the `collapsed` state from <Sidebar> down to all subcomponents\n// (Brand / Item / Group / Section / SubMenu) without forcing the consumer to\n// pass it manually to each child.\n//\n// Subcomponents always allow an explicit `collapsed` prop that wins over the\n// context — useful for one-off overrides or stories that mount a child in\n// isolation.\n\nconst SidebarContext = createContext<{ collapsed: boolean }>({ collapsed: false });\n\nconst useSidebarCollapsed = (override?: boolean): boolean => {\n const ctx = useContext(SidebarContext);\n return override ?? ctx.collapsed;\n};\n\n// ─── Sidebar root ──────────────────────────────────────────────────────────────\n\nexport type SidebarProps = {\n /** Whether the sidebar is in collapsed (icons-only) state. */\n collapsed?: boolean;\n /** Width when expanded (px). Default: 264 */\n width?: number;\n /** Width when collapsed (px). Default: 72 */\n collapsedWidth?: number;\n /** Sidebar content — typically Sidebar.Brand / .Item / .SubMenu / .Group / .Section. */\n children: ReactNode;\n /** Footer content (sticks to bottom — e.g. user profile + collapse btn). */\n footer?: ReactNode;\n /** Optional className override. */\n className?: string;\n};\n\n/**\n * Sidebar — left-side navigation panel.\n *\n * Compound component: brand + items + groups + sub-menus + footer slot.\n * Smooth width transition when `collapsed` toggles. The `collapsed` state\n * is automatically threaded to every subcomponent via React context, so\n * children don't need to receive it as a prop.\n */\nconst SidebarRoot = ({\n collapsed = false,\n width = 264,\n collapsedWidth = 72,\n children,\n footer,\n className,\n}: SidebarProps) => (\n <SidebarContext.Provider value={{ collapsed }}>\n <nav\n aria-label=\"Main navigation\"\n style={{ width: collapsed ? collapsedWidth : width }}\n className={clsx(\n 'flex h-full flex-col overflow-hidden border-r border-[var(--color-border)] bg-[var(--color-bg-panel)]',\n 'transition-[width] duration-300 ease-in-out',\n className\n )}\n >\n <div className=\"flex-1 overflow-x-hidden overflow-y-auto\">{children}</div>\n {footer && (\n <div className=\"shrink-0 overflow-hidden border-t border-[var(--color-border)] p-3\">\n {footer}\n </div>\n )}\n </nav>\n </SidebarContext.Provider>\n);\n\n// ─── Sidebar.Brand ────────────────────────────────────────────────────────────\n// Header row at the top of the sidebar — logo + product name + optional subtitle.\n// Animates with the collapse state: in collapsed mode only the logo is visible.\n\nexport type SidebarBrandProps = {\n /** Logo node — typically a small icon, lucide component, or img. */\n logo?: ReactNode;\n /** Product / app name. */\n title: string;\n /** Optional smaller subtitle below the title. */\n subtitle?: string;\n /** href to navigate when the brand is clicked. */\n href?: string;\n /** click handler (alternative to href). */\n onClick?: () => void;\n /** Override the inherited collapsed state (defaults to `useContext`). */\n collapsed?: boolean;\n};\n\nconst SidebarBrand = ({\n logo,\n title,\n subtitle,\n href,\n onClick,\n collapsed: collapsedProp,\n}: SidebarBrandProps) => {\n const collapsed = useSidebarCollapsed(collapsedProp);\n const inner = (\n <>\n {logo && (\n <div className=\"bg-brand-500/10 text-brand-500 flex h-9 w-9 shrink-0 items-center justify-center rounded-lg\">\n {logo}\n </div>\n )}\n <div\n className={clsx(\n 'min-w-0 overflow-hidden text-left transition-[max-width,opacity] duration-300',\n collapsed ? 'max-w-0 opacity-0' : 'max-w-[200px] opacity-100'\n )}\n >\n <p className=\"truncate text-base font-bold tracking-tight text-[var(--color-text-primary)]\">\n {title}\n </p>\n {subtitle && <p className=\"truncate text-xs text-[var(--color-text-muted)]\">{subtitle}</p>}\n </div>\n </>\n );\n\n const baseClass =\n 'flex h-[72px] shrink-0 items-center gap-3 px-4 border-b border-[var(--color-border)]';\n\n if (href) {\n return (\n <a href={href} className={baseClass}>\n {inner}\n </a>\n );\n }\n if (onClick) {\n return (\n <button type=\"button\" onClick={onClick} className={clsx(baseClass, 'w-full text-left')}>\n {inner}\n </button>\n );\n }\n return <div className={baseClass}>{inner}</div>;\n};\n\n// ─── Sidebar.Item ─────────────────────────────────────────────────────────────\n\nexport type SidebarItemProps = {\n /** Icon component (lucide-react or any React component accepting className). */\n icon: ComponentType<{ className?: string }>;\n /** Item label. */\n label: string;\n /** Whether the item is active (highlighted). */\n active?: boolean;\n /** Link target — renders an <a> if set, otherwise a <button>. */\n href?: string;\n /** Click handler (if not using href). */\n onClick?: () => void;\n /** Optional badge (count, \"new\"…) shown right of label. Hidden when collapsed. */\n badge?: ReactNode;\n /** Override the inherited collapsed state. */\n collapsed?: boolean;\n /** Indentation depth (for nested items inside groups). Default: 0. */\n depth?: number;\n};\n\nconst SidebarItem = ({\n icon: Icon,\n label,\n active = false,\n href,\n onClick,\n badge,\n collapsed: collapsedProp,\n depth = 0,\n}: SidebarItemProps) => {\n const collapsed = useSidebarCollapsed(collapsedProp);\n const baseClass = clsx(\n 'group mx-2 flex items-center gap-3 rounded-lg py-2 text-sm font-medium transition-colors',\n collapsed ? 'justify-center px-2' : 'px-3',\n active\n ? 'bg-brand-500/10 text-brand-500'\n : 'text-[var(--color-text-secondary)] hover:bg-black/5 hover:text-[var(--color-text-primary)] dark:hover:bg-white/5'\n );\n const style = !collapsed && depth > 0 ? { paddingLeft: 12 + depth * 20 } : undefined;\n\n const content = (\n <>\n <Icon className={clsx('h-5 w-5 shrink-0', active && 'text-brand-500')} />\n {!collapsed && (\n <>\n <span className=\"flex-1 truncate\">{label}</span>\n {badge && <span className=\"shrink-0\">{badge}</span>}\n </>\n )}\n </>\n );\n\n if (href) {\n return (\n <a\n href={href}\n title={collapsed ? label : undefined}\n className={baseClass}\n style={style}\n aria-current={active ? 'page' : undefined}\n >\n {content}\n </a>\n );\n }\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={collapsed ? label : undefined}\n className={clsx(baseClass, 'w-[calc(100%-1rem)] text-left')}\n style={style}\n aria-current={active ? 'page' : undefined}\n >\n {content}\n </button>\n );\n};\n\n// ─── Sidebar.SubMenu ──────────────────────────────────────────────────────────\n// Expandable menu — clicking the trigger toggles a list of nested items.\n// In collapsed mode, the trigger renders icon-only and the children are\n// hidden completely (chevron + nested items don't appear).\n\nexport type SidebarSubMenuProps = {\n icon: ComponentType<{ className?: string }>;\n label: string;\n /** Initial open state. */\n defaultOpen?: boolean;\n /** Override the inherited collapsed state. */\n collapsed?: boolean;\n /** Whether any child item is active. */\n active?: boolean;\n /** Optional badge shown right of label (hidden when collapsed). */\n badge?: ReactNode;\n /** Nested items — typically `Sidebar.Item` with `depth={1}`. */\n children: ReactNode;\n};\n\nconst SidebarSubMenu = ({\n icon: Icon,\n label,\n defaultOpen = false,\n collapsed: collapsedProp,\n active = false,\n badge,\n children,\n}: SidebarSubMenuProps) => {\n const collapsed = useSidebarCollapsed(collapsedProp);\n const [open, setOpen] = useState(defaultOpen || active);\n\n // Collapsed mode: render as a centered icon-only button, no children.\n if (collapsed) {\n return (\n <button\n type=\"button\"\n title={label}\n className={clsx(\n 'group mx-2 flex w-[calc(100%-1rem)] items-center justify-center rounded-lg px-2 py-2 text-sm font-medium transition-colors',\n active\n ? 'bg-brand-500/10 text-brand-500'\n : 'text-[var(--color-text-secondary)] hover:bg-black/5 hover:text-[var(--color-text-primary)] dark:hover:bg-white/5'\n )}\n >\n <Icon className={clsx('h-5 w-5 shrink-0', active && 'text-brand-500')} />\n </button>\n );\n }\n\n return (\n <div>\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n aria-expanded={open}\n className={clsx(\n 'group mx-2 flex w-[calc(100%-1rem)] items-center gap-3 rounded-lg px-3 py-2 text-left text-sm font-medium transition-colors',\n active\n ? 'bg-brand-500/10 text-brand-500'\n : 'text-[var(--color-text-secondary)] hover:bg-black/5 hover:text-[var(--color-text-primary)] dark:hover:bg-white/5'\n )}\n >\n <Icon className={clsx('h-5 w-5 shrink-0', active && 'text-brand-500')} />\n <span className=\"flex-1 truncate\">{label}</span>\n {badge && <span className=\"shrink-0\">{badge}</span>}\n <ChevronDown\n className={clsx(\n 'h-4 w-4 shrink-0 text-[var(--color-text-muted)] transition-transform',\n open && 'rotate-180'\n )}\n />\n </button>\n {open && <div className=\"mt-0.5 space-y-0.5\">{children}</div>}\n </div>\n );\n};\n\n// ─── Sidebar.Group ────────────────────────────────────────────────────────────\n// Collapsible labelled group — header with chevron + items list. In collapsed\n// mode, the header is hidden and children render flat.\n\nexport type SidebarGroupProps = {\n label: string;\n defaultOpen?: boolean;\n collapsed?: boolean;\n children: ReactNode;\n};\n\nconst SidebarGroup = ({\n label,\n defaultOpen = true,\n collapsed: collapsedProp,\n children,\n}: SidebarGroupProps) => {\n const collapsed = useSidebarCollapsed(collapsedProp);\n const [open, setOpen] = useState(defaultOpen);\n\n if (collapsed) {\n return <div className=\"my-1\">{children}</div>;\n }\n\n return (\n <div className=\"my-1\">\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n className=\"mx-2 flex w-[calc(100%-1rem)] items-center gap-2 px-3 py-1.5 text-[10px] font-bold tracking-wider text-[var(--color-text-muted)] uppercase hover:text-[var(--color-text-secondary)]\"\n >\n {open ? <ChevronDown className=\"h-3 w-3\" /> : <ChevronRight className=\"h-3 w-3\" />}\n {label}\n </button>\n {open && <div className=\"space-y-0.5\">{children}</div>}\n </div>\n );\n};\n\n// ─── Sidebar.Section ──────────────────────────────────────────────────────────\n// Visual separator + optional non-collapsible label. Label hides automatically\n// when the sidebar is collapsed.\n\nexport type SidebarSectionProps = {\n label?: string;\n collapsed?: boolean;\n children: ReactNode;\n};\n\nconst SidebarSection = ({ label, collapsed: collapsedProp, children }: SidebarSectionProps) => {\n const collapsed = useSidebarCollapsed(collapsedProp);\n return (\n <div className=\"my-2 border-t border-[var(--color-border)] pt-2\">\n {label && !collapsed && (\n <p className=\"px-5 py-1.5 text-[10px] font-bold tracking-wider text-[var(--color-text-muted)] uppercase\">\n {label}\n </p>\n )}\n <div className=\"space-y-0.5\">{children}</div>\n </div>\n );\n};\n\n// ─── Compound exports ─────────────────────────────────────────────────────────\n\ntype SidebarComponent = typeof SidebarRoot & {\n Brand: typeof SidebarBrand;\n Item: typeof SidebarItem;\n Group: typeof SidebarGroup;\n Section: typeof SidebarSection;\n SubMenu: typeof SidebarSubMenu;\n};\n\nexport const Sidebar = SidebarRoot as SidebarComponent;\nSidebar.Brand = SidebarBrand;\nSidebar.Item = SidebarItem;\nSidebar.Group = SidebarGroup;\nSidebar.Section = SidebarSection;\nSidebar.SubMenu = SidebarSubMenu;\n","import { type ReactNode } from 'react';\nimport { ChevronRight, Home } from 'lucide-react';\nimport { clsx } from 'clsx';\n\nexport type PageBreadcrumbItem = {\n label: string;\n href?: string;\n onClick?: () => void;\n};\n\nexport type PageBreadcrumbProps = {\n /** Ordered list of breadcrumb items. First gets a Home icon, last is current page (no link). */\n items: PageBreadcrumbItem[];\n className?: string;\n};\n\n/**\n * PageBreadcrumb — slim breadcrumb shown below a page title.\n *\n * The first item is decorated with a Home icon. The last item is the current\n * page (rendered as plain text, not a link). Items in between are clickable\n * (either via `href` or `onClick`).\n */\nexport const PageBreadcrumb = ({ items, className }: PageBreadcrumbProps) => (\n <nav aria-label=\"Breadcrumb\" className={className}>\n <ol className=\"flex flex-wrap items-center gap-1 text-sm\">\n {items.map((item, i) => {\n const isFirst = i === 0;\n const isLast = i === items.length - 1;\n const linkClass =\n 'hover:text-brand-500 dark:hover:text-brand-400 flex items-center gap-1 text-[var(--color-text-secondary)] transition-colors';\n const renderInner: ReactNode = (\n <>\n {isFirst && <Home className=\"h-4 w-4\" />}\n {item.label}\n </>\n );\n return (\n <li key={item.label} className=\"flex items-center gap-1\">\n {i > 0 && (\n <ChevronRight className=\"h-4 w-4 text-[var(--color-text-muted)]\" aria-hidden />\n )}\n {isLast ? (\n <span className=\"font-medium text-[var(--color-text-primary)]\">{item.label}</span>\n ) : item.onClick ? (\n <button type=\"button\" onClick={item.onClick} className={linkClass}>\n {renderInner}\n </button>\n ) : (\n <a href={item.href ?? '#'} className={clsx(linkClass)}>\n {renderInner}\n </a>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n);\n","import { type ReactNode } from 'react';\n\nexport type PageHeaderProps = {\n /** Main page title (h2) */\n title: string;\n /** Optional description shown below title (only when no breadcrumb) */\n description?: string;\n /** Breadcrumb shown below title (replaces description if provided) */\n breadcrumb?: ReactNode;\n /**\n * Optional meta row shown below the title — typically a `flex gap-x-6` of\n * `<PageHeader.MetaItem icon=...>` children, mirroring the TUI \"With meta\n * and actions\" pattern. Renders alongside (below) `breadcrumb` and\n * `description`.\n */\n meta?: ReactNode;\n /** Right-aligned actions (buttons, icon buttons, etc.) */\n actions?: ReactNode;\n className?: string;\n};\n\n/**\n * PageHeader — standard page header with title, breadcrumb or description,\n * optional meta line, and actions.\n *\n * Use at the top of every page. If both `breadcrumb` and `description` are passed,\n * the breadcrumb wins (description is hidden — they're alternatives).\n */\nconst Root = ({ title, description, breadcrumb, meta, actions, className }: PageHeaderProps) => (\n <div className={`flex items-start justify-between gap-4 ${className ?? ''}`}>\n <div className=\"min-w-0\">\n <h2 className=\"text-xl font-bold text-[var(--color-text-primary)]\">{title}</h2>\n {breadcrumb && <div className=\"mt-1.5\">{breadcrumb}</div>}\n {!breadcrumb && description && (\n <p className=\"mt-1 text-sm text-[var(--color-text-secondary)]\">{description}</p>\n )}\n {meta && (\n <div className=\"mt-2 flex flex-wrap items-center gap-x-6 gap-y-1 text-sm text-[var(--color-text-secondary)]\">\n {meta}\n </div>\n )}\n </div>\n {actions && <div className=\"flex shrink-0 items-center gap-2\">{actions}</div>}\n </div>\n);\n\nexport type PageHeaderMetaItemProps = {\n /** Lucide icon (or any component accepting `className`). */\n icon?: React.ComponentType<{ className?: string; 'aria-hidden'?: boolean }>;\n children: ReactNode;\n};\n\n/**\n * MetaItem — single icon+text item for the PageHeader `meta` slot.\n * Mirrors TUI: `<div class=\"flex items-center text-sm\"><Icon class=\"mr-1.5 size-5\" />Text</div>`.\n */\nconst MetaItem = ({ icon: Icon, children }: PageHeaderMetaItemProps) => (\n <div className=\"flex items-center\">\n {Icon && <Icon className=\"mr-1.5 size-5 text-[var(--color-text-muted)]\" aria-hidden />}\n {children}\n </div>\n);\n\nexport const PageHeader = Object.assign(Root, { MetaItem });\n","import { type ComponentType, type ReactNode } from 'react';\nimport { clsx } from 'clsx';\n\nexport type SectionCardIconTone = 'brand' | 'blue' | 'violet' | 'green' | 'amber' | 'red' | 'gray';\n\nconst TONE_CLASSES: Record<SectionCardIconTone, { color: string; bg: string }> = {\n brand: {\n color: 'text-brand-600 dark:text-brand-400',\n bg: 'bg-brand-500/10 dark:bg-brand-500/15',\n },\n blue: {\n color: 'text-blue-600 dark:text-blue-400',\n bg: 'bg-blue-500/10 dark:bg-blue-500/15',\n },\n violet: {\n color: 'text-violet-600 dark:text-violet-400',\n bg: 'bg-violet-500/10 dark:bg-violet-500/15',\n },\n green: {\n color: 'text-green-600 dark:text-green-400',\n bg: 'bg-green-500/10 dark:bg-green-500/15',\n },\n amber: {\n color: 'text-amber-600 dark:text-amber-400',\n bg: 'bg-amber-500/10 dark:bg-amber-500/15',\n },\n red: {\n color: 'text-red-600 dark:text-red-400',\n bg: 'bg-red-500/10 dark:bg-red-500/15',\n },\n gray: {\n color: 'text-gray-600 dark:text-gray-400',\n bg: 'bg-gray-500/10 dark:bg-gray-500/15',\n },\n};\n\nexport type SectionCardProps = {\n /** Section title (h3) */\n title: string;\n /** Optional description shown below title */\n desc?: string;\n /** Optional icon component (lucide-react or any React component accepting className) */\n icon?: ComponentType<{ className?: string }>;\n /** Preset color theme for the icon (sets text + bg in one shot). */\n iconTone?: SectionCardIconTone;\n /** Tailwind text-* class for the icon. Overridden by `iconTone` when both are set. */\n iconColor?: string;\n /** Tailwind bg-* class for the icon container. Overridden by `iconTone` when both are set. */\n iconBg?: string;\n /** Card content */\n children?: ReactNode;\n className?: string;\n};\n\n/**\n * SectionCard — white card with title, optional icon and description, and children.\n *\n * The de-facto building block for grouped content in a page. Use multiple\n * SectionCards stacked vertically (with `space-y-6`) or in a grid.\n */\nexport const SectionCard = ({\n title,\n desc,\n icon: Icon,\n iconTone,\n iconColor,\n iconBg,\n children,\n className,\n}: SectionCardProps) => {\n const tonePreset = iconTone ? TONE_CLASSES[iconTone] : null;\n const finalIconColor = tonePreset?.color ?? iconColor ?? 'text-[var(--color-text-muted)]';\n const finalIconBg = tonePreset?.bg ?? iconBg ?? 'bg-black/5 dark:bg-white/5';\n return (\n <div\n className={clsx(\n 'rounded-2xl border border-[var(--color-border)] bg-[var(--color-bg-panel)] p-6',\n className\n )}\n >\n <div className=\"mb-5 flex items-center gap-3\">\n {Icon && (\n <div\n className={clsx(\n 'flex h-9 w-9 shrink-0 items-center justify-center rounded-lg',\n finalIconBg\n )}\n >\n <Icon className={clsx('h-5 w-5', finalIconColor)} />\n </div>\n )}\n <div>\n <h3 className=\"text-sm font-semibold text-[var(--color-text-primary)]\">{title}</h3>\n {desc && <p className=\"mt-0.5 text-xs text-[var(--color-text-secondary)]\">{desc}</p>}\n </div>\n </div>\n {children}\n </div>\n );\n};\n","import { type ReactNode } from 'react';\nimport { clsx } from 'clsx';\n\nexport type PageCardProps = {\n children: ReactNode;\n className?: string;\n};\n\n/**\n * PageCard — full-page outer card.\n *\n * Replaces multiple SectionCards stacked: a single rounded-2xl bordered card\n * that wraps ALL page content. Use for settings, profiles, forms — anything\n * that's hard to read full-width.\n *\n * Combine with `<ContentNarrow>` inside for a centered constrained column.\n */\nexport const PageCard = ({ children, className }: PageCardProps) => (\n <div\n className={clsx(\n 'min-h-[60vh] rounded-2xl border border-[var(--color-border)] bg-[var(--color-bg-panel)] px-5 py-8 xl:px-10 xl:py-12',\n className\n )}\n >\n {children}\n </div>\n);\n","import { type ReactNode } from 'react';\n\nexport type ContentNarrowProps = {\n children: ReactNode;\n /** Max width in px. Default: 680 */\n maxWidth?: number;\n className?: string;\n};\n\n/**\n * ContentNarrow — centered constrained-width wrapper.\n *\n * Use inside PageCard or anywhere you want a readable column of content\n * (settings forms, prose, profile pages…). Default width is 680px.\n */\nexport const ContentNarrow = ({ children, maxWidth = 680, className }: ContentNarrowProps) => (\n <div className={`mx-auto w-full ${className ?? ''}`} style={{ maxWidth }}>\n {children}\n </div>\n);\n","export type ColBoxProps = {\n /** Label shown centered (typically a percentage like \"50%\") */\n label: string;\n /** Min height in px. Default: 80 */\n height?: number;\n className?: string;\n};\n\n/**\n * ColBox — styled placeholder box for layout demos.\n *\n * Useful when prototyping page layouts to visualize column proportions\n * (e.g. \"20% / 60% / 20%\"). Same visual treatment as SectionCard but\n * with a centered monospace label.\n */\nexport const ColBox = ({ label, height = 80, className }: ColBoxProps) => (\n <div\n className={`flex items-center justify-center rounded-xl border border-[var(--color-border)] bg-[var(--color-bg-panel)] p-4 ${\n className ?? ''\n }`}\n style={{ minHeight: height }}\n >\n <span className=\"font-mono text-sm font-semibold text-[var(--color-text-muted)]\">{label}</span>\n </div>\n);\n","export type LoadingStateProps = {\n /** Message shown below the spinner. Default: 'Loading…' */\n message?: string;\n className?: string;\n};\n\n/**\n * LoadingState — spinning loader with a message.\n *\n * Use inside a SectionCard or any container while data is being fetched.\n * Fills available height with vertical centering.\n */\nexport const LoadingState = ({ message = 'Loading…', className }: LoadingStateProps) => (\n <div className={`flex flex-col items-center justify-center gap-3 py-12 ${className ?? ''}`}>\n <div className=\"border-t-brand-500 h-8 w-8 animate-spin rounded-full border-2 border-[var(--color-border)]\" />\n <p className=\"text-sm text-[var(--color-text-muted)]\">{message}</p>\n </div>\n);\n","import { type ReactNode } from 'react';\nimport { Inbox } from 'lucide-react';\n\nexport type EmptyStateProps = {\n /** Title (typically \"No data\" or domain-specific) */\n title?: string;\n /** Optional description below title */\n description?: string;\n /** Optional call-to-action (button, link) */\n action?: ReactNode;\n className?: string;\n};\n\n/**\n * EmptyState — friendly empty-list placeholder.\n *\n * Use when an API call returns no results. Always show a description\n * if there's an action the user can take to populate the list.\n */\nexport const EmptyState = ({\n title = 'No data',\n description,\n action,\n className,\n}: EmptyStateProps) => (\n <div className={`flex flex-col items-center justify-center gap-3 py-12 ${className ?? ''}`}>\n <Inbox className=\"h-10 w-10 text-[var(--color-border)]\" />\n <div className=\"text-center\">\n <p className=\"text-sm font-medium text-[var(--color-text-secondary)]\">{title}</p>\n {description && <p className=\"mt-1 text-xs text-[var(--color-text-muted)]\">{description}</p>}\n </div>\n {action}\n </div>\n);\n","import { AlertCircle } from 'lucide-react';\n\nexport type ErrorStateProps = {\n /** Error message. Default: 'Something went wrong.' */\n message?: string;\n /** Optional retry callback. If set, a \"Try again\" link appears. */\n onRetry?: () => void;\n className?: string;\n};\n\n/**\n * ErrorState — error placeholder with optional retry action.\n *\n * Use when an API call fails or rendering fails inside a section.\n * Pair with `<EmptyState>` when the error is \"no data found\" rather\n * than a real failure.\n */\nexport const ErrorState = ({\n message = 'Something went wrong.',\n onRetry,\n className,\n}: ErrorStateProps) => (\n <div className={`flex flex-col items-center justify-center gap-3 py-12 ${className ?? ''}`}>\n <AlertCircle className=\"h-8 w-8 text-red-400\" />\n <p className=\"text-sm text-[var(--color-text-secondary)]\">{message}</p>\n {onRetry && (\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"text-brand-500 hover:text-brand-600 text-xs font-medium hover:underline\"\n >\n Try again\n </button>\n )}\n </div>\n);\n","import { clsx } from 'clsx';\n\nexport type SkProps = {\n /** Tailwind height class — default `h-4`. */\n h?: string;\n /** Tailwind width class — default `w-full`. */\n w?: string;\n /** Tailwind border-radius class — default `rounded`. */\n round?: string;\n className?: string;\n};\n\n/**\n * Sk — primitive skeleton block (animated pulsing rectangle). Compose with\n * the Skeleton presets (SkeletonText / SkeletonTable / SkeletonList) or\n * use directly for custom placeholders.\n */\nexport const Sk = ({ h = 'h-4', w = 'w-full', round = 'rounded', className }: SkProps) => (\n <div className={clsx('animate-pulse bg-gray-200 dark:bg-gray-700', h, w, round, className)} />\n);\n\nexport type SkeletonTextProps = {\n lines?: number;\n className?: string;\n};\n\nconst TEXT_WIDTHS = ['w-full', 'w-5/6', 'w-4/6', 'w-2/3'] as const;\n\nexport const SkeletonText = ({ lines = 4, className }: SkeletonTextProps) => (\n <div className={clsx('space-y-3', className)}>\n <Sk h=\"h-5\" w=\"w-3/4\" />\n {Array.from({ length: Math.max(0, lines - 1) }).map((_, i) => (\n <Sk key={i} h=\"h-4\" w={TEXT_WIDTHS[i % TEXT_WIDTHS.length]} />\n ))}\n </div>\n);\n\nexport type SkeletonTableProps = {\n rows?: number;\n cols?: number;\n className?: string;\n};\n\nexport const SkeletonTable = ({ rows = 4, cols = 4, className }: SkeletonTableProps) => (\n <div\n className={clsx(\n 'overflow-hidden rounded-xl border border-gray-200 dark:border-gray-800',\n className\n )}\n >\n <div className=\"border-b border-gray-200 bg-gray-50 px-4 py-3 dark:border-gray-800 dark:bg-gray-800\">\n <div\n className=\"grid gap-4\"\n style={{ gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))` }}\n >\n {Array.from({ length: cols }).map((_, i) => (\n <Sk key={i} h=\"h-3\" w=\"w-3/4\" />\n ))}\n </div>\n </div>\n {Array.from({ length: rows }).map((_, row) => (\n <div\n key={row}\n className=\"border-b border-gray-100 px-4 py-3 last:border-0 dark:border-gray-800\"\n >\n <div\n className=\"grid gap-4\"\n style={{ gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))` }}\n >\n {Array.from({ length: cols }).map((_, col) => (\n <Sk key={col} h=\"h-3\" w={col === 0 ? 'w-full' : col === cols - 1 ? 'w-1/2' : 'w-5/6'} />\n ))}\n </div>\n </div>\n ))}\n </div>\n);\n\nexport type SkeletonListProps = {\n rows?: number;\n showAction?: boolean;\n className?: string;\n};\n\nexport const SkeletonList = ({ rows = 4, showAction = true, className }: SkeletonListProps) => (\n <div className={clsx('animate-pulse space-y-0', className)}>\n {Array.from({ length: rows }).map((_, i) => (\n <div\n key={i}\n className=\"flex items-start gap-3 border-b border-gray-100 px-4 py-3.5 last:border-0 dark:border-gray-800\"\n >\n <Sk h=\"h-9\" w=\"w-9\" round=\"rounded-xl\" />\n <div className=\"min-w-0 flex-1 space-y-2 pt-0.5\">\n <div className=\"flex items-center gap-2\">\n <Sk h=\"h-3.5\" w=\"w-16\" round=\"rounded-full\" />\n <Sk h=\"h-4\" w=\"w-32\" />\n <Sk h=\"h-5\" w=\"w-14\" round=\"rounded-full\" />\n </div>\n <Sk h=\"h-3.5\" w={i % 2 === 0 ? 'w-2/3' : 'w-1/2'} />\n <Sk h=\"h-3\" w=\"w-40\" />\n </div>\n {showAction && <Sk h=\"h-8\" w=\"w-16\" round=\"rounded-lg\" className=\"shrink-0\" />}\n </div>\n ))}\n </div>\n);\n","import { clsx } from 'clsx';\nimport { type HealthStatus } from './types';\n\nexport type StatusBadgeProps = {\n status: HealthStatus;\n size?: 'sm' | 'md' | 'lg';\n label?: string;\n className?: string;\n};\n\nconst SIZE_CLASS = {\n sm: 'px-1.5 py-0.5 text-[10px]',\n md: 'px-2 py-0.5 text-xs',\n lg: 'px-3 py-1 text-sm',\n} as const;\n\n// Tailwind 4 scans source files for class strings — keeping these inline (not\n// imported from types.ts as constants) ensures the scanner picks them up.\nconst STATUS_CLASS: Record<HealthStatus, string> = {\n OK: 'bg-green-100 text-green-700 dark:bg-green-500/15 dark:text-green-400',\n WARN: 'bg-amber-100 text-amber-700 dark:bg-amber-500/15 dark:text-amber-400',\n CRIT: 'bg-red-100 text-red-700 dark:bg-red-500/15 dark:text-red-400',\n UNKNOWN: 'bg-gray-100 text-gray-500 dark:bg-gray-800 dark:text-gray-400',\n INFO: 'bg-blue-100 text-blue-700 dark:bg-blue-500/15 dark:text-blue-400',\n};\n\n/**\n * StatusBadge — rounded-full status pill (OK / WARN / CRIT / UNKNOWN).\n *\n * Three sizes: sm (inline in tables), md (default), lg (prominent display).\n */\nexport const StatusBadge = ({ status, size = 'md', label, className }: StatusBadgeProps) => (\n <span\n className={clsx(\n 'inline-flex items-center rounded-full font-bold',\n SIZE_CLASS[size],\n STATUS_CLASS[status],\n className\n )}\n >\n {label ?? status}\n </span>\n);\n","/** Health status — used by StatusBadge, HealthDot, HealthBadge, and lists. */\nexport type HealthStatus = 'OK' | 'WARN' | 'CRIT' | 'UNKNOWN' | 'INFO';\n\n/** Tailwind class string per status — pill background + text color. */\nexport const STATUS_PILL: Record<HealthStatus, string> = {\n OK: 'bg-green-100 text-green-700 dark:bg-green-500/15 dark:text-green-400',\n WARN: 'bg-amber-100 text-amber-700 dark:bg-amber-500/15 dark:text-amber-400',\n CRIT: 'bg-red-100 text-red-700 dark:bg-red-500/15 dark:text-red-400',\n UNKNOWN: 'bg-gray-100 text-gray-500 dark:bg-gray-800 dark:text-gray-400',\n INFO: 'bg-blue-100 text-blue-700 dark:bg-blue-500/15 dark:text-blue-400',\n};\n\n/** Raw color hex per status — used for HealthDot pulse animation. */\nexport const STATUS_COLOR: Record<HealthStatus, string> = {\n OK: '#10b981',\n WARN: '#f59e0b',\n CRIT: '#ef4444',\n UNKNOWN: '#6b7280',\n INFO: '#3b82f6',\n};\n","import { clsx } from 'clsx';\nimport { type HealthStatus, STATUS_COLOR } from './types';\n\nexport type HealthDotProps = {\n status: HealthStatus;\n /** Show a pulsing animation around the dot */\n pulse?: boolean;\n className?: string;\n};\n\n/**\n * HealthDot — small colored circle indicator (10px).\n *\n * Use for compact status displays (next to a label, in a row, in a chart legend).\n * Set `pulse` to draw attention (recommended for CRIT).\n */\nexport const HealthDot = ({ status, pulse = false, className }: HealthDotProps) => (\n <span className={clsx('relative flex h-2.5 w-2.5 shrink-0', className)}>\n {pulse && (\n <span\n className=\"absolute inline-flex h-full w-full animate-ping rounded-full opacity-60\"\n style={{ backgroundColor: STATUS_COLOR[status] }}\n />\n )}\n <span\n className=\"relative inline-flex h-2.5 w-2.5 rounded-full\"\n style={{ backgroundColor: STATUS_COLOR[status] }}\n />\n </span>\n);\n","import {\n CheckCircle,\n AlertTriangle,\n XCircle,\n HelpCircle,\n Info,\n type LucideIcon,\n} from 'lucide-react';\nimport { clsx } from 'clsx';\nimport { type HealthStatus } from './types';\n\nexport type HealthBadgeProps = {\n status: HealthStatus;\n /** Custom label override (default: the status text) */\n label?: string;\n className?: string;\n};\n\nconst HEALTH_CONFIG: Record<\n HealthStatus,\n { icon: LucideIcon; bg: string; text: string; border: string }\n> = {\n OK: {\n icon: CheckCircle,\n bg: 'bg-green-50 dark:bg-green-500/10',\n text: 'text-green-600 dark:text-green-400',\n border: 'border-green-200 dark:border-green-500/30',\n },\n WARN: {\n icon: AlertTriangle,\n bg: 'bg-amber-50 dark:bg-amber-500/10',\n text: 'text-amber-600 dark:text-amber-400',\n border: 'border-amber-200 dark:border-amber-500/30',\n },\n CRIT: {\n icon: XCircle,\n bg: 'bg-red-50 dark:bg-red-500/10',\n text: 'text-red-600 dark:text-red-400',\n border: 'border-red-200 dark:border-red-500/30',\n },\n UNKNOWN: {\n icon: HelpCircle,\n bg: 'bg-gray-100 dark:bg-gray-800',\n text: 'text-gray-500 dark:text-gray-400',\n border: 'border-gray-200 dark:border-gray-700',\n },\n INFO: {\n icon: Info,\n bg: 'bg-blue-50 dark:bg-blue-500/10',\n text: 'text-blue-600 dark:text-blue-400',\n border: 'border-blue-200 dark:border-blue-500/30',\n },\n};\n\n/**\n * HealthBadge — prominent status badge with icon + label (rounded-lg).\n *\n * Larger and more visible than StatusBadge — use for hero status displays\n * (e.g. \"System Health\" page, dashboard summary cards).\n */\nexport const HealthBadge = ({ status, label, className }: HealthBadgeProps) => {\n const { icon: Icon, bg, text, border } = HEALTH_CONFIG[status];\n return (\n <span\n className={clsx(\n 'inline-flex items-center gap-2 rounded-lg border px-3 py-1.5 text-sm font-medium',\n bg,\n text,\n border,\n className\n )}\n >\n <Icon className=\"h-4 w-4\" />\n {label ?? status}\n </span>\n );\n};\n","import { clsx } from 'clsx';\nimport { ChevronRight } from 'lucide-react';\nimport { forwardRef, type HTMLAttributes, type LiHTMLAttributes, type ReactNode } from 'react';\n\n// ── Root ─────────────────────────────────────────────────────────────────────\n// TUI reference: <ul role=\"list\" class=\"divide-y divide-gray-100\">\n// light pattern; dark variant uses divide-white/5\n\nexport type StackedListProps = Omit<HTMLAttributes<HTMLUListElement>, 'children'> & {\n children: ReactNode;\n};\n\nconst StackedListRoot = forwardRef<HTMLUListElement, StackedListProps>(function StackedListRoot(\n { className, children, ...rest },\n ref\n) {\n return (\n <ul\n ref={ref}\n role=\"list\"\n className={clsx('divide-y divide-gray-100 dark:divide-white/5', className)}\n {...rest}\n >\n {children}\n </ul>\n );\n});\n\n// ── Item ─────────────────────────────────────────────────────────────────────\n// TUI reference (Simple, row markup):\n// <li class=\"flex justify-between gap-x-6 py-5\">\n// <div class=\"flex min-w-0 gap-x-4\">\n// {avatar — size-12 flex-none rounded-full bg-gray-50}\n// <div class=\"min-w-0 flex-auto\">\n// <p class=\"text-sm/6 font-semibold text-gray-900\">{title}</p>\n// <p class=\"mt-1 truncate text-xs/5 text-gray-500\">{subtitle}</p>\n// </div>\n// </div>\n// <div class=\"hidden shrink-0 sm:flex sm:flex-col sm:items-end\">\n// {meta — also two <p> lines, hidden on mobile}\n// </div>\n// </li>\n\nexport type StackedListItemProps = LiHTMLAttributes<HTMLLIElement> & {\n /** Leading slot — typically an `<img>` (size-12, rounded-full) or `<Avatar>`. */\n avatar?: ReactNode;\n /** Primary text. */\n title: ReactNode;\n /** Secondary text below the title (truncated by default). */\n subtitle?: ReactNode;\n /** Right-aligned meta column, hidden on mobile (mirrors TUI `hidden sm:flex`). */\n meta?: ReactNode;\n /** Trailing slot rendered after `meta` (icon, actions menu, badge…). */\n trailing?: ReactNode;\n /**\n * If set, the entire row becomes a navigable link via a full-row overlay\n * (TUI pattern: `<a><span class=\"absolute inset-x-0 -top-px bottom-0\"></span></a>`).\n * The overlay sits above the title text — other inner anchors stay on top via z-index.\n */\n href?: string;\n /** When `href` is set, also append a chevron-right icon to indicate navigation. */\n chevron?: boolean;\n};\n\nconst StackedListItem = forwardRef<HTMLLIElement, StackedListItemProps>(function StackedListItem(\n { avatar, title, subtitle, meta, trailing, href, chevron, className, ...rest },\n ref\n) {\n // The full-row link overlay needs the <li> to be `relative`.\n const isLinked = Boolean(href);\n\n const titleEl = isLinked ? (\n <p className=\"text-sm/6 font-semibold text-gray-900 dark:text-white\">\n <a href={href}>\n {/* Full-row click target */}\n <span className=\"absolute inset-x-0 -top-px bottom-0\" aria-hidden />\n {title}\n </a>\n </p>\n ) : (\n <p className=\"text-sm/6 font-semibold text-gray-900 dark:text-white\">{title}</p>\n );\n\n return (\n <li\n ref={ref}\n className={clsx('flex justify-between gap-x-6 py-5', isLinked && 'relative', className)}\n {...rest}\n >\n <div className=\"flex min-w-0 gap-x-4\">\n {avatar}\n <div className=\"min-w-0 flex-auto\">\n {titleEl}\n {subtitle && (\n <p className=\"mt-1 truncate text-xs/5 text-gray-500 dark:text-gray-400\">{subtitle}</p>\n )}\n </div>\n </div>\n {(meta || trailing || (isLinked && chevron)) && (\n <div className=\"flex shrink-0 items-center gap-x-4\">\n {meta && <div className=\"hidden sm:flex sm:flex-col sm:items-end\">{meta}</div>}\n {trailing}\n {isLinked && chevron && (\n <ChevronRight\n className=\"size-5 flex-none text-gray-400 dark:text-gray-500\"\n aria-hidden\n />\n )}\n </div>\n )}\n </li>\n );\n});\n\n// ── Compound export ──────────────────────────────────────────────────────────\n\nexport const StackedList = Object.assign(StackedListRoot, { Item: StackedListItem });\n","import { clsx } from 'clsx';\nimport {\n Children,\n Fragment,\n forwardRef,\n type HTMLAttributes,\n type LiHTMLAttributes,\n type ReactNode,\n} from 'react';\n\n// ── Root ─────────────────────────────────────────────────────────────────────\n// TUI reference (patterns 3 / 5):\n// <ul role=\"list\" class=\"divide-y divide-gray-100\">\n\nexport type ContentStackedListProps = Omit<HTMLAttributes<HTMLUListElement>, 'children'> & {\n children: ReactNode;\n};\n\nconst ContentStackedListRoot = forwardRef<HTMLUListElement, ContentStackedListProps>(\n function ContentStackedListRoot({ className, children, ...rest }, ref) {\n return (\n <ul\n ref={ref}\n role=\"list\"\n className={clsx('divide-y divide-gray-100 dark:divide-white/5', className)}\n {...rest}\n >\n {children}\n </ul>\n );\n }\n);\n\n// ── Dot separator (TUI: <svg viewBox=\"0 0 2 2\"><circle r=1 /></svg>) ─────────\n\nconst Dot = () => (\n <svg viewBox=\"0 0 2 2\" className=\"size-0.5 flex-none fill-current\" aria-hidden>\n <circle r=\"1\" cx=\"1\" cy=\"1\" />\n </svg>\n);\n\n// ── Item ─────────────────────────────────────────────────────────────────────\n// TUI reference (Pattern 5 simplified):\n// <li class=\"flex items-center justify-between gap-x-6 py-5\">\n// <div class=\"min-w-0\">\n// <div class=\"flex items-start gap-x-3\">\n// <p class=\"text-sm/6 font-semibold text-gray-900\">{title}</p>\n// {badge}\n// </div>\n// <div class=\"mt-1 flex items-center gap-x-2 text-xs/5 text-gray-500\">\n// {meta.map(item => <Fragment>{item}{i<n-1 && <Dot />}</Fragment>)}\n// </div>\n// </div>\n// <div class=\"flex flex-none items-center gap-x-4\">\n// {trailing}\n// </div>\n// </li>\n\nexport type ContentStackedListItemProps = LiHTMLAttributes<HTMLLIElement> & {\n /** Primary text (heading-like). Becomes a link if `href` is set. */\n title: ReactNode;\n /** Make the title a link. */\n href?: string;\n /** Optional inline badge rendered next to the title (pattern 5). */\n badge?: ReactNode;\n /** Inline meta items separated by a dot. Pass an array of ReactNodes. */\n meta?: ReactNode[];\n /** Right-aligned slot — typically an AvatarGroup (pattern 3) or a button + actions menu (pattern 5). */\n trailing?: ReactNode;\n};\n\nconst ContentStackedListItem = forwardRef<HTMLLIElement, ContentStackedListItemProps>(\n function ContentStackedListItem({ title, href, badge, meta, trailing, className, ...rest }, ref) {\n const titleEl = href ? (\n <a href={href} className=\"text-gray-900 hover:underline dark:text-white\">\n {title}\n </a>\n ) : (\n title\n );\n\n const metaItems = meta ?? [];\n const hasMeta = metaItems.length > 0;\n\n return (\n <li\n ref={ref}\n className={clsx('flex items-center justify-between gap-x-6 py-5', className)}\n {...rest}\n >\n <div className=\"min-w-0\">\n <div className=\"flex items-start gap-x-3\">\n <p className=\"text-sm/6 font-semibold text-gray-900 dark:text-white\">{titleEl}</p>\n {badge}\n </div>\n {hasMeta && (\n <div className=\"mt-1 flex items-center gap-x-2 text-xs/5 text-gray-500 dark:text-gray-400\">\n {Children.toArray(metaItems).map((item, i) => (\n <Fragment key={i}>\n {i > 0 && <Dot />}\n {item}\n </Fragment>\n ))}\n </div>\n )}\n </div>\n {trailing && <div className=\"flex flex-none items-center gap-x-4\">{trailing}</div>}\n </li>\n );\n }\n);\n\n// ── Compound export ──────────────────────────────────────────────────────────\n\nexport const ContentStackedList = Object.assign(ContentStackedListRoot, {\n Item: ContentStackedListItem,\n});\n","import { clsx } from 'clsx';\nimport {\n Children,\n cloneElement,\n forwardRef,\n isValidElement,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { StackedList, type StackedListItemProps } from './StackedList';\n\n// ── Root ─────────────────────────────────────────────────────────────────────\n// TUI reference (Pattern 6 — \"In card with links\"):\n// <div class=\"overflow-hidden bg-white shadow-sm sm:rounded-md ring-1 ring-gray-200\">\n// <ul role=\"list\" class=\"divide-y divide-gray-100\">\n// <li class=\"px-4 py-5 sm:px-6\"> …same as Pattern 1 li… </li>\n// </ul>\n// </div>\n//\n// Each <li> gains horizontal padding because the surrounding card removes the\n// edge whitespace that pattern 1 relies on. We achieve this by cloning each\n// <StackedList.Item> child with an extra className.\n\nexport type StackedListInCardProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {\n /** Children must be `<StackedList.Item>` elements. */\n children: ReactNode;\n};\n\nconst ITEM_INSET_CLASS = 'px-4 sm:px-6';\n\nconst isStackedListItem = (node: ReactNode): node is ReactElement<StackedListItemProps> =>\n isValidElement(node) && node.type === StackedList.Item;\n\nexport const StackedListInCard = forwardRef<HTMLDivElement, StackedListInCardProps>(\n function StackedListInCard({ className, children, ...rest }, ref) {\n const insetChildren = Children.map(children, (child) => {\n if (!isStackedListItem(child)) return child;\n return cloneElement(child, {\n className: clsx(ITEM_INSET_CLASS, child.props.className),\n });\n });\n\n return (\n <div\n ref={ref}\n className={clsx(\n 'overflow-hidden bg-white shadow-sm ring-1 ring-gray-200 sm:rounded-md dark:bg-gray-900 dark:ring-white/10',\n className\n )}\n {...rest}\n >\n <StackedList>{insetChildren}</StackedList>\n </div>\n );\n }\n);\n","import { clsx } from 'clsx';\nimport { forwardRef, type HTMLAttributes, type LiHTMLAttributes, type ReactNode } from 'react';\n\n// ── Root ─────────────────────────────────────────────────────────────────────\n// TUI reference (Pattern 10 — \"Narrow\"):\n// <ul role=\"list\" class=\"divide-y divide-gray-100\">\n\nexport type NarrowStackedListProps = Omit<HTMLAttributes<HTMLUListElement>, 'children'> & {\n children: ReactNode;\n};\n\nconst NarrowStackedListRoot = forwardRef<HTMLUListElement, NarrowStackedListProps>(\n function NarrowStackedListRoot({ className, children, ...rest }, ref) {\n return (\n <ul\n ref={ref}\n role=\"list\"\n className={clsx('divide-y divide-gray-100 dark:divide-white/5', className)}\n {...rest}\n >\n {children}\n </ul>\n );\n }\n);\n\n// ── Header (TUI Pattern 11 — sticky group headings) ─────────────────────────\n\nexport type NarrowStackedListHeaderProps = Omit<LiHTMLAttributes<HTMLLIElement>, 'children'> & {\n /** Render with `position: sticky` so the header stays pinned while scrolling. */\n sticky?: boolean;\n children: ReactNode;\n};\n\nconst NarrowStackedListHeader = forwardRef<HTMLLIElement, NarrowStackedListHeaderProps>(\n function NarrowStackedListHeader({ sticky, className, children, ...rest }, ref) {\n return (\n <li\n ref={ref}\n className={clsx(\n 'border-t border-b border-t-gray-200 border-b-gray-200 bg-gray-50 px-3 py-1.5 text-sm/6 font-semibold text-gray-900 dark:border-t-white/10 dark:border-b-white/10 dark:bg-gray-800/60 dark:text-white',\n sticky && 'sticky top-0 z-10',\n className\n )}\n {...rest}\n >\n {children}\n </li>\n );\n }\n);\n\n// ── Item ─────────────────────────────────────────────────────────────────────\n// Three layout shapes depending on which props are passed:\n//\n// - simple (Pattern 10): avatar + (title, subtitle)\n// <li class=\"flex gap-x-4 py-5\">\n// {avatar} <div><p>{title}</p><p>{subtitle}</p></div>\n// </li>\n//\n// - with trailing (Pattern 12): + right-aligned action\n// <li class=\"flex justify-between gap-x-6 py-5\">\n// <div class=\"flex gap-x-4\">{avatar} <div>{title/subtitle}</div></div>\n// {trailing}\n// </li>\n//\n// - with timestamp/description (Pattern 13): two-row layout next to avatar\n// <li class=\"flex gap-x-4 py-5\">\n// {avatar}\n// <div class=\"flex-auto\">\n// <div class=\"flex justify-between gap-x-4\">\n// <p>{title}</p> <p>{timestamp}</p>\n// </div>\n// <p class=\"line-clamp-2\">{description}</p>\n// </div>\n// </li>\n\nexport type NarrowStackedListItemProps = LiHTMLAttributes<HTMLLIElement> & {\n /** Leading slot — typically `<img class=\"size-12 rounded-full\" />`. */\n avatar?: ReactNode;\n /** Primary text. */\n title: ReactNode;\n /** Secondary text below the title (truncated by default). */\n subtitle?: ReactNode;\n /** Optional right-of-title timestamp (Pattern 13). When set, an extra layout row is used. */\n timestamp?: ReactNode;\n /** Optional second body line (Pattern 13). Auto line-clamped to 2. */\n description?: ReactNode;\n /** Optional right-aligned trailing slot — action button, link (Pattern 12). */\n trailing?: ReactNode;\n};\n\nconst NarrowStackedListItem = forwardRef<HTMLLIElement, NarrowStackedListItemProps>(\n function NarrowStackedListItem(\n { avatar, title, subtitle, timestamp, description, trailing, className, ...rest },\n ref\n ) {\n const hasRichBody = Boolean(timestamp || description);\n\n if (hasRichBody) {\n return (\n <li ref={ref} className={clsx('flex gap-x-4 py-5', className)} {...rest}>\n {avatar}\n <div className=\"min-w-0 flex-auto\">\n <div className=\"flex items-baseline justify-between gap-x-4\">\n <p className=\"text-sm/6 font-semibold text-gray-900 dark:text-white\">{title}</p>\n {timestamp && (\n <p className=\"flex-none text-xs/5 text-gray-600 dark:text-gray-400\">{timestamp}</p>\n )}\n </div>\n {description && (\n <p className=\"mt-1 line-clamp-2 text-sm/6 text-gray-600 dark:text-gray-400\">\n {description}\n </p>\n )}\n {!description && subtitle && (\n <p className=\"mt-1 truncate text-xs/5 text-gray-500 dark:text-gray-400\">{subtitle}</p>\n )}\n </div>\n </li>\n );\n }\n\n if (trailing) {\n return (\n <li\n ref={ref}\n className={clsx('flex items-center justify-between gap-x-6 py-5', className)}\n {...rest}\n >\n <div className=\"flex min-w-0 gap-x-4\">\n {avatar}\n <div className=\"min-w-0 flex-auto\">\n <p className=\"text-sm/6 font-semibold text-gray-900 dark:text-white\">{title}</p>\n {subtitle && (\n <p className=\"mt-1 truncate text-xs/5 text-gray-500 dark:text-gray-400\">\n {subtitle}\n </p>\n )}\n </div>\n </div>\n {trailing}\n </li>\n );\n }\n\n return (\n <li ref={ref} className={clsx('flex gap-x-4 py-5', className)} {...rest}>\n {avatar}\n <div className=\"min-w-0\">\n <p className=\"text-sm/6 font-semibold text-gray-900 dark:text-white\">{title}</p>\n {subtitle && (\n <p className=\"mt-1 truncate text-xs/5 text-gray-500 dark:text-gray-400\">{subtitle}</p>\n )}\n </div>\n </li>\n );\n }\n);\n\n// ── Compound export ──────────────────────────────────────────────────────────\n\nexport const NarrowStackedList = Object.assign(NarrowStackedListRoot, {\n Header: NarrowStackedListHeader,\n Item: NarrowStackedListItem,\n});\n","import { type ReactNode } from 'react';\nimport { clsx } from 'clsx';\n\nexport type SimpleRowProps = {\n /** Label on the left (typically a property name) */\n label: string;\n /** Value on the right (typically the property value) */\n value: ReactNode;\n /** Render value in monospace font (for IDs, hashes, paths…) */\n mono?: boolean;\n className?: string;\n};\n\n/**\n * SimpleRow — flat key/value row for metadata or properties.\n *\n * Use inside a SectionCard with `divide-y` for visually separated rows:\n *\n * <SectionCard title=\"Metadata\">\n * <div className=\"divide-y divide-[var(--color-border)]\">\n * <SimpleRow label=\"ID\" value=\"rack-01-a\" mono />\n * <SimpleRow label=\"Status\" value={<StatusBadge status=\"OK\" />} />\n * </div>\n * </SectionCard>\n */\nexport const SimpleRow = ({ label, value, mono = false, className }: SimpleRowProps) => (\n <div className={clsx('flex items-center justify-between py-2.5', className)}>\n <span className=\"text-sm text-[var(--color-text-secondary)]\">{label}</span>\n <span\n className={clsx(\n 'text-sm font-medium text-[var(--color-text-primary)]',\n mono && 'font-mono text-xs'\n )}\n >\n {value}\n </span>\n </div>\n);\n","import { type ComponentType } from 'react';\nimport { ChevronRight } from 'lucide-react';\nimport { clsx } from 'clsx';\n\nexport type ClickableRowProps = {\n /** Optional leading icon (lucide-react or any icon component) */\n icon?: ComponentType<{ className?: string }>;\n /** Main row title */\n title: string;\n /** Optional subtitle below the title */\n subtitle?: string;\n /** Click handler — renders a button */\n onClick?: () => void;\n /** Or provide an href to render an <a> instead */\n href?: string;\n className?: string;\n};\n\n/**\n * ClickableRow — full-width navigable row with icon + title + subtitle + chevron.\n *\n * Use for navigable lists: racks, servers, exporters, articles…\n * Pair with `<StatusRow>` when you need a status badge on the right.\n */\nexport const ClickableRow = ({\n icon: Icon,\n title,\n subtitle,\n onClick,\n href,\n className,\n}: ClickableRowProps) => {\n const inner = (\n <>\n {Icon && (\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-black/5 text-[var(--color-text-muted)] dark:bg-white/5\">\n <Icon className=\"h-4 w-4\" />\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-[var(--color-text-primary)]\">{title}</p>\n {subtitle && <p className=\"truncate text-xs text-[var(--color-text-muted)]\">{subtitle}</p>}\n </div>\n <ChevronRight className=\"h-4 w-4 shrink-0 text-[var(--color-text-muted)]\" />\n </>\n );\n const baseClass = clsx(\n 'flex w-full items-center gap-3 px-1 py-2.5 text-left transition-colors',\n 'hover:bg-black/5 dark:hover:bg-white/5',\n className\n );\n if (href) {\n return (\n <a href={href} className={baseClass}>\n {inner}\n </a>\n );\n }\n return (\n <button type=\"button\" onClick={onClick} className={baseClass}>\n {inner}\n </button>\n );\n};\n","import { type ComponentType } from 'react';\nimport { clsx } from 'clsx';\nimport { type HealthStatus } from '../status/types';\n\nexport type StatusRowProps = {\n icon?: ComponentType<{ className?: string }>;\n title: string;\n subtitle?: string;\n status: HealthStatus;\n onClick?: () => void;\n href?: string;\n className?: string;\n};\n\n// Inlined here too (Tailwind scanner doesn't follow imports from constants).\nconst STATUS_CLASS: Record<HealthStatus, string> = {\n OK: 'bg-green-100 text-green-700 dark:bg-green-500/15 dark:text-green-400',\n WARN: 'bg-amber-100 text-amber-700 dark:bg-amber-500/15 dark:text-amber-400',\n CRIT: 'bg-red-100 text-red-700 dark:bg-red-500/15 dark:text-red-400',\n UNKNOWN: 'bg-gray-100 text-gray-500 dark:bg-gray-800 dark:text-gray-400',\n INFO: 'bg-blue-100 text-blue-700 dark:bg-blue-500/15 dark:text-blue-400',\n};\n\n/**\n * StatusRow — same as ClickableRow but ends with a status badge instead of a chevron.\n */\nexport const StatusRow = ({\n icon: Icon,\n title,\n subtitle,\n status,\n onClick,\n href,\n className,\n}: StatusRowProps) => {\n const inner = (\n <>\n {Icon && (\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-black/5 text-[var(--color-text-muted)] dark:bg-white/5\">\n <Icon className=\"h-4 w-4\" />\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-[var(--color-text-primary)]\">{title}</p>\n {subtitle && <p className=\"truncate text-xs text-[var(--color-text-muted)]\">{subtitle}</p>}\n </div>\n <span\n className={clsx(\n 'shrink-0 rounded-full px-2 py-0.5 text-[10px] font-bold',\n STATUS_CLASS[status]\n )}\n >\n {status}\n </span>\n </>\n );\n const baseClass = clsx(\n 'flex w-full items-center gap-3 px-1 py-2.5 text-left transition-colors',\n 'hover:bg-black/5 dark:hover:bg-white/5',\n className\n );\n if (href) {\n return (\n <a href={href} className={baseClass}>\n {inner}\n </a>\n );\n }\n return (\n <button type=\"button\" onClick={onClick} className={baseClass}>\n {inner}\n </button>\n );\n};\n","import { clsx } from 'clsx';\nimport {\n Children,\n forwardRef,\n isValidElement,\n type ComponentType,\n type HTMLAttributes,\n type LiHTMLAttributes,\n type ReactNode,\n} from 'react';\n\n// TUI Plus reference (Pattern 1 — \"Simple with icons\"):\n// <ul role=\"list\" class=\"-mb-8\">\n// {items.map((item, i) => (\n// <li>\n// <div class=\"relative pb-8\">\n// {!isLast && (\n// <span class=\"absolute top-5 left-5 -ml-px h-full w-0.5 bg-gray-200\" />\n// )}\n// <div class=\"relative flex space-x-3\">\n// <div>\n// <span class=\"flex size-10 items-center justify-center rounded-full bg-{intent}-500 ring-8 ring-white\">\n// <Icon class=\"size-5 text-white\" />\n// </span>\n// </div>\n// <div class=\"flex min-w-0 flex-1 justify-between space-x-4 pt-1.5\">\n// <div><p class=\"text-sm text-gray-500\">{content}</p></div>\n// <div class=\"text-right text-sm whitespace-nowrap text-gray-500\">{time}</div>\n// </div>\n// </div>\n// </div>\n// </li>\n// ))}\n// </ul>\n//\n// Connector style: dashed in TUI Plus 5 — we use a solid 2px line to match\n// the canonical headless-ui-pro demo (the docs page itself shows solid\n// `bg-gray-200`).\n\nexport type ActivityFeedIntent = 'neutral' | 'info' | 'success' | 'warning' | 'danger';\n\nconst INTENT_BG: Record<ActivityFeedIntent, string> = {\n neutral: 'bg-gray-400 dark:bg-gray-600',\n info: 'bg-blue-500',\n success: 'bg-green-500',\n warning: 'bg-amber-500',\n danger: 'bg-red-500',\n};\n\n// ── Item ─────────────────────────────────────────────────────────────────────\n\nexport type ActivityFeedItemProps = LiHTMLAttributes<HTMLLIElement> & {\n /** Lucide icon rendered inside the circle indicator. */\n icon: ComponentType<{ className?: string; 'aria-hidden'?: boolean }>;\n /** Color of the circle indicator. Default `neutral`. */\n intent?: ActivityFeedIntent;\n /** Right-aligned timestamp (text or `<time>`). */\n timestamp?: ReactNode;\n /** Main content (paragraph). */\n children: ReactNode;\n /** Internal — set by parent via cloneElement. */\n /** @internal */ __isLast?: boolean;\n};\n\nconst Item = forwardRef<HTMLLIElement, ActivityFeedItemProps>(function ActivityFeedItem(\n { icon: Icon, intent = 'neutral', timestamp, children, className, __isLast = false, ...rest },\n ref\n) {\n return (\n <li ref={ref} className={className} {...rest}>\n <div className=\"relative pb-8\">\n {!__isLast && (\n <span\n aria-hidden\n className=\"absolute top-5 left-5 -ml-px h-full w-0.5 bg-gray-200 dark:bg-white/10\"\n />\n )}\n <div className=\"relative flex space-x-3\">\n <div>\n <span\n className={clsx(\n 'flex size-10 items-center justify-center rounded-full ring-8 ring-white dark:ring-gray-900',\n INTENT_BG[intent]\n )}\n >\n <Icon className=\"size-5 text-white\" aria-hidden />\n </span>\n </div>\n <div className=\"flex min-w-0 flex-1 justify-between space-x-4 pt-1.5\">\n <div>\n <div className=\"text-sm text-gray-500 dark:text-gray-400\">{children}</div>\n </div>\n {timestamp && (\n <div className=\"text-right text-sm whitespace-nowrap text-gray-500 dark:text-gray-400\">\n {timestamp}\n </div>\n )}\n </div>\n </div>\n </div>\n </li>\n );\n});\n\n// ── Root ─────────────────────────────────────────────────────────────────────\n\nexport type ActivityFeedProps = Omit<HTMLAttributes<HTMLUListElement>, 'children'> & {\n children: ReactNode;\n};\n\nconst Root = forwardRef<HTMLUListElement, ActivityFeedProps>(function ActivityFeedRoot(\n { className, children, ...rest },\n ref\n) {\n const items = Children.toArray(children).filter(isValidElement);\n return (\n <ul ref={ref} role=\"list\" className={clsx('-mb-8', className)} {...rest}>\n {items.map((child, i) => {\n if (!isValidElement(child)) return child;\n const isLast = i === items.length - 1;\n // Inject __isLast without leaking TS error.\n const props = { __isLast: isLast };\n return (\n <child.type\n key={(child as { key?: string }).key ?? i}\n {...(child.props as object)}\n {...props}\n />\n );\n })}\n </ul>\n );\n});\n\n// ── Compound export ──────────────────────────────────────────────────────────\n\nexport const ActivityFeed = Object.assign(Root, { Item });\n","import { clsx } from 'clsx';\nimport { forwardRef, type AnchorHTMLAttributes, type HTMLAttributes, type ReactNode } from 'react';\n\n// TUI Plus reference (Pattern 1 — \"Contact cards with small portraits\"):\n// <ul role=\"list\" class=\"grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3\">\n// {people.map((p) => (\n// <li class=\"col-span-1 divide-y divide-gray-200 rounded-lg bg-white shadow\">\n// <div class=\"flex w-full items-center justify-between space-x-6 p-6\">\n// <div class=\"flex-1 truncate\">\n// <div class=\"flex items-center space-x-3\">\n// <h3 class=\"truncate text-sm font-medium text-gray-900\">{name}</h3>\n// {badge && <span class=\"…\">{badge}</span>}\n// </div>\n// <p class=\"mt-1 truncate text-sm text-gray-500\">{role}</p>\n// </div>\n// <img class=\"size-10 shrink-0 rounded-full bg-gray-300\" />\n// </div>\n// <div>\n// <div class=\"-mt-px flex divide-x divide-gray-200\">\n// <div class=\"flex w-0 flex-1\">\n// <a class=\"…\"><Envelope /> Email</a>\n// </div>\n// <div class=\"-ml-px flex w-0 flex-1\">\n// <a class=\"…\"><Phone /> Call</a>\n// </div>\n// </div>\n// </div>\n// </li>\n// ))}\n// </ul>\n\nexport type GridListCols = 1 | 2 | 3 | 4;\n\nconst COLS_CLASS: Record<GridListCols, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 sm:grid-cols-2',\n 3: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3',\n 4: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4',\n};\n\n// ── Root ─────────────────────────────────────────────────────────────────────\n\nexport type GridListProps = Omit<HTMLAttributes<HTMLUListElement>, 'children'> & {\n /** Number of columns at the widest viewport. Responsive defaults below. */\n cols?: GridListCols;\n /** Gap class (Tailwind). Default `gap-6` (24px). */\n gapClassName?: string;\n children: ReactNode;\n};\n\nconst Root = forwardRef<HTMLUListElement, GridListProps>(function GridListRoot(\n { cols = 3, gapClassName = 'gap-6', className, children, ...rest },\n ref\n) {\n return (\n <ul\n ref={ref}\n role=\"list\"\n className={clsx('grid', COLS_CLASS[cols], gapClassName, className)}\n {...rest}\n >\n {children}\n </ul>\n );\n});\n\n// ── Card ─────────────────────────────────────────────────────────────────────\n\nexport type GridListCardProps = HTMLAttributes<HTMLLIElement>;\n\nconst Card = forwardRef<HTMLLIElement, GridListCardProps>(function GridListCard(\n { className, children, ...rest },\n ref\n) {\n return (\n <li\n ref={ref}\n className={clsx(\n 'col-span-1 divide-y divide-gray-200 rounded-lg bg-white shadow dark:divide-white/10 dark:bg-gray-900 dark:ring-1 dark:ring-white/10',\n className\n )}\n {...rest}\n >\n {children}\n </li>\n );\n});\n\n// ── Footer (split actions row, divided vertically) ──────────────────────────\n\nexport type GridListFooterProps = HTMLAttributes<HTMLDivElement>;\n\nconst Footer = forwardRef<HTMLDivElement, GridListFooterProps>(function GridListFooter(\n { className, children, ...rest },\n ref\n) {\n return (\n <div ref={ref} {...rest}>\n <div className={clsx('-mt-px flex divide-x divide-gray-200 dark:divide-white/10', className)}>\n {children}\n </div>\n </div>\n );\n});\n\n// ── FooterAction (one cell of the split footer) ─────────────────────────────\n\nexport type GridListFooterActionProps = AnchorHTMLAttributes<HTMLAnchorElement> & {\n /** Index in the footer row — only used to apply `-ml-px` on cells after the first. */\n index?: number;\n};\n\nconst FooterAction = forwardRef<HTMLAnchorElement, GridListFooterActionProps>(\n function GridListFooterAction({ index = 0, className, children, ...rest }, ref) {\n return (\n <div className={clsx('flex w-0 flex-1', index > 0 && '-ml-px')}>\n <a\n ref={ref}\n className={clsx(\n 'relative inline-flex w-0 flex-1 items-center justify-center gap-x-3 rounded-bl-lg border border-transparent py-4 text-sm font-semibold text-gray-900 hover:bg-gray-50 dark:text-white dark:hover:bg-white/5',\n className\n )}\n {...rest}\n >\n {children}\n </a>\n </div>\n );\n }\n);\n\n// ── Compound export ──────────────────────────────────────────────────────────\n\nexport const GridList = Object.assign(Root, {\n Card,\n Footer,\n FooterAction,\n});\n","import { type ComponentType, type ReactNode } from 'react';\nimport { ChevronRight } from 'lucide-react';\nimport { clsx } from 'clsx';\n\nexport type BreadcrumbItem = {\n label: string;\n /** Optional icon (lucide-react component) */\n icon?: ComponentType<{ className?: string }>;\n /** Link target — last item is rendered as plain text (no link) regardless */\n href?: string;\n /** Or click handler */\n onClick?: () => void;\n};\n\nexport type BreadcrumbSeparator = 'chevron' | 'slash' | 'dot' | ReactNode;\n\nexport type BreadcrumbProps = {\n items: BreadcrumbItem[];\n /** Visual separator between items. Default `'chevron'`. Pass any ReactNode for full custom. */\n separator?: BreadcrumbSeparator;\n className?: string;\n};\n\nconst renderSeparator = (sep: BreadcrumbSeparator): ReactNode => {\n if (sep === 'chevron')\n return <ChevronRight className=\"h-4 w-4 shrink-0 text-[var(--color-text-muted)]\" aria-hidden />;\n if (sep === 'slash')\n return (\n <span aria-hidden className=\"text-sm text-[var(--color-text-muted)] select-none\">\n /\n </span>\n );\n if (sep === 'dot')\n return (\n <span\n aria-hidden\n className=\"text-base leading-none text-[var(--color-text-muted)] select-none\"\n >\n ·\n </span>\n );\n return sep;\n};\n\n/**\n * Breadcrumb — navigable path: Site → Room → Aisle → Rack → Device.\n *\n * Each item except the last is clickable. Last item renders as plain text\n * (the current page). Use icons for the most important items in the path.\n *\n * Differs from PageBreadcrumb (templates/) which is the slim variant for\n * page headers with the Home icon. This Breadcrumb is bigger and supports\n * an icon per item.\n */\nexport const Breadcrumb = ({ items, separator = 'chevron', className }: BreadcrumbProps) => (\n <nav\n aria-label=\"Breadcrumb\"\n className={clsx('flex items-center gap-1 overflow-x-auto', className)}\n >\n {items.map(({ icon: Icon, label, href, onClick }, i) => {\n const isLast = i === items.length - 1;\n return (\n <div key={label} className=\"flex items-center gap-1\">\n {i > 0 && renderSeparator(separator)}\n {isLast ? (\n <span className=\"flex items-center gap-1.5 rounded px-2 py-1 text-sm font-semibold whitespace-nowrap text-[var(--color-text-primary)]\">\n {Icon && <Icon className=\"text-brand-500 h-4 w-4\" />}\n {label}\n </span>\n ) : onClick ? (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"text-brand-600 hover:bg-brand-50 dark:text-brand-400 dark:hover:bg-brand-500/10 flex items-center gap-1.5 rounded px-2 py-1 text-sm font-medium whitespace-nowrap transition-colors\"\n >\n {Icon && <Icon className=\"h-4 w-4\" />}\n {label}\n </button>\n ) : (\n <a\n href={href ?? '#'}\n className=\"text-brand-600 hover:bg-brand-50 dark:text-brand-400 dark:hover:bg-brand-500/10 flex items-center gap-1.5 rounded px-2 py-1 text-sm font-medium whitespace-nowrap transition-colors\"\n >\n {Icon && <Icon className=\"h-4 w-4\" />}\n {label}\n </a>\n )}\n </div>\n );\n })}\n </nav>\n);\n","import { clsx } from 'clsx';\nimport {\n forwardRef,\n type AnchorHTMLAttributes,\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\n\n// TUI Plus reference (Pattern 1 — \"Simple dark with menu button on left\"):\n// <nav class=\"bg-gray-800\">\n// <div class=\"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8\">\n// <div class=\"flex h-16 items-center justify-between\">\n// <div class=\"flex items-center\">\n// <button>menu</button> <!-- mobile hamburger -->\n// <img class=\"size-8\" /> <!-- brand -->\n// <div class=\"hidden md:block\">\n// <div class=\"ml-10 flex items-baseline space-x-4\">\n// <a class=\"rounded-md bg-gray-900 px-3 py-2 text-sm font-medium text-white\"\n// aria-current=\"page\">Dashboard</a>\n// <a class=\"text-gray-300 hover:bg-gray-700 hover:text-white …\">Team</a>\n// ...\n// </div>\n// </div>\n// </div>\n// <div class=\"hidden md:block\">\n// <div class=\"ml-4 flex items-center md:ml-6\">\n// {/* notifications + avatar dropdown */}\n// </div>\n// </div>\n// </div>\n// </div>\n// </nav>\n\nexport type NavbarTheme = 'light' | 'dark';\n\nconst ROOT_BG: Record<NavbarTheme, string> = {\n light: 'bg-white shadow-sm border-b border-gray-200 dark:bg-gray-800 dark:border-white/10',\n dark: 'bg-gray-800',\n};\n\nconst ITEM_BASE: Record<NavbarTheme, string> = {\n light:\n 'rounded-md px-3 py-2 text-sm font-medium text-gray-700 hover:bg-gray-100 dark:text-gray-200 dark:hover:bg-white/5',\n dark: 'rounded-md px-3 py-2 text-sm font-medium text-gray-300 hover:bg-gray-700 hover:text-white',\n};\n\nconst ITEM_ACTIVE: Record<NavbarTheme, string> = {\n light: 'bg-gray-100 text-gray-900 dark:bg-white/10 dark:text-white',\n dark: 'bg-gray-900 text-white',\n};\n\n// ── Root ─────────────────────────────────────────────────────────────────────\n\nexport type NavbarProps = HTMLAttributes<HTMLElement> & {\n theme?: NavbarTheme;\n /** Constrain inner content to a max width container. Default `7xl`. */\n maxWidth?: 'none' | '7xl';\n /** Override the inner row height. Default `h-16` (64px). */\n heightClassName?: string;\n children: ReactNode;\n};\n\nconst RootCmp = forwardRef<HTMLElement, NavbarProps>(function NavbarRoot(\n { theme = 'light', maxWidth = '7xl', heightClassName = 'h-16', className, children, ...rest },\n ref\n) {\n return (\n <nav ref={ref} className={clsx(ROOT_BG[theme], className)} data-theme={theme} {...rest}>\n <div className={clsx('px-4 sm:px-6 lg:px-8', maxWidth === '7xl' && 'mx-auto max-w-7xl')}>\n <div className={clsx('flex items-center justify-between', heightClassName)}>{children}</div>\n </div>\n </nav>\n );\n});\n\n// ── Brand ────────────────────────────────────────────────────────────────────\n\nconst Brand = ({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) => (\n <div className={clsx('flex shrink-0 items-center', className)} {...rest}>\n {children}\n </div>\n);\n\n// ── Items (the horizontal main nav, hidden on mobile by default) ────────────\n\nconst Items = ({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) => (\n <div className={clsx('hidden md:ml-10 md:block', className)} {...rest}>\n <div className=\"flex items-baseline space-x-4\">{children}</div>\n </div>\n);\n\n// ── Item (anchor or button) ─────────────────────────────────────────────────\n\nexport type NavbarItemProps = AnchorHTMLAttributes<HTMLAnchorElement> & {\n active?: boolean;\n /** Resolve theme from the parent `<Navbar>` data attribute. Defaults to `light`. */\n theme?: NavbarTheme;\n};\n\nconst Item = ({\n active = false,\n theme = 'light',\n className,\n children,\n ...rest\n}: NavbarItemProps) => (\n <a\n aria-current={active ? 'page' : undefined}\n className={clsx(ITEM_BASE[theme], active && ITEM_ACTIVE[theme], className)}\n {...rest}\n >\n {children}\n </a>\n);\n\n// ── Actions (right-aligned slot for notifications, avatar, quick action) ───\n\nconst Actions = ({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) => (\n <div className={clsx('hidden md:block', className)} {...rest}>\n <div className=\"ml-4 flex items-center gap-3 md:ml-6\">{children}</div>\n </div>\n);\n\n// ── MobileMenuButton (hamburger for narrow viewports) ──────────────────────\n\nexport type NavbarMobileMenuButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n theme?: NavbarTheme;\n};\n\nconst MobileMenuButton = ({\n theme = 'light',\n className,\n children,\n ...rest\n}: NavbarMobileMenuButtonProps) => (\n <button\n type=\"button\"\n aria-label=\"Toggle menu\"\n className={clsx(\n 'relative inline-flex size-10 items-center justify-center rounded-md md:hidden',\n theme === 'dark'\n ? 'text-gray-400 hover:bg-gray-700 hover:text-white focus-visible:outline focus-visible:outline-2 focus-visible:outline-white'\n : 'text-gray-500 hover:bg-gray-100 hover:text-gray-700 focus-visible:outline focus-visible:outline-2 focus-visible:outline-indigo-500',\n className\n )}\n {...rest}\n >\n {children ?? (\n <svg\n className=\"size-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"1.5\"\n stroke=\"currentColor\"\n aria-hidden\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5\"\n />\n </svg>\n )}\n </button>\n);\n\n// ── Compound export ──────────────────────────────────────────────────────────\n\nexport const Navbar = Object.assign(RootCmp, {\n Brand,\n Items,\n Item,\n Actions,\n MobileMenuButton,\n});\n","import { clsx } from 'clsx';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\n\nexport type PaginationVariant = 'text' | 'compact';\nexport type PaginationSize = 'sm' | 'md';\n\nexport type PaginationProps = {\n /** 1-indexed current page. */\n page: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n /** Render \"Showing X to Y of Z\". Requires `pageSize` + `total`. */\n showInfo?: boolean;\n pageSize?: number;\n total?: number;\n /** `text` (default) shows numbered buttons. `compact` shows chevrons + \"Page X of Y\". */\n variant?: PaginationVariant;\n size?: PaginationSize;\n className?: string;\n};\n\nconst SIZE_BTN: Record<PaginationSize, string> = {\n sm: 'h-8 min-w-8 px-2 text-xs',\n md: 'h-9 min-w-9 px-2.5 text-sm',\n};\n\n/**\n * Compute the list of pages to show with ellipsis markers.\n * `0` represents an ellipsis. Always includes first + last.\n * < 8 pages: render all.\n * page near start: 1 2 3 4 5 ... N\n * page near end: 1 ... N-4 N-3 N-2 N-1 N\n * middle: 1 ... p-1 p p+1 ... N\n */\nconst buildRange = (page: number, total: number): number[] => {\n if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1);\n if (page <= 4) return [1, 2, 3, 4, 5, 0, total];\n if (page >= total - 3) return [1, 0, total - 4, total - 3, total - 2, total - 1, total];\n return [1, 0, page - 1, page, page + 1, 0, total];\n};\n\nexport const Pagination = ({\n page,\n totalPages,\n onPageChange,\n showInfo = false,\n pageSize,\n total,\n variant = 'text',\n size = 'sm',\n className,\n}: PaginationProps) => {\n const safePage = Math.max(1, Math.min(page, Math.max(1, totalPages)));\n const goTo = (p: number) => {\n if (p < 1 || p > totalPages || p === safePage) return;\n onPageChange(p);\n };\n const isFirst = safePage <= 1;\n const isLast = safePage >= totalPages;\n const btnClass =\n 'inline-flex items-center justify-center rounded-md border border-gray-200 bg-white text-gray-700 transition-colors hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-40 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-300 dark:hover:bg-gray-700';\n const activeClass =\n 'bg-brand-500 border-brand-500 text-white hover:bg-brand-600 dark:hover:bg-brand-400';\n\n const infoNode =\n showInfo && pageSize !== undefined && total !== undefined ? (\n <span className=\"text-xs text-gray-500 dark:text-gray-400\">\n Showing{' '}\n <span className=\"font-medium text-gray-700 dark:text-gray-200\">\n {Math.min(total, (safePage - 1) * pageSize + 1)}\n </span>{' '}\n to{' '}\n <span className=\"font-medium text-gray-700 dark:text-gray-200\">\n {Math.min(safePage * pageSize, total)}\n </span>{' '}\n of <span className=\"font-medium text-gray-700 dark:text-gray-200\">{total}</span>\n </span>\n ) : null;\n\n return (\n <nav\n aria-label=\"Pagination\"\n className={clsx(\n 'flex items-center gap-3',\n showInfo ? 'justify-between' : 'justify-center',\n className\n )}\n >\n {infoNode}\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n aria-label=\"Previous page\"\n disabled={isFirst}\n onClick={() => goTo(safePage - 1)}\n className={clsx(btnClass, SIZE_BTN[size])}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n\n {variant === 'compact' ? (\n <span className=\"px-3 text-xs text-gray-600 dark:text-gray-300\">\n Page <span className=\"font-medium\">{safePage}</span> of{' '}\n <span className=\"font-medium\">{Math.max(1, totalPages)}</span>\n </span>\n ) : (\n buildRange(safePage, Math.max(1, totalPages)).map((p, i) =>\n p === 0 ? (\n <span\n key={`ellipsis-${i}`}\n aria-hidden\n className={clsx(\n 'inline-flex items-center justify-center text-gray-400',\n SIZE_BTN[size]\n )}\n >\n …\n </span>\n ) : (\n <button\n key={p}\n type=\"button\"\n aria-label={`Page ${p}`}\n aria-current={p === safePage ? 'page' : undefined}\n onClick={() => goTo(p)}\n className={clsx(btnClass, SIZE_BTN[size], p === safePage && activeClass)}\n >\n {p}\n </button>\n )\n )\n )}\n\n <button\n type=\"button\"\n aria-label=\"Next page\"\n disabled={isLast}\n onClick={() => goTo(safePage + 1)}\n className={clsx(btnClass, SIZE_BTN[size])}\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n </nav>\n );\n};\n","import { clsx } from 'clsx';\nimport { Check } from 'lucide-react';\nimport {\n Children,\n cloneElement,\n isValidElement,\n type ComponentType,\n type ReactElement,\n type ReactNode,\n} from 'react';\n\nexport type StepperOrientation = 'horizontal' | 'vertical';\nexport type StepperSize = 'sm' | 'md';\nexport type StepStatus = 'done' | 'active' | 'pending';\n/**\n * Visual variant. `indicators` (default, existing): numbered circles with a\n * horizontal connector. `bars` (TUI \"Simple\"): coloured top bar above each\n * column with a label/description below — no circle indicator. `panels`\n * (TUI \"Panels\"): row of bordered panels separated by `>` chevrons, each\n * panel hosting a circle indicator + label.\n *\n * `bars` and `panels` are horizontal-only. Default falls back to existing\n * `indicators` rendering for full backward compat.\n */\nexport type StepperVariant = 'indicators' | 'bars' | 'panels';\n\n// ── Step ─────────────────────────────────────────────────────────────────────\n\nexport type StepperStepProps = {\n /** Step label (the headline). */\n children: ReactNode;\n /** Optional secondary text shown under the label. */\n description?: string;\n /** Optional icon shown inside the step indicator. Overridden by a Check when status is `done`. */\n icon?: ComponentType<{ className?: string }>;\n /** Disable user interaction for this step (only meaningful when the parent is `clickable`). */\n disabled?: boolean;\n\n // Internal — set by the parent <Stepper> via cloneElement.\n /** @internal */\n __index?: number;\n /** @internal */\n __status?: StepStatus;\n /** @internal */\n __orientation?: StepperOrientation;\n /** @internal */\n __size?: StepperSize;\n /** @internal */\n __variant?: StepperVariant;\n /** @internal */\n __clickable?: boolean;\n /** @internal */\n __onClick?: (index: number) => void;\n /** @internal */\n __isLast?: boolean;\n};\n\nconst INDICATOR_SIZE: Record<StepperSize, string> = {\n sm: 'h-7 w-7 text-xs',\n md: 'h-9 w-9 text-sm',\n};\n\nconst STATUS_INDICATOR: Record<StepStatus, string> = {\n done: 'border-brand-500 bg-brand-500 text-white',\n active:\n 'border-brand-500 text-brand-600 bg-white ring-4 ring-brand-500/15 dark:bg-gray-900 dark:text-brand-400',\n pending:\n 'border-gray-300 bg-white text-gray-400 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-500',\n};\n\nconst STATUS_LABEL: Record<StepStatus, string> = {\n done: 'text-gray-700 dark:text-gray-200',\n active: 'text-gray-900 dark:text-white font-semibold',\n pending: 'text-gray-400 dark:text-gray-500',\n};\n\nconst StepperStep = ({\n children,\n description,\n icon: Icon,\n disabled,\n __index = 0,\n __status = 'pending',\n __orientation = 'horizontal',\n __size = 'md',\n __variant = 'indicators',\n __clickable = false,\n __onClick,\n __isLast = false,\n}: StepperStepProps) => {\n const interactive = __clickable && !disabled;\n const renderAsButton = __clickable;\n const handleClick = () => {\n if (interactive && __onClick) __onClick(__index);\n };\n\n // ── Variant: bars (TUI \"Simple\") ─────────────────────────────────────────\n // <li class=\"md:flex-1\">\n // <a class=\"group flex flex-col border-l-4 border-brand-500 py-2 pl-4\n // hover:border-brand-700 md:border-t-4 md:border-l-0 md:pt-4 md:pb-0 md:pl-0\">\n // <span class=\"text-sm font-medium text-brand-600\">Step N</span>\n // <span class=\"text-sm font-medium\">{label}</span>\n // </a>\n // </li>\n if (__variant === 'bars') {\n const barColor =\n __status === 'done'\n ? 'border-brand-500'\n : __status === 'active'\n ? 'border-brand-500'\n : 'border-gray-200 dark:border-white/10';\n const stepLabel =\n __status === 'done' || __status === 'active'\n ? 'text-brand-600 dark:text-brand-400'\n : 'text-gray-500 dark:text-gray-400';\n return (\n <li className=\"md:flex-1\">\n <div\n aria-current={__status === 'active' ? 'step' : undefined}\n className={clsx(\n 'group flex flex-col border-l-4 py-2 pl-4 md:border-t-4 md:border-l-0 md:pt-4 md:pb-0 md:pl-0',\n barColor\n )}\n >\n <span className={clsx('text-sm font-medium', stepLabel)}>Step {__index + 1}</span>\n <span className=\"text-sm font-medium text-gray-900 dark:text-white\">{children}</span>\n {description && (\n <span className=\"mt-0.5 text-xs text-gray-500 dark:text-gray-400\">{description}</span>\n )}\n </div>\n </li>\n );\n }\n\n // ── Variant: panels (TUI \"Panels\") ───────────────────────────────────────\n // <li class=\"relative flex md:flex-1\">\n // <span class=\"flex items-center px-6 py-4 text-sm\">\n // <span class=\"flex size-10 items-center justify-center rounded-full {indicator}\">…</span>\n // <span class=\"ml-4 text-sm font-medium\">{label}</span>\n // </span>\n // <ChevronRight class=\"absolute top-0 right-0 hidden md:block\" />\n // </li>\n if (__variant === 'panels') {\n const dotColor =\n __status === 'done'\n ? 'bg-brand-500 text-white border-transparent'\n : __status === 'active'\n ? 'border-brand-500 text-brand-600 dark:text-brand-400'\n : 'border-gray-300 text-gray-500 dark:border-white/10 dark:text-gray-400';\n const labelColor =\n __status === 'active'\n ? 'text-brand-600 dark:text-brand-400'\n : 'text-gray-900 dark:text-white';\n return (\n <li className=\"relative md:flex md:flex-1\">\n <div\n aria-current={__status === 'active' ? 'step' : undefined}\n className=\"group flex w-full items-center\"\n >\n <span className=\"flex items-center px-6 py-4 text-sm font-medium\">\n <span\n className={clsx(\n 'flex size-10 shrink-0 items-center justify-center rounded-full border-2',\n dotColor\n )}\n >\n {__status === 'done' ? (\n <Check className=\"size-5\" aria-hidden />\n ) : (\n <span>{String(__index + 1).padStart(2, '0')}</span>\n )}\n </span>\n <span className={clsx('ml-4 text-sm font-medium', labelColor)}>{children}</span>\n </span>\n </div>\n {!__isLast && (\n <div className=\"absolute top-0 right-0 hidden h-full w-5 md:block\" aria-hidden>\n <svg\n className=\"size-full text-gray-200 dark:text-white/10\"\n viewBox=\"0 0 22 80\"\n fill=\"none\"\n preserveAspectRatio=\"none\"\n >\n <path\n d=\"M0 -2L20 40L0 82\"\n vectorEffect=\"non-scaling-stroke\"\n stroke=\"currentColor\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n )}\n </li>\n );\n }\n\n const indicator = (\n <span\n className={clsx(\n 'relative z-10 flex shrink-0 items-center justify-center rounded-full border-2 font-semibold transition-colors',\n INDICATOR_SIZE[__size],\n STATUS_INDICATOR[__status]\n )}\n >\n {__status === 'done' ? (\n <Check className={clsx(__size === 'sm' ? 'h-3.5 w-3.5' : 'h-4 w-4')} aria-hidden />\n ) : Icon ? (\n <Icon className={clsx(__size === 'sm' ? 'h-3.5 w-3.5' : 'h-4 w-4')} />\n ) : (\n <span>{__index + 1}</span>\n )}\n </span>\n );\n\n const labelBlock = (\n <div className={clsx(__orientation === 'horizontal' ? 'mt-2 text-center' : 'flex-1')}>\n <p className={clsx('text-sm', STATUS_LABEL[__status])}>{children}</p>\n {description && (\n <p className=\"mt-0.5 text-xs text-gray-500 dark:text-gray-400\">{description}</p>\n )}\n </div>\n );\n\n const content = (\n <>\n {indicator}\n {labelBlock}\n </>\n );\n\n // Horizontal: indicator + label stacked, connector to the right of indicator.\n if (__orientation === 'horizontal') {\n return (\n <li className=\"relative flex-1\">\n {/* Connector to the next step (drawn from this step's center to the next). */}\n {!__isLast && (\n <span\n aria-hidden\n className={clsx(\n 'absolute top-0 left-1/2 h-0.5 w-full',\n __status === 'done' ? 'bg-brand-500' : 'bg-gray-200 dark:bg-gray-700',\n __size === 'sm' ? 'mt-[14px]' : 'mt-[18px]'\n )}\n />\n )}\n {renderAsButton ? (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n aria-current={__status === 'active' ? 'step' : undefined}\n className=\"focus-visible:ring-brand-500/40 relative flex w-full flex-col items-center focus:outline-none focus-visible:rounded-md focus-visible:ring-2 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {content}\n </button>\n ) : (\n <div\n aria-current={__status === 'active' ? 'step' : undefined}\n className=\"flex flex-col items-center\"\n >\n {content}\n </div>\n )}\n </li>\n );\n }\n\n // Vertical: indicator on the left, label on the right, connector below indicator.\n return (\n <li className=\"relative flex gap-3 pb-6 last:pb-0\">\n {!__isLast && (\n <span\n aria-hidden\n className={clsx(\n 'absolute top-9 left-[17px] h-full w-0.5 -translate-x-1/2',\n __status === 'done' ? 'bg-brand-500' : 'bg-gray-200 dark:bg-gray-700',\n __size === 'sm' && 'top-7 left-[13px]'\n )}\n />\n )}\n {renderAsButton ? (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n aria-current={__status === 'active' ? 'step' : undefined}\n className=\"focus-visible:ring-brand-500/40 flex w-full items-start gap-3 text-left focus:outline-none focus-visible:rounded-md focus-visible:ring-2 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {content}\n </button>\n ) : (\n <div\n aria-current={__status === 'active' ? 'step' : undefined}\n className=\"flex w-full items-start gap-3\"\n >\n {content}\n </div>\n )}\n </li>\n );\n};\n\n// ── Stepper root ─────────────────────────────────────────────────────────────\n\nexport type StepperProps = {\n /** Current step (0-indexed). Steps before are `done`, equal is `active`, after are `pending`. */\n current: number;\n orientation?: StepperOrientation;\n size?: StepperSize;\n variant?: StepperVariant;\n /** Make steps clickable for back-navigation. */\n clickable?: boolean;\n onStepClick?: (index: number) => void;\n className?: string;\n children: ReactNode;\n};\n\nexport const StepperRoot = ({\n current,\n orientation = 'horizontal',\n size = 'md',\n variant = 'indicators',\n clickable = false,\n onStepClick,\n className,\n children,\n}: StepperProps) => {\n const steps = Children.toArray(children).filter(\n isValidElement\n ) as ReactElement<StepperStepProps>[];\n\n // 'bars' and 'panels' are horizontal-only; force the orientation.\n const effectiveOrientation: StepperOrientation =\n variant === 'indicators' ? orientation : 'horizontal';\n\n const rootClass =\n variant === 'panels'\n ? 'divide-y divide-gray-200 overflow-hidden rounded-md border border-gray-300 md:flex md:divide-x md:divide-y-0 dark:divide-white/10 dark:border-white/10'\n : variant === 'bars'\n ? 'space-y-4 md:flex md:space-y-0 md:space-x-8'\n : effectiveOrientation === 'horizontal'\n ? 'flex w-full items-start'\n : 'flex flex-col';\n\n return (\n <ol className={clsx(rootClass, className)} aria-label=\"Progress\">\n {steps.map((step, i) => {\n const status: StepStatus = i < current ? 'done' : i === current ? 'active' : 'pending';\n return cloneElement(step, {\n key: step.key ?? i,\n __index: i,\n __status: status,\n __orientation: effectiveOrientation,\n __size: size,\n __variant: variant,\n __clickable: clickable,\n __onClick: onStepClick,\n __isLast: i === steps.length - 1,\n });\n })}\n </ol>\n );\n};\n\nexport const Stepper = Object.assign(StepperRoot, { Step: StepperStep });\n","import { clsx } from 'clsx';\nimport {\n forwardRef,\n type AnchorHTMLAttributes,\n type ComponentType,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\n\n// TUI Plus reference (Pattern 1 — \"Simple\"):\n// <nav class=\"flex flex-1 flex-col\">\n// <ul role=\"list\" class=\"-mx-2 space-y-1\">\n// <li>\n// <a href=\"#\" class=\"group flex gap-x-3 rounded-md p-2 text-sm/6 font-semibold\n// bg-gray-50 text-indigo-600\" aria-current=\"page\">Dashboard</a>\n// </li>\n// <li><a class=\"… text-gray-700 hover:bg-gray-50 hover:text-indigo-600\">Team</a></li>\n// …\n// </ul>\n// </nav>\n//\n// Pattern 2 — \"With badges\": same row + trailing badge pill.\n// Pattern 3 — \"With icons\": leading icon (size-6 text-gray-400 group-hover:text-indigo-600).\n// Pattern 6 — \"On gray\": switches the active state to white-on-gray-100 (subtle).\n\n// ── Item ─────────────────────────────────────────────────────────────────────\n\nexport type VerticalNavigationItemProps = AnchorHTMLAttributes<HTMLAnchorElement> & {\n /** Leading icon (lucide-react component). */\n icon?: ComponentType<{ className?: string; 'aria-hidden'?: boolean }>;\n /** Trailing badge content (count, \"new\", etc.). */\n badge?: ReactNode;\n active?: boolean;\n};\n\nconst Item = forwardRef<HTMLAnchorElement, VerticalNavigationItemProps>(function Item(\n { icon: Icon, badge, active = false, className, children, ...rest },\n ref\n) {\n return (\n <li>\n <a\n ref={ref}\n aria-current={active ? 'page' : undefined}\n className={clsx(\n 'group flex items-center gap-x-3 rounded-md p-2 text-sm/6 font-semibold',\n active\n ? 'bg-gray-50 text-indigo-600 dark:bg-white/5 dark:text-indigo-400'\n : 'text-gray-700 hover:bg-gray-50 hover:text-indigo-600 dark:text-gray-300 dark:hover:bg-white/5 dark:hover:text-indigo-400',\n className\n )}\n {...rest}\n >\n {Icon && (\n <Icon\n className={clsx(\n 'size-5 shrink-0',\n active\n ? 'text-indigo-600 dark:text-indigo-400'\n : 'text-gray-400 group-hover:text-indigo-600 dark:text-gray-500 dark:group-hover:text-indigo-400'\n )}\n aria-hidden\n />\n )}\n <span className=\"flex-1 truncate\">{children}</span>\n {badge && (\n <span\n className={clsx(\n 'ml-auto inline-flex h-5 min-w-5 items-center justify-center rounded-full px-1.5 text-xs font-medium ring-1 ring-inset',\n active\n ? 'bg-white text-indigo-600 ring-indigo-600/20 dark:bg-gray-900 dark:text-indigo-400 dark:ring-indigo-400/30'\n : 'bg-white text-gray-700 ring-gray-200 dark:bg-gray-900 dark:text-gray-300 dark:ring-white/10'\n )}\n >\n {badge}\n </span>\n )}\n </a>\n </li>\n );\n});\n\n// ── Section heading (between item groups) ───────────────────────────────────\n\nexport type VerticalNavigationSectionProps = HTMLAttributes<HTMLLIElement> & {\n /** Section label, rendered as a small uppercase header. */\n label: ReactNode;\n};\n\nconst Section = ({ label, children, className, ...rest }: VerticalNavigationSectionProps) => (\n <li className={clsx('mt-4 first:mt-0', className)} {...rest}>\n <div className=\"px-2 text-xs/6 font-semibold text-gray-400 dark:text-gray-500\">{label}</div>\n <ul role=\"list\" className=\"-mx-2 mt-1 space-y-1\">\n {children}\n </ul>\n </li>\n);\n\n// ── Root ─────────────────────────────────────────────────────────────────────\n\nexport type VerticalNavigationProps = HTMLAttributes<HTMLElement> & {\n /** Tighter padding (TUI \"On gray\" pattern), useful inside a gray-bg surface. */\n variant?: 'default' | 'on-gray';\n children: ReactNode;\n};\n\nconst Root = forwardRef<HTMLElement, VerticalNavigationProps>(function VerticalNavigationRoot(\n { variant = 'default', className, children, ...rest },\n ref\n) {\n return (\n <nav\n ref={ref}\n aria-label=\"Sidebar\"\n className={clsx(\n 'flex flex-1 flex-col',\n variant === 'on-gray' && 'rounded-md bg-gray-50 p-3 dark:bg-gray-800/60',\n className\n )}\n {...rest}\n >\n <ul role=\"list\" className=\"-mx-2 space-y-1\">\n {children}\n </ul>\n </nav>\n );\n});\n\n// ── Compound export ──────────────────────────────────────────────────────────\n\nexport const VerticalNavigation = Object.assign(Root, { Item, Section });\n","import { clsx } from 'clsx';\nimport type { ButtonHTMLAttributes, ElementType, ReactNode } from 'react';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger' | 'soft';\nexport type ButtonSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n/**\n * Corner radius shape. Default `rounded` (TUI default `rounded-md`).\n * Use `pill` for fully-rounded (TUI \"Rounded primary/secondary\"),\n * `circle` for icon-only square buttons (TUI \"Circular\").\n */\nexport type ButtonShape = 'rounded' | 'pill' | 'circle';\n\nexport type ButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n variant?: ButtonVariant;\n size?: ButtonSize;\n shape?: ButtonShape;\n icon?: ElementType;\n iconPosition?: 'left' | 'right';\n loading?: boolean;\n children?: ReactNode;\n};\n\nconst VARIANT_CLASS: Record<ButtonVariant, string> = {\n primary:\n 'bg-brand-500 hover:bg-brand-600 text-white shadow-sm disabled:bg-brand-500/50 disabled:cursor-not-allowed',\n secondary:\n 'bg-white text-gray-700 border border-gray-200 hover:bg-gray-50 dark:bg-gray-800 dark:text-gray-200 dark:border-gray-700 dark:hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed',\n ghost:\n 'text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-white/5 disabled:opacity-50 disabled:cursor-not-allowed',\n danger:\n 'bg-red-500 hover:bg-red-600 text-white shadow-sm disabled:opacity-50 disabled:cursor-not-allowed',\n // TUI Plus \"Soft buttons\" — tinted background, no border, matching text.\n soft: 'bg-brand-50 text-brand-700 hover:bg-brand-100 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-brand-500/10 dark:text-brand-300 dark:hover:bg-brand-500/20',\n};\n\nconst SIZE_CLASS: Record<ButtonSize, string> = {\n xs: 'h-7 px-2 text-xs gap-1',\n sm: 'h-8 px-3 text-xs gap-1.5',\n md: 'h-9 px-3.5 text-sm gap-2',\n lg: 'h-11 px-5 text-base gap-2',\n xl: 'h-12 px-6 text-base gap-2.5',\n};\n\n// Square padding when shape='circle' — overrides horizontal px from SIZE_CLASS.\nconst CIRCLE_SQUARE: Record<ButtonSize, string> = {\n xs: 'w-7 px-0',\n sm: 'w-8 px-0',\n md: 'w-9 px-0',\n lg: 'w-11 px-0',\n xl: 'w-12 px-0',\n};\n\nconst SHAPE_CLASS: Record<ButtonShape, string> = {\n rounded: 'rounded-lg',\n pill: 'rounded-full',\n circle: 'rounded-full',\n};\n\nconst ICON_SIZE: Record<ButtonSize, string> = {\n xs: 'h-3 w-3',\n sm: 'h-3.5 w-3.5',\n md: 'h-4 w-4',\n lg: 'h-5 w-5',\n xl: 'h-5 w-5',\n};\n\nexport const Button = ({\n variant = 'primary',\n size = 'md',\n shape = 'rounded',\n icon: Icon,\n iconPosition = 'left',\n loading = false,\n disabled,\n className,\n children,\n type = 'button',\n ...rest\n}: ButtonProps) => (\n <button\n type={type}\n disabled={disabled || loading}\n className={clsx(\n 'focus-visible:ring-brand-500/40 inline-flex items-center justify-center font-medium transition-colors focus:outline-none focus-visible:ring-2',\n VARIANT_CLASS[variant],\n SIZE_CLASS[size],\n SHAPE_CLASS[shape],\n shape === 'circle' && CIRCLE_SQUARE[size],\n className\n )}\n {...rest}\n >\n {Icon && iconPosition === 'left' && !loading && <Icon className={ICON_SIZE[size]} />}\n {loading && (\n <span\n aria-hidden\n className={clsx(\n 'animate-spin rounded-full border-2 border-current border-t-transparent',\n ICON_SIZE[size]\n )}\n />\n )}\n {children}\n {Icon && iconPosition === 'right' && !loading && <Icon className={ICON_SIZE[size]} />}\n </button>\n);\n","import { clsx } from 'clsx';\nimport type { ImgHTMLAttributes, ReactNode } from 'react';\n\nexport type CardProps = {\n children: ReactNode;\n className?: string;\n padding?: 'none' | 'sm' | 'md' | 'lg';\n /** Adds hover-lift + cursor-pointer affordance. Pair with `as=\"a\"` or wrap in your router's Link. */\n interactive?: boolean;\n /**\n * When `true`, the card is flush with the viewport edges on mobile\n * (no rounded corners, no horizontal margins) and switches to rounded\n * + bordered at the `sm` breakpoint and above. Mirrors the TUI Plus\n * \"Card, edge-to-edge on mobile\" pattern.\n */\n edgeToEdgeMobile?: boolean;\n};\n\nconst PADDING_CLASS = {\n none: '',\n sm: 'p-3',\n md: 'p-4',\n lg: 'p-6',\n} as const;\n\nconst Root = ({\n children,\n className,\n padding = 'md',\n interactive = false,\n edgeToEdgeMobile = false,\n}: CardProps) => (\n <div\n className={clsx(\n 'overflow-hidden bg-white dark:bg-gray-900',\n edgeToEdgeMobile\n ? 'border-y border-gray-200 sm:rounded-2xl sm:border dark:border-gray-800'\n : 'rounded-2xl border border-gray-200 dark:border-gray-800',\n interactive &&\n 'focus-within:ring-brand-500/30 cursor-pointer transition-all focus-within:ring-2 hover:-translate-y-0.5 hover:shadow-md',\n PADDING_CLASS[padding],\n className\n )}\n >\n {children}\n </div>\n);\n\nconst Header = ({ children, className }: { children: ReactNode; className?: string }) => (\n <div\n className={clsx(\n 'flex items-center justify-between border-b border-gray-200 px-4 py-3 dark:border-gray-800',\n className\n )}\n >\n {children}\n </div>\n);\n\nconst Body = ({ children, className }: { children: ReactNode; className?: string }) => (\n <div className={clsx('p-4', className)}>{children}</div>\n);\n\nconst Footer = ({ children, className }: { children: ReactNode; className?: string }) => (\n <div\n className={clsx(\n 'flex items-center justify-end gap-2 border-t border-gray-200 px-4 py-3 dark:border-gray-800',\n className\n )}\n >\n {children}\n </div>\n);\n\n// ── Image ────────────────────────────────────────────────────────────────────\n\nexport type CardImageProps = ImgHTMLAttributes<HTMLImageElement> & {\n /** Aspect ratio class (Tailwind). Default `aspect-video`. */\n aspectRatio?: string;\n /** Wrapper className (the `<img>` is inside). */\n wrapperClassName?: string;\n};\n\nconst Image = ({\n aspectRatio = 'aspect-video',\n wrapperClassName,\n className,\n alt,\n ...rest\n}: CardImageProps) => (\n <div\n className={clsx(\n 'w-full overflow-hidden bg-gray-100 dark:bg-gray-800',\n aspectRatio,\n wrapperClassName\n )}\n >\n <img alt={alt} className={clsx('h-full w-full object-cover', className)} {...rest} />\n </div>\n);\n\nexport const Card = Object.assign(Root, { Header, Body, Footer, Image });\n","import { clsx } from 'clsx';\nimport type { ElementType, ReactNode } from 'react';\n\nexport type BadgeVariant = 'neutral' | 'brand' | 'success' | 'warning' | 'danger' | 'info';\nexport type BadgeSize = 'sm' | 'md';\nexport type BadgeAppearance = 'light' | 'solid';\n\nexport type BadgeProps = {\n children: ReactNode;\n variant?: BadgeVariant;\n size?: BadgeSize;\n /** Visual style. `light` (default) = soft tinted bg + colored text. `solid` = filled bg + white text. */\n appearance?: BadgeAppearance;\n /** Optional Lucide icon. */\n icon?: ElementType;\n iconPosition?: 'left' | 'right';\n className?: string;\n};\n\nconst VARIANT_LIGHT: Record<BadgeVariant, string> = {\n neutral: 'bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-300',\n brand: 'bg-brand-50 text-brand-700 dark:bg-brand-500/15 dark:text-brand-400',\n success: 'bg-green-100 text-green-700 dark:bg-green-500/15 dark:text-green-400',\n warning: 'bg-amber-100 text-amber-700 dark:bg-amber-500/15 dark:text-amber-400',\n danger: 'bg-red-100 text-red-700 dark:bg-red-500/15 dark:text-red-400',\n info: 'bg-blue-100 text-blue-700 dark:bg-blue-500/15 dark:text-blue-400',\n};\n\nconst VARIANT_SOLID: Record<BadgeVariant, string> = {\n neutral: 'bg-gray-600 text-white dark:bg-gray-500',\n brand: 'bg-brand-500 text-white',\n success: 'bg-green-500 text-white',\n warning: 'bg-amber-500 text-white',\n danger: 'bg-red-500 text-white',\n info: 'bg-blue-500 text-white',\n};\n\nconst SIZE_CLASS: Record<BadgeSize, string> = {\n sm: 'px-1.5 py-0.5 text-[10px] gap-1',\n md: 'px-2 py-0.5 text-xs gap-1.5',\n};\n\nconst ICON_SIZE: Record<BadgeSize, string> = {\n sm: 'h-2.5 w-2.5',\n md: 'h-3 w-3',\n};\n\nexport const Badge = ({\n children,\n variant = 'neutral',\n size = 'md',\n appearance = 'light',\n icon: Icon,\n iconPosition = 'left',\n className,\n}: BadgeProps) => {\n const variantMap = appearance === 'solid' ? VARIANT_SOLID : VARIANT_LIGHT;\n const iconClass = ICON_SIZE[size];\n return (\n <span\n className={clsx(\n 'inline-flex items-center rounded-full font-semibold',\n variantMap[variant],\n SIZE_CLASS[size],\n className\n )}\n >\n {Icon && iconPosition === 'left' && (\n <Icon className={clsx('shrink-0', iconClass)} aria-hidden />\n )}\n <span>{children}</span>\n {Icon && iconPosition === 'right' && (\n <Icon className={clsx('shrink-0', iconClass)} aria-hidden />\n )}\n </span>\n );\n};\n","import { clsx } from 'clsx';\nimport { useState } from 'react';\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl';\n\nexport type AvatarProps = {\n src?: string;\n alt?: string;\n /** Used to compute initials if `src` not provided or fails to load. */\n name?: string;\n size?: AvatarSize;\n className?: string;\n};\n\nconst SIZE_CLASS: Record<AvatarSize, string> = {\n xs: 'h-6 w-6 text-[10px]',\n sm: 'h-8 w-8 text-xs',\n md: 'h-10 w-10 text-sm',\n lg: 'h-12 w-12 text-base',\n xl: 'h-16 w-16 text-lg',\n '2xl': 'h-20 w-20 text-xl',\n '3xl': 'h-24 w-24 text-2xl',\n};\n\nconst initialsOf = (name?: string): string => {\n if (!name) return '?';\n const parts = name.trim().split(/\\s+/).slice(0, 2);\n return parts.map((p) => p[0]?.toUpperCase() ?? '').join('') || '?';\n};\n\nexport const Avatar = ({ src, alt, name, size = 'md', className }: AvatarProps) => {\n const [failed, setFailed] = useState(false);\n const showImage = src && !failed;\n return (\n <span\n className={clsx(\n 'bg-brand-500/10 text-brand-600 dark:bg-brand-500/15 dark:text-brand-400 inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full font-semibold',\n SIZE_CLASS[size],\n className\n )}\n aria-label={alt ?? name}\n >\n {showImage ? (\n <img\n src={src}\n alt={alt ?? name ?? ''}\n onError={() => setFailed(true)}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <span>{initialsOf(name)}</span>\n )}\n </span>\n );\n};\n","import { clsx } from 'clsx';\nimport { HelpCircle } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nexport type TooltipPosition = 'top' | 'bottom' | 'left' | 'right';\nexport type TooltipVariant = 'dark' | 'white' | 'brand';\n\nconst BOX_POS: Record<TooltipPosition, string> = {\n top: 'bottom-full left-1/2 -translate-x-1/2 mb-2.5',\n bottom: 'top-full left-1/2 -translate-x-1/2 mt-2.5',\n left: 'right-full top-1/2 -translate-y-1/2 mr-2.5',\n right: 'left-full top-1/2 -translate-y-1/2 ml-2.5',\n};\n\nconst ARROW_POS: Record<TooltipPosition, string> = {\n top: 'top-full left-1/2 -translate-x-1/2 -translate-y-1/2',\n bottom: 'bottom-full left-1/2 -translate-x-1/2 translate-y-1/2',\n left: 'left-full top-1/2 -translate-x-1/2 -translate-y-1/2',\n right: 'right-full top-1/2 translate-x-1/2 -translate-y-1/2',\n};\n\nconst VARIANT_BOX: Record<TooltipVariant, string> = {\n dark: 'bg-gray-900 text-white shadow-[0_0_20px_rgba(0,0,0,0.35)] dark:bg-gray-700',\n white:\n 'bg-white text-gray-700 border border-gray-200 shadow-[0_0_20px_rgba(0,0,0,0.15)] dark:bg-gray-800 dark:text-gray-200 dark:border-gray-700',\n brand: 'bg-brand-500 text-white shadow-[0_0_20px_rgba(0,0,0,0.25)]',\n};\n\nconst VARIANT_ARROW: Record<TooltipVariant, string> = {\n dark: 'bg-gray-900 dark:bg-gray-700',\n white: 'bg-white border border-gray-200 dark:bg-gray-800 dark:border-gray-700',\n brand: 'bg-brand-500',\n};\n\nexport type TooltipProps = {\n content: ReactNode;\n children: ReactNode;\n position?: TooltipPosition;\n variant?: TooltipVariant;\n /** Tailwind max-width class — default `max-w-xs` (320px) */\n maxWidth?: string;\n};\n\nexport const Tooltip = ({\n content,\n children,\n position = 'top',\n variant = 'dark',\n maxWidth = 'max-w-xs',\n}: TooltipProps) => (\n // `inline-block w-fit` keeps the wrapper exactly the size of the children even\n // inside grid/flex parents, so the absolute-positioned tooltip stays anchored\n // on the trigger rather than on the parent cell.\n <span className=\"group relative inline-block w-fit align-middle\">\n {children}\n <span\n role=\"tooltip\"\n className={clsx(\n 'pointer-events-none absolute z-50 block w-max rounded-lg px-3 py-2 text-xs leading-relaxed font-normal whitespace-normal opacity-0 transition-opacity duration-150 group-hover:opacity-100',\n maxWidth,\n BOX_POS[position],\n VARIANT_BOX[variant]\n )}\n >\n {content}\n <span\n aria-hidden\n className={clsx('absolute h-2 w-2 rotate-45', ARROW_POS[position], VARIANT_ARROW[variant])}\n />\n </span>\n </span>\n);\n\nexport const TooltipHelp = ({\n text,\n position = 'top',\n variant = 'dark',\n}: {\n text: string;\n position?: TooltipPosition;\n variant?: TooltipVariant;\n}) => (\n <Tooltip content={text} position={position} variant={variant} maxWidth=\"max-w-[260px]\">\n <HelpCircle className=\"h-3.5 w-3.5 cursor-help text-gray-400 transition-colors hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300\" />\n </Tooltip>\n);\n","import { clsx } from 'clsx';\nimport { Check, ChevronDown } from 'lucide-react';\nimport { useEffect, useRef, useState } from 'react';\nimport type { ElementType } from 'react';\n\nexport type DropdownOption = {\n value: string;\n label: string;\n icon?: ElementType;\n disabled?: boolean;\n};\n\nexport type DropdownDivider = { divider: true };\n\nexport type DropdownItem = DropdownOption | DropdownDivider;\n\nconst isDivider = (item: DropdownItem): item is DropdownDivider =>\n (item as DropdownDivider).divider === true;\n\nexport type DropdownProps = {\n label?: string;\n icon?: ElementType;\n options: DropdownItem[];\n value?: string;\n onChange?: (value: string) => void;\n placeholder?: string;\n align?: 'left' | 'right';\n disabled?: boolean;\n className?: string;\n};\n\nexport const Dropdown = ({\n label,\n icon: TriggerIcon,\n options,\n value,\n onChange,\n placeholder,\n align = 'left',\n disabled = false,\n className,\n}: DropdownProps) => {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open]);\n\n const selected = options.find((o): o is DropdownOption => !isDivider(o) && o.value === value);\n const displayLabel = selected?.label ?? placeholder ?? label ?? 'Select…';\n\n return (\n <div ref={ref} className={clsx('relative inline-block', className)}>\n <button\n type=\"button\"\n onClick={() => !disabled && setOpen((v) => !v)}\n disabled={disabled}\n className={clsx(\n 'flex h-9 items-center gap-2 rounded-lg border border-gray-200 bg-white px-3 text-sm font-medium text-gray-700 transition-colors hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-300 dark:hover:bg-gray-700',\n open && 'ring-brand-500/30 ring-2'\n )}\n >\n {TriggerIcon && <TriggerIcon className=\"h-4 w-4 shrink-0 text-gray-400\" />}\n <span className=\"truncate\">{displayLabel}</span>\n <ChevronDown\n className={clsx(\n 'h-4 w-4 shrink-0 text-gray-400 transition-transform',\n open && 'rotate-180'\n )}\n />\n </button>\n\n {open && (\n <>\n <div className=\"fixed inset-0 z-40\" onClick={() => setOpen(false)} />\n <div\n className={clsx(\n 'absolute top-full z-50 mt-1 min-w-[180px] overflow-hidden rounded-xl border border-gray-200 bg-white shadow-lg dark:border-gray-700 dark:bg-gray-800',\n align === 'right' ? 'right-0' : 'left-0'\n )}\n >\n {options.map((opt, idx) => {\n if (isDivider(opt)) {\n return (\n <div\n key={`divider-${idx}`}\n role=\"separator\"\n className=\"my-1 border-t border-gray-100 dark:border-gray-800\"\n />\n );\n }\n const Icon = opt.icon;\n const isSelected = opt.value === value;\n return (\n <button\n key={opt.value}\n type=\"button\"\n disabled={opt.disabled}\n onClick={() => {\n onChange?.(opt.value);\n setOpen(false);\n }}\n className={clsx(\n 'flex w-full items-center gap-2 px-4 py-2 text-left text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-50',\n isSelected\n ? 'bg-brand-50 text-brand-600 dark:bg-brand-500/10 dark:text-brand-400'\n : 'text-gray-700 hover:bg-gray-50 dark:text-gray-300 dark:hover:bg-white/5'\n )}\n >\n {Icon && <Icon className=\"h-4 w-4 shrink-0 text-gray-400\" />}\n <span className=\"flex-1 truncate\">{opt.label}</span>\n {isSelected && <Check className=\"text-brand-500 h-3.5 w-3.5 shrink-0\" />}\n </button>\n );\n })}\n </div>\n </>\n )}\n </div>\n );\n};\n","import { clsx } from 'clsx';\nimport { AlertTriangle, CheckCircle2, Info, X, XCircle, type LucideIcon } from 'lucide-react';\nimport { useEffect, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Button, type ButtonVariant } from './Button';\n\nexport type ModalSize = 'sm' | 'md' | 'lg' | 'xl' | 'full';\n\nconst SIZE_CLASS: Record<ModalSize, string> = {\n sm: 'max-w-sm',\n md: 'max-w-md',\n lg: 'max-w-lg',\n xl: 'max-w-2xl',\n full: 'h-full w-full max-w-none rounded-none',\n};\n\nexport type ModalProps = {\n open: boolean;\n onClose: () => void;\n size?: ModalSize;\n className?: string;\n children: ReactNode;\n};\n\nconst Root = ({ open, onClose, size = 'md', className, children }: ModalProps) => {\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [open, onClose]);\n\n if (!open) return null;\n\n const isFull = size === 'full';\n\n // Portal into document.body so the dialog escapes any clipping ancestor\n // (cards, sidebars, overflow:hidden containers).\n return createPortal(\n <div\n className={clsx(\n 'fixed inset-0 z-50 flex',\n isFull ? 'items-stretch justify-stretch' : 'items-center justify-center p-4'\n )}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n <div\n className=\"absolute inset-0 bg-black/50 backdrop-blur-sm\"\n onClick={onClose}\n aria-hidden\n />\n <div\n className={clsx(\n 'relative w-full overflow-hidden border border-gray-200 bg-white shadow-2xl dark:border-gray-800 dark:bg-gray-900',\n isFull ? '' : 'rounded-2xl',\n SIZE_CLASS[size],\n className\n )}\n >\n {children}\n </div>\n </div>,\n document.body\n );\n};\n\nexport type ModalHeaderProps = {\n title?: ReactNode;\n description?: ReactNode;\n onClose?: () => void;\n className?: string;\n children?: ReactNode;\n};\n\nconst Header = ({ title, description, onClose, className, children }: ModalHeaderProps) => (\n <div\n className={clsx(\n 'flex items-start justify-between gap-4 border-b border-gray-200 px-5 py-4 dark:border-gray-800',\n className\n )}\n >\n <div className=\"min-w-0 flex-1\">\n {title && (\n <h2 className=\"text-base font-semibold text-gray-900 dark:text-gray-100\">{title}</h2>\n )}\n {description && (\n <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">{description}</p>\n )}\n {children}\n </div>\n {onClose && (\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close modal\"\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-white/5 dark:hover:text-gray-300\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n);\n\nconst Body = ({ children, className }: { children: ReactNode; className?: string }) => (\n <div className={clsx('px-5 py-4', className)}>{children}</div>\n);\n\nconst Footer = ({ children, className }: { children: ReactNode; className?: string }) => (\n <div\n className={clsx(\n 'flex items-center justify-end gap-2 border-t border-gray-200 bg-gray-50 px-5 py-3 dark:border-gray-800 dark:bg-gray-800/50',\n className\n )}\n >\n {children}\n </div>\n);\n\n// ── Alert (convenience) ──────────────────────────────────────────────────────\n\nexport type ModalAlertIntent = 'info' | 'warning' | 'danger' | 'success';\n\nconst ALERT_ICON: Record<ModalAlertIntent, LucideIcon> = {\n info: Info,\n warning: AlertTriangle,\n danger: XCircle,\n success: CheckCircle2,\n};\n\nconst ALERT_CHIP: Record<ModalAlertIntent, string> = {\n info: 'bg-blue-100 text-blue-600 dark:bg-blue-500/15 dark:text-blue-400',\n warning: 'bg-amber-100 text-amber-600 dark:bg-amber-500/15 dark:text-amber-400',\n danger: 'bg-red-100 text-red-600 dark:bg-red-500/15 dark:text-red-400',\n success: 'bg-green-100 text-green-600 dark:bg-green-500/15 dark:text-green-400',\n};\n\nconst ALERT_PRIMARY_VARIANT: Record<ModalAlertIntent, ButtonVariant> = {\n info: 'primary',\n warning: 'primary',\n danger: 'danger',\n success: 'primary',\n};\n\nexport type ModalAlertLayout = 'centered' | 'horizontal';\n\nexport type ModalAlertProps = {\n open: boolean;\n onClose: () => void;\n intent?: ModalAlertIntent;\n title: string;\n message?: ReactNode;\n /** Primary action label. Default `OK`. */\n confirmLabel?: string;\n /** Cancel action label. When omitted, no cancel button is rendered. */\n cancelLabel?: string;\n /** Called when the primary action is clicked. Defaults to `onClose`. */\n onConfirm?: () => void;\n /** Called when Cancel is clicked. Defaults to `onClose`. */\n onCancel?: () => void;\n /** When true, the primary button shows a spinner and both buttons are disabled. */\n loading?: boolean;\n /**\n * Visual layout. `centered` (default): icon + title + buttons stacked\n * vertically and centered (TUI \"Centered with single action\").\n * `horizontal`: icon to the left of the title/message, with buttons in\n * a separate gray footer right-aligned (TUI \"Simple with gray footer\").\n */\n layout?: ModalAlertLayout;\n /**\n * In `centered` layout, render the primary action as a single\n * full-width button (TUI \"Centered with single action\" pattern).\n * Has no effect in `horizontal` layout.\n */\n fullWidthAction?: boolean;\n};\n\nconst Alert = ({\n open,\n onClose,\n intent = 'info',\n title,\n message,\n confirmLabel = 'OK',\n cancelLabel,\n onConfirm,\n onCancel,\n loading = false,\n layout = 'centered',\n fullWidthAction = false,\n}: ModalAlertProps) => {\n const Icon = ALERT_ICON[intent];\n const primaryVariant = ALERT_PRIMARY_VARIANT[intent];\n const handleConfirm = () => (onConfirm ? onConfirm() : onClose());\n const handleCancel = () => (onCancel ? onCancel() : onClose());\n\n if (layout === 'horizontal') {\n return (\n <Root open={open} onClose={onClose} size=\"lg\">\n <div className=\"bg-white sm:flex sm:items-start sm:p-6 dark:bg-gray-900\">\n <div\n className={clsx(\n 'mx-auto flex size-12 shrink-0 items-center justify-center rounded-full sm:mx-0 sm:size-10',\n ALERT_CHIP[intent]\n )}\n >\n <Icon className=\"size-6\" aria-hidden />\n </div>\n <div className=\"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left\">\n <h2 className=\"text-base font-semibold text-gray-900 dark:text-white\">{title}</h2>\n {message && (\n <div className=\"mt-2 text-sm text-gray-500 dark:text-gray-400\">{message}</div>\n )}\n </div>\n </div>\n <div className=\"flex flex-col-reverse gap-2 bg-gray-50 px-4 py-3 sm:flex-row sm:justify-end sm:gap-3 sm:px-6 dark:bg-gray-800/50\">\n {cancelLabel && (\n <Button variant=\"secondary\" disabled={loading} onClick={handleCancel}>\n {cancelLabel}\n </Button>\n )}\n <Button\n variant={primaryVariant}\n loading={loading}\n disabled={loading}\n onClick={handleConfirm}\n >\n {confirmLabel}\n </Button>\n </div>\n </Root>\n );\n }\n\n return (\n <Root open={open} onClose={onClose} size=\"sm\">\n <div className=\"p-6 text-center\">\n <div\n className={clsx(\n 'mx-auto flex size-12 items-center justify-center rounded-full',\n ALERT_CHIP[intent]\n )}\n >\n <Icon className=\"size-6\" aria-hidden />\n </div>\n <h2 className=\"mt-4 text-base font-semibold text-gray-900 dark:text-white\">{title}</h2>\n {message && <div className=\"mt-2 text-sm text-gray-600 dark:text-gray-400\">{message}</div>}\n <div\n className={clsx(\n 'mt-5',\n fullWidthAction ? 'flex flex-col gap-2' : 'flex items-center justify-center gap-2'\n )}\n >\n {cancelLabel && (\n <Button\n variant=\"secondary\"\n disabled={loading}\n onClick={handleCancel}\n className={clsx(fullWidthAction && 'w-full')}\n >\n {cancelLabel}\n </Button>\n )}\n <Button\n variant={primaryVariant}\n loading={loading}\n disabled={loading}\n onClick={handleConfirm}\n className={clsx(fullWidthAction && 'w-full')}\n >\n {confirmLabel}\n </Button>\n </div>\n </div>\n </Root>\n );\n};\n\nexport const Modal = Object.assign(Root, { Header, Body, Footer, Alert });\n","import { clsx } from 'clsx';\nimport { X } from 'lucide-react';\nimport { useEffect } from 'react';\nimport type { ElementType, ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport type DrawerSide = 'left' | 'right';\nexport type DrawerSize = 'sm' | 'md' | 'lg';\n\nconst SIZE_CLASS: Record<DrawerSize, string> = {\n sm: 'w-72',\n md: 'w-96',\n lg: 'w-[28rem]',\n};\n\n// Close-outside button offset = panel width. Used to position the X exactly\n// next to the panel edge, on the backdrop.\nconst OUTSIDE_OFFSET_RIGHT: Record<DrawerSize, string> = {\n sm: 'right-72',\n md: 'right-96',\n lg: 'right-[28rem]',\n};\nconst OUTSIDE_OFFSET_LEFT: Record<DrawerSize, string> = {\n sm: 'left-72',\n md: 'left-96',\n lg: 'left-[28rem]',\n};\n\nconst SIDE_CLASS: Record<DrawerSide, string> = {\n left: 'left-0 border-r',\n right: 'right-0 border-l',\n};\n\nconst SIDE_TRANSFORM: Record<DrawerSide, { open: string; closed: string }> = {\n left: { open: 'translate-x-0', closed: '-translate-x-full' },\n right: { open: 'translate-x-0', closed: 'translate-x-full' },\n};\n\nexport type DrawerProps = {\n open: boolean;\n onClose: () => void;\n side?: DrawerSide;\n size?: DrawerSize;\n /**\n * Render a translucent overlay behind the panel that closes on click.\n * Default `true`. Set `false` for the TUI \"Empty\" slide-over pattern\n * where the page stays interactive behind the panel.\n */\n withBackdrop?: boolean;\n /**\n * Render the close button on the backdrop (outside the panel), opposite\n * the chosen `side`. Mirrors the TUI \"With close button on outside\"\n * pattern. When `true`, no close button is rendered inside `Drawer.Header`\n * — handle the X via this overlay button instead.\n * Has no effect when `withBackdrop` is `false`.\n */\n closeOutside?: boolean;\n className?: string;\n children: ReactNode;\n};\n\nconst Root = ({\n open,\n onClose,\n side = 'right',\n size = 'md',\n withBackdrop = true,\n closeOutside = false,\n className,\n children,\n}: DrawerProps) => {\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [open, onClose]);\n\n // Portal into document.body so the drawer escapes any clipping ancestor\n // (cards, sidebars, overflow:hidden containers). Without this, calling\n // Drawer from inside e.g. a SectionCard or modal renders it in a\n // confined coordinate space and the panel never appears.\n return createPortal(\n <>\n {withBackdrop && (\n <div\n className={clsx(\n 'fixed inset-0 z-40 bg-gray-500/75 transition-opacity duration-300 dark:bg-gray-900/75',\n open ? 'opacity-100' : 'pointer-events-none opacity-0'\n )}\n onClick={onClose}\n aria-hidden\n />\n )}\n {withBackdrop && closeOutside && (\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close drawer\"\n className={clsx(\n 'fixed top-4 z-50 flex size-10 items-center justify-center rounded-full text-gray-300 transition-opacity duration-300 hover:text-white focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white',\n // Position close button adjacent to the panel edge, on the backdrop.\n side === 'right' ? OUTSIDE_OFFSET_RIGHT[size] : OUTSIDE_OFFSET_LEFT[size],\n open ? 'opacity-100' : 'pointer-events-none opacity-0'\n )}\n >\n <X className=\"size-6\" aria-hidden />\n </button>\n )}\n <aside\n className={clsx(\n 'fixed top-0 bottom-0 z-50 flex flex-col border-gray-200 bg-white shadow-2xl transition-transform duration-300 ease-in-out dark:border-gray-800 dark:bg-gray-900',\n SIDE_CLASS[side],\n SIZE_CLASS[size],\n open ? SIDE_TRANSFORM[side].open : SIDE_TRANSFORM[side].closed,\n className\n )}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n {children}\n </aside>\n </>,\n document.body\n );\n};\n\nexport type DrawerHeaderProps = {\n title: ReactNode;\n icon?: ElementType;\n description?: ReactNode;\n onClose?: () => void;\n className?: string;\n children?: ReactNode;\n};\n\nconst Header = ({\n title,\n icon: Icon,\n description,\n onClose,\n className,\n children,\n}: DrawerHeaderProps) => (\n <div\n className={clsx(\n 'flex shrink-0 items-center justify-between border-b border-gray-200 p-5 dark:border-gray-800',\n className\n )}\n >\n <div className=\"flex min-w-0 items-center gap-2.5\">\n {Icon && (\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-gray-100 dark:bg-gray-800\">\n <Icon className=\"h-4 w-4 text-gray-500 dark:text-gray-400\" />\n </div>\n )}\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-base font-semibold text-gray-900 dark:text-white\">{title}</h3>\n {description && (\n <p className=\"mt-0.5 truncate text-sm text-gray-500 dark:text-gray-400\">{description}</p>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n {children}\n {onClose && (\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close drawer\"\n className=\"text-gray-400 transition-colors hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n )}\n </div>\n </div>\n);\n\nconst Body = ({ children, className }: { children: ReactNode; className?: string }) => (\n <div className={clsx('flex-1 overflow-y-auto p-5', className)}>{children}</div>\n);\n\nconst Footer = ({ children, className }: { children: ReactNode; className?: string }) => (\n <div\n className={clsx(\n 'flex shrink-0 items-center justify-end gap-2 border-t border-gray-200 bg-gray-50 px-5 py-3 dark:border-gray-800 dark:bg-gray-800/50',\n className\n )}\n >\n {children}\n </div>\n);\n\nexport const Drawer = Object.assign(Root, { Header, Body, Footer });\n","import { clsx } from 'clsx';\nimport { createContext, useContext } from 'react';\nimport type { ElementType, ReactNode } from 'react';\n\nexport type TabsOrientation = 'horizontal' | 'vertical';\n\ntype TabsContextValue = {\n value: string;\n onChange: (value: string) => void;\n orientation: TabsOrientation;\n};\n\nconst TabsContext = createContext<TabsContextValue | null>(null);\n\nconst useTabs = () => {\n const ctx = useContext(TabsContext);\n if (!ctx) throw new Error('Tabs.* must be used inside <Tabs>');\n return ctx;\n};\n\nexport type TabsProps = {\n value: string;\n onChange: (value: string) => void;\n /** Layout direction. `horizontal` (default) puts the tab list on top; `vertical` puts it on the left. */\n orientation?: TabsOrientation;\n children: ReactNode;\n className?: string;\n};\n\nconst Root = ({ value, onChange, orientation = 'horizontal', children, className }: TabsProps) => (\n <TabsContext.Provider value={{ value, onChange, orientation }}>\n <div className={clsx(orientation === 'vertical' ? 'flex gap-6' : '', className)}>\n {children}\n </div>\n </TabsContext.Provider>\n);\n\nconst List = ({ children, className }: { children: ReactNode; className?: string }) => {\n const { orientation } = useTabs();\n return (\n <div\n role=\"tablist\"\n aria-orientation={orientation}\n className={clsx(\n orientation === 'vertical'\n ? 'flex shrink-0 flex-col gap-1 border-r border-gray-200 dark:border-gray-800'\n : 'flex items-center gap-1 border-b border-gray-200 dark:border-gray-800',\n className\n )}\n >\n {children}\n </div>\n );\n};\n\nexport type TabProps = {\n value: string;\n children: ReactNode;\n icon?: ElementType;\n badge?: ReactNode;\n disabled?: boolean;\n className?: string;\n};\n\nconst Trigger = ({ value, children, icon: Icon, badge, disabled, className }: TabProps) => {\n const { value: active, onChange, orientation } = useTabs();\n const isActive = value === active;\n return (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n disabled={disabled}\n onClick={() => onChange(value)}\n className={clsx(\n 'flex items-center gap-2 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50',\n orientation === 'vertical'\n ? clsx(\n '-mr-px justify-start rounded-l-lg border-r-2 px-3 py-2 text-left whitespace-nowrap',\n isActive\n ? 'border-brand-500 bg-brand-50 text-brand-600 dark:bg-brand-500/10 dark:text-brand-400'\n : 'border-transparent text-gray-500 hover:bg-gray-50 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-white/5 dark:hover:text-gray-200'\n )\n : clsx(\n '-mb-px border-b-2 px-3 py-2',\n isActive\n ? 'border-brand-500 text-brand-600 dark:text-brand-400'\n : 'border-transparent text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200'\n ),\n className\n )}\n >\n {Icon && <Icon className=\"h-4 w-4\" />}\n {children}\n {badge !== undefined && (\n <span\n className={clsx(\n 'ms-auto rounded-full px-1.5 py-0.5 text-[10px] font-bold',\n isActive\n ? 'bg-brand-100 text-brand-600 dark:bg-brand-500/20 dark:text-brand-400'\n : 'bg-gray-100 text-gray-500 dark:bg-gray-800 dark:text-gray-400'\n )}\n >\n {badge}\n </span>\n )}\n </button>\n );\n};\n\nconst Panel = ({\n value,\n children,\n className,\n}: {\n value: string;\n children: ReactNode;\n className?: string;\n}) => {\n const { value: active, orientation } = useTabs();\n if (value !== active) return null;\n return (\n <div\n role=\"tabpanel\"\n className={clsx(orientation === 'vertical' ? 'flex-1' : 'pt-5', className)}\n >\n {children}\n </div>\n );\n};\n\nexport const Tabs = Object.assign(Root, { List, Trigger, Panel });\n","import { clsx } from 'clsx';\nimport { Check, Copy } from 'lucide-react';\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n type ButtonHTMLAttributes,\n} from 'react';\n\nexport type ClipboardVariant = 'icon' | 'button';\nexport type ClipboardSize = 'sm' | 'md';\n\nexport type ClipboardProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onCopy'> & {\n /** Text written to the clipboard on click. */\n value: string;\n /** `icon` (default) → square icon-only button. `button` → icon + label. */\n variant?: ClipboardVariant;\n size?: ClipboardSize;\n /** Override the label (only shown when `variant=\"button\"`). */\n copyLabel?: string;\n copiedLabel?: string;\n /** Milliseconds the \"copied\" state stays visible. Default 1500. */\n duration?: number;\n /** Fires after the value is copied. */\n onCopy?: (value: string) => void;\n /**\n * Style for floating on top of a code block (translucent bg, hover-revealed\n * via parent's `group` class). Pair with a `group` parent and absolute\n * positioning. Default `false`.\n */\n floating?: boolean;\n};\n\nconst SIZE_ICON: Record<ClipboardSize, { box: string; icon: string }> = {\n sm: { box: 'h-7 w-7', icon: 'h-3.5 w-3.5' },\n md: { box: 'h-9 w-9', icon: 'h-4 w-4' },\n};\n\nconst SIZE_BUTTON: Record<ClipboardSize, string> = {\n sm: 'h-7 px-2 text-xs gap-1.5',\n md: 'h-9 px-3 text-sm gap-2',\n};\n\nexport const Clipboard = forwardRef<HTMLButtonElement, ClipboardProps>(function Clipboard(\n {\n value,\n variant = 'icon',\n size = 'sm',\n copyLabel = 'Copy',\n copiedLabel = 'Copied!',\n duration = 1500,\n onCopy,\n floating = false,\n className,\n onClick,\n ...rest\n },\n ref\n) {\n const [copied, setCopied] = useState(false);\n const timeoutRef = useRef<number | null>(null);\n\n const handleClick = useCallback(\n async (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e);\n if (e.defaultPrevented) return;\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n onCopy?.(value);\n if (timeoutRef.current !== null) window.clearTimeout(timeoutRef.current);\n timeoutRef.current = window.setTimeout(() => setCopied(false), duration);\n } catch {\n // Clipboard API unavailable — silent noop\n }\n },\n [value, duration, onClick, onCopy]\n );\n\n useEffect(\n () => () => {\n if (timeoutRef.current !== null) window.clearTimeout(timeoutRef.current);\n },\n []\n );\n\n const Icon = copied ? Check : Copy;\n const label = copied ? copiedLabel : copyLabel;\n const iconClass = clsx(SIZE_ICON[size].icon, copied && 'text-green-500');\n\n const baseClass = floating\n ? 'border border-gray-200 bg-white/90 text-gray-500 opacity-0 transition-opacity group-hover:opacity-100 hover:text-gray-700 dark:border-gray-700 dark:bg-gray-800/90 dark:text-gray-400 dark:hover:text-gray-200'\n : 'border border-gray-200 bg-white text-gray-700 transition-colors hover:bg-gray-50 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700';\n\n if (variant === 'icon') {\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-label={label}\n onClick={handleClick}\n className={clsx(\n 'inline-flex items-center justify-center rounded-md',\n SIZE_ICON[size].box,\n baseClass,\n className\n )}\n {...rest}\n >\n <Icon className={iconClass} aria-hidden />\n </button>\n );\n }\n\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={handleClick}\n className={clsx(\n 'inline-flex items-center justify-center rounded-md font-medium',\n SIZE_BUTTON[size],\n baseClass,\n className\n )}\n {...rest}\n >\n <Icon className={iconClass} aria-hidden />\n {label}\n </button>\n );\n});\n","import { clsx } from 'clsx';\nimport { Clipboard } from './Clipboard';\n\nexport type CodeBlockProps = {\n code: string;\n language?: string;\n /** Show the copy button (top-right, hover-revealed). Default `true`. */\n showCopy?: boolean;\n className?: string;\n};\n\nexport const CodeBlock = ({ code, language, showCopy = true, className }: CodeBlockProps) => (\n <div\n className={clsx(\n 'group relative overflow-hidden rounded-xl border border-gray-200 bg-gray-50 dark:border-gray-800 dark:bg-gray-900',\n className\n )}\n >\n {language && (\n <div className=\"flex items-center justify-between border-b border-gray-200 px-4 py-1.5 dark:border-gray-800\">\n <span className=\"text-[10px] font-semibold tracking-wider text-gray-500 uppercase dark:text-gray-400\">\n {language}\n </span>\n {/* When a title bar is present, the copy button lives inside it so the\n * bar doubles as the action surface — matches GitHub / Carbon / TUI. */}\n {showCopy && <Clipboard value={code} floating />}\n </div>\n )}\n <pre className=\"overflow-x-auto p-4 text-xs leading-relaxed text-gray-800 dark:text-gray-200\">\n <code>{code}</code>\n </pre>\n {/* Without a title bar there is nothing to anchor the button to, so we float\n * it over the code in the top-right corner (hover-revealed via `group`). */}\n {showCopy && !language && (\n <Clipboard value={code} floating className=\"absolute top-2 right-2\" />\n )}\n </div>\n);\n","import { clsx } from 'clsx';\nimport type { ButtonHTMLAttributes, ElementType, ReactNode } from 'react';\n\nexport type PageActionVariant = 'outline' | 'primary' | 'brand-outline' | 'danger-outline';\n\nconst VARIANT_CLASS: Record<PageActionVariant, string> = {\n outline:\n 'border-gray-200 bg-white text-gray-600 hover:bg-gray-50 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-300 dark:hover:bg-gray-700',\n primary:\n 'border-transparent bg-brand-500 text-white hover:bg-brand-600 dark:bg-brand-500 dark:hover:bg-brand-600',\n 'brand-outline':\n 'border-brand-200 bg-brand-50 text-brand-600 hover:bg-brand-100 dark:border-brand-700/40 dark:bg-brand-500/10 dark:text-brand-400 dark:hover:bg-brand-500/20',\n 'danger-outline':\n 'border-red-200 bg-white text-red-600 hover:bg-red-50 dark:border-red-800 dark:bg-transparent dark:text-red-400 dark:hover:bg-red-500/10',\n};\n\nexport type PageActionButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n icon?: ElementType;\n variant?: PageActionVariant;\n children?: ReactNode;\n};\n\nexport const PageActionButton = ({\n icon: Icon,\n variant = 'outline',\n className,\n children,\n type = 'button',\n ...rest\n}: PageActionButtonProps) => (\n <button\n type={type}\n className={clsx(\n 'flex items-center gap-1.5 rounded-lg border px-3 py-2 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50',\n VARIANT_CLASS[variant],\n className\n )}\n {...rest}\n >\n {Icon && <Icon className=\"h-4 w-4 shrink-0\" />}\n {children}\n </button>\n);\n\nexport type PageActionIconButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'children'\n> & {\n icon: ElementType;\n variant?: PageActionVariant;\n};\n\nexport const PageActionIconButton = ({\n icon: Icon,\n variant = 'outline',\n className,\n type = 'button',\n ...rest\n}: PageActionIconButtonProps) => (\n <button\n type={type}\n className={clsx(\n 'flex items-center justify-center rounded-lg border p-2.5 transition-colors disabled:cursor-not-allowed disabled:opacity-50',\n VARIANT_CLASS[variant],\n className\n )}\n {...rest}\n >\n <Icon className=\"h-4 w-4\" />\n </button>\n);\n","import { clsx } from 'clsx';\nimport { Check, ChevronDown, RefreshCw } from 'lucide-react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nexport type RefreshOption = { label: string; ms: number };\n\nexport const REFRESH_OPTIONS: RefreshOption[] = [\n { label: 'Off', ms: 0 },\n { label: '15s', ms: 15_000 },\n { label: '30s', ms: 30_000 },\n { label: '1m', ms: 60_000 },\n { label: '2m', ms: 120_000 },\n { label: '5m', ms: 300_000 },\n { label: '10m', ms: 600_000 },\n { label: '30m', ms: 1_800_000 },\n { label: '1h', ms: 3_600_000 },\n];\n\n/**\n * Hook that manages auto-refresh state for a page key, persisted to localStorage.\n * Pass a stable `pageKey` (e.g. \"room\", \"rack\", \"alerts\").\n */\nexport const useAutoRefresh = (pageKey: string, onRefresh: () => void | Promise<void>) => {\n const storageKey = `cosmos.refresh.${pageKey}`;\n\n const [autoRefreshMs, setAutoRefreshMs] = useState<number>(() => {\n if (typeof window === 'undefined') return 0;\n const stored = window.localStorage.getItem(storageKey);\n return stored ? Number(stored) : 0;\n });\n\n const onRefreshRef = useRef(onRefresh);\n useEffect(() => {\n onRefreshRef.current = onRefresh;\n }, [onRefresh]);\n\n useEffect(() => {\n if (autoRefreshMs === 0) return;\n const timer = setInterval(() => void onRefreshRef.current(), autoRefreshMs);\n return () => clearInterval(timer);\n }, [autoRefreshMs]);\n\n const onIntervalChange = useCallback(\n (ms: number) => {\n setAutoRefreshMs(ms);\n if (typeof window !== 'undefined') {\n window.localStorage.setItem(storageKey, String(ms));\n }\n },\n [storageKey]\n );\n\n return { autoRefreshMs, onIntervalChange };\n};\n\nexport type RefreshButtonProps = {\n refreshing?: boolean;\n autoRefreshMs: number;\n onRefresh: () => void | Promise<void>;\n onIntervalChange: (ms: number) => void;\n options?: RefreshOption[];\n className?: string;\n};\n\nexport const RefreshButton = ({\n refreshing = false,\n autoRefreshMs,\n onRefresh,\n onIntervalChange,\n options = REFRESH_OPTIONS,\n className,\n}: RefreshButtonProps) => {\n const [open, setOpen] = useState(false);\n const currentLabel = options.find((o) => o.ms === autoRefreshMs)?.label ?? '?';\n const isAutoActive = autoRefreshMs > 0;\n\n return (\n <div\n className={clsx(\n 'relative flex items-stretch rounded-lg border border-gray-200 bg-white dark:border-gray-700 dark:bg-gray-800',\n className\n )}\n >\n <button\n type=\"button\"\n onClick={() => void onRefresh()}\n disabled={refreshing}\n className=\"flex items-center gap-1.5 rounded-l-lg px-3 py-2 text-sm text-gray-600 transition-colors hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50 dark:text-gray-300 dark:hover:bg-gray-700\"\n >\n <RefreshCw className={clsx('h-4 w-4', refreshing && 'animate-spin')} />\n <span>Refresh</span>\n {isAutoActive && (\n <span className=\"flex items-center gap-1 text-xs text-gray-400\">\n <span className=\"inline-block h-1.5 w-1.5 animate-pulse rounded-full bg-green-400\" />\n {currentLabel}\n </span>\n )}\n </button>\n\n <div className=\"w-px self-stretch bg-gray-200 dark:bg-gray-700\" />\n\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n aria-label=\"Choose refresh interval\"\n className=\"flex h-full items-center rounded-r-lg px-2 text-gray-400 transition-colors hover:bg-gray-50 dark:text-gray-500 dark:hover:bg-gray-700\"\n >\n <ChevronDown className=\"h-3.5 w-3.5\" />\n </button>\n\n {open && (\n <>\n <div className=\"fixed inset-0 z-20\" onClick={() => setOpen(false)} aria-hidden />\n <div className=\"absolute top-full right-0 z-30 mt-1 w-28 overflow-hidden rounded-xl border border-gray-200 bg-white shadow-xl dark:border-gray-800 dark:bg-gray-900\">\n {options.map((opt) => (\n <button\n type=\"button\"\n key={opt.ms}\n onClick={() => {\n onIntervalChange(opt.ms);\n setOpen(false);\n }}\n className={clsx(\n 'flex w-full items-center justify-between px-3 py-2 text-left text-sm transition-colors hover:bg-gray-50 dark:hover:bg-white/5',\n autoRefreshMs === opt.ms\n ? 'text-brand-600 dark:text-brand-400 font-semibold'\n : 'text-gray-700 dark:text-gray-300'\n )}\n >\n {opt.label}\n {autoRefreshMs === opt.ms && <Check className=\"h-3 w-3\" />}\n </button>\n ))}\n </div>\n </>\n )}\n </div>\n </div>\n );\n};\n","import { clsx } from 'clsx';\nimport { ChevronRight } from 'lucide-react';\nimport type { ButtonHTMLAttributes, ReactNode } from 'react';\n\nexport type RowActionButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n children?: ReactNode;\n hideChevron?: boolean;\n};\n\n/**\n * RowActionButton — compact action button for the right edge of table rows\n * or list items. Defaults to a chevron-right indicator suggesting navigation.\n */\nexport const RowActionButton = ({\n children = 'View',\n hideChevron = false,\n className,\n type = 'button',\n ...rest\n}: RowActionButtonProps) => (\n <button\n type={type}\n className={clsx(\n 'hover:border-brand-300 hover:bg-brand-50 hover:text-brand-600 dark:hover:border-brand-700/50 dark:hover:bg-brand-500/10 dark:hover:text-brand-400 inline-flex cursor-pointer items-center gap-1 rounded-lg border border-gray-200 px-2.5 py-1 text-xs font-medium text-gray-600 transition-colors dark:border-gray-700 dark:text-gray-400',\n className\n )}\n {...rest}\n >\n {children}\n {!hideChevron && <ChevronRight className=\"h-3.5 w-3.5\" />}\n </button>\n);\n","import { clsx } from 'clsx';\n\nexport type SpinnerSize = 'sm' | 'md' | 'lg' | 'xl';\n\nconst SIZE_CLASS: Record<SpinnerSize, string> = {\n sm: 'h-4 w-4 border-2',\n md: 'h-6 w-6 border-2',\n lg: 'h-8 w-8 border-[3px]',\n xl: 'h-10 w-10 border-4',\n};\n\nexport type SpinnerProps = {\n size?: SpinnerSize;\n className?: string;\n};\n\nexport const Spinner = ({ size = 'md', className }: SpinnerProps) => (\n <div\n role=\"status\"\n aria-label=\"Loading\"\n className={clsx(\n 'border-t-brand-500 dark:border-t-brand-500 animate-spin rounded-full border-gray-200 dark:border-gray-700',\n SIZE_CLASS[size],\n className\n )}\n />\n);\n","import { clsx } from 'clsx';\nimport type { ReactNode } from 'react';\n\nexport type SectionLabelProps = {\n children: ReactNode;\n className?: string;\n};\n\n/**\n * SectionLabel — small upper-cased label used as a quiet section divider\n * inside drawers, settings panels, and form groups.\n */\nexport const SectionLabel = ({ children, className }: SectionLabelProps) => (\n <p\n className={clsx(\n 'text-[10px] font-semibold tracking-wider text-gray-400 uppercase dark:text-gray-600',\n className\n )}\n >\n {children}\n </p>\n);\n","import { clsx } from 'clsx';\nimport type { ElementType } from 'react';\n\nexport type IconBoxSize = 'sm' | 'md' | 'lg';\n\nconst BOX_SIZE: Record<IconBoxSize, string> = {\n sm: 'h-7 w-7 rounded-md',\n md: 'h-8 w-8 rounded-lg',\n lg: 'h-10 w-10 rounded-xl',\n};\n\nconst ICON_SIZE: Record<IconBoxSize, string> = {\n sm: 'h-3.5 w-3.5',\n md: 'h-4 w-4',\n lg: 'h-5 w-5',\n};\n\nexport type IconBoxProps = {\n icon: ElementType;\n size?: IconBoxSize;\n /** Tailwind background classes — default neutral gray. */\n bg?: string;\n /** Tailwind text color classes — default neutral gray. */\n color?: string;\n className?: string;\n};\n\n/**\n * IconBox — icon wrapped in a rounded square with configurable color theme.\n * Useful for resource avatars in lists and cards.\n */\nexport const IconBox = ({\n icon: Icon,\n size = 'md',\n bg = 'bg-gray-100 dark:bg-gray-800',\n color = 'text-gray-500 dark:text-gray-400',\n className,\n}: IconBoxProps) => (\n <div className={clsx('flex shrink-0 items-center justify-center', BOX_SIZE[size], bg, className)}>\n <Icon className={clsx(ICON_SIZE[size], color)} />\n </div>\n);\n","import { clsx } from 'clsx';\nimport { AlertCircle, AlertTriangle, CheckCircle, Info } from 'lucide-react';\nimport type { ElementType, ReactNode } from 'react';\n\nexport type AlertVariant = 'success' | 'error' | 'warning' | 'info';\n\ntype VariantConfig = {\n border: string;\n bg: string;\n icon: ElementType;\n iconCls: string;\n text: string;\n};\n\nconst VARIANT_CONFIG: Record<AlertVariant, VariantConfig> = {\n success: {\n border: 'border-green-200 dark:border-green-500/20',\n bg: 'bg-green-50 dark:bg-green-500/10',\n icon: CheckCircle,\n iconCls: 'text-green-500',\n text: 'text-green-700 dark:text-green-400',\n },\n error: {\n border: 'border-red-200 dark:border-red-500/20',\n bg: 'bg-red-50 dark:bg-red-500/10',\n icon: AlertCircle,\n iconCls: 'text-red-500',\n text: 'text-red-700 dark:text-red-400',\n },\n warning: {\n border: 'border-amber-200 dark:border-amber-500/20',\n bg: 'bg-amber-50 dark:bg-amber-500/10',\n icon: AlertTriangle,\n iconCls: 'text-amber-500',\n text: 'text-amber-700 dark:text-amber-400',\n },\n info: {\n border: 'border-blue-200 dark:border-blue-500/20',\n bg: 'bg-blue-50 dark:bg-blue-500/10',\n icon: Info,\n iconCls: 'text-blue-500',\n text: 'text-blue-700 dark:text-blue-400',\n },\n};\n\nexport type AlertBannerProps = {\n variant?: AlertVariant;\n children: ReactNode;\n className?: string;\n};\n\nexport const AlertBanner = ({ variant = 'info', children, className }: AlertBannerProps) => {\n const v = VARIANT_CONFIG[variant];\n const Icon = v.icon;\n return (\n <div\n role=\"alert\"\n className={clsx(\n 'flex items-center gap-3 rounded-2xl border px-5 py-3.5',\n v.border,\n v.bg,\n className\n )}\n >\n <Icon className={clsx('h-4 w-4 shrink-0', v.iconCls)} />\n <p className={clsx('text-sm font-medium', v.text)}>{children}</p>\n </div>\n );\n};\n","import { clsx } from 'clsx';\nimport { ChevronDown } from 'lucide-react';\n\nexport type SelectInputOption = { label: string; value: string };\n\nexport type SelectInputProps = {\n value: string;\n onChange: (value: string) => void;\n options: SelectInputOption[];\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n};\n\n/**\n * SelectInput — styled native select wrapper. Different from `Select` (which\n * adds label/description/error chrome) and from `Dropdown` (which is a\n * non-native menu). Use this when you want a pure value-changing native select\n * with the Cosmos look.\n */\nexport const SelectInput = ({\n value,\n onChange,\n options,\n placeholder,\n disabled = false,\n className,\n}: SelectInputProps) => (\n <div className={clsx('relative inline-block', className)}>\n <select\n value={value}\n onChange={(e) => onChange(e.target.value)}\n disabled={disabled}\n className={clsx(\n 'focus:border-brand-500 h-9 appearance-none rounded-lg border border-gray-200 bg-white pr-9 pl-3 text-sm font-medium text-gray-700 transition-colors hover:bg-gray-50 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700'\n )}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n <ChevronDown className=\"pointer-events-none absolute top-1/2 right-2.5 h-4 w-4 -translate-y-1/2 text-gray-400\" />\n </div>\n);\n","import { clsx } from 'clsx';\n\nexport type BackdropProps = {\n onClick?: () => void;\n zIndex?: number;\n blur?: boolean;\n className?: string;\n};\n\n/**\n * Backdrop — primitive overlay layer (fixed inset-0 with semi-opaque black).\n * Reusable building block for Modal, Drawer, Lightbox, command palette, etc.\n */\nexport const Backdrop = ({ onClick, zIndex = 30, blur = true, className }: BackdropProps) => (\n <div\n onClick={onClick}\n aria-hidden\n style={{ zIndex }}\n className={clsx('fixed inset-0 bg-black/20', blur && 'backdrop-blur-[1px]', className)}\n />\n);\n","import { clsx } from 'clsx';\nimport { AlertCircle, Check, Loader2, Save } from 'lucide-react';\nimport type { ElementType } from 'react';\n\nexport type SaveState = 'idle' | 'dirty' | 'saving' | 'saved' | 'error';\n\ntype StateConfig = {\n label: string;\n icon: ElementType;\n cls: string;\n spin?: boolean;\n};\n\nconst STATE_CONFIG: Record<SaveState, StateConfig> = {\n idle: {\n label: 'Save Changes',\n icon: Save,\n cls: 'bg-brand-500 hover:bg-brand-600 text-white',\n },\n dirty: {\n label: 'Save Changes',\n icon: Save,\n cls: 'bg-brand-500 hover:bg-brand-600 text-white animate-pulse',\n },\n saving: {\n label: 'Saving…',\n icon: Loader2,\n cls: 'bg-brand-500 text-white opacity-70 cursor-not-allowed',\n spin: true,\n },\n saved: {\n label: 'Saved',\n icon: Check,\n cls: 'bg-green-500 text-white cursor-default',\n },\n error: {\n label: 'Error',\n icon: AlertCircle,\n cls: 'bg-red-500 text-white',\n },\n};\n\nexport type StatefulSaveButtonProps = {\n state: SaveState;\n onClick: () => void;\n /** Override label for `idle` / `dirty` states. */\n label?: string;\n /** Override label for `saved` state. */\n savedLabel?: string;\n className?: string;\n};\n\n/**\n * StatefulSaveButton — save button with 5 visual states cycling\n * idle → dirty → saving → saved → idle (or error on failure).\n */\nexport const StatefulSaveButton = ({\n state,\n onClick,\n label,\n savedLabel,\n className,\n}: StatefulSaveButtonProps) => {\n const cfg = { ...STATE_CONFIG[state] };\n if (label && (state === 'idle' || state === 'dirty')) cfg.label = label;\n if (savedLabel && state === 'saved') cfg.label = savedLabel;\n const Icon = cfg.icon;\n const inactive = state === 'saving' || state === 'saved';\n\n return (\n <button\n type=\"button\"\n onClick={inactive ? undefined : onClick}\n disabled={inactive}\n className={clsx(\n 'flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-semibold shadow-sm transition-all disabled:cursor-not-allowed',\n cfg.cls,\n className\n )}\n >\n <Icon className={clsx('h-4 w-4 shrink-0', cfg.spin && 'animate-spin')} />\n {cfg.label}\n </button>\n );\n};\n","import { clsx } from 'clsx';\n\nexport type UnsavedIndicatorProps = {\n visible: boolean;\n label?: string;\n className?: string;\n};\n\n/**\n * UnsavedIndicator — small amber label shown when a form has unsaved changes.\n * Pair with StatefulSaveButton in a header or toolbar.\n */\nexport const UnsavedIndicator = ({\n visible,\n label = 'Unsaved changes',\n className,\n}: UnsavedIndicatorProps) => {\n if (!visible) return null;\n return (\n <span className={clsx('text-xs font-medium text-amber-500 dark:text-amber-400', className)}>\n {label}\n </span>\n );\n};\n","import { AlertTriangle, Loader2, Save, X } from 'lucide-react';\nimport { useEffect } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport type ConfirmationModalProps = {\n open: boolean;\n title?: string;\n message?: string;\n onStay: () => void;\n onDiscard?: () => void;\n onSave?: () => void;\n saving?: boolean;\n stayLabel?: string;\n discardLabel?: string;\n saveLabel?: string;\n /** Hide the Save button — for simple confirm/cancel flows. */\n hideSave?: boolean;\n};\n\n/**\n * ConfirmationModal — focused dialog for unsaved-changes guards or\n * destructive-action confirmation. Three actions: Stay (cancel) /\n * Discard (negative) / Save (primary). Set `hideSave` for binary confirm.\n *\n * Renders via `createPortal` into `document.body` so the dialog escapes\n * any clipping container (cards, sidebars, overflow:hidden ancestors).\n * Clicking the backdrop or pressing `Escape` calls `onStay`.\n */\nexport const ConfirmationModal = ({\n open,\n title = 'Unsaved changes',\n message = 'You have unsaved changes. What would you like to do?',\n onStay,\n onDiscard,\n onSave,\n saving = false,\n stayLabel = 'Stay',\n discardLabel = 'Discard',\n saveLabel = 'Save & go',\n hideSave = false,\n}: ConfirmationModalProps) => {\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onStay();\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [open, onStay]);\n\n if (!open) return null;\n\n return createPortal(\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center p-4\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"cosmos-confirmation-title\"\n >\n <div className=\"absolute inset-0 bg-black/50 backdrop-blur-sm\" onClick={onStay} aria-hidden />\n <div className=\"relative w-full max-w-md overflow-hidden rounded-2xl border border-gray-200 bg-white shadow-2xl dark:border-gray-700 dark:bg-gray-900\">\n <div className=\"flex items-start gap-4 p-6\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-amber-50 dark:bg-amber-500/10\">\n <AlertTriangle className=\"h-5 w-5 text-amber-500\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3\n id=\"cosmos-confirmation-title\"\n className=\"font-semibold text-gray-900 dark:text-white\"\n >\n {title}\n </h3>\n <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">{message}</p>\n </div>\n <button\n type=\"button\"\n onClick={onStay}\n aria-label=\"Close\"\n className=\"shrink-0 text-gray-400 transition-colors hover:text-gray-600 dark:hover:text-gray-200\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n\n <div className=\"flex flex-nowrap items-center justify-end gap-2 border-t border-gray-100 px-6 py-4 dark:border-gray-800\">\n <button\n type=\"button\"\n onClick={onStay}\n className=\"shrink-0 rounded-lg border border-gray-200 px-3 py-2 text-sm font-medium text-gray-700 transition-colors hover:bg-gray-50 dark:border-gray-700 dark:text-gray-300 dark:hover:bg-gray-800\"\n >\n {stayLabel}\n </button>\n {onDiscard && (\n <button\n type=\"button\"\n onClick={onDiscard}\n className=\"shrink-0 rounded-lg border border-red-200 px-3 py-2 text-sm font-medium text-red-600 transition-colors hover:bg-red-50 dark:border-red-700/40 dark:text-red-400 dark:hover:bg-red-500/10\"\n >\n {discardLabel}\n </button>\n )}\n {!hideSave && onSave && (\n <button\n type=\"button\"\n onClick={onSave}\n disabled={saving}\n className=\"bg-brand-500 hover:bg-brand-600 flex shrink-0 items-center gap-1.5 rounded-lg px-3 py-2 text-sm font-semibold text-white transition-colors disabled:cursor-not-allowed disabled:opacity-70\"\n >\n {saving ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <Save className=\"h-3.5 w-3.5\" />\n )}\n {saveLabel}\n </button>\n )}\n </div>\n </div>\n </div>,\n document.body\n );\n};\n","import { clsx } from 'clsx';\nimport { AlertTriangle, Bell, BellOff, CheckCircle2, Info, XCircle } from 'lucide-react';\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n type ButtonHTMLAttributes,\n type ComponentType,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport type NotificationSeverity = 'crit' | 'warn' | 'info' | 'success';\n\nconst SEVERITY_META: Record<\n NotificationSeverity,\n { icon: ComponentType<{ className?: string }>; color: string; chipBg: string }\n> = {\n crit: {\n icon: XCircle,\n color: 'text-red-500 dark:text-red-400',\n chipBg: 'bg-red-500/15 dark:bg-red-500/20',\n },\n warn: {\n icon: AlertTriangle,\n color: 'text-amber-500 dark:text-amber-400',\n chipBg: 'bg-amber-500/15 dark:bg-amber-500/20',\n },\n info: {\n icon: Info,\n color: 'text-blue-500 dark:text-blue-400',\n chipBg: 'bg-blue-500/15 dark:bg-blue-500/20',\n },\n success: {\n icon: CheckCircle2,\n color: 'text-green-600 dark:text-green-400',\n chipBg: 'bg-green-500/15 dark:bg-green-500/20',\n },\n};\n\nconst BADGE_BG: Record<NotificationSeverity, string> = {\n crit: 'bg-red-500',\n warn: 'bg-amber-500',\n info: 'bg-blue-500',\n success: 'bg-green-500',\n};\n\n// ── Context ──────────────────────────────────────────────────────────────────\n\ntype Ctx = {\n open: boolean;\n setOpen: (v: boolean) => void;\n triggerRef: React.RefObject<HTMLButtonElement | null>;\n triggerRect: DOMRect | null;\n refreshRect: () => void;\n align: 'left' | 'right';\n};\n\nconst NotificationsPanelContext = createContext<Ctx | null>(null);\n\nconst useCtx = (): Ctx => {\n const ctx = useContext(NotificationsPanelContext);\n if (!ctx) throw new Error('NotificationsPanel.* must be used inside <NotificationsPanel>');\n return ctx;\n};\n\n// ── Root ─────────────────────────────────────────────────────────────────────\n\nexport type NotificationsPanelProps = {\n /** Controlled open state. If omitted, the panel manages its own state. */\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Which side of the trigger the panel anchors to. Default `right`. */\n align?: 'left' | 'right';\n children: ReactNode;\n};\n\nconst NotificationsPanelRoot = ({\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n align = 'right',\n children,\n}: NotificationsPanelProps) => {\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const isControlled = openProp !== undefined;\n const open = isControlled ? openProp : internalOpen;\n\n const triggerRef = useRef<HTMLButtonElement>(null);\n const [triggerRect, setTriggerRect] = useState<DOMRect | null>(null);\n\n const refreshRect = useCallback(() => {\n if (triggerRef.current) {\n setTriggerRect(triggerRef.current.getBoundingClientRect());\n }\n }, []);\n\n const setOpen = useCallback(\n (v: boolean) => {\n if (v) refreshRect();\n if (!isControlled) setInternalOpen(v);\n onOpenChange?.(v);\n },\n [isControlled, onOpenChange, refreshRect]\n );\n\n // Refresh rect on resize/scroll while open\n useEffect(() => {\n if (!open) return;\n const handler = () => refreshRect();\n window.addEventListener('resize', handler);\n window.addEventListener('scroll', handler, true);\n return () => {\n window.removeEventListener('resize', handler);\n window.removeEventListener('scroll', handler, true);\n };\n }, [open, refreshRect]);\n\n // Escape closes\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false);\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [open, setOpen]);\n\n return (\n <NotificationsPanelContext.Provider\n value={{ open, setOpen, triggerRef, triggerRect, refreshRect, align }}\n >\n {children}\n </NotificationsPanelContext.Provider>\n );\n};\n\n// ── Trigger ──────────────────────────────────────────────────────────────────\n\nexport type NotificationsPanelTriggerProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'onClick' | 'children'\n> & {\n /** Number to show in the badge. 0 hides the badge. Values > 9999 render as \"9999+\". */\n count?: number;\n /** When true, shows the BellOff icon and dims the badge ping animation. */\n muted?: boolean;\n /** When true, shows the ping animation around the badge. Default: count > 0 && !muted. */\n ping?: boolean;\n};\n\nconst NotificationsPanelTrigger = forwardRef<HTMLButtonElement, NotificationsPanelTriggerProps>(\n function NotificationsPanelTrigger(\n { count = 0, muted = false, ping, className, ...rest },\n forwardedRef\n ) {\n const { open, setOpen, triggerRef, refreshRect } = useCtx();\n // Merge refs\n const setRef = (node: HTMLButtonElement | null) => {\n (triggerRef as React.MutableRefObject<HTMLButtonElement | null>).current = node;\n if (typeof forwardedRef === 'function') forwardedRef(node);\n else if (forwardedRef) forwardedRef.current = node;\n };\n // If the panel starts open (defaultOpen / controlled open), the rect\n // must be computed once after the trigger button mounts; otherwise\n // <Content> stays null because triggerRect is still null.\n useEffect(() => {\n if (open) refreshRect();\n // We intentionally only react to mount + open transitions here.\n }, [open, refreshRect]);\n const showPing = ping ?? (count > 0 && !muted);\n const Icon = muted ? BellOff : Bell;\n const display = count > 9999 ? '9999+' : String(count);\n return (\n <button\n ref={setRef}\n type=\"button\"\n aria-label={muted ? 'Notifications (muted)' : 'Notifications'}\n aria-expanded={open}\n onClick={() => setOpen(!open)}\n className={clsx(\n 'relative flex h-10 w-10 items-center justify-center rounded-lg border transition-colors',\n muted\n ? 'border-gray-200 text-gray-400 dark:border-gray-700 dark:text-gray-600'\n : 'border-gray-200 text-gray-500 hover:bg-gray-100 hover:text-gray-700 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-white/5 dark:hover:text-white',\n className\n )}\n {...rest}\n >\n <Icon className=\"h-5 w-5\" />\n {count > 0 && (\n <span className=\"absolute top-0.5 right-0.5 flex min-w-[16px] items-center justify-center\">\n {showPing && (\n <span className=\"absolute inline-flex h-4 w-4 animate-ping rounded-full bg-red-400 opacity-25\" />\n )}\n <span className=\"relative flex h-4 min-w-[16px] items-center justify-center rounded-full bg-red-500 px-1 text-[9px] leading-none font-bold text-white\">\n {display}\n </span>\n </span>\n )}\n </button>\n );\n }\n);\n\n// ── Content (portal panel) ───────────────────────────────────────────────────\n\nexport type NotificationsPanelContentProps = {\n /** Tailwind width class. Default `w-96` (384px). */\n width?: string;\n className?: string;\n children: ReactNode;\n};\n\nconst NotificationsPanelContent = ({\n width = 'w-96',\n className,\n children,\n}: NotificationsPanelContentProps) => {\n const { open, setOpen, triggerRect, align } = useCtx();\n if (!open || !triggerRect) return null;\n\n const top = triggerRect.bottom + 8;\n const positionStyle =\n align === 'right'\n ? { top, right: window.innerWidth - triggerRect.right }\n : { top, left: triggerRect.left };\n\n return createPortal(\n <>\n <div className=\"fixed inset-0 z-[9998]\" onClick={() => setOpen(false)} />\n <div\n role=\"dialog\"\n aria-label=\"Notifications\"\n style={positionStyle}\n className={clsx(\n 'fixed z-[9999] overflow-hidden rounded-2xl border border-gray-200 bg-white shadow-xl dark:border-gray-700 dark:bg-gray-900',\n width,\n className\n )}\n >\n {children}\n </div>\n </>,\n document.body\n );\n};\n\n// ── Header ───────────────────────────────────────────────────────────────────\n\nexport type NotificationsPanelHeaderProps = {\n title: string;\n /** Right-side slot — pills, action buttons, etc. */\n children?: ReactNode;\n className?: string;\n};\n\nconst NotificationsPanelHeader = ({\n title,\n children,\n className,\n}: NotificationsPanelHeaderProps) => (\n <div\n className={clsx(\n 'flex items-center justify-between border-b border-gray-100 px-4 py-3 dark:border-gray-800',\n className\n )}\n >\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">{title}</h3>\n {children && <div className=\"flex items-center gap-2\">{children}</div>}\n </div>\n);\n\n// ── Counters (CRIT/WARN/INFO pills) ──────────────────────────────────────────\n\nexport type NotificationsPanelCountersProps = {\n crit?: number;\n warn?: number;\n info?: number;\n};\n\nconst NotificationsPanelCounters = ({ crit, warn, info }: NotificationsPanelCountersProps) => (\n <>\n {crit !== undefined && crit > 0 && (\n <span className=\"flex items-center gap-1 rounded-full bg-red-100 px-2 py-0.5 text-xs font-bold text-red-600 dark:bg-red-500/15 dark:text-red-400\">\n <XCircle className=\"h-3 w-3\" />\n {crit}\n </span>\n )}\n {warn !== undefined && warn > 0 && (\n <span className=\"flex items-center gap-1 rounded-full bg-amber-100 px-2 py-0.5 text-xs font-bold text-amber-600 dark:bg-amber-500/15 dark:text-amber-400\">\n <AlertTriangle className=\"h-3 w-3\" />\n {warn}\n </span>\n )}\n {info !== undefined && info > 0 && (\n <span className=\"flex items-center gap-1 rounded-full bg-blue-100 px-2 py-0.5 text-xs font-bold text-blue-600 dark:bg-blue-500/15 dark:text-blue-400\">\n <Info className=\"h-3 w-3\" />\n {info}\n </span>\n )}\n </>\n);\n\n// ── HeaderAction (mute / settings shortcut) ──────────────────────────────────\n\nexport type NotificationsPanelHeaderActionProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n icon: ComponentType<{ className?: string }>;\n active?: boolean;\n};\n\nconst NotificationsPanelHeaderAction = forwardRef<\n HTMLButtonElement,\n NotificationsPanelHeaderActionProps\n>(function NotificationsPanelHeaderAction({ icon: Icon, active, className, ...rest }, ref) {\n return (\n <button\n ref={ref}\n type=\"button\"\n className={clsx(\n 'flex h-7 w-7 items-center justify-center rounded-lg transition-colors',\n active\n ? 'bg-gray-100 text-gray-500 dark:bg-gray-800 dark:text-gray-400'\n : 'text-gray-400 hover:bg-gray-100 hover:text-gray-600 dark:text-gray-500 dark:hover:bg-gray-800 dark:hover:text-gray-300',\n className\n )}\n {...rest}\n >\n <Icon className=\"h-4 w-4\" />\n </button>\n );\n});\n\n// ── List ─────────────────────────────────────────────────────────────────────\n\nexport type NotificationsPanelListProps = {\n /** Optional max height. Default `max-h-96`. */\n maxHeight?: string;\n className?: string;\n children: ReactNode;\n};\n\nconst NotificationsPanelList = ({\n maxHeight = 'max-h-96',\n className,\n children,\n}: NotificationsPanelListProps) => (\n <div\n className={clsx(\n 'divide-y divide-gray-100 overflow-y-auto dark:divide-gray-800',\n maxHeight,\n className\n )}\n >\n {children}\n </div>\n);\n\n// ── Item ─────────────────────────────────────────────────────────────────────\n\nexport type NotificationsPanelItemProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n severity: NotificationSeverity;\n title: string;\n subtitle?: string;\n /** Small mono caption shown below the subtitle (e.g. check id, error code). */\n caption?: string;\n /** Right-side badge label. If omitted, derived from severity (CRIT/WARN/INFO/OK). */\n badgeLabel?: string;\n /** When true, the panel auto-closes after the item is clicked. Default true. */\n closeOnClick?: boolean;\n};\n\nconst NotificationsPanelItem = forwardRef<HTMLButtonElement, NotificationsPanelItemProps>(\n function NotificationsPanelItem(\n {\n severity,\n title,\n subtitle,\n caption,\n badgeLabel,\n closeOnClick = true,\n onClick,\n className,\n ...rest\n },\n ref\n ) {\n const { setOpen } = useCtx();\n const meta = SEVERITY_META[severity];\n const Icon = meta.icon;\n const defaultLabel = severity === 'success' ? 'OK' : severity.toUpperCase();\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={(e) => {\n onClick?.(e);\n if (closeOnClick && !e.defaultPrevented) setOpen(false);\n }}\n className={clsx(\n 'flex w-full items-start gap-3 px-4 py-3 text-left transition-colors hover:bg-gray-50 dark:hover:bg-white/5',\n className\n )}\n {...rest}\n >\n <div\n className={clsx(\n 'mt-0.5 flex h-7 w-7 shrink-0 items-center justify-center rounded-full',\n meta.chipBg\n )}\n >\n <Icon className={clsx('h-4 w-4', meta.color)} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-semibold text-gray-900 dark:text-white\">{title}</p>\n {subtitle && (\n <p className=\"truncate text-xs text-gray-500 dark:text-gray-400\">{subtitle}</p>\n )}\n {caption && (\n <p className=\"mt-0.5 truncate font-mono text-[10px] text-gray-400\">{caption}</p>\n )}\n </div>\n <span\n className={clsx(\n 'mt-0.5 shrink-0 rounded-full px-2 py-0.5 text-[10px] font-bold text-white',\n BADGE_BG[severity]\n )}\n >\n {badgeLabel ?? defaultLabel}\n </span>\n </button>\n );\n }\n);\n\n// ── Empty ────────────────────────────────────────────────────────────────────\n\nexport type NotificationsPanelEmptyProps = {\n title?: string;\n subtitle?: string;\n icon?: ComponentType<{ className?: string }>;\n};\n\nconst NotificationsPanelEmpty = ({\n title = 'No active alerts',\n subtitle = 'All systems nominal.',\n icon: Icon = Bell,\n}: NotificationsPanelEmptyProps) => (\n <div className=\"flex flex-col items-center gap-2 px-4 py-8 text-center\">\n <Icon className=\"h-8 w-8 text-gray-300 dark:text-gray-700\" />\n <p className=\"text-sm font-medium text-gray-500 dark:text-gray-400\">{title}</p>\n <p className=\"text-xs text-gray-400 dark:text-gray-600\">{subtitle}</p>\n </div>\n);\n\n// ── Footer ───────────────────────────────────────────────────────────────────\n\nexport type NotificationsPanelFooterProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n children: ReactNode;\n /** When true, the panel auto-closes after the footer is clicked. Default true. */\n closeOnClick?: boolean;\n};\n\nconst NotificationsPanelFooter = ({\n children,\n closeOnClick = true,\n onClick,\n className,\n ...rest\n}: NotificationsPanelFooterProps) => {\n const { setOpen } = useCtx();\n return (\n <div className=\"border-t border-gray-100 p-2 dark:border-gray-800\">\n <button\n type=\"button\"\n onClick={(e) => {\n onClick?.(e);\n if (closeOnClick && !e.defaultPrevented) setOpen(false);\n }}\n className={clsx(\n 'text-brand-500 w-full rounded-lg py-2 text-center text-sm font-medium transition-colors hover:bg-gray-50 dark:hover:bg-white/5',\n className\n )}\n {...rest}\n >\n {children}\n </button>\n </div>\n );\n};\n\n// ── Compound export ──────────────────────────────────────────────────────────\n\nexport const NotificationsPanel = Object.assign(NotificationsPanelRoot, {\n Trigger: NotificationsPanelTrigger,\n Content: NotificationsPanelContent,\n Header: NotificationsPanelHeader,\n Counters: NotificationsPanelCounters,\n HeaderAction: NotificationsPanelHeaderAction,\n List: NotificationsPanelList,\n Item: NotificationsPanelItem,\n Empty: NotificationsPanelEmpty,\n Footer: NotificationsPanelFooter,\n});\n","import { clsx } from 'clsx';\nimport { CheckCircle2, Info, X, XCircle, type LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\n// TUI Plus reference (Pattern 1 — \"Simple\"):\n// <div class=\"pointer-events-auto w-full max-w-sm overflow-hidden rounded-lg bg-white shadow-lg ring-1 ring-black/5\">\n// <div class=\"p-4\">\n// <div class=\"flex items-start\">\n// <div class=\"shrink-0\"><CheckCircle … /></div>\n// <div class=\"ml-3 w-0 flex-1 pt-0.5\">\n// <p class=\"text-sm font-medium text-gray-900\">Successfully saved!</p>\n// <p class=\"mt-1 text-sm text-gray-500\">Anyone with a link can now view this file.</p>\n// </div>\n// <div class=\"ml-4 flex shrink-0\"><button>close</button></div>\n// </div>\n// </div>\n// </div>\n//\n// Pattern 2 — \"Condensed\" (dark theme by default):\n// <div class=\"pointer-events-auto flex w-full max-w-md divide-x divide-white/10 rounded-lg bg-gray-900 shadow-lg ring-1 ring-black/5\">\n// <div class=\"flex w-0 flex-1 items-center p-4\">\n// <p class=\"text-sm font-medium text-white\">Discussion archived</p>\n// </div>\n// <div class=\"flex\"><div class=\"flex flex-col divide-y divide-white/10\">\n// <button class=\"text-indigo-400\">Undo</button>\n// <button class=\"text-gray-300\">Dismiss</button>\n// </div></div>\n// </div>\n\nexport type NotificationIntent = 'success' | 'info' | 'error';\n\nconst INTENT_ICON: Record<NotificationIntent, LucideIcon> = {\n success: CheckCircle2,\n info: Info,\n error: XCircle,\n};\n\nconst INTENT_COLOR: Record<NotificationIntent, string> = {\n success: 'text-green-400',\n info: 'text-blue-400',\n error: 'text-red-400',\n};\n\n// ── Simple variant ───────────────────────────────────────────────────────────\n\nexport type NotificationCardSimpleProps = {\n /** Primary text (TUI: text-sm font-medium text-gray-900). */\n title: ReactNode;\n /** Secondary text under the title. */\n description?: ReactNode;\n /** Visual intent for the leading icon. Default `success`. */\n intent?: NotificationIntent;\n /** Override the icon entirely (replaces the intent-derived one). */\n icon?: LucideIcon;\n /** When provided, renders an X button that calls this on click. */\n onDismiss?: () => void;\n className?: string;\n};\n\nconst SimpleVariant = ({\n title,\n description,\n intent = 'success',\n icon,\n onDismiss,\n className,\n}: NotificationCardSimpleProps) => {\n const Icon = icon ?? INTENT_ICON[intent];\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={clsx(\n 'pointer-events-auto w-full max-w-sm overflow-hidden rounded-lg bg-white shadow-lg ring-1 ring-black/5 dark:bg-gray-800 dark:ring-white/10',\n className\n )}\n >\n <div className=\"p-4\">\n <div className=\"flex items-start\">\n <div className=\"shrink-0\">\n <Icon className={clsx('size-6', INTENT_COLOR[intent])} aria-hidden />\n </div>\n <div className=\"ml-3 w-0 flex-1 pt-0.5\">\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">{title}</p>\n {description && (\n <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">{description}</p>\n )}\n </div>\n {onDismiss && (\n <div className=\"ml-4 flex shrink-0\">\n <button\n type=\"button\"\n onClick={onDismiss}\n aria-label=\"Dismiss notification\"\n className=\"inline-flex rounded-md text-gray-400 hover:text-gray-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-500 dark:hover:text-gray-300\"\n >\n <X className=\"size-5\" aria-hidden />\n </button>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n\n// ── Condensed variant ────────────────────────────────────────────────────────\n\nexport type NotificationCardCondensedProps = {\n /** Primary text shown on the left. */\n title: ReactNode;\n /** Inline action label (e.g., \"Undo\") — rendered as a link-styled button. */\n actionLabel?: ReactNode;\n /** Called when the action is clicked. Required when `actionLabel` is set. */\n onAction?: () => void;\n /** When provided, renders a trailing X button. */\n onDismiss?: () => void;\n className?: string;\n};\n\nconst CondensedVariant = ({\n title,\n actionLabel,\n onAction,\n onDismiss,\n className,\n}: NotificationCardCondensedProps) => (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={clsx(\n 'pointer-events-auto flex w-full max-w-md items-center gap-3 rounded-lg bg-gray-900 px-4 py-3 shadow-lg ring-1 ring-black/5 dark:bg-gray-800 dark:ring-white/10',\n className\n )}\n >\n <p className=\"flex-1 text-sm font-medium text-white\">{title}</p>\n {actionLabel && (\n <button\n type=\"button\"\n onClick={onAction}\n className=\"text-sm font-medium text-indigo-400 hover:text-indigo-300 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-500\"\n >\n {actionLabel}\n </button>\n )}\n {onDismiss && (\n <button\n type=\"button\"\n onClick={onDismiss}\n aria-label=\"Dismiss notification\"\n className=\"inline-flex rounded-md text-gray-400 hover:text-gray-200 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-500\"\n >\n <X className=\"size-5\" aria-hidden />\n </button>\n )}\n </div>\n);\n\n// ── Compound export ──────────────────────────────────────────────────────────\n\nconst Root = SimpleVariant;\nexport const NotificationCard = Object.assign(Root, {\n Simple: SimpleVariant,\n Condensed: CondensedVariant,\n});\n","import { clsx } from 'clsx';\nimport { ChevronDown } from 'lucide-react';\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n type ButtonHTMLAttributes,\n type ComponentType,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { Avatar } from './Avatar';\n\n// ── Context ──────────────────────────────────────────────────────────────────\n\ntype Ctx = {\n open: boolean;\n setOpen: (v: boolean) => void;\n triggerRef: React.RefObject<HTMLButtonElement | null>;\n triggerRect: DOMRect | null;\n refreshRect: () => void;\n align: 'left' | 'right';\n};\n\nconst UserMenuContext = createContext<Ctx | null>(null);\nconst useCtx = (): Ctx => {\n const ctx = useContext(UserMenuContext);\n if (!ctx) throw new Error('UserMenu.* must be used inside <UserMenu>');\n return ctx;\n};\n\n// ── Root ─────────────────────────────────────────────────────────────────────\n\nexport type UserMenuProps = {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Side of the trigger the menu anchors to. Default `right`. */\n align?: 'left' | 'right';\n children: ReactNode;\n};\n\nconst UserMenuRoot = ({\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n align = 'right',\n children,\n}: UserMenuProps) => {\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const isControlled = openProp !== undefined;\n const open = isControlled ? openProp : internalOpen;\n const triggerRef = useRef<HTMLButtonElement>(null);\n const [triggerRect, setTriggerRect] = useState<DOMRect | null>(null);\n\n const refreshRect = useCallback(() => {\n if (triggerRef.current) setTriggerRect(triggerRef.current.getBoundingClientRect());\n }, []);\n\n const setOpen = useCallback(\n (v: boolean) => {\n if (v) refreshRect();\n if (!isControlled) setInternalOpen(v);\n onOpenChange?.(v);\n },\n [isControlled, onOpenChange, refreshRect]\n );\n\n useEffect(() => {\n if (!open) return;\n const handler = () => refreshRect();\n window.addEventListener('resize', handler);\n window.addEventListener('scroll', handler, true);\n return () => {\n window.removeEventListener('resize', handler);\n window.removeEventListener('scroll', handler, true);\n };\n }, [open, refreshRect]);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false);\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [open, setOpen]);\n\n return (\n <UserMenuContext.Provider\n value={{ open, setOpen, triggerRef, triggerRect, refreshRect, align }}\n >\n {children}\n </UserMenuContext.Provider>\n );\n};\n\n// ── Trigger ──────────────────────────────────────────────────────────────────\n\nexport type UserMenuTriggerProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'onClick' | 'children'\n> & {\n /** Display name shown next to the avatar. Also used for initials fallback. */\n name: string;\n /** Avatar image URL. Falls back to initials of `name`. */\n avatarSrc?: string;\n /** Hide the textual name (icon-only trigger). Useful on small viewports. */\n hideName?: boolean;\n};\n\nconst UserMenuTrigger = forwardRef<HTMLButtonElement, UserMenuTriggerProps>(\n function UserMenuTrigger(\n { name, avatarSrc, hideName = false, className, ...rest },\n forwardedRef\n ) {\n const { open, setOpen, triggerRef, refreshRect } = useCtx();\n const setRef = (node: HTMLButtonElement | null) => {\n (triggerRef as React.MutableRefObject<HTMLButtonElement | null>).current = node;\n if (typeof forwardedRef === 'function') forwardedRef(node);\n else if (forwardedRef) forwardedRef.current = node;\n };\n useEffect(() => {\n if (open) refreshRect();\n }, [open, refreshRect]);\n return (\n <button\n ref={setRef}\n type=\"button\"\n aria-label={`User menu for ${name}`}\n aria-expanded={open}\n onClick={() => setOpen(!open)}\n className={clsx(\n 'flex items-center gap-2 rounded-lg border border-gray-200 py-1.5 pr-3 pl-2 transition-colors hover:bg-gray-100 dark:border-gray-700 dark:hover:bg-white/5',\n className\n )}\n {...rest}\n >\n <Avatar src={avatarSrc} name={name} size=\"sm\" />\n {!hideName && (\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-200\">{name}</span>\n )}\n <ChevronDown\n className={clsx(\n 'h-4 w-4 shrink-0 text-gray-400 transition-transform',\n open && 'rotate-180'\n )}\n aria-hidden\n />\n </button>\n );\n }\n);\n\n// ── Content (portal) ─────────────────────────────────────────────────────────\n\nexport type UserMenuContentProps = {\n /** Tailwind width class. Default `w-56` (224px). */\n width?: string;\n className?: string;\n children: ReactNode;\n};\n\nconst UserMenuContent = ({ width = 'w-56', className, children }: UserMenuContentProps) => {\n const { open, setOpen, triggerRect, align } = useCtx();\n if (!open || !triggerRect) return null;\n const top = triggerRect.bottom + 8;\n const positionStyle =\n align === 'right'\n ? { top, right: window.innerWidth - triggerRect.right }\n : { top, left: triggerRect.left };\n return createPortal(\n <>\n <div className=\"fixed inset-0 z-[9998]\" onClick={() => setOpen(false)} />\n <div\n role=\"menu\"\n aria-label=\"User menu\"\n style={positionStyle}\n className={clsx(\n 'fixed z-[9999] overflow-hidden rounded-xl border border-gray-200 bg-white py-1 shadow-lg dark:border-gray-700 dark:bg-gray-900',\n width,\n className\n )}\n >\n {children}\n </div>\n </>,\n document.body\n );\n};\n\n// ── Header (avatar + name + email) ───────────────────────────────────────────\n\nexport type UserMenuHeaderProps = {\n name: string;\n email?: string;\n avatarSrc?: string;\n className?: string;\n};\n\nconst UserMenuHeader = ({ name, email, avatarSrc, className }: UserMenuHeaderProps) => (\n <div\n className={clsx(\n 'flex items-center gap-3 border-b border-gray-100 px-4 py-3 dark:border-gray-800',\n className\n )}\n >\n <Avatar src={avatarSrc} name={name} size=\"md\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-semibold text-gray-900 dark:text-white\">{name}</p>\n {email && <p className=\"truncate text-xs text-gray-500 dark:text-gray-400\">{email}</p>}\n </div>\n </div>\n);\n\n// ── Items (vertical group wrapper) ───────────────────────────────────────────\n\nconst UserMenuItems = ({ children }: { children: ReactNode }) => (\n <div role=\"group\" className=\"py-1\">\n {children}\n </div>\n);\n\n// ── Item ─────────────────────────────────────────────────────────────────────\n\nexport type UserMenuItemVariant = 'default' | 'danger';\n\nexport type UserMenuItemProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n icon?: ComponentType<{ className?: string }>;\n variant?: UserMenuItemVariant;\n /** Auto-close the menu after click. Default true. */\n closeOnClick?: boolean;\n};\n\nconst UserMenuItem = forwardRef<HTMLButtonElement, UserMenuItemProps>(function UserMenuItem(\n { icon: Icon, variant = 'default', closeOnClick = true, onClick, className, children, ...rest },\n ref\n) {\n const { setOpen } = useCtx();\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"menuitem\"\n onClick={(e) => {\n onClick?.(e);\n if (closeOnClick && !e.defaultPrevented) setOpen(false);\n }}\n className={clsx(\n 'flex w-full items-center gap-2 px-4 py-2 text-left text-sm transition-colors',\n variant === 'danger'\n ? 'text-red-600 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-500/10'\n : 'text-gray-700 hover:bg-gray-50 dark:text-gray-300 dark:hover:bg-white/5',\n className\n )}\n {...rest}\n >\n {Icon && (\n <Icon\n className={clsx(\n 'h-4 w-4 shrink-0',\n variant === 'danger'\n ? 'text-red-500 dark:text-red-400'\n : 'text-gray-400 dark:text-gray-500'\n )}\n aria-hidden\n />\n )}\n <span className=\"flex-1 truncate\">{children}</span>\n </button>\n );\n});\n\n// ── Separator ────────────────────────────────────────────────────────────────\n\nconst UserMenuSeparator = () => (\n <div role=\"separator\" className=\"my-1 border-t border-gray-100 dark:border-gray-800\" />\n);\n\n// ── Compound export ──────────────────────────────────────────────────────────\n\nexport const UserMenu = Object.assign(UserMenuRoot, {\n Trigger: UserMenuTrigger,\n Content: UserMenuContent,\n Header: UserMenuHeader,\n Items: UserMenuItems,\n Item: UserMenuItem,\n Separator: UserMenuSeparator,\n});\n","import { clsx } from 'clsx';\nimport { Moon, Sun } from 'lucide-react';\nimport { forwardRef, type ButtonHTMLAttributes } from 'react';\n\nexport type ThemeToggleSize = 'sm' | 'md';\n\nexport type ThemeToggleProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onClick'> & {\n /** Current theme state. `true` = dark mode active (Sun shown to switch back to light). */\n isDark: boolean;\n /** Called when the user toggles the theme. */\n onToggle: () => void;\n /** Visual size. `md` (default) = 40px, `sm` = 32px. */\n size?: ThemeToggleSize;\n /** Override the button title (also used as aria-label). */\n lightLabel?: string;\n darkLabel?: string;\n};\n\nconst SIZE_CLASS: Record<ThemeToggleSize, { box: string; icon: string }> = {\n sm: { box: 'h-8 w-8', icon: 'h-4 w-4' },\n md: { box: 'h-10 w-10', icon: 'h-5 w-5' },\n};\n\nexport const ThemeToggle = forwardRef<HTMLButtonElement, ThemeToggleProps>(function ThemeToggle(\n {\n isDark,\n onToggle,\n size = 'md',\n lightLabel = 'Switch to light mode',\n darkLabel = 'Switch to dark mode',\n className,\n ...rest\n },\n ref\n) {\n const Icon = isDark ? Sun : Moon;\n const label = isDark ? lightLabel : darkLabel;\n const { box, icon } = SIZE_CLASS[size];\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={onToggle}\n title={label}\n aria-label={label}\n aria-pressed={isDark}\n className={clsx(\n 'flex items-center justify-center rounded-lg border border-gray-200 text-gray-500 transition-colors hover:bg-gray-100 hover:text-gray-700 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-white/5 dark:hover:text-white',\n box,\n className\n )}\n {...rest}\n >\n <Icon className={icon} aria-hidden />\n </button>\n );\n});\n","import { clsx } from 'clsx';\nimport { Moon, MoonStar, Sun } from 'lucide-react';\nimport { forwardRef, type ButtonHTMLAttributes, type ComponentType } from 'react';\n\nexport type ThemeToggleTriSize = 'sm' | 'md';\nexport type ThemeMode = 'light' | 'dark' | 'oled';\n\nexport type ThemeToggleTriProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'onClick' | 'onChange'\n> & {\n /** Current theme. */\n theme: ThemeMode;\n /** Called with the next theme in the cycle (light → dark → oled → light). */\n onChange: (next: ThemeMode) => void;\n /** Visual size. `md` (default) = 40px, `sm` = 32px. */\n size?: ThemeToggleTriSize;\n /** Label used when the next click will switch to light mode. */\n lightLabel?: string;\n /** Label used when the next click will switch to dark mode. */\n darkLabel?: string;\n /** Label used when the next click will switch to OLED mode. */\n oledLabel?: string;\n};\n\nconst SIZE_CLASS: Record<ThemeToggleTriSize, { box: string; icon: string }> = {\n sm: { box: 'h-8 w-8', icon: 'h-4 w-4' },\n md: { box: 'h-10 w-10', icon: 'h-5 w-5' },\n};\n\nconst TRI_ORDER: readonly ThemeMode[] = ['light', 'dark', 'oled'];\n\nconst nextInCycle = (current: ThemeMode): ThemeMode => {\n const idx = TRI_ORDER.indexOf(current);\n return TRI_ORDER[(idx + 1) % TRI_ORDER.length];\n};\n\n// Each icon represents the *current* theme so the user knows what's active.\nconst ICON_FOR: Record<ThemeMode, ComponentType<{ className?: string }>> = {\n light: Sun,\n dark: Moon,\n oled: MoonStar,\n};\n\nexport const ThemeToggleTri = forwardRef<HTMLButtonElement, ThemeToggleTriProps>(\n function ThemeToggleTri(\n {\n theme,\n onChange,\n size = 'md',\n lightLabel = 'Switch to light mode',\n darkLabel = 'Switch to dark mode',\n oledLabel = 'Switch to OLED mode',\n className,\n ...rest\n },\n ref\n ) {\n const next = nextInCycle(theme);\n const label = next === 'light' ? lightLabel : next === 'dark' ? darkLabel : oledLabel;\n const Icon = ICON_FOR[theme];\n const { box, icon } = SIZE_CLASS[size];\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={() => onChange(next)}\n title={label}\n aria-label={label}\n data-theme={theme}\n className={clsx(\n 'flex items-center justify-center rounded-lg border border-gray-200 text-gray-500 transition-colors hover:bg-gray-100 hover:text-gray-700 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-white/5 dark:hover:text-white',\n box,\n className\n )}\n {...rest}\n >\n <Icon className={icon} aria-hidden />\n </button>\n );\n }\n);\n","import { clsx } from 'clsx';\nimport type { ReactNode } from 'react';\n\nexport type ButtonGroupOrientation = 'horizontal' | 'vertical';\n\nexport type ButtonGroupProps = {\n /** Stacking direction. Default `horizontal`. */\n orientation?: ButtonGroupOrientation;\n /** Render as attached (shared border, rounded only on outer edges). Default `true`. */\n attached?: boolean;\n /** Gap between buttons when `attached={false}`. Tailwind size token. Default `gap-2`. */\n gap?: string;\n className?: string;\n children: ReactNode;\n};\n\n/**\n * ButtonGroup — wraps `<Button>` (or any button-like) children to render\n * them as a connected segment row/column. The wrapper applies CSS\n * selectors so the inner buttons keep their own variant/size/icon props.\n *\n * Patterns: period selectors (Day/Week/Month), toolbars, paginators,\n * grouped actions (Save/Delete).\n */\nexport const ButtonGroup = ({\n orientation = 'horizontal',\n attached = true,\n gap = 'gap-2',\n className,\n children,\n}: ButtonGroupProps) => {\n if (!attached) {\n return (\n <div\n className={clsx(\n 'inline-flex',\n orientation === 'vertical' ? 'flex-col' : 'flex-row',\n gap,\n className\n )}\n role=\"group\"\n >\n {children}\n </div>\n );\n }\n return (\n <div\n role=\"group\"\n className={clsx(\n 'isolate inline-flex',\n orientation === 'vertical' ? 'flex-col' : 'flex-row',\n // Reset corner radii on every child, then re-apply to the outer ones.\n '[&>button]:rounded-none',\n // Bring the focused button on top so its focus ring is fully visible.\n '[&>button:focus]:z-10 [&>button:focus-visible]:z-10',\n orientation === 'horizontal' && [\n '[&>button:first-child]:rounded-l-lg',\n '[&>button:last-child]:rounded-r-lg',\n // Collapse adjacent borders by pulling each subsequent button 1px left.\n '[&>button:not(:first-child)]:-ml-px',\n ],\n orientation === 'vertical' && [\n '[&>button:first-child]:rounded-t-lg',\n '[&>button:last-child]:rounded-b-lg',\n '[&>button:not(:first-child)]:-mt-px',\n ],\n className\n )}\n >\n {children}\n </div>\n );\n};\n","import { clsx } from 'clsx';\nimport Autoplay from 'embla-carousel-autoplay';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport useEmblaCarousel, { type UseEmblaCarouselType } from 'embla-carousel-react';\nimport { createContext, useCallback, useContext, useEffect, useState, type ReactNode } from 'react';\n\ntype EmblaApi = UseEmblaCarouselType[1];\n\n// ── Context ──────────────────────────────────────────────────────────────────\n\ntype Ctx = {\n emblaRef: UseEmblaCarouselType[0];\n api: EmblaApi;\n selectedIndex: number;\n scrollSnaps: number[];\n scrollPrev: () => void;\n scrollNext: () => void;\n scrollTo: (i: number) => void;\n canScrollPrev: boolean;\n canScrollNext: boolean;\n};\n\nconst CarouselContext = createContext<Ctx | null>(null);\nconst useCtx = (): Ctx => {\n const ctx = useContext(CarouselContext);\n if (!ctx) throw new Error('Carousel.* must be used inside <Carousel>');\n return ctx;\n};\n\n// ── Root ─────────────────────────────────────────────────────────────────────\n\nexport type CarouselOptions = Parameters<typeof useEmblaCarousel>[0];\n\nexport type CarouselProps = {\n /** Embla options forwarded to the hook (loop, align, slidesToScroll, …). */\n options?: CarouselOptions;\n /** Auto-advance. Pass `true` for default 4 s, or a number (ms). */\n autoplay?: boolean | number;\n /** Pause autoplay on user interaction. Default `true`. */\n stopOnInteraction?: boolean;\n className?: string;\n children: ReactNode;\n};\n\nexport const CarouselRoot = ({\n options,\n autoplay = false,\n stopOnInteraction = true,\n className,\n children,\n}: CarouselProps) => {\n const plugins = autoplay\n ? [\n Autoplay({\n delay: typeof autoplay === 'number' ? autoplay : 4000,\n stopOnInteraction,\n }),\n ]\n : [];\n const [emblaRef, api] = useEmblaCarousel(options, plugins);\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [scrollSnaps, setScrollSnaps] = useState<number[]>([]);\n\n const scrollPrev = useCallback(() => api?.scrollPrev(), [api]);\n const scrollNext = useCallback(() => api?.scrollNext(), [api]);\n const scrollTo = useCallback((i: number) => api?.scrollTo(i), [api]);\n\n useEffect(() => {\n if (!api) return;\n const onSelect = () => setSelectedIndex(api.selectedScrollSnap());\n setScrollSnaps(api.scrollSnapList());\n onSelect();\n api.on('select', onSelect);\n api.on('reInit', () => {\n setScrollSnaps(api.scrollSnapList());\n onSelect();\n });\n }, [api]);\n\n const canScrollPrev = api?.canScrollPrev() ?? false;\n const canScrollNext = api?.canScrollNext() ?? false;\n\n return (\n <CarouselContext.Provider\n value={{\n emblaRef,\n api,\n selectedIndex,\n scrollSnaps,\n scrollPrev,\n scrollNext,\n scrollTo,\n canScrollPrev,\n canScrollNext,\n }}\n >\n <div className={clsx('relative', className)}>{children}</div>\n </CarouselContext.Provider>\n );\n};\n\n// ── Viewport (the scroll container) ──────────────────────────────────────────\n\nexport type CarouselViewportProps = { children: ReactNode; className?: string };\n\nconst CarouselViewport = ({ children, className }: CarouselViewportProps) => {\n const { emblaRef } = useCtx();\n return (\n <div ref={emblaRef} className={clsx('overflow-hidden', className)}>\n <div className=\"flex\">{children}</div>\n </div>\n );\n};\n\n// ── Slide ────────────────────────────────────────────────────────────────────\n\nexport type CarouselSlideProps = {\n /** Slide width as a Tailwind class. Default `basis-full` (one per view). */\n basis?: string;\n className?: string;\n children: ReactNode;\n};\n\nconst CarouselSlide = ({ basis = 'basis-full', className, children }: CarouselSlideProps) => (\n <div className={clsx('min-w-0 shrink-0 grow-0 px-1', basis, className)}>{children}</div>\n);\n\n// ── Controls (prev / next buttons) ───────────────────────────────────────────\n\nexport type CarouselControlsProps = {\n /** Place buttons. `inside` overlays them on the viewport edges; `outside` puts them above the indicators. Default `inside`. */\n position?: 'inside' | 'outside';\n className?: string;\n prevLabel?: string;\n nextLabel?: string;\n};\n\nconst CarouselControls = ({\n position = 'inside',\n className,\n prevLabel = 'Previous slide',\n nextLabel = 'Next slide',\n}: CarouselControlsProps) => {\n const { scrollPrev, scrollNext, canScrollPrev, canScrollNext } = useCtx();\n const baseBtn =\n 'flex h-9 w-9 items-center justify-center rounded-full border border-gray-200 bg-white text-gray-600 shadow-sm transition-colors hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-40 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-300 dark:hover:bg-gray-700';\n if (position === 'outside') {\n return (\n <div className={clsx('mt-3 flex items-center justify-center gap-2', className)}>\n <button\n type=\"button\"\n aria-label={prevLabel}\n disabled={!canScrollPrev}\n onClick={scrollPrev}\n className={baseBtn}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n aria-label={nextLabel}\n disabled={!canScrollNext}\n onClick={scrollNext}\n className={baseBtn}\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n );\n }\n return (\n <>\n <button\n type=\"button\"\n aria-label={prevLabel}\n disabled={!canScrollPrev}\n onClick={scrollPrev}\n className={clsx('absolute top-1/2 left-2 z-10 -translate-y-1/2', baseBtn, className)}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n aria-label={nextLabel}\n disabled={!canScrollNext}\n onClick={scrollNext}\n className={clsx('absolute top-1/2 right-2 z-10 -translate-y-1/2', baseBtn, className)}\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </>\n );\n};\n\n// ── Indicators (dots) ────────────────────────────────────────────────────────\n\nexport type CarouselIndicatorsProps = { className?: string };\n\nconst CarouselIndicators = ({ className }: CarouselIndicatorsProps) => {\n const { scrollSnaps, selectedIndex, scrollTo } = useCtx();\n return (\n <div className={clsx('mt-3 flex items-center justify-center gap-2', className)}>\n {scrollSnaps.map((_, i) => {\n const active = i === selectedIndex;\n return (\n <button\n key={i}\n type=\"button\"\n aria-label={`Go to slide ${i + 1}`}\n aria-current={active}\n onClick={() => scrollTo(i)}\n className={clsx(\n 'h-2 rounded-full transition-all',\n active ? 'bg-brand-500 w-6' : 'w-2 bg-gray-300 dark:bg-gray-600'\n )}\n />\n );\n })}\n </div>\n );\n};\n\n// ── Compound export ──────────────────────────────────────────────────────────\n\nexport const Carousel = Object.assign(CarouselRoot, {\n Viewport: CarouselViewport,\n Slide: CarouselSlide,\n Controls: CarouselControls,\n Indicators: CarouselIndicators,\n});\n","import { clsx } from 'clsx';\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n type ButtonHTMLAttributes,\n type CSSProperties,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nexport type PopoverPosition = 'top' | 'bottom' | 'left' | 'right';\n\n// ── Context ──────────────────────────────────────────────────────────────────\n\ntype Ctx = {\n open: boolean;\n setOpen: (v: boolean) => void;\n triggerRef: React.RefObject<HTMLButtonElement | null>;\n triggerRect: DOMRect | null;\n refreshRect: () => void;\n};\n\nconst PopoverContext = createContext<Ctx | null>(null);\nconst useCtx = (): Ctx => {\n const ctx = useContext(PopoverContext);\n if (!ctx) throw new Error('Popover.* must be used inside <Popover>');\n return ctx;\n};\n\n// ── Root ─────────────────────────────────────────────────────────────────────\n\nexport type PopoverProps = {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n children: ReactNode;\n};\n\nconst PopoverRoot = ({\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n children,\n}: PopoverProps) => {\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const isControlled = openProp !== undefined;\n const open = isControlled ? openProp : internalOpen;\n const triggerRef = useRef<HTMLButtonElement>(null);\n const [triggerRect, setTriggerRect] = useState<DOMRect | null>(null);\n\n const refreshRect = useCallback(() => {\n if (triggerRef.current) setTriggerRect(triggerRef.current.getBoundingClientRect());\n }, []);\n\n const setOpen = useCallback(\n (v: boolean) => {\n if (v) refreshRect();\n if (!isControlled) setInternalOpen(v);\n onOpenChange?.(v);\n },\n [isControlled, onOpenChange, refreshRect]\n );\n\n useEffect(() => {\n if (!open) return;\n const handler = () => refreshRect();\n window.addEventListener('resize', handler);\n window.addEventListener('scroll', handler, true);\n return () => {\n window.removeEventListener('resize', handler);\n window.removeEventListener('scroll', handler, true);\n };\n }, [open, refreshRect]);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false);\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [open, setOpen]);\n\n return (\n <PopoverContext.Provider value={{ open, setOpen, triggerRef, triggerRect, refreshRect }}>\n {children}\n </PopoverContext.Provider>\n );\n};\n\n// ── Trigger ──────────────────────────────────────────────────────────────────\n\nexport type PopoverTriggerProps = ButtonHTMLAttributes<HTMLButtonElement>;\n\nconst PopoverTrigger = forwardRef<HTMLButtonElement, PopoverTriggerProps>(function PopoverTrigger(\n { onClick, children, ...rest },\n forwardedRef\n) {\n const { open, setOpen, triggerRef, refreshRect } = useCtx();\n const setRef = (node: HTMLButtonElement | null) => {\n (triggerRef as React.MutableRefObject<HTMLButtonElement | null>).current = node;\n if (typeof forwardedRef === 'function') forwardedRef(node);\n else if (forwardedRef) forwardedRef.current = node;\n };\n useEffect(() => {\n if (open) refreshRect();\n }, [open, refreshRect]);\n return (\n <button\n ref={setRef}\n type=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n onClick={(e) => {\n onClick?.(e);\n setOpen(!open);\n }}\n {...rest}\n >\n {children}\n </button>\n );\n});\n\n// ── Content (portal) ─────────────────────────────────────────────────────────\n\nconst positionStyle = (position: PopoverPosition, rect: DOMRect, offset: number): CSSProperties => {\n switch (position) {\n case 'top':\n return {\n top: rect.top - offset,\n left: rect.left + rect.width / 2,\n transform: 'translate(-50%, -100%)',\n };\n case 'right':\n return {\n top: rect.top + rect.height / 2,\n left: rect.right + offset,\n transform: 'translateY(-50%)',\n };\n case 'left':\n return {\n top: rect.top + rect.height / 2,\n left: rect.left - offset,\n transform: 'translate(-100%, -50%)',\n };\n case 'bottom':\n default:\n return {\n top: rect.bottom + offset,\n left: rect.left + rect.width / 2,\n transform: 'translateX(-50%)',\n };\n }\n};\n\nconst arrowStyle = (position: PopoverPosition): CSSProperties => {\n // 8px square rotated 45° → diamond, clipped half by the content panel.\n const base: CSSProperties = {\n position: 'absolute',\n width: 8,\n height: 8,\n transform: 'rotate(45deg)',\n };\n switch (position) {\n case 'top':\n return { ...base, bottom: -4, left: '50%', marginLeft: -4 };\n case 'right':\n return { ...base, left: -4, top: '50%', marginTop: -4 };\n case 'left':\n return { ...base, right: -4, top: '50%', marginTop: -4 };\n case 'bottom':\n default:\n return { ...base, top: -4, left: '50%', marginLeft: -4 };\n }\n};\n\nexport type PopoverContentProps = {\n position?: PopoverPosition;\n /** Distance from the trigger edge in px. Default 8. */\n offset?: number;\n /** Show a small arrow pointing to the trigger. Default false. */\n arrow?: boolean;\n /** Tailwind width class. Default `w-64`. */\n width?: string;\n className?: string;\n children: ReactNode;\n};\n\nconst PopoverContent = ({\n position = 'bottom',\n offset = 8,\n arrow = false,\n width = 'w-64',\n className,\n children,\n}: PopoverContentProps) => {\n const { open, setOpen, triggerRect } = useCtx();\n if (!open || !triggerRect) return null;\n return createPortal(\n <>\n <div className=\"fixed inset-0 z-[9998]\" onClick={() => setOpen(false)} />\n <div\n role=\"dialog\"\n style={positionStyle(position, triggerRect, offset)}\n className={clsx(\n 'fixed z-[9999] rounded-xl border border-gray-200 bg-white p-4 text-sm shadow-xl dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100',\n width,\n className\n )}\n >\n {arrow && (\n <span\n aria-hidden\n style={arrowStyle(position)}\n className=\"border border-gray-200 bg-white dark:border-gray-700 dark:bg-gray-900\"\n />\n )}\n <div className=\"relative\">{children}</div>\n </div>\n </>,\n document.body\n );\n};\n\n// ── Compound export ──────────────────────────────────────────────────────────\n\nexport const Popover = Object.assign(PopoverRoot, {\n Trigger: PopoverTrigger,\n Content: PopoverContent,\n});\n","import { clsx } from 'clsx';\nimport type { ReactNode } from 'react';\n\nexport type ProgressBarSize = 'xs' | 'sm' | 'md' | 'lg';\nexport type ProgressBarIntent = 'brand' | 'success' | 'warning' | 'danger';\nexport type ProgressBarLabel = 'none' | 'inside' | 'outside';\n\nexport type ProgressBarProps = {\n value?: number;\n max?: number;\n size?: ProgressBarSize;\n intent?: ProgressBarIntent;\n /** Where to render the % label. `inside` requires `lg` size. Default `none`. */\n label?: ProgressBarLabel;\n /** Replace the auto-computed % with custom content. */\n labelContent?: ReactNode;\n /** Animated diagonal stripes pattern over the filled bar. */\n striped?: boolean;\n /** Loop a small bar across the container when total progress is unknown. */\n indeterminate?: boolean;\n className?: string;\n};\n\nconst SIZE_TRACK: Record<ProgressBarSize, string> = {\n xs: 'h-1',\n sm: 'h-2',\n md: 'h-3',\n lg: 'h-5',\n};\n\nconst INTENT_BG: Record<ProgressBarIntent, string> = {\n brand: 'bg-brand-500',\n success: 'bg-green-500',\n warning: 'bg-amber-500',\n danger: 'bg-red-500',\n};\n\nexport const ProgressBar = ({\n value = 0,\n max = 100,\n size = 'md',\n intent = 'brand',\n label = 'none',\n labelContent,\n striped = false,\n indeterminate = false,\n className,\n}: ProgressBarProps) => {\n const pct = indeterminate ? 100 : Math.max(0, Math.min(100, (value / max) * 100));\n const labelText = labelContent ?? `${Math.round(pct)}%`;\n // Inside label only fits in lg size (h-5 = 20px) — fall back to outside otherwise.\n const effectiveLabel: ProgressBarLabel = label === 'inside' && size !== 'lg' ? 'outside' : label;\n const showInsideLabel = effectiveLabel === 'inside' && !indeterminate;\n const showOutsideLabel = effectiveLabel === 'outside';\n return (\n <div className={clsx('block', className)}>\n <div className=\"flex items-center gap-3\">\n <div\n role=\"progressbar\"\n aria-valuenow={indeterminate ? undefined : Math.round(pct)}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-busy={indeterminate || undefined}\n className={clsx(\n 'relative flex-1 overflow-hidden rounded-full bg-gray-100 dark:bg-gray-800',\n SIZE_TRACK[size]\n )}\n >\n {indeterminate ? (\n <div\n className={clsx(\n 'absolute h-full w-1/3 rounded-full motion-safe:animate-[progressIndeterminate_1.4s_ease-in-out_infinite]',\n INTENT_BG[intent],\n striped && 'bg-gradient-to-r bg-[length:1rem_1rem]'\n )}\n style={{\n backgroundImage: striped\n ? 'linear-gradient(45deg, rgba(255,255,255,.18) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.18) 50%, rgba(255,255,255,.18) 75%, transparent 75%, transparent)'\n : undefined,\n backgroundSize: striped ? '1rem 1rem' : undefined,\n }}\n />\n ) : (\n <div\n style={{\n width: `${pct}%`,\n backgroundImage: striped\n ? 'linear-gradient(45deg, rgba(255,255,255,.18) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.18) 50%, rgba(255,255,255,.18) 75%, transparent 75%, transparent)'\n : undefined,\n backgroundSize: striped ? '1rem 1rem' : undefined,\n }}\n className={clsx(\n 'flex h-full items-center justify-center rounded-full transition-[width] duration-300 ease-out',\n INTENT_BG[intent],\n striped && 'motion-safe:animate-[progressStripes_1s_linear_infinite]'\n )}\n >\n {showInsideLabel && (\n <span className=\"px-2 text-[10px] leading-none font-bold text-white\">\n {labelText}\n </span>\n )}\n </div>\n )}\n </div>\n {showOutsideLabel && (\n <span\n aria-live=\"polite\"\n className=\"shrink-0 text-xs font-medium text-gray-700 tabular-nums dark:text-gray-300\"\n >\n {labelText}\n </span>\n )}\n </div>\n {/* Inline keyframes — local to ProgressBar so consumers don't need to register them globally. */}\n <style>{`\n @keyframes progressIndeterminate {\n 0% { left: -33%; }\n 100% { left: 100%; }\n }\n @keyframes progressStripes {\n 0% { background-position: 0 0; }\n 100% { background-position: 1rem 0; }\n }\n `}</style>\n </div>\n );\n};\n","import { clsx } from 'clsx';\nimport type { ReactNode } from 'react';\n\nexport type RibbonPosition = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\nexport type RibbonIntent = 'brand' | 'success' | 'warning' | 'danger' | 'neutral';\nexport type RibbonShape = 'flat' | 'angled';\n\nexport type RibbonProps = {\n /** Corner of the parent to anchor to. Parent must be `position: relative` (and `overflow-hidden` for `angled`). */\n position?: RibbonPosition;\n intent?: RibbonIntent;\n /** `flat` = rectangle hugging the corner. `angled` = 45° diagonal banner across the corner. */\n shape?: RibbonShape;\n children: ReactNode;\n className?: string;\n};\n\nconst INTENT_BG: Record<RibbonIntent, string> = {\n brand: 'bg-brand-500 text-white',\n success: 'bg-green-500 text-white',\n warning: 'bg-amber-500 text-white',\n danger: 'bg-red-500 text-white',\n neutral: 'bg-gray-700 text-white dark:bg-gray-600',\n};\n\n// `flat`: round the OUTER corners (away from the parent edge), keep the\n// touching corner sharp so it sits flush against the card edge.\nconst FLAT_POSITION: Record<RibbonPosition, string> = {\n 'top-right': 'top-0 right-0 rounded-bl-lg rounded-tr-[inherit]',\n 'top-left': 'top-0 left-0 rounded-br-lg rounded-tl-[inherit]',\n 'bottom-right': 'bottom-0 right-0 rounded-tl-lg rounded-br-[inherit]',\n 'bottom-left': 'bottom-0 left-0 rounded-tr-lg rounded-bl-[inherit]',\n};\n\n// `angled`: 45° banner across the corner. The parent must be\n// `overflow-hidden` so the banner ends are clipped by the card edge.\nconst ANGLED_POSITION: Record<RibbonPosition, string> = {\n 'top-right': 'top-5 -right-12 rotate-45',\n 'top-left': 'top-5 -left-12 -rotate-45',\n 'bottom-right': 'bottom-5 -right-12 -rotate-45',\n 'bottom-left': 'bottom-5 -left-12 rotate-45',\n};\n\nexport const Ribbon = ({\n position = 'top-right',\n intent = 'brand',\n shape = 'flat',\n children,\n className,\n}: RibbonProps) => {\n if (shape === 'angled') {\n return (\n <span\n className={clsx(\n 'absolute z-10 w-40 px-2 py-1 text-center text-[11px] font-bold tracking-wide uppercase shadow-md',\n INTENT_BG[intent],\n ANGLED_POSITION[position],\n className\n )}\n >\n {children}\n </span>\n );\n }\n return (\n <span\n className={clsx(\n 'absolute z-10 px-2.5 py-1 text-[11px] font-bold tracking-wide uppercase shadow',\n INTENT_BG[intent],\n FLAT_POSITION[position],\n className\n )}\n >\n {children}\n </span>\n );\n};\n","import { clsx } from 'clsx';\nimport { ExternalLink } from 'lucide-react';\nimport { forwardRef, type AnchorHTMLAttributes, type ReactNode } from 'react';\n\nexport type LinkVariant = 'colored' | 'underline' | 'opacity' | 'opacity-hover' | 'subtle';\n\nexport type LinkProps = AnchorHTMLAttributes<HTMLAnchorElement> & {\n variant?: LinkVariant;\n /** When true, opens in a new tab with safe rel attrs and renders an external icon. */\n external?: boolean;\n /** Hide the auto-added external icon when `external` is true. */\n hideExternalIcon?: boolean;\n children?: ReactNode;\n};\n\nconst VARIANT_CLASS: Record<LinkVariant, string> = {\n colored: 'text-brand-600 hover:text-brand-700 dark:text-brand-400 dark:hover:text-brand-300',\n underline:\n 'text-gray-900 underline underline-offset-2 hover:text-brand-600 dark:text-gray-100 dark:hover:text-brand-400',\n opacity: 'text-gray-700 opacity-70 hover:opacity-100 dark:text-gray-200',\n 'opacity-hover': 'text-gray-700 transition-opacity hover:opacity-70 dark:text-gray-200',\n subtle: 'text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200',\n};\n\nexport const Link = forwardRef<HTMLAnchorElement, LinkProps>(function Link(\n {\n variant = 'colored',\n external = false,\n hideExternalIcon = false,\n target,\n rel,\n className,\n children,\n ...rest\n },\n ref\n) {\n const finalTarget = external ? (target ?? '_blank') : target;\n const finalRel = external ? (rel ?? 'noopener noreferrer') : rel;\n return (\n <a\n ref={ref}\n target={finalTarget}\n rel={finalRel}\n className={clsx(\n 'focus-visible:ring-brand-500/40 inline-flex items-center gap-1 text-sm font-medium transition-colors focus:outline-none focus-visible:rounded focus-visible:ring-2',\n VARIANT_CLASS[variant],\n className\n )}\n {...rest}\n >\n {children}\n {external && !hideExternalIcon && (\n <ExternalLink className=\"h-3.5 w-3.5 shrink-0\" aria-hidden />\n )}\n </a>\n );\n});\n","import { clsx } from 'clsx';\nimport { ArrowRight, Check, Dot } from 'lucide-react';\nimport { createContext, useContext, type ComponentType, type ReactNode } from 'react';\n\nexport type ListVariant = 'unordered' | 'ordered' | 'plain';\nexport type ListMarker = 'disc' | 'check' | 'arrow' | 'dot' | 'none';\nexport type ListSpacing = 'tight' | 'normal' | 'loose';\nexport type ListOrientation = 'vertical' | 'horizontal';\n\nconst MARKER_ICON: Partial<Record<ListMarker, ComponentType<{ className?: string }>>> = {\n check: Check,\n arrow: ArrowRight,\n dot: Dot,\n};\n\nconst MARKER_COLOR: Partial<Record<ListMarker, string>> = {\n check: 'text-green-500',\n arrow: 'text-brand-500',\n dot: 'text-gray-400',\n};\n\nconst SPACING_VERTICAL: Record<ListSpacing, string> = {\n tight: 'space-y-1',\n normal: 'space-y-2',\n loose: 'space-y-3',\n};\n\nconst SPACING_HORIZONTAL: Record<ListSpacing, string> = {\n tight: 'gap-2',\n normal: 'gap-4',\n loose: 'gap-6',\n};\n\n// ── Context ──────────────────────────────────────────────────────────────────\n\ntype Ctx = {\n variant: ListVariant;\n marker: ListMarker;\n orientation: ListOrientation;\n};\n\nconst ListContext = createContext<Ctx | null>(null);\nconst useCtx = (): Ctx => {\n const ctx = useContext(ListContext);\n if (!ctx) throw new Error('List.Item must be used inside <List>');\n return ctx;\n};\n\n// ── Root ─────────────────────────────────────────────────────────────────────\n\nexport type ListProps = {\n variant?: ListVariant;\n /** Marker style (only applies when `variant=\"unordered\"`). Default `disc`. */\n marker?: ListMarker;\n spacing?: ListSpacing;\n orientation?: ListOrientation;\n className?: string;\n children: ReactNode;\n};\n\nconst ListRoot = ({\n variant = 'unordered',\n marker = 'disc',\n spacing = 'normal',\n orientation = 'vertical',\n className,\n children,\n}: ListProps) => {\n // For ordered or plain lists the `marker` prop is ignored — use 'none' so\n // we don't render a marker icon AND css list-style is set explicitly below.\n const effectiveMarker: ListMarker =\n variant === 'ordered' || variant === 'plain' ? 'none' : marker;\n const Tag = (variant === 'ordered' ? 'ol' : 'ul') as 'ul' | 'ol';\n // Use a native CSS bullet only for `disc` to keep semantics; for icon-based\n // markers (check/arrow/dot) and 'none' we render the marker ourselves so\n // colors and alignment are consistent.\n const useNativeMarker = variant === 'ordered' || effectiveMarker === 'disc';\n const listStyle =\n variant === 'ordered'\n ? 'list-decimal ps-5 marker:text-gray-400'\n : effectiveMarker === 'disc'\n ? 'list-disc ps-5 marker:text-gray-400'\n : 'list-none';\n const layout =\n orientation === 'horizontal'\n ? clsx('flex flex-wrap items-center', SPACING_HORIZONTAL[spacing])\n : SPACING_VERTICAL[spacing];\n return (\n <ListContext.Provider value={{ variant, marker: effectiveMarker, orientation }}>\n <Tag\n className={clsx(\n 'text-sm text-gray-700 dark:text-gray-300',\n listStyle,\n // When using the native marker we don't need flex layout per item.\n // For icon markers, use vertical/horizontal flex layouts.\n !useNativeMarker && layout,\n useNativeMarker && (orientation === 'horizontal' ? layout : SPACING_VERTICAL[spacing]),\n className\n )}\n >\n {children}\n </Tag>\n </ListContext.Provider>\n );\n};\n\n// ── Item ─────────────────────────────────────────────────────────────────────\n\nexport type ListItemProps = {\n /** Override the parent marker for this single item. */\n icon?: ComponentType<{ className?: string }>;\n /** Override the icon color (Tailwind class). Default depends on the marker. */\n iconColor?: string;\n className?: string;\n children: ReactNode;\n};\n\nconst ListItem = ({ icon, iconColor, className, children }: ListItemProps) => {\n const { variant, marker } = useCtx();\n // Ordered + disc + native: render plain <li> and let CSS draw the marker.\n if (variant === 'ordered' || marker === 'disc') {\n return <li className={className}>{children}</li>;\n }\n if (marker === 'none' && !icon) {\n return <li className={className}>{children}</li>;\n }\n const Icon = icon ?? MARKER_ICON[marker];\n const color = iconColor ?? MARKER_COLOR[marker] ?? 'text-gray-400';\n return (\n <li className={clsx('flex items-start gap-2', className)}>\n {Icon && <Icon className={clsx('mt-0.5 h-4 w-4 shrink-0', color)} aria-hidden />}\n <span className=\"flex-1\">{children}</span>\n </li>\n );\n};\n\n// ── Compound export ──────────────────────────────────────────────────────────\n\nexport const List = Object.assign(ListRoot, { Item: ListItem });\n","import * as RadixAccordion from '@radix-ui/react-accordion';\nimport { clsx } from 'clsx';\nimport { ChevronDown } from 'lucide-react';\nimport { forwardRef, type ComponentPropsWithoutRef, type ElementRef, type ReactNode } from 'react';\n\n// ── Root ─────────────────────────────────────────────────────────────────────\n\nexport type AccordionProps = ComponentPropsWithoutRef<typeof RadixAccordion.Root> & {\n /** Visual variant. `bordered` (default) wraps each item in a border; `seamless` strips borders for a tighter look. */\n appearance?: 'bordered' | 'seamless';\n};\n\nconst AccordionRoot = forwardRef<ElementRef<typeof RadixAccordion.Root>, AccordionProps>(\n function Accordion({ appearance = 'bordered', className, children, ...rest }, ref) {\n return (\n <RadixAccordion.Root\n ref={ref}\n className={clsx(\n 'block',\n appearance === 'bordered' &&\n 'overflow-hidden rounded-xl border border-gray-200 bg-white dark:border-gray-700 dark:bg-gray-900',\n className\n )}\n {...rest}\n >\n {children}\n </RadixAccordion.Root>\n );\n }\n) as React.ForwardRefExoticComponent<\n AccordionProps & React.RefAttributes<ElementRef<typeof RadixAccordion.Root>>\n>;\n\n// ── Item ─────────────────────────────────────────────────────────────────────\n\nexport type AccordionItemProps = ComponentPropsWithoutRef<typeof RadixAccordion.Item>;\n\nconst AccordionItem = forwardRef<ElementRef<typeof RadixAccordion.Item>, AccordionItemProps>(\n function AccordionItem({ className, ...rest }, ref) {\n return (\n <RadixAccordion.Item\n ref={ref}\n className={clsx('border-b border-gray-100 last:border-b-0 dark:border-gray-800', className)}\n {...rest}\n />\n );\n }\n);\n\n// ── Trigger (folds Radix Header inside) ──────────────────────────────────────\n\nexport type AccordionTriggerProps = ComponentPropsWithoutRef<typeof RadixAccordion.Trigger> & {\n children: ReactNode;\n /** Hide the chevron indicator. Default `false`. */\n hideChevron?: boolean;\n};\n\nconst AccordionTrigger = forwardRef<\n ElementRef<typeof RadixAccordion.Trigger>,\n AccordionTriggerProps\n>(function AccordionTrigger({ className, children, hideChevron = false, ...rest }, ref) {\n return (\n <RadixAccordion.Header className=\"flex\">\n <RadixAccordion.Trigger\n ref={ref}\n className={clsx(\n 'group focus-visible:ring-brand-500/30 flex w-full items-center justify-between gap-2 px-4 py-3 text-left text-sm font-medium text-gray-900 transition-colors hover:bg-gray-50 focus:outline-none focus-visible:ring-2 dark:text-white dark:hover:bg-white/5',\n className\n )}\n {...rest}\n >\n <span className=\"flex-1\">{children}</span>\n {!hideChevron && (\n <ChevronDown\n className=\"h-4 w-4 shrink-0 text-gray-400 transition-transform duration-200 group-data-[state=open]:rotate-180\"\n aria-hidden\n />\n )}\n </RadixAccordion.Trigger>\n </RadixAccordion.Header>\n );\n});\n\n// ── Content ──────────────────────────────────────────────────────────────────\n\nexport type AccordionContentProps = ComponentPropsWithoutRef<typeof RadixAccordion.Content>;\n\nconst AccordionContent = forwardRef<\n ElementRef<typeof RadixAccordion.Content>,\n AccordionContentProps\n>(function AccordionContent({ className, children, ...rest }, ref) {\n return (\n <RadixAccordion.Content\n ref={ref}\n // Animate using Radix's CSS var `--radix-accordion-content-height`.\n // `motion-safe` honours `prefers-reduced-motion`.\n className={clsx(\n 'overflow-hidden text-sm text-gray-700 motion-safe:data-[state=closed]:animate-[accordionUp_180ms_ease-out] motion-safe:data-[state=open]:animate-[accordionDown_180ms_ease-out] dark:text-gray-300',\n className\n )}\n {...rest}\n >\n <div className=\"px-4 pt-0 pb-4\">{children}</div>\n <style>{`\n @keyframes accordionDown {\n from { height: 0; }\n to { height: var(--radix-accordion-content-height); }\n }\n @keyframes accordionUp {\n from { height: var(--radix-accordion-content-height); }\n to { height: 0; }\n }\n `}</style>\n </RadixAccordion.Content>\n );\n});\n\n// ── Compound export ──────────────────────────────────────────────────────────\n\nexport const Accordion = Object.assign(AccordionRoot, {\n Item: AccordionItem,\n Trigger: AccordionTrigger,\n Content: AccordionContent,\n});\n","import { clsx } from 'clsx';\nimport { Children, type ReactNode } from 'react';\n\nexport type ImageGridGap = 'sm' | 'md' | 'lg';\n\nexport type ImageGridColumns =\n | 1\n | 2\n | 3\n | 4\n | { sm?: 1 | 2 | 3 | 4; md?: 1 | 2 | 3 | 4; lg?: 1 | 2 | 3 | 4 };\n\nexport type ImageGridProps = {\n /** Number of columns (static) or per-breakpoint object. Default 3. */\n columns?: ImageGridColumns;\n gap?: ImageGridGap;\n /** Tailwind aspect-* class applied to each cell. Default `aspect-square`. */\n aspectRatio?: string;\n /** Round each cell. Default `true`. */\n rounded?: boolean;\n className?: string;\n children: ReactNode;\n};\n\nconst STATIC_COLS: Record<1 | 2 | 3 | 4, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-2',\n 3: 'grid-cols-3',\n 4: 'grid-cols-4',\n};\n\nconst SM_COLS: Record<1 | 2 | 3 | 4, string> = {\n 1: 'sm:grid-cols-1',\n 2: 'sm:grid-cols-2',\n 3: 'sm:grid-cols-3',\n 4: 'sm:grid-cols-4',\n};\n\nconst MD_COLS: Record<1 | 2 | 3 | 4, string> = {\n 1: 'md:grid-cols-1',\n 2: 'md:grid-cols-2',\n 3: 'md:grid-cols-3',\n 4: 'md:grid-cols-4',\n};\n\nconst LG_COLS: Record<1 | 2 | 3 | 4, string> = {\n 1: 'lg:grid-cols-1',\n 2: 'lg:grid-cols-2',\n 3: 'lg:grid-cols-3',\n 4: 'lg:grid-cols-4',\n};\n\nconst GAP_CLASS: Record<ImageGridGap, string> = {\n sm: 'gap-2',\n md: 'gap-4',\n lg: 'gap-6',\n};\n\nexport const ImageGrid = ({\n columns = 3,\n gap = 'md',\n aspectRatio = 'aspect-square',\n rounded = true,\n className,\n children,\n}: ImageGridProps) => {\n const colsClass =\n typeof columns === 'number'\n ? STATIC_COLS[columns]\n : clsx(\n 'grid-cols-1',\n columns.sm && SM_COLS[columns.sm],\n columns.md && MD_COLS[columns.md],\n columns.lg && LG_COLS[columns.lg]\n );\n return (\n <div className={clsx('grid', colsClass, GAP_CLASS[gap], className)}>\n {Children.map(children, (child, i) => (\n <div\n key={i}\n className={clsx(\n 'overflow-hidden bg-gray-100 dark:bg-gray-800 [&_img]:h-full [&_img]:w-full [&_img]:object-cover',\n aspectRatio,\n rounded && 'rounded-xl'\n )}\n >\n {child}\n </div>\n ))}\n </div>\n );\n};\n","import { clsx } from 'clsx';\n\nexport type VideoEmbedAspect = '16:9' | '4:3' | '1:1' | '21:9' | (string & {});\n\nexport type VideoEmbedProps = {\n src: string;\n /** Required for a11y — title of the embedded video. */\n title: string;\n /** Aspect ratio. Either a preset (`16:9`, `4:3`, `1:1`, `21:9`) or any Tailwind aspect-* class. */\n aspectRatio?: VideoEmbedAspect;\n /** Render with rounded corners. Default `true`. */\n rounded?: boolean;\n /** Embed type. `iframe` (default — YouTube, Vimeo, …) or `video` (native HTML5 file). */\n type?: 'iframe' | 'video';\n /** Pass-through to the underlying element (iframe `allow`, video `muted`/`autoPlay`/`loop`/`controls`/`poster`). */\n allow?: string;\n muted?: boolean;\n autoPlay?: boolean;\n loop?: boolean;\n controls?: boolean;\n poster?: string;\n className?: string;\n};\n\nconst ASPECT_PRESETS: Record<'16:9' | '4:3' | '1:1' | '21:9', string> = {\n '16:9': 'aspect-video',\n '4:3': 'aspect-[4/3]',\n '1:1': 'aspect-square',\n '21:9': 'aspect-[21/9]',\n};\n\nconst resolveAspect = (a: VideoEmbedAspect): string => {\n if (a in ASPECT_PRESETS) return ASPECT_PRESETS[a as keyof typeof ASPECT_PRESETS];\n // assume the consumer passed a Tailwind class\n return a;\n};\n\nexport const VideoEmbed = ({\n src,\n title,\n aspectRatio = '16:9',\n rounded = true,\n type = 'iframe',\n allow = 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture',\n muted,\n autoPlay,\n loop,\n controls = true,\n poster,\n className,\n}: VideoEmbedProps) => (\n <div\n className={clsx(\n 'w-full overflow-hidden bg-black',\n resolveAspect(aspectRatio),\n rounded && 'rounded-xl',\n className\n )}\n >\n {type === 'iframe' ? (\n <iframe\n src={src}\n title={title}\n allow={allow}\n allowFullScreen\n loading=\"lazy\"\n className=\"h-full w-full border-0\"\n />\n ) : (\n <video\n src={src}\n title={title}\n muted={muted}\n autoPlay={autoPlay}\n loop={loop}\n controls={controls}\n playsInline\n poster={poster}\n className=\"h-full w-full\"\n />\n )}\n </div>\n);\n","import { Toaster as SonnerToaster, type ToasterProps } from 'sonner';\n\n/**\n * Cosmos toast — thin wrapper around sonner.\n *\n * Mount the `<Toaster />` once at the app root. Trigger toasts from anywhere\n * with `toast(...)`, `toast.success(...)`, `toast.error(...)`, `toast.promise(...)`.\n *\n * Cosmos defaults: bottom-right, system theme, rich-colors on, close button on.\n * Override per-instance by passing props.\n */\n\nexport type CosmosToasterProps = ToasterProps;\n\nexport const Toaster = (props: CosmosToasterProps) => (\n <SonnerToaster\n position=\"bottom-right\"\n theme=\"system\"\n richColors\n closeButton\n duration={4000}\n toastOptions={{\n classNames: {\n toast:\n 'group rounded-xl border border-gray-200 bg-white text-sm text-gray-900 shadow-lg dark:border-gray-700 dark:bg-gray-900 dark:text-white',\n title: 'text-sm font-semibold',\n description: 'text-xs text-gray-600 dark:text-gray-400',\n actionButton: 'rounded-md bg-brand-500 px-2.5 py-1 text-xs font-medium text-white',\n cancelButton:\n 'rounded-md bg-gray-100 px-2.5 py-1 text-xs font-medium text-gray-700 dark:bg-gray-700 dark:text-gray-200',\n closeButton:\n 'rounded-md text-gray-400 hover:bg-gray-100 hover:text-gray-700 dark:hover:bg-gray-800 dark:hover:text-gray-200',\n },\n }}\n {...props}\n />\n);\n\n// Re-export the trigger function as `toast`. Includes `toast.success`,\n// `toast.error`, `toast.warning`, `toast.info`, `toast.loading`,\n// `toast.promise`, `toast.dismiss`.\n//\n// Re-exported directly from sonner (rather than aliased through a local\n// `const toast = sonnerToast`) because sonner's `.promise(...)` signature\n// references an internal `PromiseIExtendedResult` type that isn't part of\n// its public exports — re-exporting in place keeps the binding pointing at\n// the original symbol and avoids the TS4023 \"cannot be named\" error during\n// `.d.ts` emission.\nexport { toast } from 'sonner';\n","import { clsx } from 'clsx';\nimport {\n AlertTriangle,\n CheckCircle2,\n Info,\n Megaphone,\n X,\n XCircle,\n type LucideIcon,\n} from 'lucide-react';\nimport { useState, type ElementType, type ReactNode } from 'react';\n\nexport type AnnouncementBarIntent = 'info' | 'success' | 'warning' | 'danger' | 'brand';\n\nexport type AnnouncementBarProps = {\n intent?: AnnouncementBarIntent;\n /** Override the default icon for the intent. Pass `null` to hide. */\n icon?: ElementType | null;\n message: ReactNode;\n /** Right-side slot — a Link, Button, etc. */\n action?: ReactNode;\n /** Render a close button. */\n dismissible?: boolean;\n /** Called when the user clicks close. */\n onDismiss?: () => void;\n /** Stick to the top of the viewport. */\n sticky?: boolean;\n className?: string;\n};\n\nconst INTENT_ICON: Record<AnnouncementBarIntent, LucideIcon> = {\n info: Info,\n success: CheckCircle2,\n warning: AlertTriangle,\n danger: XCircle,\n brand: Megaphone,\n};\n\nconst INTENT_BG: Record<AnnouncementBarIntent, string> = {\n info: 'bg-blue-50 text-blue-800 border-blue-200 dark:bg-blue-500/10 dark:text-blue-300 dark:border-blue-500/30',\n success:\n 'bg-green-50 text-green-800 border-green-200 dark:bg-green-500/10 dark:text-green-300 dark:border-green-500/30',\n warning:\n 'bg-amber-50 text-amber-900 border-amber-200 dark:bg-amber-500/10 dark:text-amber-200 dark:border-amber-500/30',\n danger:\n 'bg-red-50 text-red-800 border-red-200 dark:bg-red-500/10 dark:text-red-300 dark:border-red-500/30',\n brand: 'bg-brand-500 text-white border-brand-600 dark:bg-brand-600 dark:border-brand-500',\n};\n\nconst ICON_COLOR: Record<AnnouncementBarIntent, string> = {\n info: 'text-blue-500 dark:text-blue-400',\n success: 'text-green-500 dark:text-green-400',\n warning: 'text-amber-500 dark:text-amber-400',\n danger: 'text-red-500 dark:text-red-400',\n brand: 'text-white',\n};\n\nexport const AnnouncementBar = ({\n intent = 'info',\n icon,\n message,\n action,\n dismissible = false,\n onDismiss,\n sticky = false,\n className,\n}: AnnouncementBarProps) => {\n const [open, setOpen] = useState(true);\n if (!open) return null;\n const Icon = icon === null ? null : (icon ?? INTENT_ICON[intent]);\n return (\n <div\n role=\"status\"\n className={clsx(\n 'flex w-full items-center gap-3 border-b px-4 py-2 text-sm',\n INTENT_BG[intent],\n sticky && 'sticky top-0 z-40',\n className\n )}\n >\n {Icon && <Icon className={clsx('h-4 w-4 shrink-0', ICON_COLOR[intent])} aria-hidden />}\n <span className=\"min-w-0 flex-1\">{message}</span>\n {action && <span className=\"shrink-0\">{action}</span>}\n {dismissible && (\n <button\n type=\"button\"\n aria-label=\"Dismiss announcement\"\n onClick={() => {\n setOpen(false);\n onDismiss?.();\n }}\n className={clsx(\n 'flex h-7 w-7 shrink-0 items-center justify-center rounded-md transition-colors',\n intent === 'brand'\n ? 'text-white/80 hover:bg-white/15 hover:text-white'\n : 'text-current opacity-60 hover:bg-black/5 hover:opacity-100 dark:hover:bg-white/10'\n )}\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n );\n};\n","import { clsx } from 'clsx';\nimport { Cookie } from 'lucide-react';\nimport { useState, type ReactNode } from 'react';\nimport { Button } from './Button';\n\nexport type CookieBannerPosition = 'bottom' | 'top' | 'floating';\n\nexport type CookieBannerProps = {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n position?: CookieBannerPosition;\n title?: string;\n message: ReactNode;\n /** Render the Settings button. Hidden if no handler. */\n onSettings?: () => void;\n settingsLabel?: string;\n /** Render the Deny All button. Hidden if no handler. */\n onDeny?: () => void;\n denyLabel?: string;\n /** Required Accept handler — primary action. */\n onAccept: () => void;\n acceptLabel?: string;\n /** Show the Cookie icon next to the title. Default `true`. */\n showIcon?: boolean;\n className?: string;\n};\n\nexport const CookieBanner = ({\n open: openProp,\n defaultOpen = true,\n onOpenChange,\n position = 'bottom',\n title = 'We use cookies',\n message,\n onSettings,\n settingsLabel = 'Cookie settings',\n onDeny,\n denyLabel = 'Deny all',\n onAccept,\n acceptLabel = 'Accept all',\n showIcon = true,\n className,\n}: CookieBannerProps) => {\n const isControlled = openProp !== undefined;\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const open = isControlled ? openProp : internalOpen;\n\n const setOpen = (v: boolean) => {\n if (!isControlled) setInternalOpen(v);\n onOpenChange?.(v);\n };\n\n const handleAccept = () => {\n onAccept();\n setOpen(false);\n };\n const handleDeny = () => {\n onDeny?.();\n setOpen(false);\n };\n const handleSettings = () => {\n onSettings?.();\n // Settings doesn't auto-close — typically opens a sub-modal.\n };\n\n if (!open) return null;\n\n const positionClass: Record<CookieBannerPosition, string> = {\n bottom: 'fixed inset-x-0 bottom-0 border-t',\n top: 'fixed inset-x-0 top-0 border-b',\n floating: 'fixed inset-x-0 bottom-4 mx-auto max-w-3xl rounded-2xl border shadow-xl',\n };\n\n return (\n <div\n role=\"dialog\"\n aria-label={title}\n className={clsx(\n 'z-50 border-gray-200 bg-white p-4 dark:border-gray-700 dark:bg-gray-900',\n positionClass[position],\n className\n )}\n >\n <div className=\"flex flex-col gap-4 md:flex-row md:items-center md:justify-between\">\n <div className=\"flex min-w-0 items-start gap-3\">\n {showIcon && <Cookie className=\"text-brand-500 mt-0.5 h-5 w-5 shrink-0\" aria-hidden />}\n <div className=\"min-w-0 flex-1\">\n {title && (\n <p className=\"text-sm font-semibold text-gray-900 dark:text-white\">{title}</p>\n )}\n <div className=\"mt-1 text-sm text-gray-600 dark:text-gray-400\">{message}</div>\n </div>\n </div>\n <div className=\"flex shrink-0 flex-wrap items-center gap-2\">\n {onSettings && (\n <Button variant=\"ghost\" size=\"sm\" onClick={handleSettings}>\n {settingsLabel}\n </Button>\n )}\n {onDeny && (\n <Button variant=\"secondary\" size=\"sm\" onClick={handleDeny}>\n {denyLabel}\n </Button>\n )}\n <Button variant=\"primary\" size=\"sm\" onClick={handleAccept}>\n {acceptLabel}\n </Button>\n </div>\n </div>\n </div>\n );\n};\n","import { Command } from 'cmdk';\nimport { clsx } from 'clsx';\nimport { Search } from 'lucide-react';\nimport {\n forwardRef,\n useEffect,\n type ComponentPropsWithoutRef,\n type ElementRef,\n type ElementType,\n type ReactNode,\n} from 'react';\n\n// ── Root (wraps cmdk's Command.Dialog) ───────────────────────────────────────\n\nexport type CommandPaletteProps = ComponentPropsWithoutRef<typeof Command.Dialog> & {\n /**\n * Optional global hotkey that toggles the palette open/closed when the\n * matching keyboard combination is pressed. Common values: `'mod+k'`\n * (Cmd on macOS, Ctrl elsewhere), `'mod+shift+p'`, `'/'`. Pass `null`\n * to skip registering a hotkey.\n */\n hotkey?: 'mod+k' | 'mod+/' | '/' | string | null;\n};\n\nconst matchesHotkey = (e: KeyboardEvent, hotkey: string): boolean => {\n // Lightweight matcher: lowercase, split on '+', check each modifier + key.\n const parts = hotkey.toLowerCase().split('+');\n const expectMod = parts.includes('mod');\n const expectMeta = parts.includes('meta') || parts.includes('cmd');\n const expectCtrl = parts.includes('ctrl');\n const expectShift = parts.includes('shift');\n const expectAlt = parts.includes('alt') || parts.includes('option');\n const key = parts[parts.length - 1];\n\n const isMac = typeof navigator !== 'undefined' && /Mac|iPhone|iPad/i.test(navigator.platform);\n const modPressed = isMac ? e.metaKey : e.ctrlKey;\n\n if (expectMod && !modPressed) return false;\n if (expectMeta && !e.metaKey) return false;\n if (expectCtrl && !e.ctrlKey) return false;\n if (expectShift && !e.shiftKey) return false;\n if (expectAlt && !e.altKey) return false;\n return e.key.toLowerCase() === key;\n};\n\nconst CommandPaletteRoot = ({\n hotkey = 'mod+k',\n open,\n onOpenChange,\n className,\n overlayClassName,\n contentClassName,\n children,\n label = 'Command palette',\n ...rest\n}: CommandPaletteProps) => {\n useEffect(() => {\n if (!hotkey) return;\n const handler = (e: KeyboardEvent) => {\n if (matchesHotkey(e, hotkey)) {\n e.preventDefault();\n onOpenChange?.(!open);\n }\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [hotkey, open, onOpenChange]);\n\n return (\n <Command.Dialog\n open={open}\n onOpenChange={onOpenChange}\n label={label}\n overlayClassName={clsx(\n 'fixed inset-0 z-[9998] bg-black/50 backdrop-blur-sm',\n overlayClassName\n )}\n contentClassName={clsx(\n 'fixed top-[20%] left-1/2 z-[9999] w-[640px] max-w-[calc(100vw-2rem)] -translate-x-1/2 overflow-hidden rounded-xl border border-gray-200 bg-white shadow-2xl dark:border-gray-700 dark:bg-gray-900',\n contentClassName\n )}\n className={className}\n {...rest}\n >\n {children}\n </Command.Dialog>\n );\n};\n\n// ── Input ────────────────────────────────────────────────────────────────────\n\nexport type CommandPaletteInputProps = ComponentPropsWithoutRef<typeof Command.Input>;\n\nconst CommandPaletteInput = forwardRef<ElementRef<typeof Command.Input>, CommandPaletteInputProps>(\n function CommandPaletteInput({ className, ...rest }, ref) {\n return (\n <div className=\"flex items-center gap-3 border-b border-gray-100 px-4 dark:border-gray-800\">\n <Search className=\"h-4 w-4 shrink-0 text-gray-400\" aria-hidden />\n <Command.Input\n ref={ref}\n className={clsx(\n 'flex h-12 w-full bg-transparent text-sm text-gray-900 placeholder:text-gray-400 focus:outline-none dark:text-white',\n className\n )}\n {...rest}\n />\n </div>\n );\n }\n);\n\n// ── List ─────────────────────────────────────────────────────────────────────\n\nexport type CommandPaletteListProps = ComponentPropsWithoutRef<typeof Command.List>;\n\nconst CommandPaletteList = forwardRef<ElementRef<typeof Command.List>, CommandPaletteListProps>(\n function CommandPaletteList({ className, ...rest }, ref) {\n return (\n <Command.List\n ref={ref}\n className={clsx('max-h-[420px] overflow-y-auto p-2', className)}\n {...rest}\n />\n );\n }\n);\n\n// ── Group ────────────────────────────────────────────────────────────────────\n\nexport type CommandPaletteGroupProps = ComponentPropsWithoutRef<typeof Command.Group>;\n\nconst CommandPaletteGroup = forwardRef<ElementRef<typeof Command.Group>, CommandPaletteGroupProps>(\n function CommandPaletteGroup({ className, ...rest }, ref) {\n return (\n <Command.Group\n ref={ref}\n className={clsx(\n 'px-1 pb-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:pt-2 [&_[cmdk-group-heading]]:pb-1.5 [&_[cmdk-group-heading]]:text-[11px] [&_[cmdk-group-heading]]:font-semibold [&_[cmdk-group-heading]]:tracking-wider [&_[cmdk-group-heading]]:text-gray-400 [&_[cmdk-group-heading]]:uppercase dark:[&_[cmdk-group-heading]]:text-gray-500',\n className\n )}\n {...rest}\n />\n );\n }\n);\n\n// ── Item ─────────────────────────────────────────────────────────────────────\n\nexport type CommandPaletteItemProps = Omit<\n ComponentPropsWithoutRef<typeof Command.Item>,\n 'children'\n> & {\n icon?: ElementType;\n /** Right-aligned keyboard shortcut hint (e.g. \"⌘D\"). */\n shortcut?: ReactNode;\n children: ReactNode;\n};\n\nconst CommandPaletteItem = forwardRef<ElementRef<typeof Command.Item>, CommandPaletteItemProps>(\n function CommandPaletteItem({ icon: Icon, shortcut, children, className, ...rest }, ref) {\n return (\n <Command.Item\n ref={ref}\n className={clsx(\n 'flex cursor-pointer items-center gap-3 rounded-md px-2 py-2 text-sm text-gray-700 transition-colors outline-none select-none',\n 'data-[selected=true]:bg-gray-100 data-[selected=true]:text-gray-900',\n 'dark:text-gray-200 dark:data-[selected=true]:bg-white/5 dark:data-[selected=true]:text-white',\n 'data-[disabled=true]:cursor-not-allowed data-[disabled=true]:opacity-40',\n className\n )}\n {...rest}\n >\n {Icon && <Icon className=\"h-4 w-4 shrink-0 text-gray-400\" aria-hidden />}\n <span className=\"flex-1 truncate\">{children}</span>\n {shortcut && (\n <kbd className=\"shrink-0 rounded border border-gray-200 bg-gray-50 px-1.5 py-0.5 font-mono text-[10px] font-medium text-gray-500 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-400\">\n {shortcut}\n </kbd>\n )}\n </Command.Item>\n );\n }\n);\n\n// ── Separator ────────────────────────────────────────────────────────────────\n\nconst CommandPaletteSeparator = forwardRef<\n ElementRef<typeof Command.Separator>,\n ComponentPropsWithoutRef<typeof Command.Separator>\n>(function CommandPaletteSeparator({ className, ...rest }, ref) {\n return (\n <Command.Separator\n ref={ref}\n className={clsx('my-1 h-px bg-gray-100 dark:bg-gray-800', className)}\n {...rest}\n />\n );\n});\n\n// ── Empty ────────────────────────────────────────────────────────────────────\n\nconst CommandPaletteEmpty = forwardRef<\n ElementRef<typeof Command.Empty>,\n ComponentPropsWithoutRef<typeof Command.Empty>\n>(function CommandPaletteEmpty({ className, ...rest }, ref) {\n return (\n <Command.Empty\n ref={ref}\n className={clsx('px-2 py-8 text-center text-sm text-gray-500 dark:text-gray-400', className)}\n {...rest}\n />\n );\n});\n\n// ── Loading ──────────────────────────────────────────────────────────────────\n\nconst CommandPaletteLoading = forwardRef<\n ElementRef<typeof Command.Loading>,\n ComponentPropsWithoutRef<typeof Command.Loading>\n>(function CommandPaletteLoading({ className, ...rest }, ref) {\n return (\n <Command.Loading\n ref={ref}\n className={clsx('px-2 py-6 text-center text-xs text-gray-500 dark:text-gray-400', className)}\n {...rest}\n />\n );\n});\n\n// ── Footer (Cosmos addition — keyboard hints) ────────────────────────────────\n\nexport type CommandPaletteFooterProps = {\n className?: string;\n children: ReactNode;\n};\n\nconst CommandPaletteFooter = ({ className, children }: CommandPaletteFooterProps) => (\n <div\n className={clsx(\n 'flex items-center justify-between border-t border-gray-100 px-4 py-2 text-[11px] text-gray-500 dark:border-gray-800 dark:text-gray-400',\n className\n )}\n >\n {children}\n </div>\n);\n\n// ── Compound export ──────────────────────────────────────────────────────────\n\nexport const CommandPalette = Object.assign(CommandPaletteRoot, {\n Input: CommandPaletteInput,\n List: CommandPaletteList,\n Group: CommandPaletteGroup,\n Item: CommandPaletteItem,\n Separator: CommandPaletteSeparator,\n Empty: CommandPaletteEmpty,\n Loading: CommandPaletteLoading,\n Footer: CommandPaletteFooter,\n});\n","import { clsx } from 'clsx';\nimport { ArrowUp } from 'lucide-react';\nimport {\n useCallback,\n useEffect,\n useState,\n type ButtonHTMLAttributes,\n type ComponentType,\n} from 'react';\n\nexport type BackToTopFabPosition = 'bottom-right' | 'bottom-left';\nexport type BackToTopFabIntent = 'brand' | 'neutral';\n\nexport type BackToTopFabProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onClick'> & {\n /** Pixels of vertical scroll before the FAB fades in. Default `300`. */\n threshold?: number;\n /** Anchor corner. Default `bottom-right`. */\n position?: BackToTopFabPosition;\n /** Use smooth scrolling. Default `true`. */\n smoothScroll?: boolean;\n /** Override the icon. Default `ArrowUp`. */\n icon?: ComponentType<{ className?: string }>;\n /** Visual intent. Default `brand` (filled brand-500). `neutral` is gray. */\n intent?: BackToTopFabIntent;\n /** Override the click handler — defaults to `window.scrollTo({ top: 0 })`. */\n onActivate?: () => void;\n /** Distance from the viewport edges in px. Default `24`. */\n offset?: number;\n ariaLabel?: string;\n};\n\nconst POSITION_CLASS: Record<BackToTopFabPosition, string> = {\n 'bottom-right': 'right-0',\n 'bottom-left': 'left-0',\n};\n\nconst INTENT_CLASS: Record<BackToTopFabIntent, string> = {\n brand: 'bg-brand-500 text-white shadow-lg shadow-brand-500/25 hover:bg-brand-600 active:scale-95',\n neutral:\n 'bg-white text-gray-700 border border-gray-200 shadow-lg hover:bg-gray-50 active:scale-95 dark:bg-gray-800 dark:text-gray-200 dark:border-gray-700 dark:hover:bg-gray-700',\n};\n\nexport const BackToTopFab = ({\n threshold = 300,\n position = 'bottom-right',\n smoothScroll = true,\n icon: Icon = ArrowUp,\n intent = 'brand',\n onActivate,\n offset = 24,\n ariaLabel = 'Back to top',\n className,\n style,\n ...rest\n}: BackToTopFabProps) => {\n const [visible, setVisible] = useState(false);\n\n useEffect(() => {\n const handler = () => setVisible(window.scrollY > threshold);\n handler();\n window.addEventListener('scroll', handler, { passive: true });\n return () => window.removeEventListener('scroll', handler);\n }, [threshold]);\n\n const handleClick = useCallback(() => {\n if (onActivate) {\n onActivate();\n return;\n }\n window.scrollTo({ top: 0, behavior: smoothScroll ? 'smooth' : 'auto' });\n }, [onActivate, smoothScroll]);\n\n const positionStyle = {\n bottom: offset,\n [position === 'bottom-right' ? 'right' : 'left']: offset,\n ...style,\n };\n\n return (\n <button\n type=\"button\"\n aria-label={ariaLabel}\n aria-hidden={!visible || undefined}\n tabIndex={visible ? 0 : -1}\n onClick={handleClick}\n style={positionStyle}\n className={clsx(\n 'fixed z-40 flex h-12 w-12 items-center justify-center rounded-full transition-all duration-200',\n POSITION_CLASS[position],\n INTENT_CLASS[intent],\n visible\n ? 'pointer-events-auto translate-y-0 opacity-100'\n : 'pointer-events-none translate-y-2 opacity-0',\n className\n )}\n {...rest}\n >\n <Icon className=\"h-5 w-5\" aria-hidden />\n </button>\n );\n};\n","import { clsx } from 'clsx';\nimport { X } from 'lucide-react';\nimport { Fragment, useEffect, useState, type ReactNode } from 'react';\n\n// ── Hotkey matcher ───────────────────────────────────────────────────────────\n// Lightweight matcher mirroring CommandPalette — kept inline to avoid\n// cross-component coupling. Lowercase, split on '+', match modifiers + key.\n\nconst matchesHotkey = (e: KeyboardEvent, hotkey: string): boolean => {\n const parts = hotkey.toLowerCase().split('+');\n const expectMod = parts.includes('mod');\n const expectMeta = parts.includes('meta') || parts.includes('cmd');\n const expectCtrl = parts.includes('ctrl');\n const expectShift = parts.includes('shift');\n const expectAlt = parts.includes('alt') || parts.includes('option');\n const key = parts[parts.length - 1];\n\n const isMac = typeof navigator !== 'undefined' && /Mac|iPhone|iPad/i.test(navigator.platform);\n const modPressed = isMac ? e.metaKey : e.ctrlKey;\n\n if (expectMod && !modPressed) return false;\n if (expectMeta && !e.metaKey) return false;\n if (expectCtrl && !e.ctrlKey) return false;\n if (expectShift && !e.shiftKey) return false;\n if (expectAlt && !e.altKey) return false;\n return e.key.toLowerCase() === key;\n};\n\n// Skip the hotkey when the user is typing in a form control — opening the\n// help overlay while typing \"?\" in a textarea would surprise the user.\nconst isTypingInFormControl = (target: EventTarget | null): boolean => {\n if (!(target instanceof HTMLElement)) return false;\n const tag = target.tagName;\n return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || target.isContentEditable;\n};\n\n// ── Key rendering ────────────────────────────────────────────────────────────\n\nconst KEY_LABEL: Record<string, string> = {\n mod: '⌘',\n cmd: '⌘',\n meta: '⌘',\n ctrl: 'Ctrl',\n shift: '⇧',\n alt: '⌥',\n option: '⌥',\n enter: '↵',\n escape: 'Esc',\n esc: 'Esc',\n arrowup: '↑',\n arrowdown: '↓',\n arrowleft: '←',\n arrowright: '→',\n backspace: '⌫',\n delete: '⌦',\n tab: 'Tab',\n space: '␣',\n};\n\nconst formatKey = (raw: string, isMac: boolean): string => {\n const key = raw.toLowerCase();\n if (key === 'mod') return isMac ? '⌘' : 'Ctrl';\n if (KEY_LABEL[key]) return KEY_LABEL[key];\n return raw.length === 1 ? raw.toUpperCase() : raw;\n};\n\nconst Kbd = ({ children, className }: { children: ReactNode; className?: string }) => (\n <kbd\n className={clsx(\n 'inline-flex h-6 min-w-[1.5rem] items-center justify-center rounded border border-gray-200 bg-gray-50 px-1.5 font-mono text-[11px] font-medium text-gray-700 shadow-[0_1px_0_0_rgba(0,0,0,0.05)] dark:border-gray-700 dark:bg-gray-800 dark:text-gray-300',\n className\n )}\n >\n {children}\n </kbd>\n);\n\n// ── Root ─────────────────────────────────────────────────────────────────────\n\nexport type HelpOverlayProps = {\n /** Controlled open state. Omit to use the internal hotkey-driven state. */\n open?: boolean;\n /** Called when the overlay opens or closes (controlled or uncontrolled). */\n onOpenChange?: (open: boolean) => void;\n /**\n * Global hotkey that toggles the overlay. Defaults to `'?'`. Pass `null`\n * to skip registering a hotkey (controlled-only usage).\n */\n hotkey?: string | null;\n /** Header title. Defaults to `'Keyboard shortcuts'`. */\n title?: ReactNode;\n /** Optional descriptive subtitle below the title. */\n description?: ReactNode;\n /** Footer hint text. Defaults to `Press Esc to close`. */\n footer?: ReactNode;\n className?: string;\n children: ReactNode;\n};\n\nconst HelpOverlayRoot = ({\n open: controlledOpen,\n onOpenChange,\n hotkey = '?',\n title = 'Keyboard shortcuts',\n description,\n footer,\n className,\n children,\n}: HelpOverlayProps) => {\n const isControlled = controlledOpen !== undefined;\n const [internalOpen, setInternalOpen] = useState(false);\n const open = isControlled ? controlledOpen : internalOpen;\n\n const setOpen = (next: boolean) => {\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n };\n\n // Hotkey toggles open/close; Esc always closes (handled while open).\n useEffect(() => {\n if (!hotkey) return;\n const handler = (e: KeyboardEvent) => {\n if (isTypingInFormControl(e.target)) return;\n if (matchesHotkey(e, hotkey)) {\n e.preventDefault();\n setOpen(!open);\n }\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n // setOpen is stable enough — depends only on isControlled/onOpenChange/open\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [hotkey, open, isControlled, onOpenChange]);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n setOpen(false);\n }\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n if (!open) return null;\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center p-4\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={typeof title === 'string' ? title : 'Keyboard shortcuts'}\n >\n <div\n className=\"absolute inset-0 bg-black/50 backdrop-blur-sm\"\n onClick={() => setOpen(false)}\n aria-hidden\n />\n <div\n className={clsx(\n 'relative flex max-h-[80vh] w-full max-w-2xl flex-col overflow-hidden rounded-2xl border border-gray-200 bg-white shadow-2xl dark:border-gray-800 dark:bg-gray-900',\n className\n )}\n >\n <div className=\"flex items-start justify-between gap-4 border-b border-gray-200 px-5 py-4 dark:border-gray-800\">\n <div className=\"min-w-0 flex-1\">\n <h2 className=\"text-base font-semibold text-gray-900 dark:text-gray-100\">{title}</h2>\n {description && (\n <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">{description}</p>\n )}\n </div>\n <button\n type=\"button\"\n onClick={() => setOpen(false)}\n aria-label=\"Close keyboard shortcuts\"\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-white/5 dark:hover:text-gray-300\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n <div className=\"grid grid-cols-1 gap-x-8 gap-y-6 overflow-y-auto px-5 py-5 sm:grid-cols-2\">\n {children}\n </div>\n {(footer ?? true) && (\n <div className=\"flex items-center justify-end gap-2 border-t border-gray-200 bg-gray-50 px-5 py-2.5 text-xs text-gray-500 dark:border-gray-800 dark:bg-gray-800/50 dark:text-gray-400\">\n {footer ?? (\n <>\n Press <Kbd>Esc</Kbd> to close\n </>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\n// ── Section ──────────────────────────────────────────────────────────────────\n\nexport type HelpOverlaySectionProps = {\n title: ReactNode;\n className?: string;\n children: ReactNode;\n};\n\nconst HelpOverlaySection = ({ title, className, children }: HelpOverlaySectionProps) => (\n <section className={clsx('space-y-2', className)}>\n <h3 className=\"text-[11px] font-semibold tracking-wider text-gray-400 uppercase dark:text-gray-500\">\n {title}\n </h3>\n <ul className=\"divide-y divide-gray-100 dark:divide-gray-800\">{children}</ul>\n </section>\n);\n\n// ── Shortcut ─────────────────────────────────────────────────────────────────\n\nexport type HelpOverlayShortcutProps = {\n /**\n * Either a single combo (`'mod+k'`) or a sequence of combos to press in\n * order (`['g', 'h']`). For chord display, separate parts with `+`\n * inside each string.\n */\n keys: string | string[];\n description: ReactNode;\n className?: string;\n};\n\nconst HelpOverlayShortcut = ({ keys, description, className }: HelpOverlayShortcutProps) => {\n const isMac = typeof navigator !== 'undefined' && /Mac|iPhone|iPad/i.test(navigator.platform);\n const sequence = Array.isArray(keys) ? keys : [keys];\n\n return (\n <li className={clsx('flex items-center justify-between gap-3 py-1.5 text-sm', className)}>\n <span className=\"text-gray-700 dark:text-gray-300\">{description}</span>\n <span className=\"flex shrink-0 items-center gap-1\">\n {sequence.map((combo, idx) => {\n const parts = combo.split('+');\n return (\n <Fragment key={`${combo}-${idx}`}>\n {idx > 0 && (\n <span className=\"px-0.5 text-[10px] text-gray-400 uppercase dark:text-gray-500\">\n then\n </span>\n )}\n <span className=\"flex items-center gap-1\">\n {parts.map((part, pIdx) => (\n <Fragment key={`${part}-${pIdx}`}>\n {pIdx > 0 && (\n <span className=\"text-xs text-gray-400 dark:text-gray-500\">+</span>\n )}\n <Kbd>{formatKey(part, isMac)}</Kbd>\n </Fragment>\n ))}\n </span>\n </Fragment>\n );\n })}\n </span>\n </li>\n );\n};\n\n// ── Compound export ──────────────────────────────────────────────────────────\n\nexport const HelpOverlay = Object.assign(HelpOverlayRoot, {\n Section: HelpOverlaySection,\n Shortcut: HelpOverlayShortcut,\n});\n","import { clsx } from 'clsx';\nimport { forwardRef } from 'react';\nimport type { ElementType, InputHTMLAttributes, ReactNode } from 'react';\n\nexport type InputProps = Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> & {\n label?: string;\n description?: string;\n error?: string;\n /** Optional left icon (lucide-react). Ignored when `prefix` is set. */\n icon?: ElementType;\n /** Optional right slot — e.g. unit suffix, validation pill. Ignored when `suffix` is set. */\n rightSlot?: ReactNode;\n /** Slot rendered next to the label text (e.g. a TooltipHelp). */\n labelTrailing?: ReactNode;\n /** Attached prefix addon (e.g. `https://`, `€`, `@`). Renders as a bordered group. */\n prefix?: ReactNode;\n /** Attached suffix addon (e.g. `.com`, `kg`). Renders as a bordered group. */\n suffix?: ReactNode;\n};\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n {\n label,\n description,\n error,\n icon: Icon,\n rightSlot,\n labelTrailing,\n prefix,\n suffix,\n className,\n id,\n ...rest\n },\n ref\n) {\n const inputId = id ?? rest.name;\n const hasGroup = prefix !== undefined || suffix !== undefined;\n const borderClass = error\n ? 'border-red-400 focus-within:border-red-500 dark:border-red-500/60'\n : 'border-gray-200 focus-within:border-brand-500 dark:border-gray-700';\n\n return (\n <label htmlFor={inputId} className=\"block\">\n {label && (\n <span className=\"mb-1.5 flex items-center gap-1.5 text-sm font-medium text-gray-700 dark:text-gray-300\">\n {label}\n {labelTrailing}\n </span>\n )}\n {hasGroup ? (\n <div\n className={clsx(\n 'flex h-9 w-full items-stretch overflow-hidden rounded-lg border bg-white transition-colors dark:bg-gray-800',\n borderClass\n )}\n >\n {prefix !== undefined && (\n <span className=\"flex shrink-0 items-center border-r border-inherit bg-gray-50 px-3 text-sm text-gray-500 dark:bg-gray-900 dark:text-gray-400\">\n {prefix}\n </span>\n )}\n <input\n ref={ref}\n id={inputId}\n className={clsx(\n 'h-full min-w-0 flex-1 border-0 bg-transparent px-3 text-sm text-gray-900 focus:ring-0 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50 dark:text-white',\n className\n )}\n {...rest}\n />\n {suffix !== undefined && (\n <span className=\"flex shrink-0 items-center border-l border-inherit bg-gray-50 px-3 text-sm text-gray-500 dark:bg-gray-900 dark:text-gray-400\">\n {suffix}\n </span>\n )}\n </div>\n ) : (\n <div className=\"relative inline-flex h-9 w-full items-center\">\n {Icon && (\n <Icon\n aria-hidden\n className=\"pointer-events-none absolute left-3 h-4 w-4 text-gray-400\"\n />\n )}\n <input\n ref={ref}\n id={inputId}\n className={clsx(\n 'h-full w-full rounded-lg border bg-white text-sm transition-colors focus:outline-none disabled:cursor-not-allowed disabled:opacity-50 dark:bg-gray-800 dark:text-white',\n Icon ? 'pl-9' : 'pl-3',\n rightSlot ? 'pr-16' : 'pr-3',\n error\n ? 'border-red-400 focus:border-red-500 dark:border-red-500/60'\n : 'focus:border-brand-500 border-gray-200 dark:border-gray-700',\n className\n )}\n {...rest}\n />\n {rightSlot && (\n <span className=\"pointer-events-none absolute right-3 text-xs text-gray-400\">\n {rightSlot}\n </span>\n )}\n </div>\n )}\n {(error || description) && (\n <span\n className={clsx(\n 'mt-1 block text-xs',\n error ? 'text-red-500' : 'text-gray-500 dark:text-gray-400'\n )}\n >\n {error ?? description}\n </span>\n )}\n </label>\n );\n});\n","import { clsx } from 'clsx';\nimport { Search } from 'lucide-react';\n\nexport type SearchInputProps = {\n value: string;\n onChange: (v: string) => void;\n placeholder?: string;\n className?: string;\n};\n\nexport const SearchInput = ({\n value,\n onChange,\n placeholder = 'Search…',\n className,\n}: SearchInputProps) => (\n <div className={clsx('relative inline-flex h-9 w-full items-center', className)}>\n <Search aria-hidden className=\"pointer-events-none absolute left-3 h-4 w-4 text-gray-400\" />\n <input\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n className=\"focus:border-brand-500 h-full w-full rounded-lg border border-gray-200 bg-white pr-3 pl-9 text-sm transition-colors focus:outline-none dark:border-gray-700 dark:bg-gray-800 dark:text-white dark:placeholder-gray-500\"\n />\n </div>\n);\n","import { clsx } from 'clsx';\nimport { ChevronDown } from 'lucide-react';\nimport { forwardRef } from 'react';\nimport type { SelectHTMLAttributes } from 'react';\n\nexport type SelectOption = { value: string; label: string; disabled?: boolean };\n\nexport type SelectProps = Omit<SelectHTMLAttributes<HTMLSelectElement>, 'children'> & {\n options: SelectOption[];\n label?: string;\n description?: string;\n error?: string;\n};\n\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(function Select(\n { options, label, description, error, className, id, ...rest },\n ref\n) {\n const selectId = id ?? rest.name;\n return (\n <label htmlFor={selectId} className=\"block\">\n {label && (\n <span className=\"mb-1.5 block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {label}\n </span>\n )}\n <div className=\"relative\">\n <select\n ref={ref}\n id={selectId}\n className={clsx(\n 'h-9 w-full appearance-none rounded-lg border bg-white pr-9 pl-3 text-sm transition-colors focus:outline-none disabled:cursor-not-allowed disabled:opacity-50 dark:bg-gray-800 dark:text-white',\n error\n ? 'border-red-400 focus:border-red-500 dark:border-red-500/60'\n : 'focus:border-brand-500 border-gray-200 dark:border-gray-700',\n className\n )}\n {...rest}\n >\n {options.map((opt) => (\n <option key={opt.value} value={opt.value} disabled={opt.disabled}>\n {opt.label}\n </option>\n ))}\n </select>\n <ChevronDown className=\"pointer-events-none absolute top-1/2 right-3 h-4 w-4 -translate-y-1/2 text-gray-400\" />\n </div>\n {(error || description) && (\n <span\n className={clsx(\n 'mt-1 block text-xs',\n error ? 'text-red-500' : 'text-gray-500 dark:text-gray-400'\n )}\n >\n {error ?? description}\n </span>\n )}\n </label>\n );\n});\n","import { clsx } from 'clsx';\n\nexport type ToggleProps = {\n checked: boolean;\n onChange: (checked: boolean) => void;\n disabled?: boolean;\n label?: string;\n description?: string;\n};\n\nexport const Toggle = ({\n checked,\n onChange,\n disabled = false,\n label,\n description,\n}: ToggleProps) => (\n <label className={clsx('flex items-center gap-3', disabled && 'opacity-50')}>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n disabled={disabled}\n onClick={() => !disabled && onChange(!checked)}\n className={clsx(\n 'relative h-6 w-11 shrink-0 rounded-full transition-colors',\n disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n checked ? 'bg-brand-500' : 'bg-gray-200 dark:bg-gray-700'\n )}\n >\n <span\n className={clsx(\n 'absolute top-0.5 left-0.5 h-5 w-5 rounded-full bg-white shadow transition-transform',\n checked ? 'translate-x-5' : 'translate-x-0'\n )}\n />\n </button>\n {(label || description) && (\n <span className=\"min-w-0 flex-1\">\n {label && (\n <span className=\"block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {label}\n </span>\n )}\n {description && (\n <span className=\"mt-0.5 block text-xs text-gray-500 dark:text-gray-400\">\n {description}\n </span>\n )}\n </span>\n )}\n </label>\n);\n","import { clsx } from 'clsx';\nimport type { ElementType } from 'react';\n\nexport type FilterOption<T extends string = string> = { label: string; value: T };\n\nexport type FilterPillsProps<T extends string = string> = {\n options: FilterOption<T>[];\n value: T;\n onChange: (v: T) => void;\n icon?: ElementType;\n /**\n * Stretch the pill group to fill its parent (`flex w-full`). Default\n * `false` — the group sizes to its content (pill labels + optional icon).\n */\n fullWidth?: boolean;\n className?: string;\n};\n\nexport const FilterPills = <T extends string = string>({\n options,\n value,\n onChange,\n icon: Icon,\n fullWidth = false,\n className,\n}: FilterPillsProps<T>) => (\n <div\n className={clsx(\n fullWidth ? 'flex w-full' : 'inline-flex',\n 'h-9 items-center overflow-hidden rounded-lg border border-gray-200 dark:border-gray-700',\n className\n )}\n >\n {Icon && (\n <span className=\"flex h-full items-center border-r border-gray-200 bg-gray-50 px-2.5 dark:border-gray-700 dark:bg-gray-800/60\">\n <Icon className=\"h-3.5 w-3.5 shrink-0 text-gray-400 dark:text-gray-500\" />\n </span>\n )}\n <div className=\"flex items-center gap-1 px-1.5\">\n {options.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => onChange(opt.value)}\n className={clsx(\n 'flex h-7 items-center rounded-md px-3 text-xs font-medium transition-colors',\n value === opt.value\n ? 'bg-brand-500 text-white'\n : 'text-gray-500 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-white/5'\n )}\n >\n {opt.label}\n </button>\n ))}\n </div>\n </div>\n);\n","import { clsx } from 'clsx';\nimport type { ElementType } from 'react';\n\nexport type SegmentOption<T extends string> = {\n label: string;\n value: T;\n icon?: ElementType;\n};\n\nexport type SegmentedControlProps<T extends string> = {\n options: SegmentOption<T>[];\n value: T;\n onChange: (v: T) => void;\n className?: string;\n};\n\nexport const SegmentedControl = <T extends string>({\n options,\n value,\n onChange,\n className,\n}: SegmentedControlProps<T>) => (\n <div\n className={clsx(\n 'inline-flex overflow-hidden rounded-lg border border-gray-200 dark:border-gray-700',\n className\n )}\n >\n {options.map((opt, i) => {\n const Icon = opt.icon;\n const isActive = opt.value === value;\n return (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => onChange(opt.value)}\n className={clsx(\n 'flex items-center gap-1.5 px-3 py-2 text-sm font-medium transition-colors',\n i > 0 && 'border-l border-gray-200 dark:border-gray-700',\n isActive\n ? 'bg-brand-500 text-white'\n : 'text-gray-500 hover:bg-gray-50 dark:text-gray-400 dark:hover:bg-white/5'\n )}\n >\n {Icon && <Icon className=\"h-4 w-4\" />}\n {opt.label}\n </button>\n );\n })}\n </div>\n);\n","import { clsx } from 'clsx';\nimport { ChevronDown, ChevronUp } from 'lucide-react';\n\nexport type StepperInputProps = {\n value: number;\n onChange: (v: number) => void;\n min?: number;\n max?: number;\n step?: number;\n unit?: string;\n /** Tailwind width class for the inner input — default `w-20`. */\n width?: string;\n /**\n * Stretch the whole control to fill its parent (`flex w-full`). Default\n * `false` — the control sizes to its content (input width + unit + arrows).\n */\n fullWidth?: boolean;\n disabled?: boolean;\n className?: string;\n};\n\n/**\n * StepperInput — number field with stacked ↑ / ↓ arrows embedded inside the\n * right edge. Compact alternative to NumberInput for settings panels.\n */\nexport const StepperInput = ({\n value,\n onChange,\n min = -Infinity,\n max = Infinity,\n step = 1,\n unit,\n width = 'w-20',\n fullWidth = false,\n disabled = false,\n className,\n}: StepperInputProps) => {\n const clamp = (v: number) => Math.min(max, Math.max(min, v));\n const arrowBtn =\n 'flex flex-1 items-center justify-center px-1.5 transition-colors hover:bg-gray-50 dark:hover:bg-white/5 disabled:cursor-not-allowed disabled:opacity-40';\n\n return (\n <div\n className={clsx(\n fullWidth ? 'flex w-full' : 'inline-flex',\n 'h-9 overflow-hidden rounded-lg border border-gray-200 bg-white dark:border-gray-700 dark:bg-gray-800',\n disabled && 'opacity-50',\n className\n )}\n >\n <input\n type=\"number\"\n value={value}\n onChange={(e) => {\n const n = parseFloat(e.target.value);\n if (!isNaN(n)) onChange(clamp(n));\n }}\n disabled={disabled}\n min={min}\n max={max}\n step={step}\n className={clsx(\n 'h-full [appearance:textfield] bg-transparent pr-1 pl-3 text-sm font-medium text-gray-700 focus:outline-none disabled:cursor-not-allowed dark:text-gray-200 [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none',\n fullWidth ? 'flex-1' : width\n )}\n />\n {unit && (\n <span className=\"flex items-center pr-1.5 text-xs text-gray-400 select-none dark:text-gray-500\">\n {unit}\n </span>\n )}\n <div className=\"flex flex-col border-l border-gray-200 dark:border-gray-700\">\n <button\n type=\"button\"\n onClick={() => onChange(clamp(value + step))}\n disabled={disabled || value >= max}\n tabIndex={-1}\n aria-label=\"Increase\"\n className={arrowBtn}\n >\n <ChevronUp className=\"h-3.5 w-3.5 text-gray-500 dark:text-gray-400\" strokeWidth={2.5} />\n </button>\n <button\n type=\"button\"\n onClick={() => onChange(clamp(value - step))}\n disabled={disabled || value <= min}\n tabIndex={-1}\n aria-label=\"Decrease\"\n className={clsx('border-t border-gray-200 dark:border-gray-700', arrowBtn)}\n >\n <ChevronDown className=\"h-3.5 w-3.5 text-gray-500 dark:text-gray-400\" strokeWidth={2.5} />\n </button>\n </div>\n </div>\n );\n};\n","import { clsx } from 'clsx';\n\nexport type NumberInputProps = {\n value: number;\n onChange: (v: number) => void;\n min?: number;\n max?: number;\n step?: number;\n unit?: string;\n /** Tailwind width class for the inner input — default `w-20`. */\n width?: string;\n /**\n * Stretch the whole control to fill its parent (`flex w-full`). Default\n * `false` — the control sizes to its content (buttons + input width + unit).\n * Use `fullWidth` for form grids where the column should be filled.\n */\n fullWidth?: boolean;\n disabled?: boolean;\n className?: string;\n};\n\n/**\n * NumberInput — number field with `−` / `+` buttons on the outside edges.\n * Replaces native `<input type=\"number\">` spinners for cross-browser\n * consistency.\n */\nexport const NumberInput = ({\n value,\n onChange,\n min = -Infinity,\n max = Infinity,\n step = 1,\n unit,\n width = 'w-20',\n fullWidth = false,\n disabled = false,\n className,\n}: NumberInputProps) => {\n const clamp = (v: number) => Math.min(max, Math.max(min, v));\n const btn =\n 'flex h-full items-center justify-center px-2 text-gray-400 transition-colors hover:bg-gray-50 hover:text-gray-600 disabled:cursor-not-allowed disabled:opacity-40 dark:text-gray-500 dark:hover:bg-white/5 dark:hover:text-gray-300';\n\n return (\n <div\n className={clsx(\n // `inline-flex` so the control sizes to its content by default; opt into\n // `flex w-full` via `fullWidth` for form grids that need the column.\n fullWidth ? 'flex w-full' : 'inline-flex',\n 'h-9 overflow-hidden rounded-lg border border-gray-200 bg-white dark:border-gray-700 dark:bg-gray-800',\n disabled && 'opacity-50',\n className\n )}\n >\n <button\n type=\"button\"\n onClick={() => onChange(clamp(value - step))}\n disabled={disabled || value <= min}\n tabIndex={-1}\n aria-label=\"Decrease\"\n className={clsx('border-r border-gray-200 dark:border-gray-700', btn)}\n >\n <span className=\"text-base leading-none font-semibold text-gray-500 dark:text-gray-400\">\n −\n </span>\n </button>\n <div className=\"flex items-center\">\n <input\n type=\"number\"\n value={value}\n onChange={(e) => {\n const n = parseFloat(e.target.value);\n if (!isNaN(n)) onChange(clamp(n));\n }}\n disabled={disabled}\n min={min}\n max={max}\n step={step}\n className={clsx(\n 'h-full [appearance:textfield] border-0 bg-transparent text-center text-sm font-medium text-gray-700 focus:outline-none disabled:cursor-not-allowed dark:text-gray-200 [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none',\n width\n )}\n />\n {unit && <span className=\"pr-1.5 text-xs text-gray-400 dark:text-gray-500\">{unit}</span>}\n </div>\n <button\n type=\"button\"\n onClick={() => onChange(clamp(value + step))}\n disabled={disabled || value >= max}\n tabIndex={-1}\n aria-label=\"Increase\"\n className={clsx('border-l border-gray-200 dark:border-gray-700', btn)}\n >\n <span className=\"text-base leading-none font-semibold text-gray-500 dark:text-gray-400\">\n +\n </span>\n </button>\n </div>\n );\n};\n","import { clsx } from 'clsx';\nimport { Maximize2, Minus, Plus, RotateCcw } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nexport type ZoomBarProps = {\n zoom: number;\n onZoomOut: () => void;\n onZoomIn: () => void;\n onFit?: () => void;\n onReset?: () => void;\n /**\n * Stretch the zoom group to fill its parent (`flex w-full`). Default\n * `false` — the group sizes to its content. Zoom bars are usually\n * floated over a canvas, so the compact default is the right one.\n */\n fullWidth?: boolean;\n className?: string;\n};\n\nconst ZoomBtn = ({\n onClick,\n title,\n children,\n dividerLeft = false,\n}: {\n onClick: () => void;\n title: string;\n children: ReactNode;\n dividerLeft?: boolean;\n}) => (\n <button\n type=\"button\"\n onClick={onClick}\n title={title}\n className={clsx(\n 'flex items-center px-2.5 py-2 text-gray-500 transition-colors hover:bg-gray-50 dark:text-gray-400 dark:hover:bg-white/5',\n dividerLeft && 'border-l border-gray-200 dark:border-gray-700'\n )}\n >\n {children}\n </button>\n);\n\n/**\n * ZoomBar — inline zoom control group: [−] [xx%] [+] [fit] [reset].\n * Use for canvas, map, and visualization views.\n */\nexport const ZoomBar = ({\n zoom,\n onZoomOut,\n onZoomIn,\n onFit,\n onReset,\n fullWidth = false,\n className,\n}: ZoomBarProps) => (\n <div\n className={clsx(\n fullWidth ? 'flex w-full' : 'inline-flex',\n 'overflow-hidden rounded-lg border border-gray-200 bg-white dark:border-gray-700 dark:bg-gray-800',\n className\n )}\n >\n <ZoomBtn onClick={onZoomOut} title=\"Zoom out\">\n <Minus className=\"h-4 w-4\" />\n </ZoomBtn>\n <span className=\"flex min-w-[3.5rem] items-center justify-center border-x border-gray-200 px-3 py-2 font-mono text-sm font-medium text-gray-600 dark:border-gray-700 dark:text-gray-300\">\n {Math.round(zoom * 100)}%\n </span>\n <ZoomBtn onClick={onZoomIn} title=\"Zoom in\">\n <Plus className=\"h-4 w-4\" />\n </ZoomBtn>\n {onFit && (\n <ZoomBtn onClick={onFit} title=\"Fit to canvas\" dividerLeft>\n <Maximize2 className=\"h-4 w-4\" />\n </ZoomBtn>\n )}\n {onReset && (\n <ZoomBtn onClick={onReset} title=\"Reset to 100%\" dividerLeft>\n <RotateCcw className=\"h-4 w-4\" />\n </ZoomBtn>\n )}\n </div>\n);\n","import { clsx } from 'clsx';\nimport type { ReactNode } from 'react';\nimport { TooltipHelp } from '../ui/Tooltip';\n\nexport type FormRowProps = {\n label: string;\n description?: string;\n /** Renders a `(?)` help icon next to the label. */\n tooltip?: string;\n children: ReactNode;\n className?: string;\n};\n\n/**\n * FormRow — horizontal setting row : label (+ optional description and help)\n * on the left, control on the right. Pair multiple FormRows inside a\n * `divide-y` container to build settings panels.\n */\nexport const FormRow = ({ label, description, tooltip, children, className }: FormRowProps) => (\n <div className={clsx('flex items-center justify-between gap-4', className)}>\n <div className=\"min-w-0 flex-1\">\n <p className=\"flex items-center gap-1.5 text-sm font-medium text-gray-700 dark:text-gray-300\">\n {label}\n {tooltip && <TooltipHelp text={tooltip} />}\n </p>\n {description && (\n <p className=\"mt-0.5 text-xs text-gray-500 dark:text-gray-400\">{description}</p>\n )}\n </div>\n <div className=\"shrink-0\">{children}</div>\n </div>\n);\n","import { clsx } from 'clsx';\nimport { AlertCircle, Camera, Trash2 } from 'lucide-react';\nimport { useRef, useState, type ChangeEvent } from 'react';\nimport { Avatar, type AvatarSize } from '../ui/Avatar';\nimport { Button } from '../ui/Button';\nimport { Spinner } from '../ui/Spinner';\n\nexport type AvatarUploaderSize = 'md' | 'lg';\n\nexport type AvatarUploaderProps = {\n /** Current avatar URL (data URL or http). null/undefined → initials fallback. */\n src?: string | null;\n /** Used for the initials fallback when `src` is empty. */\n name?: string;\n /** Visual size. `md` = 80px (default), `lg` = 96px. */\n size?: AvatarUploaderSize;\n /** Called with the picked file once type/size validation has passed. */\n onUpload: (file: File) => void | Promise<void>;\n /** Called when the user clicks Remove. Hidden when omitted. */\n onRemove?: () => void | Promise<void>;\n /** Override the loading spinner externally (controlled). */\n loading?: boolean;\n /** External error message. Overrides any internal validation error. */\n error?: string;\n /** Helper text below the actions. */\n helperText?: string;\n /** Max file size in megabytes. Default 5. */\n maxSizeMB?: number;\n /** File picker accept attribute. Default `image/*`. */\n accept?: string;\n disabled?: boolean;\n /** Override the upload button label. Default toggles \"Upload photo\" / \"Change photo\". */\n uploadLabel?: string;\n removeLabel?: string;\n className?: string;\n};\n\nconst SIZE_TO_AVATAR: Record<AvatarUploaderSize, AvatarSize> = {\n md: '2xl',\n lg: '3xl',\n};\n\nconst SIZE_BOX: Record<AvatarUploaderSize, string> = {\n md: 'h-20 w-20',\n lg: 'h-24 w-24',\n};\n\nexport const AvatarUploader = ({\n src,\n name,\n size = 'md',\n onUpload,\n onRemove,\n loading: loadingProp,\n error: errorProp,\n helperText,\n maxSizeMB = 5,\n accept = 'image/*',\n disabled = false,\n uploadLabel,\n removeLabel = 'Remove',\n className,\n}: AvatarUploaderProps) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const [internalLoading, setInternalLoading] = useState(false);\n const [internalError, setInternalError] = useState<string | null>(null);\n\n const loading = loadingProp ?? internalLoading;\n const error = errorProp ?? internalError;\n const hasAvatar = !!src;\n const isBusy = disabled || loading;\n const defaultUploadLabel = hasAvatar ? 'Change photo' : 'Upload photo';\n const defaultHelper = `JPG, PNG or GIF — max ${maxSizeMB} MB`;\n\n const handleFile = async (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (inputRef.current) inputRef.current.value = '';\n if (!file) return;\n if (!file.type.startsWith('image/')) {\n setInternalError('Please select an image file');\n return;\n }\n if (file.size > maxSizeMB * 1024 * 1024) {\n setInternalError(`File too large — max ${maxSizeMB} MB`);\n return;\n }\n setInternalError(null);\n setInternalLoading(true);\n try {\n await onUpload(file);\n } catch (err) {\n setInternalError(err instanceof Error ? err.message : 'Upload failed');\n } finally {\n setInternalLoading(false);\n }\n };\n\n const handleRemove = () => {\n if (!onRemove || isBusy) return;\n setInternalError(null);\n void onRemove();\n };\n\n return (\n <div className={clsx('flex items-center gap-6', className)}>\n <div className={clsx('relative shrink-0', SIZE_BOX[size])}>\n <Avatar\n src={src ?? undefined}\n name={name}\n size={SIZE_TO_AVATAR[size]}\n className=\"ring-2 ring-gray-200 dark:ring-gray-700\"\n />\n {loading && (\n <div\n role=\"status\"\n aria-label=\"Uploading\"\n className=\"absolute inset-0 flex items-center justify-center rounded-full bg-black/40\"\n >\n <Spinner size=\"sm\" className=\"border-white/30 border-t-white\" />\n </div>\n )}\n </div>\n <div className=\"space-y-2\">\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n className=\"hidden\"\n onChange={handleFile}\n aria-label=\"Upload avatar\"\n disabled={isBusy}\n />\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n icon={Camera}\n disabled={isBusy}\n onClick={() => inputRef.current?.click()}\n >\n {uploadLabel ?? defaultUploadLabel}\n </Button>\n {hasAvatar && onRemove && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n icon={Trash2}\n disabled={isBusy}\n onClick={handleRemove}\n className=\"text-red-500 hover:bg-red-50 dark:hover:bg-red-900/20\"\n >\n {removeLabel}\n </Button>\n )}\n </div>\n {error ? (\n <p className=\"flex items-center gap-1 text-xs text-red-500\">\n <AlertCircle className=\"h-3 w-3\" /> {error}\n </p>\n ) : (\n <p className=\"text-xs text-gray-400 dark:text-gray-500\">{helperText ?? defaultHelper}</p>\n )}\n </div>\n </div>\n );\n};\n","import { Eye, EyeOff } from 'lucide-react';\nimport { forwardRef, useState } from 'react';\nimport { TooltipHelp } from '../ui/Tooltip';\nimport { Input, type InputProps } from './Input';\n\nexport type PasswordInputProps = Omit<\n InputProps,\n 'type' | 'icon' | 'rightSlot' | 'labelTrailing'\n> & {\n /** Tooltip text shown next to the label (uses TooltipHelp). */\n helpText?: string;\n /** Override the visibility-toggle button labels (defaults: \"Show/Hide password\"). */\n showLabel?: string;\n hideLabel?: string;\n};\n\nexport const PasswordInput = forwardRef<HTMLInputElement, PasswordInputProps>(\n function PasswordInput(\n {\n helpText,\n showLabel = 'Show password',\n hideLabel = 'Hide password',\n autoComplete = 'current-password',\n disabled,\n ...rest\n },\n ref\n ) {\n const [show, setShow] = useState(false);\n const ToggleIcon = show ? EyeOff : Eye;\n return (\n <Input\n ref={ref}\n type={show ? 'text' : 'password'}\n autoComplete={autoComplete}\n disabled={disabled}\n labelTrailing={helpText ? <TooltipHelp text={helpText} /> : undefined}\n rightSlot={\n <button\n type=\"button\"\n onClick={() => setShow((s) => !s)}\n disabled={disabled}\n aria-label={show ? hideLabel : showLabel}\n aria-pressed={show}\n className=\"pointer-events-auto -my-0.5 inline-flex h-7 w-7 items-center justify-center rounded-md text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-600 disabled:cursor-not-allowed disabled:opacity-50 dark:hover:bg-gray-700 dark:hover:text-gray-200\"\n >\n <ToggleIcon className=\"h-4 w-4\" aria-hidden />\n </button>\n }\n {...rest}\n />\n );\n }\n);\n","import { clsx } from 'clsx';\nimport { Check, X } from 'lucide-react';\n\nexport type PasswordRule = { label: string; ok: boolean };\n\nexport type PasswordPolicyCheckerProps = {\n rules: PasswordRule[];\n /** Title shown above the rules list. Pass `null` to hide it. */\n title?: string | null;\n className?: string;\n};\n\nexport const PasswordPolicyChecker = ({\n rules,\n title = 'Password requirements',\n className,\n}: PasswordPolicyCheckerProps) => {\n if (rules.length === 0) {\n return (\n <p className={clsx('text-xs text-gray-400 dark:text-gray-500', className)}>\n No requirements defined.\n </p>\n );\n }\n return (\n <div className={className}>\n {title && (\n <p className=\"mb-1.5 text-xs font-medium text-gray-500 dark:text-gray-400\">{title}</p>\n )}\n <ul className=\"space-y-1\">\n {rules.map((r, i) => {\n const Icon = r.ok ? Check : X;\n return (\n <li\n key={`${i}-${r.label}`}\n className={clsx(\n 'flex items-center gap-2 text-xs transition-colors',\n r.ok ? 'text-green-600 dark:text-green-400' : 'text-gray-400 dark:text-gray-500'\n )}\n >\n <Icon className=\"h-3.5 w-3.5 shrink-0\" aria-hidden />\n <span>{r.label}</span>\n </li>\n );\n })}\n </ul>\n </div>\n );\n};\n\n/**\n * Sensible default password policy. Override per-app if stricter/looser\n * rules are needed (i18n, custom min length, blocklists, …).\n */\nexport const defaultPasswordRules = (pwd: string): PasswordRule[] => [\n { label: 'At least 12 characters', ok: pwd.length >= 12 },\n { label: 'One uppercase letter', ok: /[A-Z]/.test(pwd) },\n { label: 'One lowercase letter', ok: /[a-z]/.test(pwd) },\n { label: 'One number', ok: /\\d/.test(pwd) },\n { label: 'One symbol', ok: /[^A-Za-z0-9]/.test(pwd) },\n];\n","import { clsx } from 'clsx';\nimport { forwardRef, useId, useState, type ReactNode, type TextareaHTMLAttributes } from 'react';\n\nexport type TextareaResize = 'none' | 'vertical' | 'horizontal' | 'both';\n\nexport type TextareaProps = TextareaHTMLAttributes<HTMLTextAreaElement> & {\n label?: string;\n description?: string;\n error?: string;\n /** Slot rendered next to the label text (e.g. a TooltipHelp). */\n labelTrailing?: ReactNode;\n /** Resize behaviour. Default `vertical`. */\n resize?: TextareaResize;\n /** Show a `<used> / <max>` counter below the field. Default: auto when `maxLength` is set. */\n showCount?: boolean;\n};\n\nconst RESIZE_CLASS: Record<TextareaResize, string> = {\n none: 'resize-none',\n vertical: 'resize-y',\n horizontal: 'resize-x',\n both: 'resize',\n};\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n {\n label,\n description,\n error,\n labelTrailing,\n resize = 'vertical',\n showCount,\n rows = 4,\n maxLength,\n className,\n id,\n value,\n defaultValue,\n onChange,\n ...rest\n },\n ref\n) {\n const generatedId = useId();\n const fieldId = id ?? rest.name ?? generatedId;\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n typeof defaultValue === 'string' ? defaultValue : ''\n );\n const currentValue = isControlled ? String(value ?? '') : internalValue;\n const counterEnabled = showCount ?? maxLength !== undefined;\n const overLimit = maxLength !== undefined && currentValue.length > maxLength;\n const descId = `${fieldId}-desc`;\n const hasDesc = !!(error || description);\n\n return (\n <div className=\"block\">\n {label && (\n <label\n htmlFor={fieldId}\n className=\"mb-1.5 flex items-center gap-1.5 text-sm font-medium text-gray-700 dark:text-gray-300\"\n >\n {label}\n {labelTrailing}\n </label>\n )}\n <textarea\n ref={ref}\n id={fieldId}\n rows={rows}\n maxLength={maxLength}\n value={value}\n defaultValue={defaultValue}\n onChange={(e) => {\n if (!isControlled) setInternalValue(e.target.value);\n onChange?.(e);\n }}\n aria-describedby={hasDesc ? descId : undefined}\n aria-invalid={error || overLimit ? true : undefined}\n className={clsx(\n 'block w-full rounded-lg border bg-white px-3 py-2 text-sm transition-colors focus:outline-none disabled:cursor-not-allowed disabled:opacity-50 dark:bg-gray-800 dark:text-white',\n RESIZE_CLASS[resize],\n error || overLimit\n ? 'border-red-400 focus:border-red-500 dark:border-red-500/60'\n : 'focus:border-brand-500 border-gray-200 dark:border-gray-700',\n className\n )}\n {...rest}\n />\n <div className=\"mt-1 flex items-start justify-between gap-2\">\n <span\n id={descId}\n className={clsx(\n 'block min-h-[1rem] text-xs',\n error ? 'text-red-500' : 'text-gray-500 dark:text-gray-400'\n )}\n >\n {error ?? description ?? ''}\n </span>\n {counterEnabled && (\n <span\n aria-live=\"polite\"\n className={clsx(\n 'shrink-0 font-mono text-xs tabular-nums',\n overLimit ? 'text-red-500' : 'text-gray-400 dark:text-gray-500'\n )}\n >\n {currentValue.length}\n {maxLength !== undefined && <> / {maxLength}</>}\n </span>\n )}\n </div>\n </div>\n );\n});\n","import { clsx } from 'clsx';\nimport { Check, Minus } from 'lucide-react';\nimport {\n forwardRef,\n useEffect,\n useId,\n useRef,\n useState,\n type ChangeEvent,\n type InputHTMLAttributes,\n type ReactNode,\n} from 'react';\n\nexport type CheckboxSize = 'sm' | 'md';\n\nexport type CheckboxProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'type' | 'onChange' | 'children'\n> & {\n label?: ReactNode;\n description?: string;\n /** Called with the next checked state. */\n onChange?: (checked: boolean, e: ChangeEvent<HTMLInputElement>) => void;\n /** When true, renders the indeterminate (minus) icon. Overrides `checked` visually. */\n indeterminate?: boolean;\n size?: CheckboxSize;\n};\n\nconst SIZE_CLASS: Record<CheckboxSize, { box: string; icon: string; label: string }> = {\n sm: { box: 'h-4 w-4', icon: 'h-3 w-3', label: 'text-xs' },\n md: { box: 'h-[18px] w-[18px]', icon: 'h-3.5 w-3.5', label: 'text-sm' },\n};\n\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(function Checkbox(\n {\n label,\n description,\n checked,\n defaultChecked,\n indeterminate = false,\n onChange,\n disabled,\n size = 'md',\n id,\n className,\n ...rest\n },\n forwardedRef\n) {\n const generatedId = useId();\n const fieldId = id ?? rest.name ?? generatedId;\n const innerRef = useRef<HTMLInputElement>(null);\n const setRef = (node: HTMLInputElement | null) => {\n innerRef.current = node;\n if (typeof forwardedRef === 'function') forwardedRef(node);\n else if (forwardedRef) forwardedRef.current = node;\n };\n const isControlled = checked !== undefined;\n const [internalChecked, setInternalChecked] = useState<boolean>(defaultChecked ?? false);\n const isChecked = isControlled ? !!checked : internalChecked;\n const showFilled = isChecked || indeterminate;\n\n // Sync the native indeterminate flag (no DOM API exposed via JSX).\n useEffect(() => {\n if (innerRef.current) innerRef.current.indeterminate = indeterminate;\n }, [indeterminate]);\n\n const sizes = SIZE_CLASS[size];\n\n return (\n <label\n htmlFor={fieldId}\n className={clsx(\n 'inline-flex cursor-pointer items-start gap-2',\n disabled && 'cursor-not-allowed opacity-50',\n className\n )}\n >\n <span className=\"relative inline-flex shrink-0 items-center justify-center\">\n <input\n ref={setRef}\n id={fieldId}\n type=\"checkbox\"\n checked={isControlled ? isChecked : undefined}\n defaultChecked={!isControlled ? defaultChecked : undefined}\n disabled={disabled}\n onChange={(e) => {\n if (!isControlled) setInternalChecked(e.target.checked);\n onChange?.(e.target.checked, e);\n }}\n className=\"peer sr-only\"\n {...rest}\n />\n <span\n aria-hidden\n className={clsx(\n 'peer-focus-visible:ring-brand-500/40 relative flex items-center justify-center rounded-md border transition-colors peer-focus-visible:ring-2',\n sizes.box,\n showFilled\n ? 'border-brand-500 bg-brand-500'\n : 'border-gray-300 bg-white dark:border-gray-600 dark:bg-gray-800'\n )}\n >\n {/* Always render both icons; toggle visibility via opacity to keep\n the box's intrinsic baseline stable (prevents text from\n shifting when checked/unchecked). */}\n <Check\n className={clsx(\n 'block text-white transition-opacity',\n sizes.icon,\n isChecked && !indeterminate ? 'opacity-100' : 'opacity-0'\n )}\n />\n {indeterminate && <Minus className={clsx('absolute block text-white', sizes.icon)} />}\n </span>\n </span>\n {(label || description) && (\n <span className=\"flex flex-col\">\n {label && (\n <span className={clsx('text-gray-700 dark:text-gray-300', sizes.label)}>{label}</span>\n )}\n {description && (\n <span className=\"mt-0.5 text-xs text-gray-500 dark:text-gray-400\">{description}</span>\n )}\n </span>\n )}\n </label>\n );\n});\n\n// ── CheckboxGroup ────────────────────────────────────────────────────────────\n\nexport type CheckboxGroupOption = {\n value: string;\n label: string;\n description?: string;\n disabled?: boolean;\n};\n\nexport type CheckboxGroupProps = {\n legend?: string;\n description?: string;\n value?: string[];\n defaultValue?: string[];\n onChange?: (value: string[]) => void;\n options: CheckboxGroupOption[];\n orientation?: 'vertical' | 'horizontal';\n error?: string;\n /** Shared `name` attribute for all checkboxes. */\n name?: string;\n size?: CheckboxSize;\n className?: string;\n};\n\nexport const CheckboxGroup = ({\n legend,\n description,\n value,\n defaultValue = [],\n onChange,\n options,\n orientation = 'vertical',\n error,\n name,\n size = 'md',\n className,\n}: CheckboxGroupProps) => {\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string[]>(defaultValue);\n const current = isControlled ? value : internalValue;\n\n const toggle = (v: string) => {\n const next = current.includes(v) ? current.filter((x) => x !== v) : [...current, v];\n if (!isControlled) setInternalValue(next);\n onChange?.(next);\n };\n\n return (\n <fieldset className={clsx('block', className)}>\n {legend && (\n <legend className=\"mb-1.5 text-sm font-medium text-gray-700 dark:text-gray-300\">\n {legend}\n </legend>\n )}\n {description && (\n <p className=\"mb-2 text-xs text-gray-500 dark:text-gray-400\">{description}</p>\n )}\n <div className={clsx(orientation === 'horizontal' ? 'flex flex-wrap gap-4' : 'space-y-2')}>\n {options.map((opt) => (\n <Checkbox\n key={opt.value}\n label={opt.label}\n description={opt.description}\n disabled={opt.disabled}\n name={name}\n value={opt.value}\n size={size}\n checked={current.includes(opt.value)}\n onChange={() => toggle(opt.value)}\n />\n ))}\n </div>\n {error && <p className=\"mt-1.5 text-xs text-red-500\">{error}</p>}\n </fieldset>\n );\n};\n","import { clsx } from 'clsx';\nimport {\n forwardRef,\n useId,\n useState,\n type ChangeEvent,\n type InputHTMLAttributes,\n type ReactNode,\n} from 'react';\n\nexport type RadioSize = 'sm' | 'md';\n\nexport type RadioProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'type' | 'onChange' | 'children'\n> & {\n label?: ReactNode;\n description?: string;\n /** Called with the next checked state (true when this radio becomes selected). */\n onChange?: (checked: boolean, e: ChangeEvent<HTMLInputElement>) => void;\n size?: RadioSize;\n};\n\nconst SIZE_CLASS: Record<RadioSize, { box: string; dot: string; label: string }> = {\n sm: { box: 'h-4 w-4', dot: 'h-1.5 w-1.5', label: 'text-xs' },\n md: { box: 'h-[18px] w-[18px]', dot: 'h-2 w-2', label: 'text-sm' },\n};\n\nexport const Radio = forwardRef<HTMLInputElement, RadioProps>(function Radio(\n {\n label,\n description,\n checked,\n defaultChecked,\n onChange,\n disabled,\n size = 'md',\n id,\n className,\n ...rest\n },\n forwardedRef\n) {\n const generatedId = useId();\n const fieldId = id ?? generatedId;\n const isControlled = checked !== undefined;\n const [internalChecked, setInternalChecked] = useState<boolean>(defaultChecked ?? false);\n const isChecked = isControlled ? !!checked : internalChecked;\n const sizes = SIZE_CLASS[size];\n\n return (\n <label\n htmlFor={fieldId}\n className={clsx(\n 'inline-flex cursor-pointer items-start gap-2',\n disabled && 'cursor-not-allowed opacity-50',\n className\n )}\n >\n <span className=\"relative inline-flex shrink-0 items-center justify-center\">\n <input\n ref={forwardedRef}\n id={fieldId}\n type=\"radio\"\n checked={isControlled ? isChecked : undefined}\n defaultChecked={!isControlled ? defaultChecked : undefined}\n disabled={disabled}\n onChange={(e) => {\n if (!isControlled) setInternalChecked(e.target.checked);\n onChange?.(e.target.checked, e);\n }}\n className=\"peer sr-only\"\n {...rest}\n />\n <span\n aria-hidden\n className={clsx(\n 'peer-focus-visible:ring-brand-500/40 flex items-center justify-center rounded-full border transition-colors peer-focus-visible:ring-2 peer-focus-visible:ring-offset-1 dark:peer-focus-visible:ring-offset-gray-900',\n sizes.box,\n isChecked\n ? 'border-brand-500 bg-white dark:bg-gray-800'\n : 'border-gray-300 bg-white dark:border-gray-600 dark:bg-gray-800'\n )}\n >\n {isChecked && <span className={clsx('bg-brand-500 rounded-full', sizes.dot)} />}\n </span>\n </span>\n {(label || description) && (\n <span className=\"flex flex-col\">\n {label && (\n <span className={clsx('text-gray-700 dark:text-gray-300', sizes.label)}>{label}</span>\n )}\n {description && (\n <span className=\"mt-0.5 text-xs text-gray-500 dark:text-gray-400\">{description}</span>\n )}\n </span>\n )}\n </label>\n );\n});\n\n// ── RadioGroup ───────────────────────────────────────────────────────────────\n\nexport type RadioGroupOption = {\n value: string;\n label: string;\n description?: string;\n disabled?: boolean;\n};\n\nexport type RadioGroupProps = {\n legend?: string;\n description?: string;\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n options: RadioGroupOption[];\n orientation?: 'vertical' | 'horizontal';\n error?: string;\n /** Shared `name` for the radios (auto-generated via useId if omitted). */\n name?: string;\n size?: RadioSize;\n className?: string;\n};\n\nexport const RadioGroup = ({\n legend,\n description,\n value,\n defaultValue,\n onChange,\n options,\n orientation = 'vertical',\n error,\n name,\n size = 'md',\n className,\n}: RadioGroupProps) => {\n const generatedName = useId();\n const groupName = name ?? generatedName;\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string | undefined>(defaultValue);\n const current = isControlled ? value : internalValue;\n\n const select = (v: string) => {\n if (!isControlled) setInternalValue(v);\n onChange?.(v);\n };\n\n return (\n <fieldset className={clsx('block', className)}>\n {legend && (\n <legend className=\"mb-1.5 text-sm font-medium text-gray-700 dark:text-gray-300\">\n {legend}\n </legend>\n )}\n {description && (\n <p className=\"mb-2 text-xs text-gray-500 dark:text-gray-400\">{description}</p>\n )}\n <div className={clsx(orientation === 'horizontal' ? 'flex flex-wrap gap-4' : 'space-y-2')}>\n {options.map((opt) => (\n <Radio\n key={opt.value}\n label={opt.label}\n description={opt.description}\n disabled={opt.disabled}\n name={groupName}\n value={opt.value}\n size={size}\n checked={current === opt.value}\n onChange={(checked) => {\n if (checked) select(opt.value);\n }}\n />\n ))}\n </div>\n {error && <p className=\"mt-1.5 text-xs text-red-500\">{error}</p>}\n </fieldset>\n );\n};\n","import { clsx } from 'clsx';\nimport { Paperclip } from 'lucide-react';\nimport {\n forwardRef,\n useId,\n useRef,\n useState,\n type ChangeEvent,\n type InputHTMLAttributes,\n} from 'react';\n\nexport type FileInputProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'onChange' | 'value'\n> & {\n label?: string;\n description?: string;\n error?: string;\n /** Called with the array of selected files. */\n onChange?: (files: File[]) => void;\n /** Browse button label. Default \"Browse\". */\n buttonLabel?: string;\n /** Placeholder when no file is selected. Default \"No file chosen\". */\n placeholder?: string;\n /** Show file size next to the name. Default true. */\n showSize?: boolean;\n};\n\nconst formatBytes = (n: number): string => {\n if (n < 1024) return `${n} B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;\n if (n < 1024 * 1024 * 1024) return `${(n / 1024 / 1024).toFixed(1)} MB`;\n return `${(n / 1024 / 1024 / 1024).toFixed(2)} GB`;\n};\n\nconst summarizeFiles = (files: File[], showSize: boolean): string => {\n if (files.length === 0) return '';\n if (files.length === 1) {\n const f = files[0];\n return showSize ? `${f.name} — ${formatBytes(f.size)}` : f.name;\n }\n const total = files.reduce((sum, f) => sum + f.size, 0);\n return showSize ? `${files.length} files — ${formatBytes(total)} total` : `${files.length} files`;\n};\n\nexport const FileInput = forwardRef<HTMLInputElement, FileInputProps>(function FileInput(\n {\n label,\n description,\n error,\n onChange,\n buttonLabel = 'Browse',\n placeholder = 'No file chosen',\n showSize = true,\n multiple,\n accept,\n disabled,\n id,\n name,\n className,\n ...rest\n },\n forwardedRef\n) {\n const generatedId = useId();\n const fieldId = id ?? name ?? generatedId;\n const innerRef = useRef<HTMLInputElement>(null);\n const setRef = (node: HTMLInputElement | null) => {\n innerRef.current = node;\n if (typeof forwardedRef === 'function') forwardedRef(node);\n else if (forwardedRef) forwardedRef.current = node;\n };\n const [files, setFiles] = useState<File[]>([]);\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const list = Array.from(e.target.files ?? []);\n setFiles(list);\n onChange?.(list);\n };\n\n const summary = summarizeFiles(files, showSize);\n\n return (\n <div className={clsx('block', className)}>\n {label && (\n <label\n htmlFor={fieldId}\n className=\"mb-1.5 block text-sm font-medium text-gray-700 dark:text-gray-300\"\n >\n {label}\n </label>\n )}\n <div\n className={clsx(\n 'flex h-9 w-full items-stretch overflow-hidden rounded-lg border bg-white transition-colors dark:bg-gray-800',\n error\n ? 'border-red-400 focus-within:border-red-500 dark:border-red-500/60'\n : 'focus-within:border-brand-500 border-gray-200 dark:border-gray-700',\n disabled && 'cursor-not-allowed opacity-50'\n )}\n >\n <button\n type=\"button\"\n onClick={() => innerRef.current?.click()}\n disabled={disabled}\n className=\"flex shrink-0 items-center gap-2 border-r border-inherit bg-gray-50 px-3 text-sm font-medium text-gray-700 transition-colors hover:bg-gray-100 disabled:cursor-not-allowed dark:bg-gray-900 dark:text-gray-200 dark:hover:bg-gray-800\"\n >\n <Paperclip className=\"h-4 w-4\" aria-hidden />\n {buttonLabel}\n </button>\n <span\n className={clsx(\n 'flex min-w-0 flex-1 items-center px-3 text-sm',\n files.length === 0\n ? 'text-gray-400 dark:text-gray-500'\n : 'text-gray-900 dark:text-white'\n )}\n >\n <span className=\"truncate\">{summary || placeholder}</span>\n </span>\n <input\n ref={setRef}\n id={fieldId}\n name={name}\n type=\"file\"\n multiple={multiple}\n accept={accept}\n disabled={disabled}\n onChange={handleChange}\n className=\"sr-only\"\n {...rest}\n />\n </div>\n {(error || description) && (\n <p\n className={clsx(\n 'mt-1 text-xs',\n error ? 'text-red-500' : 'text-gray-500 dark:text-gray-400'\n )}\n >\n {error ?? description}\n </p>\n )}\n </div>\n );\n});\n","import { clsx } from 'clsx';\nimport { File as FileIcon, Upload, X } from 'lucide-react';\nimport { useCallback, useId, useRef, useState, type DragEvent, type ReactNode } from 'react';\n\nconst formatBytes = (n: number): string => {\n if (n < 1024) return `${n} B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;\n if (n < 1024 * 1024 * 1024) return `${(n / 1024 / 1024).toFixed(1)} MB`;\n return `${(n / 1024 / 1024 / 1024).toFixed(2)} GB`;\n};\n\nexport type DropzoneProps = {\n label?: string;\n description?: string;\n error?: string;\n multiple?: boolean;\n accept?: string;\n disabled?: boolean;\n /** Called with the new list of accepted files. */\n onChange?: (files: File[]) => void;\n /** Controlled file list. */\n value?: File[];\n /** Cap on file count when `multiple` is true. */\n maxFiles?: number;\n /** Max bytes per file. */\n maxSize?: number;\n /** Custom content shown inside the drop area (overrides defaults). */\n children?: ReactNode;\n /** Hide the file list rendered below the drop area. Default `false`. */\n hideFileList?: boolean;\n className?: string;\n};\n\nconst matchesAccept = (file: File, accept: string): boolean => {\n // accept is a comma-separated list of mime types or extensions: \"image/*,.pdf\"\n return accept.split(',').some((token) => {\n const t = token.trim().toLowerCase();\n if (!t) return false;\n if (t.startsWith('.')) return file.name.toLowerCase().endsWith(t);\n if (t.endsWith('/*')) return file.type.startsWith(t.slice(0, -1));\n return file.type === t;\n });\n};\n\nexport const Dropzone = ({\n label,\n description,\n error: errorProp,\n multiple = false,\n accept,\n disabled = false,\n onChange,\n value,\n maxFiles,\n maxSize,\n children,\n hideFileList = false,\n className,\n}: DropzoneProps) => {\n const fieldId = useId();\n const inputRef = useRef<HTMLInputElement>(null);\n const isControlled = value !== undefined;\n const [internalFiles, setInternalFiles] = useState<File[]>([]);\n const [internalError, setInternalError] = useState<string | null>(null);\n const [dragOver, setDragOver] = useState(false);\n const files = isControlled ? value : internalFiles;\n const error = errorProp ?? internalError;\n\n const validate = useCallback(\n (incoming: File[]): { ok: File[]; error?: string } => {\n const ok: File[] = [];\n for (const f of incoming) {\n if (accept && !matchesAccept(f, accept))\n return { ok: [], error: `\"${f.name}\" type not allowed (${accept}).` };\n if (maxSize !== undefined && f.size > maxSize)\n return { ok: [], error: `\"${f.name}\" exceeds ${formatBytes(maxSize)}.` };\n ok.push(f);\n }\n const merged = multiple ? [...files, ...ok] : ok.slice(0, 1);\n if (multiple && maxFiles !== undefined && merged.length > maxFiles)\n return { ok: [], error: `Too many files (max ${maxFiles}).` };\n return { ok: merged };\n },\n [accept, files, maxFiles, maxSize, multiple]\n );\n\n const apply = (next: File[]) => {\n if (!isControlled) setInternalFiles(next);\n onChange?.(next);\n };\n\n const handleFiles = (incoming: File[]) => {\n if (incoming.length === 0) return;\n const { ok, error: validationError } = validate(incoming);\n if (validationError) {\n setInternalError(validationError);\n return;\n }\n setInternalError(null);\n apply(ok);\n };\n\n const handleDrop = (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n setDragOver(false);\n if (disabled) return;\n handleFiles(Array.from(e.dataTransfer.files ?? []));\n };\n\n const removeAt = (idx: number) => {\n const next = files.filter((_, i) => i !== idx);\n apply(next);\n setInternalError(null);\n };\n\n return (\n <div className={clsx('block', className)}>\n {label && (\n <label\n htmlFor={fieldId}\n className=\"mb-1.5 block text-sm font-medium text-gray-700 dark:text-gray-300\"\n >\n {label}\n </label>\n )}\n <div\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-label={label ? undefined : 'Upload files'}\n onClick={() => !disabled && inputRef.current?.click()}\n onKeyDown={(e) => {\n if (disabled) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n inputRef.current?.click();\n }\n }}\n onDragEnter={(e) => {\n e.preventDefault();\n if (!disabled) setDragOver(true);\n }}\n onDragOver={(e) => {\n e.preventDefault();\n if (!disabled) setDragOver(true);\n }}\n onDragLeave={(e) => {\n e.preventDefault();\n setDragOver(false);\n }}\n onDrop={handleDrop}\n className={clsx(\n 'flex flex-col items-center justify-center gap-2 rounded-xl border-2 border-dashed px-6 py-10 text-center transition-colors',\n disabled\n ? 'cursor-not-allowed opacity-50'\n : 'focus-visible:ring-brand-500/40 cursor-pointer focus:outline-none focus-visible:ring-2',\n error\n ? 'border-red-300 bg-red-50/40 dark:border-red-500/40 dark:bg-red-500/5'\n : dragOver\n ? 'border-brand-500 bg-brand-50 dark:bg-brand-500/10'\n : 'hover:border-brand-400 dark:hover:border-brand-500 border-gray-300 bg-gray-50 dark:border-gray-700 dark:bg-gray-800/40'\n )}\n >\n {children ?? (\n <>\n <Upload className=\"h-7 w-7 text-gray-400 dark:text-gray-500\" aria-hidden />\n <p className=\"text-sm font-medium text-gray-700 dark:text-gray-200\">\n <span className=\"text-brand-600 dark:text-brand-400 font-semibold\">\n Click to upload\n </span>{' '}\n or drag and drop\n </p>\n {description && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">{description}</p>\n )}\n </>\n )}\n <input\n ref={inputRef}\n id={fieldId}\n type=\"file\"\n multiple={multiple}\n accept={accept}\n disabled={disabled}\n className=\"sr-only\"\n onChange={(e) => handleFiles(Array.from(e.target.files ?? []))}\n />\n </div>\n {error && <p className=\"mt-1.5 text-xs text-red-500\">{error}</p>}\n {!hideFileList && files.length > 0 && (\n <ul className=\"mt-3 space-y-2\">\n {files.map((f, idx) => (\n <li\n key={`${f.name}-${idx}`}\n className=\"flex items-center gap-3 rounded-lg border border-gray-200 bg-white px-3 py-2 dark:border-gray-700 dark:bg-gray-800\"\n >\n <FileIcon className=\"h-4 w-4 shrink-0 text-gray-400\" aria-hidden />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm text-gray-900 dark:text-white\">{f.name}</p>\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">{formatBytes(f.size)}</p>\n </div>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n removeAt(idx);\n }}\n aria-label={`Remove ${f.name}`}\n className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-md text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-700 dark:hover:text-gray-200\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n};\n","import { clsx } from 'clsx';\nimport type { ReactNode } from 'react';\nimport { Button, type ButtonVariant } from '../ui/Button';\n\nexport type FormFooterAlign = 'right' | 'between';\n\nexport type FormFooterProps = {\n /** Cancel button handler. Hidden when omitted. */\n onCancel?: () => void;\n cancelLabel?: string;\n /** Submit button. Defaults to `<button type=\"submit\">`. Override via `submitProps.type`. */\n submitLabel?: string;\n /** When true, the submit button shows a spinner and is disabled. */\n submitting?: boolean;\n /** Disable the submit button (e.g. form invalid / not dirty). */\n submitDisabled?: boolean;\n /** Visual variant for the submit button. Default `primary`. */\n submitVariant?: ButtonVariant;\n /** Form name attribute (used by submit when the button is outside the form). */\n formId?: string;\n /** Where to render the buttons. Default `right`. */\n align?: FormFooterAlign;\n /** Render a top border separator. Default `true`. */\n bordered?: boolean;\n /** Optional content shown opposite the buttons (helper text, last-saved indicator…). */\n extra?: ReactNode;\n /** Replace the entire button row (still keeps padding + border). */\n children?: ReactNode;\n className?: string;\n};\n\nexport const FormFooter = ({\n onCancel,\n cancelLabel = 'Cancel',\n submitLabel = 'Save changes',\n submitting = false,\n submitDisabled = false,\n submitVariant = 'primary',\n formId,\n align = 'right',\n bordered = true,\n extra,\n children,\n className,\n}: FormFooterProps) => {\n const buttons = children ?? (\n <>\n {onCancel && (\n <Button type=\"button\" variant=\"secondary\" onClick={onCancel} disabled={submitting}>\n {cancelLabel}\n </Button>\n )}\n <Button\n type=\"submit\"\n variant={submitVariant}\n loading={submitting}\n disabled={submitDisabled || submitting}\n form={formId}\n >\n {submitLabel}\n </Button>\n </>\n );\n\n return (\n <div\n className={clsx(\n 'flex items-center gap-3 pt-4',\n bordered && 'border-t border-gray-100 dark:border-gray-800',\n align === 'between' ? 'justify-between' : 'justify-end',\n className\n )}\n >\n {extra && <div className=\"text-xs text-gray-500 dark:text-gray-400\">{extra}</div>}\n <div className={clsx('flex items-center gap-3', align === 'right' && 'ml-auto')}>\n {buttons}\n </div>\n </div>\n );\n};\n","import { clsx } from 'clsx';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { DayPicker, getDefaultClassNames, type DayPickerProps } from 'react-day-picker';\n// react-day-picker base structural styles. Override via `classNames` below.\nimport 'react-day-picker/style.css';\n\nexport type CalendarProps = DayPickerProps & {\n className?: string;\n};\n\n/**\n * Thin Cosmos wrapper around react-day-picker's `<DayPicker>`. All DayPicker\n * props are accepted (see https://daypicker.dev). Cosmos applies its own\n * Tailwind class names on top of the defaults so the calendar matches the\n * rest of the design system.\n */\nexport const Calendar = ({ classNames, components, className, ...rest }: CalendarProps) => {\n const def = getDefaultClassNames();\n return (\n // `animate` is intentionally OFF: with our custom caption (mode/year\n // dropdowns), the cross-fade transition renders the outgoing caption on\n // top of the incoming one for ~150 ms, producing a visible ghost of\n // \"May 2026\" overlapping the dropdowns. Static caption swaps look clean.\n <DayPicker\n classNames={{\n root: clsx(def.root, 'p-3 text-sm', className),\n months: clsx(def.months, 'gap-4'),\n month: clsx(def.month, 'space-y-2'),\n // Reserve horizontal padding so the absolute Nav prev/next chevrons sit\n // OUTSIDE of the caption content (dropdowns or label), never overlapping.\n month_caption: clsx(def.month_caption, 'flex min-h-9 items-center justify-center px-9'),\n // Hide the textual caption visually — react-day-picker still emits it\n // for screen readers, but our `Dropdowns` (when `captionLayout` is set)\n // already show the month + year, so the raw label produces a visual\n // doubling. `sr-only` keeps the a11y guarantee, kills the ghost text.\n caption_label: 'sr-only',\n // Nav stays absolutely positioned but vertically centered with the caption\n // (top-1.5 lines up with the caption baseline; pointer-events-none on wrapper\n // keeps the inner space click-through, then re-enables on the buttons).\n nav: clsx(\n def.nav,\n 'pointer-events-none absolute inset-x-0 top-1 flex items-center justify-between px-1'\n ),\n button_previous:\n 'pointer-events-auto inline-flex h-7 w-7 items-center justify-center rounded-md text-gray-500 transition-colors hover:bg-gray-100 hover:text-gray-700 disabled:opacity-30 dark:text-gray-400 dark:hover:bg-white/5 dark:hover:text-gray-200',\n button_next:\n 'pointer-events-auto inline-flex h-7 w-7 items-center justify-center rounded-md text-gray-500 transition-colors hover:bg-gray-100 hover:text-gray-700 disabled:opacity-30 dark:text-gray-400 dark:hover:bg-white/5 dark:hover:text-gray-200',\n // Caption dropdowns (when `captionLayout=\"dropdown\"` etc.)\n // The `dropdown` key targets the actual `<select>` element. `appearance-none`\n // hides the browser-native chevron; we layer a Lucide ChevronDown via a\n // background-image SVG so the chevron matches the rest of the design system.\n dropdowns: 'flex items-center justify-center gap-1.5',\n dropdown_root: 'relative inline-flex items-center',\n dropdown: clsx(\n 'cursor-pointer appearance-none rounded-md border border-gray-200 bg-white py-1 pr-6 pl-2.5 text-sm font-medium text-gray-700 transition-colors hover:bg-gray-50',\n 'focus:ring-brand-500/30 focus:ring-2 focus:outline-none',\n 'dark:border-gray-700 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700',\n // Custom chevron-down via inline SVG (text-gray-400 in light, text-gray-500 in dark — single SVG, neutral color works for both).\n \"bg-[url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%239ca3af' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E\\\")] bg-[length:12px] bg-[position:right_6px_center] bg-no-repeat\"\n ),\n months_dropdown: '',\n years_dropdown: '',\n weekdays: clsx(def.weekdays, ''),\n weekday: 'h-8 w-8 text-center text-[11px] font-medium text-gray-400 dark:text-gray-500',\n week: clsx(def.week, ''),\n day: 'h-8 w-8 p-0 text-center align-middle',\n day_button:\n 'inline-flex h-8 w-8 items-center justify-center rounded-md text-sm text-gray-700 transition-colors hover:bg-gray-100 dark:text-gray-200 dark:hover:bg-white/5',\n today: 'font-semibold text-brand-600 dark:text-brand-400',\n selected:\n '[&_button]:bg-brand-500 [&_button]:text-white [&_button]:hover:bg-brand-600 dark:[&_button]:hover:bg-brand-400',\n outside: 'text-gray-300 dark:text-gray-600',\n disabled: 'opacity-30',\n range_start: '[&_button]:rounded-r-none',\n range_end: '[&_button]:rounded-l-none',\n range_middle:\n '[&_button]:bg-brand-500/15 [&_button]:text-brand-700 [&_button]:rounded-none dark:[&_button]:text-brand-300',\n footer: 'pt-2 text-center text-xs text-gray-500 dark:text-gray-400',\n ...classNames,\n }}\n components={{\n Chevron: ({ orientation }) =>\n orientation === 'left' ? (\n <ChevronLeft className=\"h-4 w-4\" />\n ) : (\n <ChevronRight className=\"h-4 w-4\" />\n ),\n ...components,\n }}\n {...rest}\n />\n );\n};\n","import { clsx } from 'clsx';\nimport { Calendar as CalendarIcon } from 'lucide-react';\nimport { useCallback, useEffect, useId, useRef, useState, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Calendar } from './Calendar';\n\nexport type DateRange = {\n from: Date | undefined;\n to: Date | undefined;\n};\n\nexport type DatePickerMode = 'single' | 'range';\n\n// Discriminated union — the `mode` prop changes the shape of `value`,\n// `defaultValue`, and `onChange`. Without a union TypeScript would force\n// consumers to type-narrow at every call site.\ntype SingleProps = {\n mode?: 'single';\n value?: Date;\n defaultValue?: Date;\n onChange?: (date: Date | undefined) => void;\n /** Placeholder for the (single) trigger. */\n placeholder?: string;\n};\n\ntype RangeProps = {\n mode: 'range';\n value?: DateRange;\n defaultValue?: DateRange;\n onChange?: (range: DateRange) => void;\n /** Placeholder for the FROM trigger. */\n fromPlaceholder?: string;\n /** Placeholder for the TO trigger. */\n toPlaceholder?: string;\n};\n\ntype CommonProps = {\n label?: string;\n description?: string;\n error?: string;\n disabled?: boolean;\n /** Earliest selectable date (inclusive). */\n fromDate?: Date;\n /** Latest selectable date (inclusive). */\n toDate?: Date;\n /** Year range for the year dropdown. Default: current year ±10. */\n fromYear?: number;\n toYear?: number;\n /** Caption style. `dropdown` (default) shows month + year as `<select>`s. */\n captionLayout?: 'dropdown' | 'dropdown-months' | 'dropdown-years' | 'label';\n /** Single mode only — show a \"Today\" shortcut button below the calendar. Default `true`. */\n showTodayButton?: boolean;\n /** Custom formatter for displayed dates. Default `DD MMM YYYY`. */\n format?: (date: Date) => string;\n /** Single mode only — fully replace the default footer (Today button) with custom JSX. */\n calendarFooter?: ReactNode;\n /** Stretch the trigger(s) to fill the parent. */\n fullWidth?: boolean;\n className?: string;\n};\n\nexport type DatePickerProps = (SingleProps | RangeProps) & CommonProps;\n\nconst defaultFormat = (d: Date): string =>\n d.toLocaleDateString(undefined, { day: '2-digit', month: 'short', year: 'numeric' });\n\nconst EMPTY_RANGE: DateRange = { from: undefined, to: undefined };\n\nexport const DatePicker = (props: DatePickerProps) => {\n const {\n label,\n description,\n error,\n disabled = false,\n fromDate,\n toDate,\n fromYear,\n toYear,\n captionLayout = 'dropdown',\n showTodayButton = true,\n format = defaultFormat,\n calendarFooter,\n fullWidth = false,\n className,\n } = props;\n\n const isRange = props.mode === 'range';\n const fieldId = useId();\n const fromRef = useRef<HTMLButtonElement>(null);\n const toRef = useRef<HTMLButtonElement>(null);\n const [open, setOpen] = useState(false);\n const [anchorRect, setAnchorRect] = useState<DOMRect | null>(null);\n\n // ── Value plumbing (controlled vs uncontrolled) ─────────────────────────────\n const isControlled = props.value !== undefined;\n const [internalSingle, setInternalSingle] = useState<Date | undefined>(\n !isRange ? (props as SingleProps).defaultValue : undefined\n );\n const [internalRange, setInternalRange] = useState<DateRange>(\n isRange ? ((props as RangeProps).defaultValue ?? EMPTY_RANGE) : EMPTY_RANGE\n );\n\n const selectedSingle = isRange\n ? undefined\n : isControlled\n ? (props as SingleProps).value\n : internalSingle;\n const selectedRange = isRange\n ? isControlled\n ? ((props as RangeProps).value ?? EMPTY_RANGE)\n : internalRange\n : EMPTY_RANGE;\n\n // ── Calendar bounds ─────────────────────────────────────────────────────────\n const currentYear = new Date().getFullYear();\n const startMonth = fromDate ?? new Date(fromYear ?? currentYear - 10, 0, 1);\n const endMonth = toDate ?? new Date(toYear ?? currentYear + 10, 11, 31);\n const initialMonth = isRange\n ? (selectedRange.from ?? selectedRange.to ?? new Date())\n : (selectedSingle ?? new Date());\n const [month, setMonth] = useState<Date>(initialMonth);\n\n // ── Popover open/close ──────────────────────────────────────────────────────\n const anchor = useCallback((side: 'from' | 'to' = 'from') => {\n const r = side === 'to' ? toRef.current : fromRef.current;\n if (r) setAnchorRect(r.getBoundingClientRect());\n }, []);\n\n const toggle = (next: boolean, side: 'from' | 'to' = 'from') => {\n if (next) {\n anchor(side);\n setMonth(initialMonth);\n }\n setOpen(next);\n };\n\n useEffect(() => {\n if (!open) return;\n const refresh = () => anchor('from');\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false);\n };\n window.addEventListener('resize', refresh);\n window.addEventListener('scroll', refresh, true);\n document.addEventListener('keydown', onKey);\n return () => {\n window.removeEventListener('resize', refresh);\n window.removeEventListener('scroll', refresh, true);\n document.removeEventListener('keydown', onKey);\n };\n }, [open, anchor]);\n\n // ── Selection commit ────────────────────────────────────────────────────────\n const commitSingle = (date: Date | undefined) => {\n if (!isControlled) setInternalSingle(date);\n (props as SingleProps).onChange?.(date);\n if (date) setOpen(false);\n };\n\n const commitRange = (range: DateRange) => {\n if (!isControlled) setInternalRange(range);\n (props as RangeProps).onChange?.(range);\n if (range.from && range.to) setOpen(false);\n };\n\n // ── Footer (single mode) ────────────────────────────────────────────────────\n const handleToday = () => {\n const today = new Date();\n setMonth(today);\n commitSingle(today);\n };\n\n const singleFooter =\n calendarFooter ??\n (showTodayButton ? (\n <button\n type=\"button\"\n onClick={handleToday}\n className=\"text-brand-600 hover:bg-brand-50 dark:text-brand-400 dark:hover:bg-brand-500/10 inline-flex h-7 items-center rounded-md px-3 text-xs font-medium transition-colors\"\n >\n Today\n </button>\n ) : undefined);\n\n // Range mode always exposes Clear + Done — closing without picking the\n // second bound shouldn't be a dead end.\n const rangeFooter = (\n <div className=\"flex items-center justify-between gap-2 pt-2\">\n <button\n type=\"button\"\n onClick={() => commitRange(EMPTY_RANGE)}\n className=\"inline-flex h-7 items-center rounded-md px-3 text-xs font-medium text-gray-500 transition-colors hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-white/5 dark:hover:text-gray-200\"\n >\n Clear\n </button>\n <button\n type=\"button\"\n onClick={() => setOpen(false)}\n className=\"bg-brand-500 hover:bg-brand-600 inline-flex h-7 items-center rounded-md px-3 text-xs font-medium text-white transition-colors\"\n >\n Done\n </button>\n </div>\n );\n\n // ── Trigger rendering ───────────────────────────────────────────────────────\n const triggerClass = clsx(\n 'h-9 items-center gap-2 rounded-lg border bg-white px-3 text-left text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-50 dark:bg-gray-800',\n error\n ? 'border-red-400 focus:border-red-500 focus:outline-none dark:border-red-500/60'\n : 'focus:border-brand-500 border-gray-200 focus:outline-none dark:border-gray-700'\n );\n\n const renderTrigger = (\n ref: React.RefObject<HTMLButtonElement | null>,\n id: string | undefined,\n side: 'from' | 'to',\n date: Date | undefined,\n placeholder: string\n ) => (\n <button\n ref={ref}\n id={id}\n type=\"button\"\n disabled={disabled}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n // `react-hooks/refs` flags this because `toggle → anchor → ref.current`,\n // but the chain only runs in the click callback, never during render.\n // eslint-disable-next-line react-hooks/refs\n onClick={() => toggle(!open, side)}\n className={clsx(\n fullWidth\n ? 'flex flex-1'\n : isRange\n ? 'inline-flex min-w-[180px]'\n : 'inline-flex min-w-[200px]',\n triggerClass\n )}\n >\n <CalendarIcon className=\"h-4 w-4 shrink-0 text-gray-400\" aria-hidden />\n <span\n className={clsx(\n 'flex-1 truncate',\n date ? 'text-gray-900 dark:text-white' : 'text-gray-400 dark:text-gray-500'\n )}\n >\n {date ? format(date) : placeholder}\n </span>\n </button>\n );\n\n // ── Render ──────────────────────────────────────────────────────────────────\n return (\n <div className={clsx('block', className)}>\n {label && (\n <label\n htmlFor={fieldId}\n className=\"mb-1.5 block text-sm font-medium text-gray-700 dark:text-gray-300\"\n >\n {label}\n </label>\n )}\n\n {isRange ? (\n <div className={clsx('flex items-center gap-2', !fullWidth && 'w-fit')}>\n {renderTrigger(\n fromRef,\n fieldId,\n 'from',\n selectedRange.from,\n (props as RangeProps).fromPlaceholder ?? 'Start date'\n )}\n <span className=\"text-xs font-medium text-gray-500 dark:text-gray-400\">to</span>\n {renderTrigger(\n toRef,\n undefined,\n 'to',\n selectedRange.to,\n (props as RangeProps).toPlaceholder ?? 'End date'\n )}\n </div>\n ) : (\n renderTrigger(\n fromRef,\n fieldId,\n 'from',\n selectedSingle,\n (props as SingleProps).placeholder ?? 'Pick a date'\n )\n )}\n\n {(error || description) && (\n <p\n className={clsx(\n 'mt-1 text-xs',\n error ? 'text-red-500' : 'text-gray-500 dark:text-gray-400'\n )}\n >\n {error ?? description}\n </p>\n )}\n\n {open &&\n anchorRect &&\n createPortal(\n <>\n <div className=\"fixed inset-0 z-[9998]\" onClick={() => setOpen(false)} />\n <div\n role=\"dialog\"\n aria-label={label ? `${label} calendar` : 'Calendar'}\n style={{ top: anchorRect.bottom + 6, left: anchorRect.left }}\n className=\"fixed z-[9999] overflow-hidden rounded-xl border border-gray-200 bg-white shadow-xl dark:border-gray-700 dark:bg-gray-900\"\n >\n {isRange ? (\n <Calendar\n mode=\"range\"\n selected={selectedRange.from || selectedRange.to ? selectedRange : undefined}\n onSelect={(r) => commitRange({ from: r?.from, to: r?.to })}\n month={month}\n onMonthChange={setMonth}\n captionLayout={captionLayout}\n startMonth={startMonth}\n endMonth={endMonth}\n disabled={\n fromDate || toDate\n ? [\n ...(fromDate ? [{ before: fromDate }] : []),\n ...(toDate ? [{ after: toDate }] : []),\n ]\n : undefined\n }\n footer={rangeFooter}\n />\n ) : (\n <Calendar\n mode=\"single\"\n selected={selectedSingle}\n onSelect={commitSingle}\n month={month}\n onMonthChange={setMonth}\n captionLayout={captionLayout}\n startMonth={startMonth}\n endMonth={endMonth}\n disabled={\n fromDate || toDate\n ? [\n ...(fromDate ? [{ before: fromDate }] : []),\n ...(toDate ? [{ after: toDate }] : []),\n ]\n : undefined\n }\n footer={singleFooter}\n />\n )}\n </div>\n </>,\n document.body\n )}\n </div>\n );\n};\n","import { clsx } from 'clsx';\nimport { Clock } from 'lucide-react';\nimport { forwardRef, useId, type ChangeEvent, type InputHTMLAttributes } from 'react';\n\nexport type TimePickerProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'value' | 'onChange'\n> & {\n label?: string;\n description?: string;\n error?: string;\n /** HH:MM (24h) string. */\n value?: string;\n defaultValue?: string;\n onChange?: (time: string, e: ChangeEvent<HTMLInputElement>) => void;\n /** Minute granularity. 1 = any minute, 60 = hours only. Default 1. */\n step?: number;\n /** Earliest time (HH:MM). */\n min?: string;\n /** Latest time (HH:MM). */\n max?: string;\n /**\n * Stretch the input to fill its parent (`w-full`). Default `false` —\n * the input sizes itself with a sensible `min-w-[140px]`. Use `fullWidth`\n * in form grids that should fill the column.\n */\n fullWidth?: boolean;\n};\n\nexport const TimePicker = forwardRef<HTMLInputElement, TimePickerProps>(function TimePicker(\n {\n label,\n description,\n error,\n value,\n defaultValue,\n onChange,\n step,\n min,\n max,\n disabled,\n id,\n name,\n fullWidth = false,\n className,\n ...rest\n },\n ref\n) {\n const generatedId = useId();\n const fieldId = id ?? name ?? generatedId;\n const stepSeconds = step !== undefined ? step * 60 : undefined;\n\n return (\n <div className=\"block\">\n {label && (\n <label\n htmlFor={fieldId}\n className=\"mb-1.5 block text-sm font-medium text-gray-700 dark:text-gray-300\"\n >\n {label}\n </label>\n )}\n <div\n className={clsx(\n 'relative inline-flex h-9 items-center',\n fullWidth ? 'w-full' : 'min-w-[140px]'\n )}\n >\n <Clock aria-hidden className=\"pointer-events-none absolute left-3 h-4 w-4 text-gray-400\" />\n <input\n ref={ref}\n id={fieldId}\n name={name}\n type=\"time\"\n value={value}\n defaultValue={defaultValue}\n step={stepSeconds}\n min={min}\n max={max}\n disabled={disabled}\n onChange={(e) => onChange?.(e.target.value, e)}\n className={clsx(\n 'h-full w-full rounded-lg border bg-white pr-3 pl-9 text-sm transition-colors focus:outline-none disabled:cursor-not-allowed disabled:opacity-50 dark:bg-gray-800 dark:text-white',\n // Hide the browser-native time picker icon (Chrome adds an extra clock on the right) so only our left-icon shows.\n '[&::-webkit-calendar-picker-indicator]:absolute [&::-webkit-calendar-picker-indicator]:inset-0 [&::-webkit-calendar-picker-indicator]:cursor-pointer [&::-webkit-calendar-picker-indicator]:opacity-0',\n error\n ? 'border-red-400 focus:border-red-500 dark:border-red-500/60'\n : 'focus:border-brand-500 border-gray-200 dark:border-gray-700',\n className\n )}\n {...rest}\n />\n </div>\n {(error || description) && (\n <p\n className={clsx(\n 'mt-1 text-xs',\n error ? 'text-red-500' : 'text-gray-500 dark:text-gray-400'\n )}\n >\n {error ?? description}\n </p>\n )}\n </div>\n );\n});\n","import { clsx } from 'clsx';\nimport {\n useEffect,\n useRef,\n type ChangeEvent,\n type ClipboardEvent,\n type KeyboardEvent,\n} from 'react';\n\nexport type OtpInputProps = {\n /** Number of cells. Default 6. */\n length?: number;\n /** Current value. Length should be ≤ `length`. */\n value: string;\n onChange: (value: string) => void;\n /** Fired when the user reaches `length` characters. */\n onComplete?: (value: string) => void;\n disabled?: boolean;\n error?: boolean;\n /** Allow letters in addition to digits. Default `false` (digits only). */\n alphanumeric?: boolean;\n /** Render each filled cell as a `•` instead of the actual character. */\n mask?: boolean;\n autoFocus?: boolean;\n /** Hidden input `name` for native form submission. */\n name?: string;\n className?: string;\n ariaLabel?: string;\n};\n\nconst sanitize = (raw: string, alphanumeric: boolean): string => {\n const re = alphanumeric ? /[^A-Za-z0-9]/g : /\\D/g;\n return raw.replace(re, '');\n};\n\nexport const OtpInput = ({\n length = 6,\n value,\n onChange,\n onComplete,\n disabled = false,\n error = false,\n alphanumeric = false,\n mask = false,\n autoFocus = false,\n name,\n className,\n ariaLabel = 'Verification code',\n}: OtpInputProps) => {\n const refs = useRef<Array<HTMLInputElement | null>>([]);\n\n useEffect(() => {\n if (autoFocus) refs.current[0]?.focus();\n }, [autoFocus]);\n\n const setCell = (idx: number, char: string) => {\n const cleaned = sanitize(char, alphanumeric).slice(0, 1);\n const arr = value.padEnd(length, ' ').split('');\n arr[idx] = cleaned || ' ';\n // Trim trailing spaces but keep internal positions intact while building.\n const finalValue = arr\n .map((c) => (c === ' ' ? '' : c))\n .join('')\n .slice(0, length);\n onChange(finalValue);\n if (finalValue.length === length) onComplete?.(finalValue);\n return cleaned;\n };\n\n const focusCell = (idx: number) => {\n const target = refs.current[Math.max(0, Math.min(length - 1, idx))];\n target?.focus();\n target?.select();\n };\n\n const handleChange = (idx: number) => (e: ChangeEvent<HTMLInputElement>) => {\n const inserted = setCell(idx, e.target.value);\n if (inserted) focusCell(idx + 1);\n };\n\n const handleKeyDown = (idx: number) => (e: KeyboardEvent<HTMLInputElement>) => {\n const cell = value[idx] ?? '';\n if (e.key === 'Backspace') {\n if (cell.length === 0 && idx > 0) {\n e.preventDefault();\n // Clear previous cell and move focus there.\n const arr = value.split('');\n arr[idx - 1] = '';\n onChange(arr.join('').replace(/$/, ''));\n focusCell(idx - 1);\n } else if (cell.length > 0) {\n // Default behaviour also wipes — but we ensure the parent state stays consistent.\n const arr = value.split('');\n arr[idx] = '';\n onChange(arr.join(''));\n }\n return;\n }\n if (e.key === 'ArrowLeft' && idx > 0) {\n e.preventDefault();\n focusCell(idx - 1);\n }\n if (e.key === 'ArrowRight' && idx < length - 1) {\n e.preventDefault();\n focusCell(idx + 1);\n }\n };\n\n const handlePaste = (idx: number) => (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n const raw = e.clipboardData.getData('text');\n const cleaned = sanitize(raw, alphanumeric).slice(0, length - idx);\n if (!cleaned) return;\n const arr = value.padEnd(length, ' ').split('');\n cleaned.split('').forEach((c, i) => {\n arr[idx + i] = c;\n });\n const finalValue = arr\n .map((c) => (c === ' ' ? '' : c))\n .join('')\n .slice(0, length);\n onChange(finalValue);\n const nextFocus = Math.min(length - 1, idx + cleaned.length);\n focusCell(nextFocus);\n if (finalValue.length === length) onComplete?.(finalValue);\n };\n\n return (\n <div className={clsx('flex items-center gap-2', className)} role=\"group\" aria-label={ariaLabel}>\n {Array.from({ length }).map((_, i) => {\n const cellChar = value[i] ?? '';\n const display = mask && cellChar ? '•' : cellChar;\n return (\n <input\n key={i}\n ref={(el) => {\n refs.current[i] = el;\n }}\n type=\"text\"\n inputMode={alphanumeric ? 'text' : 'numeric'}\n pattern={alphanumeric ? '[A-Za-z0-9]*' : '[0-9]*'}\n maxLength={1}\n autoComplete={i === 0 ? 'one-time-code' : 'off'}\n value={display}\n disabled={disabled}\n aria-label={`${ariaLabel} digit ${i + 1}`}\n onChange={handleChange(i)}\n onKeyDown={handleKeyDown(i)}\n onPaste={handlePaste(i)}\n onFocus={(e) => e.target.select()}\n className={clsx(\n 'focus:ring-brand-500/30 h-12 w-10 rounded-lg border bg-white text-center text-lg font-semibold text-gray-900 tabular-nums transition-colors focus:ring-2 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50 dark:bg-gray-800 dark:text-white',\n error\n ? 'border-red-400 focus:border-red-500 dark:border-red-500/60'\n : 'focus:border-brand-500 border-gray-200 dark:border-gray-700'\n )}\n />\n );\n })}\n {name && <input type=\"hidden\" name={name} value={value} />}\n </div>\n );\n};\n","import { clsx } from 'clsx';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n// TUI Plus reference (Pattern 1 — \"Simple\"):\n// <div class=\"bg-white shadow-sm sm:rounded-lg\">\n// <div class=\"px-4 py-5 sm:p-6\">\n// <h3 class=\"text-base font-semibold text-gray-900\">Manage subscription</h3>\n// <div class=\"mt-2 max-w-xl text-sm text-gray-500\">\n// <p>Lorem ipsum dolor…</p>\n// </div>\n// <div class=\"mt-5\">\n// <button class=\"…\">Change plan</button>\n// </div>\n// </div>\n// </div>\n//\n// Pattern 4 — \"With button at top right\": switches to `sm:flex sm:items-start\n// sm:justify-between`, action floats top-right next to title block.\n// Pattern 7 — \"Simple well\": uses tinted gray bg instead of white card.\n\nexport type ActionPanelLayout = 'stacked' | 'inline';\n\nexport type ActionPanelProps = HTMLAttributes<HTMLDivElement> & {\n /** Section title (rendered as `<h3>`). */\n title: ReactNode;\n /** Body text shown under the title. */\n description?: ReactNode;\n /** Trailing action — button, link, toggle, etc. */\n action?: ReactNode;\n /**\n * Layout. `stacked` (default): action sits below the description.\n * `inline`: action floats top-right (TUI \"With button at top right\").\n */\n layout?: ActionPanelLayout;\n /**\n * Use a tinted gray surface instead of a white card (TUI \"Simple well\").\n */\n well?: boolean;\n};\n\nexport const ActionPanel = forwardRef<HTMLDivElement, ActionPanelProps>(function ActionPanel(\n { title, description, action, layout = 'stacked', well = false, className, children, ...rest },\n ref\n) {\n const surface = well\n ? 'rounded-lg bg-gray-50 dark:bg-gray-800/60'\n : 'bg-white shadow-sm sm:rounded-lg dark:bg-gray-900 dark:ring-1 dark:ring-white/10';\n\n const body = (\n <>\n <div className={layout === 'inline' ? 'sm:flex-1' : undefined}>\n <h3 className=\"text-base font-semibold text-gray-900 dark:text-white\">{title}</h3>\n {description && (\n <div className=\"mt-2 max-w-xl text-sm text-gray-500 dark:text-gray-400\">\n {typeof description === 'string' ? <p>{description}</p> : description}\n </div>\n )}\n {layout === 'stacked' && children && <div className=\"mt-3\">{children}</div>}\n </div>\n {action && (\n <div\n className={clsx(\n layout === 'inline'\n ? 'mt-3 sm:mt-0 sm:ml-6 sm:flex sm:shrink-0 sm:items-center'\n : 'mt-5'\n )}\n >\n {action}\n </div>\n )}\n {layout === 'inline' && children && <div className=\"mt-3 sm:w-full\">{children}</div>}\n </>\n );\n\n return (\n <div ref={ref} className={clsx(surface, className)} {...rest}>\n <div\n className={clsx(\n 'px-4 py-5 sm:p-6',\n layout === 'inline' && 'sm:flex sm:items-start sm:justify-between'\n )}\n >\n {body}\n </div>\n </div>\n );\n});\n","import { clsx } from 'clsx';\nimport { Check, ChevronsUpDown } from 'lucide-react';\nimport {\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\n\n// TUI Plus reference (Pattern 1 — \"Simple\"):\n// <Combobox>\n// <ComboboxLabel>Assigned to</ComboboxLabel>\n// <ComboboxInput onChange={…} displayValue={…} />\n// <ComboboxButton><ChevronUpDown /></ComboboxButton>\n// <ComboboxOptions>\n// {filtered.map(p => <ComboboxOption value={p}>{p.name}</ComboboxOption>)}\n// </ComboboxOptions>\n// </Combobox>\n//\n// Our implementation is uncontrolled-input + controlled-selection, no\n// external lib (cmdk/headlessui not needed for this surface).\n\nexport type ComboboxOption = {\n value: string;\n label: string;\n /** Optional secondary text shown to the right (mirrors TUI \"With secondary text\"). */\n secondary?: ReactNode;\n /** Optional status dot/icon shown to the left (TUI \"With status indicator\"). */\n leading?: ReactNode;\n disabled?: boolean;\n};\n\nexport type ComboboxProps = {\n label?: ReactNode;\n /** Selected option value (controlled). */\n value?: string;\n /** Called when the user picks an option. */\n onChange?: (value: string) => void;\n options: ComboboxOption[];\n placeholder?: string;\n /** Show this when no option matches the typed query. */\n emptyMessage?: string;\n /** Disable the input + dropdown. */\n disabled?: boolean;\n /** Helper text under the input. */\n helperText?: string;\n /** Error message — replaces helperText when set. */\n error?: string;\n className?: string;\n};\n\nexport const Combobox = ({\n label,\n value,\n onChange,\n options,\n placeholder,\n emptyMessage = 'No matches found.',\n disabled = false,\n helperText,\n error,\n className,\n}: ComboboxProps) => {\n const id = useId();\n const listboxId = `${id}-listbox`;\n const selected = options.find((o) => o.value === value);\n const [query, setQuery] = useState(selected?.label ?? '');\n const [open, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(0);\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n // Keep input mirror of external selection.\n useEffect(() => {\n if (!open) setQuery(selected?.label ?? '');\n }, [selected?.label, open]);\n\n const filtered = useMemo(() => {\n if (!query) return options;\n const q = query.toLowerCase();\n return options.filter((o) => o.label.toLowerCase().includes(q));\n }, [options, query]);\n\n // Close on outside click.\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (!wrapperRef.current?.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open]);\n\n const pick = (opt: ComboboxOption) => {\n if (opt.disabled) return;\n onChange?.(opt.value);\n setQuery(opt.label);\n setOpen(false);\n };\n\n const onKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setOpen(true);\n setActiveIndex((i) => Math.min(i + 1, filtered.length - 1));\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setActiveIndex((i) => Math.max(i - 1, 0));\n } else if (e.key === 'Enter') {\n if (open && filtered[activeIndex]) {\n e.preventDefault();\n pick(filtered[activeIndex]);\n }\n } else if (e.key === 'Escape') {\n setOpen(false);\n }\n };\n\n return (\n <div ref={wrapperRef} className={clsx('w-full', className)}>\n {label && (\n <label htmlFor={id} className=\"block text-sm font-medium text-gray-900 dark:text-white\">\n {label}\n </label>\n )}\n <div className={clsx('relative', label && 'mt-2')}>\n <input\n id={id}\n role=\"combobox\"\n aria-expanded={open}\n aria-controls={listboxId}\n aria-autocomplete=\"list\"\n aria-activedescendant={\n open && filtered[activeIndex] ? `${id}-opt-${activeIndex}` : undefined\n }\n disabled={disabled}\n value={query}\n placeholder={placeholder}\n onChange={(e) => {\n setQuery(e.target.value);\n setOpen(true);\n setActiveIndex(0);\n }}\n onFocus={() => setOpen(true)}\n onKeyDown={onKeyDown}\n className={clsx(\n 'w-full rounded-md border bg-white py-1.5 pr-10 pl-3 text-sm shadow-sm focus:ring-2 focus:outline-none dark:bg-gray-900 dark:text-white',\n error\n ? 'border-red-500 focus:border-red-500 focus:ring-red-500/30'\n : 'focus:border-brand-500 focus:ring-brand-500/30 border-gray-300 dark:border-white/10',\n disabled && 'cursor-not-allowed opacity-50'\n )}\n />\n <button\n type=\"button\"\n aria-label=\"Toggle options\"\n disabled={disabled}\n onClick={() => setOpen((v) => !v)}\n className=\"absolute inset-y-0 right-0 flex items-center pr-2 text-gray-400 hover:text-gray-500\"\n >\n <ChevronsUpDown className=\"size-5\" aria-hidden />\n </button>\n {open && (\n <ul\n id={listboxId}\n role=\"listbox\"\n className=\"absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 text-sm shadow-lg ring-1 ring-black/5 focus:outline-none dark:bg-gray-800 dark:ring-white/10\"\n >\n {filtered.length === 0 ? (\n <li className=\"px-3 py-2 text-sm text-gray-500 dark:text-gray-400\">{emptyMessage}</li>\n ) : (\n filtered.map((opt, i) => {\n const isActive = i === activeIndex;\n const isSelected = opt.value === value;\n return (\n <li\n id={`${id}-opt-${i}`}\n key={opt.value}\n role=\"option\"\n aria-selected={isSelected}\n onMouseEnter={() => setActiveIndex(i)}\n onMouseDown={(e) => {\n // mousedown fires before input blur — prevents losing focus\n // race with the listbox unmount.\n e.preventDefault();\n pick(opt);\n }}\n className={clsx(\n 'flex cursor-pointer items-center gap-2 px-3 py-2 select-none',\n isActive ? 'bg-brand-500 text-white' : 'text-gray-900 dark:text-gray-100',\n opt.disabled && 'cursor-not-allowed opacity-50'\n )}\n >\n {opt.leading && <span className=\"shrink-0\">{opt.leading}</span>}\n <span className=\"flex-1 truncate\">{opt.label}</span>\n {opt.secondary && (\n <span\n className={clsx(\n 'shrink-0 text-xs',\n isActive ? 'text-white/80' : 'text-gray-500 dark:text-gray-400'\n )}\n >\n {opt.secondary}\n </span>\n )}\n {isSelected && <Check className=\"size-4 shrink-0\" aria-hidden />}\n </li>\n );\n })\n )}\n </ul>\n )}\n </div>\n {(helperText || error) && (\n <p\n className={clsx(\n 'mt-1.5 text-xs',\n error ? 'text-red-600 dark:text-red-400' : 'text-gray-500 dark:text-gray-400'\n )}\n >\n {error ?? helperText}\n </p>\n )}\n </div>\n );\n};\n","import { clsx } from 'clsx';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n// TUI Plus reference (Pattern 1 — \"Left-aligned\"):\n// <div>\n// <div class=\"px-4 sm:px-0\">\n// <h3 class=\"text-base/7 font-semibold text-gray-900\">Applicant Information</h3>\n// <p class=\"mt-1 max-w-2xl text-sm/6 text-gray-500\">Personal details and application.</p>\n// </div>\n// <div class=\"mt-6 border-t border-gray-100\">\n// <dl class=\"divide-y divide-gray-100\">\n// <div class=\"px-4 py-6 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0\">\n// <dt class=\"text-sm/6 font-medium text-gray-900\">Full name</dt>\n// <dd class=\"mt-1 text-sm/6 text-gray-700 sm:col-span-2 sm:mt-0\">Margot Foster</dd>\n// </div>\n// …\n// </dl>\n// </div>\n// </div>\n//\n// Pattern 2 — \"Left-aligned in card\": wraps the <dl> in a card surface with\n// border + rounded + shadow.\n\n// ── Item ─────────────────────────────────────────────────────────────────────\n\nexport type DescriptionListItemProps = HTMLAttributes<HTMLDivElement> & {\n /** Label (`<dt>`). */\n label: ReactNode;\n /** Value (`<dd>`). */\n children: ReactNode;\n};\n\nconst Item = forwardRef<HTMLDivElement, DescriptionListItemProps>(function Item(\n { label, children, className, ...rest },\n ref\n) {\n return (\n <div\n ref={ref}\n className={clsx('px-4 py-6 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0', className)}\n {...rest}\n >\n <dt className=\"text-sm/6 font-medium text-gray-900 dark:text-white\">{label}</dt>\n <dd className=\"mt-1 text-sm/6 text-gray-700 sm:col-span-2 sm:mt-0 dark:text-gray-300\">\n {children}\n </dd>\n </div>\n );\n});\n\n// ── Root ─────────────────────────────────────────────────────────────────────\n\nexport type DescriptionListProps = HTMLAttributes<HTMLDListElement> & {\n /** Optional header title (rendered above the list). */\n title?: ReactNode;\n /** Optional header description (rendered below the title). */\n description?: ReactNode;\n /**\n * When `true`, wraps the list in a card surface with border + rounded +\n * shadow (TUI \"Left-aligned in card\" pattern).\n */\n inCard?: boolean;\n /**\n * When `true`, items get an alternating gray background (TUI \"Left-aligned\n * striped\" pattern). Implementation uses `even:bg-gray-50`.\n */\n striped?: boolean;\n children: ReactNode;\n};\n\nconst RootCmp = forwardRef<HTMLDListElement, DescriptionListProps>(function DescriptionListRoot(\n { title, description, inCard = false, striped = false, className, children, ...rest },\n ref\n) {\n const dl = (\n <dl\n ref={ref}\n className={clsx(\n 'divide-y divide-gray-100 dark:divide-white/5',\n striped &&\n '[&>div:nth-child(even)]:bg-gray-50 dark:[&>div:nth-child(even)]:bg-white/[0.03]',\n inCard && 'px-4 sm:px-6',\n className\n )}\n {...rest}\n >\n {children}\n </dl>\n );\n\n const header =\n title || description ? (\n <div className={clsx(inCard ? 'px-4 pt-6 pb-4 sm:px-6' : 'px-4 sm:px-0')}>\n {title && (\n <h3 className=\"text-base/7 font-semibold text-gray-900 dark:text-white\">{title}</h3>\n )}\n {description && (\n <p className=\"mt-1 max-w-2xl text-sm/6 text-gray-500 dark:text-gray-400\">{description}</p>\n )}\n </div>\n ) : null;\n\n if (inCard) {\n return (\n <div className=\"overflow-hidden bg-white shadow-sm ring-1 ring-gray-200 sm:rounded-xl dark:bg-gray-900 dark:ring-white/10\">\n {header}\n {!header && null}\n <div className=\"border-t border-gray-100 dark:border-white/10\">{dl}</div>\n </div>\n );\n }\n\n return (\n <div>\n {header}\n <div className={clsx(header && 'mt-6 border-t border-gray-100 dark:border-white/10')}>\n {dl}\n </div>\n </div>\n );\n});\n\n// ── Compound export ──────────────────────────────────────────────────────────\n\nexport const DescriptionList = Object.assign(RootCmp, { Item });\n","import { clsx } from 'clsx';\nimport type { ReactNode } from 'react';\n\nexport type KpiCardProps = {\n label: string;\n value: ReactNode;\n /** Smaller text under the value — e.g. \"across 3 sites\". */\n sub?: ReactNode;\n className?: string;\n};\n\n/**\n * KpiCard — single key metric card : label + large value + optional sub-text.\n * Use in dashboards as the top-row at-a-glance panel.\n */\nexport const KpiCard = ({ label, value, sub, className }: KpiCardProps) => (\n <div\n className={clsx(\n 'flex flex-col rounded-2xl border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900',\n className\n )}\n >\n <p className=\"text-xs font-medium tracking-wider text-gray-500 uppercase dark:text-gray-400\">\n {label}\n </p>\n <p className=\"mt-2 text-2xl font-bold text-gray-900 dark:text-white\">{value}</p>\n {sub && <p className=\"mt-1 text-xs text-gray-500 dark:text-gray-400\">{sub}</p>}\n </div>\n);\n","import { clsx } from 'clsx';\nimport type { ElementType, ReactNode } from 'react';\nimport { Avatar } from '../ui/Avatar';\n\nexport type TimelineItem = {\n id: string;\n /** Label or rendered title for the entry. */\n title: ReactNode;\n /** Optional secondary line under the title. */\n description?: ReactNode;\n /** Time label — e.g. \"5m ago\", \"2026-05-07 14:32\". */\n time?: ReactNode;\n /** Lucide icon — used by `dot` and `stepper` variants. */\n icon?: ElementType;\n /** Initials/name for `avatar` variant. */\n avatarName?: string;\n /** Optional image URL for `avatar` variant. */\n avatarSrc?: string;\n /**\n * Visual tone for `stepper` variant (icon circle background).\n * Defaults to `brand`.\n */\n tone?: TimelineTone;\n};\n\nexport type TimelineTone = 'brand' | 'success' | 'warning' | 'danger' | 'neutral';\n\nexport type TimelineVariant =\n /** Small coloured dot — concise activity stream. */\n | 'dot'\n /** Avatar (initials or image) — useful when authorship matters. */\n | 'avatar'\n /**\n * Flowbite-style stepper timeline — large icon circle (40px) with the\n * Lucide icon at 20px, tinted background per `tone`. Best for hero\n * activity feeds or onboarding-style step-by-step views.\n */\n | 'stepper'\n /** Each entry rendered as a stand-alone card (no connector line). */\n | 'card';\n\nexport type TimelineProps = {\n items: TimelineItem[];\n variant?: TimelineVariant;\n className?: string;\n};\n\n// ── Tone colour map for the `stepper` variant ────────────────────────────────\n\nconst TONE_BG: Record<TimelineTone, string> = {\n brand: 'bg-brand-100 text-brand-700 dark:bg-brand-500/20 dark:text-brand-300',\n success: 'bg-green-100 text-green-700 dark:bg-green-500/20 dark:text-green-300',\n warning: 'bg-amber-100 text-amber-700 dark:bg-amber-500/20 dark:text-amber-300',\n danger: 'bg-red-100 text-red-700 dark:bg-red-500/20 dark:text-red-300',\n neutral: 'bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-300',\n};\n\n// ── Indicator renderers (one per variant) ────────────────────────────────────\n\nconst DotIndicator = ({ icon: Icon }: { icon?: ElementType }) => (\n <span className=\"bg-brand-500 flex h-4 w-4 shrink-0 items-center justify-center rounded-full ring-4 ring-white dark:ring-gray-900\">\n {Icon && <Icon className=\"h-2.5 w-2.5 text-white\" />}\n </span>\n);\n\nconst AvatarIndicator = ({ name, src }: { name?: string; src?: string }) => (\n <Avatar size=\"sm\" name={name} src={src} className=\"shrink-0\" />\n);\n\nconst StepperIndicator = ({\n icon: Icon,\n tone = 'brand',\n}: {\n icon?: ElementType;\n tone?: TimelineTone;\n}) => (\n <span\n className={clsx(\n 'flex h-10 w-10 shrink-0 items-center justify-center rounded-full ring-4 ring-white dark:ring-gray-900',\n TONE_BG[tone]\n )}\n >\n {Icon ? <Icon className=\"h-5 w-5\" /> : <span className=\"h-2 w-2 rounded-full bg-current\" />}\n </span>\n);\n\n// ── Body (title + description + time) — shared across all line variants ──────\n\nconst Body = ({ item }: { item: TimelineItem }) => (\n <div className=\"min-w-0 flex-1 pb-2 last:pb-0\">\n <p className=\"text-sm font-medium text-gray-900 dark:text-gray-100\">{item.title}</p>\n {item.description && (\n <p className=\"mt-0.5 text-xs text-gray-500 dark:text-gray-400\">{item.description}</p>\n )}\n {item.time && (\n <p className=\"mt-0.5 font-mono text-[10px] text-gray-400 uppercase\">{item.time}</p>\n )}\n </div>\n);\n\n// ── Main component ──────────────────────────────────────────────────────────\n\nexport const Timeline = ({ items, variant = 'dot', className }: TimelineProps) => {\n // `card` keeps its own simple stacked layout — no connector line, no\n // indicator column to align.\n if (variant === 'card') {\n return (\n <ol className={clsx('space-y-3', className)}>\n {items.map((item) => (\n <li\n key={item.id}\n className=\"rounded-xl border border-gray-200 bg-white p-3 dark:border-gray-800 dark:bg-gray-900\"\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-gray-900 dark:text-gray-100\">{item.title}</p>\n {item.description && (\n <p className=\"mt-0.5 text-xs text-gray-500 dark:text-gray-400\">\n {item.description}\n </p>\n )}\n </div>\n {item.time && (\n <span className=\"shrink-0 font-mono text-[10px] text-gray-400 uppercase\">\n {item.time}\n </span>\n )}\n </div>\n </li>\n ))}\n </ol>\n );\n }\n\n // Shared flex-column layout for `dot`, `avatar`, `stepper`. The connector\n // line is rendered per-item *inside* the indicator column, so it always\n // tracks the actual indicator size rather than relying on a `border-l`\n // tracked on the parent `<ol>` (which used to drift away from larger\n // indicators like avatars and stepper icon circles).\n const gap = variant === 'stepper' ? 'gap-x-4' : 'gap-x-3';\n\n return (\n <ol className={clsx('flex flex-col', className)}>\n {items.map((item, i) => {\n const isLast = i === items.length - 1;\n return (\n <li key={item.id} className={clsx('flex', gap)}>\n {/* Indicator + vertical connector. */}\n <div className=\"flex flex-col items-center\">\n {variant === 'avatar' ? (\n <AvatarIndicator name={item.avatarName} src={item.avatarSrc} />\n ) : variant === 'stepper' ? (\n <StepperIndicator icon={item.icon} tone={item.tone} />\n ) : (\n <DotIndicator icon={item.icon} />\n )}\n {!isLast && <span className=\"my-1 w-px flex-1 bg-gray-200 dark:bg-gray-700\" />}\n </div>\n {/* Content. */}\n <Body item={item} />\n </li>\n );\n })}\n </ol>\n );\n};\n","import { clsx } from 'clsx';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { useMemo, useState } from 'react';\n\nexport type MiniCalendarProps = {\n today?: Date;\n selected: Date;\n onSelect: (date: Date) => void;\n /** Set of ISO date strings (YYYY-MM-DD) marking days with events. */\n eventDays?: Set<string>;\n className?: string;\n};\n\nconst WEEK_DAYS = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'];\nconst MONTHS = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n];\n\nconst isoDate = (d: Date) =>\n `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;\n\nconst sameDay = (a: Date, b: Date) =>\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate();\n\n/**\n * MiniCalendar — compact ISO-week month picker with optional event dots.\n * Click the month title to jump back to today's month.\n */\nexport const MiniCalendar = ({\n today = new Date(),\n selected,\n onSelect,\n eventDays,\n className,\n}: MiniCalendarProps) => {\n const [view, setView] = useState(() => new Date(selected.getFullYear(), selected.getMonth(), 1));\n\n const cells = useMemo(() => {\n const firstOfMonth = new Date(view.getFullYear(), view.getMonth(), 1);\n const daysInMonth = new Date(view.getFullYear(), view.getMonth() + 1, 0).getDate();\n // Monday-first offset (JS: 0=Sun..6=Sat → ISO: 0=Mon..6=Sun)\n const isoOffset = (firstOfMonth.getDay() + 6) % 7;\n const arr: (Date | null)[] = Array(isoOffset).fill(null);\n for (let d = 1; d <= daysInMonth; d++)\n arr.push(new Date(view.getFullYear(), view.getMonth(), d));\n while (arr.length % 7 !== 0) arr.push(null);\n return arr;\n }, [view]);\n\n const goPrev = () => setView((v) => new Date(v.getFullYear(), v.getMonth() - 1, 1));\n const goNext = () => setView((v) => new Date(v.getFullYear(), v.getMonth() + 1, 1));\n const goToday = () => setView(new Date(today.getFullYear(), today.getMonth(), 1));\n\n return (\n <div\n className={clsx(\n 'rounded-2xl border border-gray-200 bg-white p-3 dark:border-gray-800 dark:bg-gray-900',\n className\n )}\n >\n <div className=\"mb-2 flex items-center justify-between\">\n <button\n type=\"button\"\n onClick={goPrev}\n aria-label=\"Previous month\"\n className=\"flex h-7 w-7 items-center justify-center rounded-lg text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-700 dark:hover:bg-white/5\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={goToday}\n className=\"hover:text-brand-600 dark:hover:text-brand-400 text-sm font-semibold text-gray-900 dark:text-gray-100\"\n >\n {MONTHS[view.getMonth()]} {view.getFullYear()}\n </button>\n <button\n type=\"button\"\n onClick={goNext}\n aria-label=\"Next month\"\n className=\"flex h-7 w-7 items-center justify-center rounded-lg text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-700 dark:hover:bg-white/5\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n\n <div className=\"grid grid-cols-7 gap-0.5 text-center\">\n {WEEK_DAYS.map((d) => (\n <span\n key={d}\n className=\"py-1 text-[10px] font-semibold tracking-wider text-gray-400 uppercase\"\n >\n {d}\n </span>\n ))}\n {cells.map((d, i) => {\n if (!d) return <span key={`e-${i}`} />;\n const isToday = sameDay(d, today);\n const isSelected = sameDay(d, selected);\n const hasEvent = eventDays?.has(isoDate(d));\n return (\n <button\n type=\"button\"\n key={d.toISOString()}\n onClick={() => onSelect(d)}\n className={clsx(\n 'relative flex h-8 items-center justify-center rounded-md text-xs font-medium transition-colors',\n isSelected\n ? 'bg-brand-500 hover:bg-brand-600 text-white'\n : isToday\n ? 'bg-brand-50 text-brand-600 hover:bg-brand-100 dark:bg-brand-500/15 dark:text-brand-400'\n : 'text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-white/5'\n )}\n >\n {d.getDate()}\n {hasEvent && (\n <span\n className={clsx(\n 'absolute bottom-1 h-1 w-1 rounded-full',\n isSelected ? 'bg-white' : 'bg-brand-500'\n )}\n />\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\n};\n","import { clsx } from 'clsx';\nimport { useState } from 'react';\n\nexport type ColumnFilterDropdownProps = {\n values: string[];\n selected: Set<string>;\n searchable?: boolean;\n onToggle: (value: string) => void;\n onClear: () => void;\n className?: string;\n};\n\n/**\n * ColumnFilterDropdown — popover with multi-select checkboxes for filtering\n * a column. Optional search input filters the visible options.\n */\nexport const ColumnFilterDropdown = ({\n values,\n selected,\n searchable = true,\n onToggle,\n onClear,\n className,\n}: ColumnFilterDropdownProps) => {\n const [query, setQuery] = useState('');\n const visible = query\n ? values.filter((v) => v.toLowerCase().includes(query.toLowerCase()))\n : values;\n\n return (\n <div\n className={clsx(\n 'absolute top-full left-0 z-50 mt-1 min-w-[200px] rounded-xl border border-gray-200 bg-white shadow-xl dark:border-gray-700 dark:bg-gray-900',\n className\n )}\n >\n {searchable && (\n <div className=\"border-b border-gray-100 p-2 dark:border-gray-800\">\n <input\n autoFocus\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search…\"\n className=\"focus:border-brand-400 h-7 w-full rounded-lg border border-gray-200 px-2.5 text-xs placeholder-gray-400 focus:outline-none dark:border-gray-700 dark:bg-gray-800 dark:text-white dark:placeholder-gray-500\"\n />\n </div>\n )}\n <div className=\"max-h-52 overflow-y-auto py-1\">\n {visible.length === 0 ? (\n <p className=\"px-3 py-2 text-xs text-gray-400\">No results</p>\n ) : (\n visible.map((val) => (\n <label\n key={val}\n className=\"flex cursor-pointer items-center gap-2.5 px-3 py-1.5 text-xs hover:bg-gray-50 dark:hover:bg-white/5\"\n >\n <input\n type=\"checkbox\"\n checked={selected.has(val)}\n onChange={() => onToggle(val)}\n className=\"accent-brand-500 h-3.5 w-3.5 cursor-pointer rounded\"\n />\n <span className=\"truncate text-gray-700 dark:text-gray-300\">{val}</span>\n </label>\n ))\n )}\n </div>\n {selected.size > 0 && (\n <div className=\"border-t border-gray-100 p-2 dark:border-gray-800\">\n <button\n type=\"button\"\n onClick={onClear}\n className=\"w-full rounded-lg px-2 py-1.5 text-xs font-medium text-gray-500 transition-colors hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-white/5\"\n >\n Clear ({selected.size} selected)\n </button>\n </div>\n )}\n </div>\n );\n};\n","import { clsx } from 'clsx';\nimport { ChevronDown, ChevronUp, Filter } from 'lucide-react';\nimport { useEffect, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { ColumnFilterDropdown } from './ColumnFilterDropdown';\nimport type { SortDirection } from './types';\n\nexport type ColumnHeaderProps = {\n label: ReactNode;\n align?: 'left' | 'right' | 'center';\n sortable?: boolean;\n filterable?: boolean;\n /** Current sort direction for this column, or null if not active. */\n sortDir?: SortDirection | null;\n onSortToggle?: () => void;\n /** Filter popover state — values, selected set, callbacks. */\n filterValues?: string[];\n filterSelected?: Set<string>;\n onFilterToggle?: (v: string) => void;\n onFilterClear?: () => void;\n className?: string;\n};\n\nconst ALIGN_CLASS = {\n left: 'text-left',\n right: 'text-right',\n center: 'text-center',\n} as const;\n\nexport const ColumnHeader = ({\n label,\n align = 'left',\n sortable,\n filterable,\n sortDir = null,\n onSortToggle,\n filterValues = [],\n filterSelected,\n onFilterToggle,\n onFilterClear,\n className,\n}: ColumnHeaderProps) => {\n const [open, setOpen] = useState(false);\n const filterCount = filterSelected?.size ?? 0;\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open]);\n\n return (\n <th\n className={clsx(\n 'bg-gray-50 px-4 py-3 text-xs font-semibold tracking-wider text-gray-500 uppercase dark:bg-gray-800 dark:text-gray-400',\n ALIGN_CLASS[align],\n className\n )}\n >\n <div ref={ref} className=\"relative inline-flex items-center gap-1.5\">\n {sortable ? (\n <button\n type=\"button\"\n onClick={onSortToggle}\n className=\"flex items-center gap-1 transition-colors hover:text-gray-700 dark:hover:text-gray-200\"\n >\n {label}\n {sortDir === 'asc' && <ChevronUp className=\"h-3 w-3\" />}\n {sortDir === 'desc' && <ChevronDown className=\"h-3 w-3\" />}\n </button>\n ) : (\n <span>{label}</span>\n )}\n\n {filterable && filterValues.length > 0 && (\n <>\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n aria-label=\"Filter column\"\n className={clsx(\n 'flex items-center gap-1 rounded p-0.5 transition-colors hover:bg-gray-200 dark:hover:bg-white/10',\n filterCount > 0 && 'text-brand-500'\n )}\n >\n <Filter className=\"h-3 w-3\" />\n {filterCount > 0 && <span className=\"text-[10px]\">{filterCount}</span>}\n </button>\n {open && filterSelected && onFilterToggle && onFilterClear && (\n <ColumnFilterDropdown\n values={filterValues}\n selected={filterSelected}\n onToggle={onFilterToggle}\n onClear={onFilterClear}\n />\n )}\n </>\n )}\n </div>\n </th>\n );\n};\n","import { clsx } from 'clsx';\nimport { X } from 'lucide-react';\n\nexport type ActiveFilter = {\n key: string;\n label: string;\n /** Comma-joined preview of selected values. */\n value: string;\n};\n\nexport type ActiveFiltersBarProps = {\n filters: ActiveFilter[];\n onClearOne: (key: string) => void;\n onClearAll: () => void;\n className?: string;\n};\n\n/**\n * ActiveFiltersBar — chips row showing current column filters with per-chip\n * dismiss + a \"Clear all\" action. Renders nothing when there are no filters.\n */\nexport const ActiveFiltersBar = ({\n filters,\n onClearOne,\n onClearAll,\n className,\n}: ActiveFiltersBarProps) => {\n if (filters.length === 0) return null;\n return (\n <div\n className={clsx(\n 'bg-brand-50/50 dark:bg-brand-500/5 flex shrink-0 flex-wrap items-center gap-1.5 border-b border-gray-100 px-4 py-2 dark:border-gray-800',\n className\n )}\n >\n <span className=\"text-xs text-gray-400\">Active filters:</span>\n {filters.map((f) => (\n <span\n key={f.key}\n className=\"border-brand-200 text-brand-600 dark:border-brand-700/50 dark:text-brand-400 flex items-center gap-1.5 rounded-full border bg-white px-2.5 py-1 text-xs font-medium dark:bg-gray-900\"\n >\n <span className=\"font-semibold capitalize\">{f.label}</span>\n <span className=\"text-brand-400\">·</span>\n <span className=\"max-w-[180px] truncate\">{f.value}</span>\n <button\n type=\"button\"\n onClick={() => onClearOne(f.key)}\n aria-label={`Clear ${f.label} filter`}\n className=\"hover:text-brand-800 dark:hover:text-brand-200 ml-0.5 rounded-full\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </span>\n ))}\n <button\n type=\"button\"\n onClick={onClearAll}\n className=\"ml-1 text-xs font-medium text-gray-400 hover:text-gray-600 dark:hover:text-gray-200\"\n >\n Clear all\n </button>\n </div>\n );\n};\n","import { clsx } from 'clsx';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { useMemo } from 'react';\n\nexport type PaginationProps = {\n page: number;\n totalPages: number;\n total: number;\n pageSize: number;\n onPageChange: (page: number) => void;\n showAll?: boolean;\n onToggleShowAll?: (showAll: boolean) => void;\n className?: string;\n};\n\n/**\n * Computes a compact page list with ellipsis for long sequences.\n * Always shows first/last and a window of 3 around the active page.\n */\nconst buildPageList = (current: number, total: number): (number | '...')[] => {\n if (total <= 7) return Array.from({ length: total }, (_, i) => i);\n const out: (number | '...')[] = [0];\n const start = Math.max(1, current - 1);\n const end = Math.min(total - 2, current + 1);\n if (start > 1) out.push('...');\n for (let i = start; i <= end; i++) out.push(i);\n if (end < total - 2) out.push('...');\n out.push(total - 1);\n return out;\n};\n\nexport const Pagination = ({\n page,\n totalPages,\n total,\n pageSize,\n onPageChange,\n showAll = false,\n onToggleShowAll,\n className,\n}: PaginationProps) => {\n const safePage = Math.min(Math.max(0, page), Math.max(0, totalPages - 1));\n const firstEntry = total === 0 ? 0 : safePage * pageSize + 1;\n const lastEntry = Math.min(total, (safePage + 1) * pageSize);\n const pageNums = useMemo(() => buildPageList(safePage, totalPages), [safePage, totalPages]);\n\n return (\n <div\n className={clsx(\n 'flex shrink-0 flex-wrap items-center justify-between gap-3 border-t border-gray-100 px-4 py-3 dark:border-gray-800',\n className\n )}\n >\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {showAll ? (\n <>\n Showing all <b className=\"text-gray-700 dark:text-gray-200\">{total}</b> results\n </>\n ) : (\n <>\n Showing{' '}\n <b className=\"text-gray-700 dark:text-gray-200\">\n {firstEntry}–{lastEntry}\n </b>{' '}\n of <b className=\"text-gray-700 dark:text-gray-200\">{total}</b> results\n </>\n )}\n </p>\n\n <div className=\"flex items-center gap-3\">\n {onToggleShowAll && (\n <button\n type=\"button\"\n onClick={() => onToggleShowAll(!showAll)}\n className=\"text-xs font-medium text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200\"\n >\n {showAll ? 'Show paginated' : 'Show all'}\n </button>\n )}\n\n {!showAll && totalPages > 1 && (\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => onPageChange(Math.max(0, safePage - 1))}\n disabled={safePage === 0}\n className=\"flex items-center gap-1.5 rounded-lg border border-gray-200 px-3 py-2 text-sm font-medium text-gray-600 transition-colors hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-40 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-white/5\"\n >\n <ChevronLeft className=\"h-4 w-4\" /> Previous\n </button>\n <div className=\"flex items-center gap-1\">\n {pageNums.map((p, i) =>\n p === '...' ? (\n <span\n key={`e-${i}`}\n className=\"flex h-9 w-9 items-center justify-center text-sm text-gray-400\"\n >\n …\n </span>\n ) : (\n <button\n type=\"button\"\n key={p}\n onClick={() => onPageChange(p)}\n className={clsx(\n 'flex h-9 w-9 items-center justify-center rounded-lg text-sm font-medium transition-colors',\n p === safePage\n ? 'bg-brand-500 text-white'\n : 'border border-gray-200 text-gray-600 hover:bg-gray-50 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-white/5'\n )}\n >\n {p + 1}\n </button>\n )\n )}\n </div>\n <button\n type=\"button\"\n onClick={() => onPageChange(Math.min(totalPages - 1, safePage + 1))}\n disabled={safePage === totalPages - 1}\n className=\"flex items-center gap-1.5 rounded-lg border border-gray-200 px-3 py-2 text-sm font-medium text-gray-600 transition-colors hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-40 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-white/5\"\n >\n Next <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n )}\n </div>\n </div>\n );\n};\n","import { clsx } from 'clsx';\nimport { Search, X } from 'lucide-react';\nimport { useCallback, useMemo, useState, type ReactNode } from 'react';\nimport { ColumnHeader } from './ColumnHeader';\nimport { ActiveFiltersBar, type ActiveFilter } from './ActiveFiltersBar';\nimport { Pagination } from './Pagination';\nimport { Checkbox } from '../forms/Checkbox';\nimport { LoadingState } from '../feedback/LoadingState';\nimport { EmptyState } from '../feedback/EmptyState';\nimport { ErrorState } from '../feedback/ErrorState';\nimport type { ColumnDef, SortDirection } from './types';\n\nexport type DataTableProps<T> = {\n rows: T[];\n columns: ColumnDef<T>[];\n rowKey: (row: T) => string | number;\n /** Optional right-edge action column (typically a `RowActionButton`). */\n renderRowAction?: (row: T) => React.ReactNode;\n pageSize?: number;\n loading?: boolean;\n error?: string | null;\n onRetry?: () => void;\n emptyTitle?: string;\n emptyDescription?: string;\n\n // ── Selection ──────────────────────────────────────────────────────────────\n /** Show a checkbox column and enable row selection. */\n selectable?: boolean;\n /** Controlled selection set (row keys). */\n selection?: Set<string | number>;\n defaultSelection?: Set<string | number>;\n onSelectionChange?: (selection: Set<string | number>) => void;\n /** Toolbar rendered above the table when `selection.size > 0`. Receives the selected rows. */\n bulkActions?: (selectedRows: T[]) => ReactNode;\n\n // ── Global search ──────────────────────────────────────────────────────────\n /** Controlled search value. When provided, the search input is shown. */\n searchValue?: string;\n defaultSearchValue?: string;\n onSearchChange?: (value: string) => void;\n searchPlaceholder?: string;\n\n className?: string;\n};\n\nconst ALIGN_CELL = {\n left: 'text-left',\n right: 'text-right',\n center: 'text-center',\n} as const;\n\n/**\n * DataTable — opinionated data table with sticky header, per-column sort and\n * filter, active filter chips bar, pagination, integrated loading / error /\n * empty states, optional row selection with bulk actions, and an optional\n * global search bar.\n */\nexport const DataTable = <T,>({\n rows,\n columns,\n rowKey,\n renderRowAction,\n pageSize = 25,\n loading = false,\n error = null,\n onRetry,\n emptyTitle = 'No results',\n emptyDescription,\n selectable = false,\n selection: selectionProp,\n defaultSelection,\n onSelectionChange,\n bulkActions,\n searchValue: searchValueProp,\n defaultSearchValue,\n onSearchChange,\n searchPlaceholder = 'Search…',\n className,\n}: DataTableProps<T>) => {\n const [sortKey, setSortKey] = useState<string | null>(null);\n const [sortDir, setSortDir] = useState<SortDirection>('asc');\n const [filters, setFilters] = useState<Record<string, Set<string>>>({});\n const [page, setPage] = useState(0);\n const [showAll, setShowAll] = useState(false);\n\n // Selection state (controlled / uncontrolled).\n const [internalSelection, setInternalSelection] = useState<Set<string | number>>(\n defaultSelection ?? new Set()\n );\n const isSelectionControlled = selectionProp !== undefined;\n const selection = isSelectionControlled ? selectionProp : internalSelection;\n const updateSelection = useCallback(\n (next: Set<string | number>) => {\n if (!isSelectionControlled) setInternalSelection(next);\n onSelectionChange?.(next);\n },\n [isSelectionControlled, onSelectionChange]\n );\n\n // Search state (controlled / uncontrolled).\n const [internalSearch, setInternalSearch] = useState(defaultSearchValue ?? '');\n const isSearchControlled = searchValueProp !== undefined;\n const searchEnabled =\n isSearchControlled || defaultSearchValue !== undefined || onSearchChange !== undefined;\n const searchValue = isSearchControlled ? searchValueProp! : internalSearch;\n const setSearch = useCallback(\n (value: string) => {\n if (!isSearchControlled) setInternalSearch(value);\n onSearchChange?.(value);\n setPage(0);\n },\n [isSearchControlled, onSearchChange]\n );\n\n const handleSortToggle = (key: string) => {\n if (sortKey !== key) {\n setSortKey(key);\n setSortDir('asc');\n } else if (sortDir === 'asc') {\n setSortDir('desc');\n } else {\n setSortKey(null);\n }\n };\n\n const handleFilterToggle = (key: string, value: string) => {\n setFilters((prev) => {\n const next = new Set(prev[key] ?? []);\n if (next.has(value)) next.delete(value);\n else next.add(value);\n const out = { ...prev };\n if (next.size === 0) delete out[key];\n else out[key] = next;\n return out;\n });\n setPage(0);\n };\n\n const clearFilter = (key: string) => {\n setFilters((prev) => {\n const out = { ...prev };\n delete out[key];\n return out;\n });\n setPage(0);\n };\n\n const clearAllFilters = () => {\n setFilters({});\n setPage(0);\n };\n\n // Build filter values per column (unique values currently present)\n const columnFilterValues = useMemo(() => {\n const out: Record<string, string[]> = {};\n for (const col of columns) {\n if (!col.filterable) continue;\n const vals = new Set<string>();\n for (const row of rows) {\n const v = col.filterValue ? col.filterValue(row) : '';\n if (v) vals.add(v);\n }\n out[col.key] = Array.from(vals).sort();\n }\n return out;\n }, [rows, columns]);\n\n // Pipeline: search → column filters → sort.\n const searchedRows = useMemo(() => {\n if (!searchEnabled || searchValue.trim().length === 0) return rows;\n const needle = searchValue.trim().toLowerCase();\n return rows.filter((row) =>\n columns.some((col) => {\n const haystack = col.searchValue\n ? col.searchValue(row)\n : col.filterValue\n ? col.filterValue(row)\n : '';\n return haystack.toLowerCase().includes(needle);\n })\n );\n }, [rows, columns, searchEnabled, searchValue]);\n\n const filteredRows = useMemo(() => {\n if (Object.keys(filters).length === 0) return searchedRows;\n return searchedRows.filter((row) =>\n columns.every((col) => {\n const sel = filters[col.key];\n if (!sel || sel.size === 0) return true;\n const v = col.filterValue ? col.filterValue(row) : '';\n return sel.has(v);\n })\n );\n }, [searchedRows, columns, filters]);\n\n const sortedRows = useMemo(() => {\n if (!sortKey) return filteredRows;\n const col = columns.find((c) => c.key === sortKey);\n if (!col?.sortValue) return filteredRows;\n const dir = sortDir === 'asc' ? 1 : -1;\n return [...filteredRows].sort((a, b) => {\n const av = col.sortValue!(a);\n const bv = col.sortValue!(b);\n if (av === null || av === undefined) return 1;\n if (bv === null || bv === undefined) return -1;\n if (av < bv) return -1 * dir;\n if (av > bv) return 1 * dir;\n return 0;\n });\n }, [filteredRows, columns, sortKey, sortDir]);\n\n const totalPages = Math.max(1, Math.ceil(sortedRows.length / pageSize));\n const safePage = Math.min(page, totalPages - 1);\n const pageRows = showAll\n ? sortedRows\n : sortedRows.slice(safePage * pageSize, (safePage + 1) * pageSize);\n\n // Selection helpers — operate on the *currently visible* rows so \"select all\"\n // never touches rows hidden by the search/filter pipeline.\n const visibleKeys = useMemo(() => sortedRows.map(rowKey), [sortedRows, rowKey]);\n const visibleSelectedCount = useMemo(\n () => visibleKeys.filter((k) => selection.has(k)).length,\n [visibleKeys, selection]\n );\n const allVisibleSelected = visibleKeys.length > 0 && visibleSelectedCount === visibleKeys.length;\n const someVisibleSelected = visibleSelectedCount > 0 && visibleSelectedCount < visibleKeys.length;\n\n const toggleAllVisible = () => {\n const next = new Set(selection);\n if (allVisibleSelected) {\n visibleKeys.forEach((k) => next.delete(k));\n } else {\n visibleKeys.forEach((k) => next.add(k));\n }\n updateSelection(next);\n };\n\n const toggleRow = (key: string | number) => {\n const next = new Set(selection);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n updateSelection(next);\n };\n\n const clearSelection = () => updateSelection(new Set());\n\n const selectedRows = useMemo(\n () => rows.filter((r) => selection.has(rowKey(r))),\n [rows, rowKey, selection]\n );\n\n const activeFilters: ActiveFilter[] = Object.entries(filters).map(([key, vals]) => ({\n key,\n label: columns.find((c) => c.key === key)?.label?.toString() ?? key,\n value: Array.from(vals).join(', '),\n }));\n\n return (\n <div\n className={clsx(\n 'flex flex-col overflow-hidden rounded-2xl border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900',\n className\n )}\n >\n {/* Top toolbar: bulk actions when any selected, otherwise search bar. */}\n {selectable && selection.size > 0 ? (\n <div className=\"bg-brand-50 dark:bg-brand-500/10 flex items-center gap-3 border-b border-gray-100 px-4 py-2 dark:border-gray-800\">\n <span className=\"text-brand-700 dark:text-brand-300 text-sm font-medium\">\n {selection.size} selected\n </span>\n <button\n type=\"button\"\n onClick={clearSelection}\n className=\"text-xs text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200\"\n >\n Clear\n </button>\n <div className=\"ml-auto flex items-center gap-2\">\n {bulkActions ? bulkActions(selectedRows) : null}\n </div>\n </div>\n ) : searchEnabled ? (\n <div className=\"border-b border-gray-100 px-4 py-2 dark:border-gray-800\">\n <div className=\"relative h-9\">\n <Search\n aria-hidden\n className=\"pointer-events-none absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 text-gray-400\"\n />\n <input\n type=\"search\"\n value={searchValue}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={searchPlaceholder}\n aria-label=\"Search rows\"\n className=\"focus:border-brand-500 h-full w-full rounded-lg border border-gray-200 bg-white pr-9 pl-9 text-sm transition-colors focus:outline-none dark:border-gray-700 dark:bg-gray-800 dark:text-white\"\n />\n {searchValue && (\n <button\n type=\"button\"\n onClick={() => setSearch('')}\n aria-label=\"Clear search\"\n className=\"absolute top-1/2 right-2 -translate-y-1/2 rounded p-1 text-gray-400 hover:bg-gray-100 hover:text-gray-700 dark:hover:bg-gray-700\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </div>\n </div>\n ) : null}\n\n <ActiveFiltersBar\n filters={activeFilters}\n onClearOne={clearFilter}\n onClearAll={clearAllFilters}\n />\n\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n {loading ? (\n <div className=\"flex h-full items-center justify-center py-10\">\n <LoadingState />\n </div>\n ) : error ? (\n <div className=\"flex h-full items-center justify-center py-10\">\n <ErrorState message={error} onRetry={onRetry} />\n </div>\n ) : sortedRows.length === 0 ? (\n <div className=\"flex h-full items-center justify-center py-10\">\n <EmptyState title={emptyTitle} description={emptyDescription} />\n </div>\n ) : (\n <table className=\"w-full table-fixed\">\n <colgroup>\n {selectable && <col style={{ width: '44px' }} />}\n {columns.map((c) => (\n <col key={c.key} style={c.width ? { width: c.width } : undefined} />\n ))}\n {renderRowAction && <col style={{ width: '8%' }} />}\n </colgroup>\n <thead className=\"sticky top-0 z-10\">\n <tr className=\"border-b border-gray-100 dark:border-gray-800\">\n {selectable && (\n <th className=\"bg-gray-50 px-4 py-3 dark:bg-gray-800\">\n <Checkbox\n aria-label=\"Select all rows\"\n checked={allVisibleSelected}\n indeterminate={someVisibleSelected}\n onChange={toggleAllVisible}\n />\n </th>\n )}\n {columns.map((col) => (\n <ColumnHeader\n key={col.key}\n label={col.label}\n align={col.align}\n sortable={col.sortable}\n filterable={col.filterable}\n sortDir={sortKey === col.key ? sortDir : null}\n onSortToggle={() => handleSortToggle(col.key)}\n filterValues={columnFilterValues[col.key]}\n filterSelected={filters[col.key]}\n onFilterToggle={(v) => handleFilterToggle(col.key, v)}\n onFilterClear={() => clearFilter(col.key)}\n />\n ))}\n {renderRowAction && (\n <th className=\"bg-gray-50 px-4 py-3 text-right text-xs font-semibold tracking-wider text-gray-500 uppercase dark:bg-gray-800 dark:text-gray-400\">\n Action\n </th>\n )}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-gray-100 dark:divide-gray-800\">\n {pageRows.map((row) => {\n const key = rowKey(row);\n const isSelected = selection.has(key);\n return (\n <tr\n key={key}\n className={clsx(\n 'hover:bg-gray-50 dark:hover:bg-white/5',\n isSelected && 'bg-brand-50/40 dark:bg-brand-500/5'\n )}\n >\n {selectable && (\n <td className=\"px-4 py-3.5\">\n <Checkbox\n aria-label={`Select row ${key}`}\n checked={isSelected}\n onChange={() => toggleRow(key)}\n />\n </td>\n )}\n {columns.map((col) => (\n <td\n key={col.key}\n className={clsx('px-4 py-3.5 text-sm', ALIGN_CELL[col.align ?? 'left'])}\n >\n {col.render(row)}\n </td>\n ))}\n {renderRowAction && (\n <td className=\"px-4 py-3.5 text-right\">{renderRowAction(row)}</td>\n )}\n </tr>\n );\n })}\n </tbody>\n </table>\n )}\n </div>\n\n {!loading && !error && sortedRows.length > 0 && (\n <Pagination\n page={safePage}\n totalPages={totalPages}\n total={sortedRows.length}\n pageSize={pageSize}\n onPageChange={setPage}\n showAll={showAll}\n onToggleShowAll={setShowAll}\n />\n )}\n </div>\n );\n};\n","import { clsx } from 'clsx';\nimport type { ReactNode } from 'react';\n\nexport type ErrorPageProps = {\n /** Big numeric code displayed prominently — e.g. `404`, `500`, `503`. */\n code: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n /** Optional illustration (image, SVG, or animated component) shown above the code. */\n illustration?: ReactNode;\n /** Action buttons (typically two: primary + secondary). */\n actions?: ReactNode;\n className?: string;\n};\n\n/**\n * ErrorPage — generic full-page error layout reusable for 4xx / 5xx /\n * maintenance screens. Provide your own `illustration`, `actions`, and\n * `code`/`title` per scenario.\n *\n * Example (404):\n * <ErrorPage\n * code={404}\n * title=\"Page not found\"\n * description=\"Sorry, the page you're looking for doesn't exist.\"\n * actions={\n * <>\n * <Button as=\"a\" href=\"/\">Go home</Button>\n * <Button variant=\"secondary\" onClick={() => history.back()}>Back</Button>\n * </>\n * }\n * />\n */\nexport const ErrorPage = ({\n code,\n title,\n description,\n illustration,\n actions,\n className,\n}: ErrorPageProps) => (\n <div\n className={clsx(\n 'flex min-h-[500px] flex-col items-center justify-center px-6 text-center',\n className\n )}\n >\n {illustration}\n <p className=\"text-brand-100 dark:text-brand-500/20 mt-2 text-8xl font-black\">{code}</p>\n <h1 className=\"-mt-4 text-2xl font-bold text-gray-900 dark:text-white\">{title}</h1>\n {description && (\n <p className=\"mt-3 max-w-sm text-sm text-gray-500 dark:text-gray-400\">{description}</p>\n )}\n {actions && (\n <div className=\"mt-8 flex flex-wrap items-center justify-center gap-3\">{actions}</div>\n )}\n </div>\n);\n","import { clsx } from 'clsx';\n\nexport type StickyScrollNavSection = {\n id: string;\n label: string;\n};\n\nexport type StickyScrollNavProps = {\n sections: StickyScrollNavSection[];\n /** Custom scroll behavior — defaults to `scrollIntoView({ behavior: 'smooth', block: 'start' })`. */\n onNavigate?: (id: string) => void;\n /** CSS top offset (px) — pass the height of any fixed header above. */\n topOffset?: number;\n className?: string;\n};\n\n/**\n * StickyScrollNav — sticky horizontal nav row that scrolls to in-page\n * sections by id. Useful for long template gallery pages and docs.\n */\nexport const StickyScrollNav = ({\n sections,\n onNavigate,\n topOffset = 0,\n className,\n}: StickyScrollNavProps) => {\n const handleClick = (id: string) => {\n if (onNavigate) {\n onNavigate(id);\n return;\n }\n const el = typeof document !== 'undefined' ? document.getElementById(id) : null;\n el?.scrollIntoView({ behavior: 'smooth', block: 'start' });\n };\n\n return (\n <nav\n style={{ top: topOffset }}\n className={clsx(\n 'sticky z-20 -mx-1 overflow-x-auto rounded-2xl border border-gray-200 bg-white/90 px-3 py-2 backdrop-blur dark:border-gray-800 dark:bg-gray-900/90',\n className\n )}\n >\n <div className=\"flex gap-1\">\n {sections.map(({ id, label }) => (\n <button\n type=\"button\"\n key={id}\n onClick={() => handleClick(id)}\n className=\"shrink-0 rounded-lg px-3 py-1.5 text-xs font-medium text-gray-500 transition-colors hover:bg-gray-100 hover:text-gray-800 dark:text-gray-400 dark:hover:bg-white/10 dark:hover:text-white\"\n >\n {label}\n </button>\n ))}\n </div>\n </nav>\n );\n};\n","import { clsx } from 'clsx';\nimport { Check } from 'lucide-react';\n\nexport type ColorSwatchProps = {\n /** Color hex (e.g. `#465fff`). */\n hex: string;\n /** Visible label below the swatch. */\n label: string;\n /** Whether this swatch is currently selected. */\n active?: boolean;\n onClick?: () => void;\n className?: string;\n};\n\n/**\n * ColorSwatch — single colour pick button. A filled rectangle with the\n * colour, an optional checkmark when active, and a small caption below.\n */\nexport const ColorSwatch = ({\n hex,\n label,\n active = false,\n onClick,\n className,\n}: ColorSwatchProps) => (\n <button\n type=\"button\"\n onClick={onClick}\n title={label}\n aria-label={label}\n aria-pressed={active}\n className={clsx(\n 'relative flex flex-col items-center gap-1.5 rounded-xl border-2 p-2.5 transition-all',\n active\n ? 'scale-105 border-gray-400 dark:border-gray-200'\n : 'border-transparent hover:scale-[1.02] hover:border-gray-200 dark:hover:border-gray-700',\n className\n )}\n >\n <span\n className=\"flex h-8 w-full items-center justify-center rounded-lg\"\n style={{ backgroundColor: hex }}\n >\n {active && <Check className=\"h-3.5 w-3.5 text-white drop-shadow\" aria-hidden />}\n </span>\n <span\n className={clsx(\n 'text-[10px] leading-none font-medium',\n active ? 'text-gray-700 dark:text-gray-200' : 'text-gray-400 dark:text-gray-500'\n )}\n >\n {label}\n </span>\n </button>\n);\n","import { clsx } from 'clsx';\nimport { ColorSwatch } from './ColorSwatch';\n\nexport type AccentColor = {\n /** Stable identifier (used as React key + value). */\n id: string;\n /** Visible label. */\n label: string;\n /** Color hex. */\n hex: string;\n};\n\nexport type AccentPickerProps = {\n /** Available accent colours. */\n colors: AccentColor[];\n /** Currently selected colour id. */\n value: string;\n onChange: (id: string) => void;\n /** Number of columns on small screens (default 5). */\n cols?: number;\n /** Number of columns from `sm:` breakpoint (default 10). */\n smCols?: number;\n className?: string;\n};\n\n/**\n * AccentPicker — grid of `<ColorSwatch>` buttons. Use to let the user\n * pick the primary brand colour. Inspired by rackscope's appearance settings.\n */\nexport const AccentPicker = ({\n colors,\n value,\n onChange,\n cols = 5,\n smCols = 10,\n className,\n}: AccentPickerProps) => (\n <div\n className={clsx('grid gap-1.5', className)}\n style={{\n gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))`,\n }}\n data-sm-cols={smCols}\n >\n {colors.map((c) => (\n <ColorSwatch\n key={c.id}\n hex={c.hex}\n label={c.label}\n active={c.id === value}\n onClick={() => onChange(c.id)}\n />\n ))}\n </div>\n);\n","import { clsx } from 'clsx';\nimport { Check } from 'lucide-react';\n\nexport type PalettePreview = {\n /** Page background. */\n bg: string;\n /** Card / panel background (sits above `bg`). */\n surface: string;\n /** Borders and faint dividers. */\n border: string;\n};\n\nexport type PaletteMeta = {\n /** Stable identifier. */\n id: string;\n /** Display name (e.g. \"Pure Light\"). */\n label: string;\n /** Short description (e.g. \"white surfaces\"). */\n desc?: string;\n /** Three colours used to render a mini mockup. */\n preview: PalettePreview;\n};\n\nexport type PaletteCardProps = {\n meta: PaletteMeta;\n active?: boolean;\n onClick?: () => void;\n className?: string;\n};\n\n/**\n * PaletteCard — preview card showing a tiny mockup (sidebar strip + card)\n * of a palette plus its label. Use inside `<PalettePicker>` to let the\n * user pick a light/dark theme palette.\n */\nexport const PaletteCard = ({ meta, active = false, onClick, className }: PaletteCardProps) => (\n <button\n type=\"button\"\n onClick={onClick}\n aria-pressed={active}\n aria-label={meta.label}\n className={clsx(\n 'group relative flex flex-col overflow-hidden rounded-xl border-2 transition-all',\n active\n ? 'border-brand-500 shadow-sm'\n : 'border-gray-200 hover:border-gray-300 dark:border-gray-700 dark:hover:border-gray-600',\n className\n )}\n >\n {/* Mini mockup */}\n <div\n className=\"flex h-16 w-full flex-col gap-0.5 p-2\"\n style={{ backgroundColor: meta.preview.bg }}\n >\n <span className=\"h-2 w-8 rounded-sm\" style={{ backgroundColor: meta.preview.border }} />\n <span\n className=\"mt-1 flex-1 rounded-sm\"\n style={{\n backgroundColor: meta.preview.surface,\n border: `1px solid ${meta.preview.border}`,\n }}\n />\n </div>\n\n {/* Label row */}\n <div\n className=\"flex items-center justify-between px-2.5 py-1.5\"\n style={{\n backgroundColor: meta.preview.surface,\n borderTop: `1px solid ${meta.preview.border}`,\n }}\n >\n <span className=\"text-left\">\n <span\n className=\"block text-xs font-semibold\"\n style={{ color: active ? undefined : '#6b7280' }}\n >\n {meta.label}\n </span>\n {meta.desc && (\n <span className=\"block text-[10px]\" style={{ color: '#9ca3af' }}>\n {meta.desc}\n </span>\n )}\n </span>\n {active && (\n <span className=\"bg-brand-500 flex h-4 w-4 shrink-0 items-center justify-center rounded-full\">\n <Check className=\"h-2.5 w-2.5 text-white\" aria-hidden />\n </span>\n )}\n </div>\n </button>\n);\n","import { clsx } from 'clsx';\nimport { PaletteCard, type PaletteMeta } from './PaletteCard';\n\nexport type PalettePickerProps = {\n palettes: PaletteMeta[];\n value: string;\n onChange: (id: string) => void;\n /** Number of columns. Default 4. */\n cols?: number;\n className?: string;\n};\n\n/**\n * PalettePicker — responsive grid of `<PaletteCard>` previews. Use one for\n * the light theme set and another for the dark theme set.\n */\nexport const PalettePicker = ({\n palettes,\n value,\n onChange,\n cols = 4,\n className,\n}: PalettePickerProps) => (\n <div\n className={clsx('grid gap-3', className)}\n style={{ gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))` }}\n >\n {palettes.map((p) => (\n <PaletteCard key={p.id} meta={p} active={p.id === value} onClick={() => onChange(p.id)} />\n ))}\n </div>\n);\n","import { clsx } from 'clsx';\nimport { Check } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nexport type OptionCardProps = {\n /** Stable identifier (used as React key + value). */\n id: string;\n /** Visible label. */\n label: string;\n /** Optional small description below the label. */\n desc?: string;\n /** Visual content rendered above the text — typically an icon, mockup, or preview. */\n preview?: ReactNode;\n active?: boolean;\n onClick?: () => void;\n className?: string;\n};\n\n/**\n * OptionCard — generic selectable card with a preview slot, label, and\n * optional description. Use to build pickers for icon styles, view modes,\n * layout variants, etc.\n */\nexport const OptionCard = ({\n label,\n desc,\n preview,\n active = false,\n onClick,\n className,\n}: OptionCardProps) => (\n <button\n type=\"button\"\n onClick={onClick}\n aria-pressed={active}\n aria-label={label}\n className={clsx(\n 'relative flex flex-col items-center gap-2 rounded-xl border-2 px-2 py-3 transition-all',\n active\n ? 'border-brand-500 bg-brand-50 dark:bg-brand-500/10'\n : 'border-gray-200 hover:border-gray-300 dark:border-gray-700 dark:hover:border-gray-600',\n className\n )}\n >\n {preview && <div className=\"flex h-10 w-10 items-center justify-center\">{preview}</div>}\n <div className=\"text-center\">\n <p\n className={clsx(\n 'text-xs font-semibold',\n active ? 'text-brand-500' : 'text-gray-700 dark:text-gray-300'\n )}\n >\n {label}\n </p>\n {desc && <p className=\"text-[10px] text-gray-400 dark:text-gray-500\">{desc}</p>}\n </div>\n {active && (\n <span className=\"bg-brand-500 absolute top-1.5 right-1.5 flex h-4 w-4 items-center justify-center rounded-full\">\n <Check className=\"h-2.5 w-2.5 text-white\" aria-hidden />\n </span>\n )}\n </button>\n);\n","import { clsx } from 'clsx';\nimport { OptionCard, type OptionCardProps } from './OptionCard';\n\nexport type OptionItem = Pick<OptionCardProps, 'id' | 'label' | 'desc' | 'preview'>;\n\nexport type OptionPickerProps = {\n options: OptionItem[];\n value: string;\n onChange: (id: string) => void;\n /** Number of grid columns. Default 5. */\n cols?: number;\n className?: string;\n};\n\n/**\n * OptionPicker — responsive grid of `<OptionCard>` previews. Use for\n * generic single-select pickers (icon styles, view modes, density, etc.).\n */\nexport const OptionPicker = ({\n options,\n value,\n onChange,\n cols = 5,\n className,\n}: OptionPickerProps) => (\n <div\n className={clsx('grid gap-2', className)}\n style={{ gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))` }}\n >\n {options.map((o) => (\n <OptionCard\n key={o.id}\n id={o.id}\n label={o.label}\n desc={o.desc}\n preview={o.preview}\n active={o.id === value}\n onClick={() => onChange(o.id)}\n />\n ))}\n </div>\n);\n","import { clsx } from 'clsx';\nimport { Quote } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nexport type BlockquoteVariant = 'plain' | 'solid' | 'icon' | 'testimonial';\nexport type BlockquoteSize = 'sm' | 'md' | 'lg';\nexport type BlockquoteAlign = 'left' | 'center' | 'right';\n\nexport type BlockquoteProps = {\n children: ReactNode;\n /**\n * Visual treatment:\n * - `plain` (default): bare italic quote\n * - `solid`: muted background + brand-coloured left border\n * - `icon`: large quote glyph above the text\n * - `testimonial`: solid background + author block in the footer\n */\n variant?: BlockquoteVariant;\n size?: BlockquoteSize;\n align?: BlockquoteAlign;\n /** Author / source — required when `variant=\"testimonial\"`. */\n author?: ReactNode;\n /** Author's role / company. Rendered below `author`. */\n role?: ReactNode;\n /** Optional avatar URL. Replaced by initials of `author` if it fails. */\n authorAvatar?: string;\n className?: string;\n};\n\nconst SIZE: Record<BlockquoteSize, string> = {\n sm: 'text-base leading-relaxed',\n md: 'text-lg leading-relaxed',\n lg: 'text-2xl leading-snug',\n};\n\nconst ALIGN: Record<BlockquoteAlign, string> = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n};\n\nexport const Blockquote = ({\n children,\n variant = 'plain',\n size = 'md',\n align = 'left',\n author,\n role,\n authorAvatar,\n className,\n}: BlockquoteProps) => {\n const text = (\n <p className={clsx('font-medium text-gray-700 italic dark:text-gray-200', SIZE[size])}>\n {children}\n </p>\n );\n\n if (variant === 'icon') {\n return (\n <blockquote className={clsx(ALIGN[align], className)}>\n <Quote\n className={clsx(\n 'text-gray-300 dark:text-gray-600',\n align === 'center' ? 'mx-auto mb-3' : 'mb-3',\n align === 'right' ? 'ms-auto' : ''\n )}\n aria-hidden\n size={32}\n />\n {text}\n </blockquote>\n );\n }\n\n if (variant === 'testimonial') {\n return (\n <figure\n className={clsx(\n 'rounded-xl border border-gray-200 bg-gray-50 p-6 dark:border-gray-800 dark:bg-gray-900/50',\n ALIGN[align],\n className\n )}\n >\n <blockquote>{text}</blockquote>\n {(author || role || authorAvatar) && (\n <figcaption\n className={clsx(\n 'mt-5 flex items-center gap-3',\n align === 'center' && 'justify-center',\n align === 'right' && 'justify-end'\n )}\n >\n {authorAvatar && (\n <img\n src={authorAvatar}\n alt=\"\"\n className=\"h-10 w-10 shrink-0 rounded-full object-cover\"\n />\n )}\n <div className={clsx(align === 'center' && 'text-center')}>\n {author && (\n <div className=\"text-sm font-semibold text-gray-900 dark:text-white\">{author}</div>\n )}\n {role && <div className=\"text-xs text-gray-500 dark:text-gray-400\">{role}</div>}\n </div>\n </figcaption>\n )}\n </figure>\n );\n }\n\n if (variant === 'solid') {\n return (\n <blockquote\n className={clsx(\n 'border-brand-500 rounded-r-lg border-l-4 bg-gray-50 p-4 dark:bg-gray-900/50',\n ALIGN[align],\n className\n )}\n >\n {text}\n </blockquote>\n );\n }\n\n // plain\n return (\n <blockquote\n className={clsx(\n 'border-l-4 border-gray-200 pl-4 dark:border-gray-700',\n ALIGN[align],\n className\n )}\n >\n {text}\n </blockquote>\n );\n};\n","import { clsx } from 'clsx';\nimport type { ReactNode } from 'react';\n\nexport type KbdSize = 'sm' | 'md';\n\nexport type KbdProps = {\n children: ReactNode;\n size?: KbdSize;\n className?: string;\n};\n\nconst SIZE: Record<KbdSize, string> = {\n sm: 'h-5 min-w-[20px] px-1.5 text-[10px]',\n md: 'h-6 min-w-[24px] px-2 text-xs',\n};\n\n/**\n * `Kbd` — represents a keyboard key. Use single instances for one-key shortcuts\n * (`⌘`, `K`) or compose multiple `<Kbd>` together with a `+` between them for\n * combos.\n *\n * <Kbd>⌘</Kbd> <Kbd>K</Kbd>\n *\n * The component intentionally stays passive — no state, no overlay — so it can\n * sit inside tooltips, help screens, paragraphs and badges without coupling.\n */\nexport const Kbd = ({ children, size = 'md', className }: KbdProps) => (\n <kbd\n className={clsx(\n 'inline-flex shrink-0 items-center justify-center rounded border border-gray-200 bg-gray-50 font-mono font-medium text-gray-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.04)] dark:border-gray-700 dark:bg-gray-800 dark:text-gray-200 dark:shadow-[inset_0_-1px_0_0_rgba(255,255,255,0.04)]',\n SIZE[size],\n className\n )}\n >\n {children}\n </kbd>\n);\n","import { clsx } from 'clsx';\nimport type { ImgHTMLAttributes, ReactNode } from 'react';\n\nexport type FigureAlign = 'left' | 'center' | 'right';\nexport type FigureSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full';\nexport type FigureRadius = 'none' | 'sm' | 'md' | 'lg' | 'xl' | 'full';\n\nexport type FigureProps = Omit<ImgHTMLAttributes<HTMLImageElement>, 'children'> & {\n src: string;\n alt: string;\n caption?: ReactNode;\n align?: FigureAlign;\n /** Constrain image width. `full` (default) → fills parent. */\n size?: FigureSize;\n /** Image corner radius. */\n radius?: FigureRadius;\n /** Drop shadow under the image. */\n shadow?: boolean;\n /** Wrapper className (the `<figure>`). */\n wrapperClassName?: string;\n};\n\nconst SIZE: Record<FigureSize, string> = {\n xs: 'max-w-xs',\n sm: 'max-w-sm',\n md: 'max-w-md',\n lg: 'max-w-lg',\n xl: 'max-w-xl',\n full: 'max-w-full',\n};\n\nconst ALIGN: Record<FigureAlign, string> = {\n left: '',\n center: 'mx-auto',\n right: 'ms-auto',\n};\n\nconst RADIUS: Record<FigureRadius, string> = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n full: 'rounded-full',\n};\n\n/**\n * `Figure` — image + optional caption pair. Wraps the native `<figure>` /\n * `<figcaption>` pattern so consumers get semantic HTML for free plus the\n * common visual knobs (alignment, size, rounding, shadow) without re-doing\n * the Tailwind tetris each time.\n */\nexport const Figure = ({\n src,\n alt,\n caption,\n align = 'left',\n size = 'full',\n radius = 'lg',\n shadow = false,\n className,\n wrapperClassName,\n ...rest\n}: FigureProps) => (\n <figure className={clsx(SIZE[size], ALIGN[align], wrapperClassName)}>\n <img\n src={src}\n alt={alt}\n className={clsx(\n 'h-auto w-full',\n RADIUS[radius],\n shadow && 'shadow-lg dark:shadow-gray-800/40',\n className\n )}\n {...rest}\n />\n {caption && (\n <figcaption className=\"mt-2 text-center text-xs text-gray-500 italic dark:text-gray-400\">\n {caption}\n </figcaption>\n )}\n </figure>\n);\n"]}