@orbitlabsui/ui 0.1.0

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/theme/theme.ts","../src/theme/ThemeProvider.tsx","../src/theme/ThemeToggle.tsx","../src/components/Button.tsx","../src/components/Overlay.tsx","../src/components/Avatar.tsx","../src/components/Input.tsx","../src/components/Textarea.tsx","../src/components/Code.tsx","../src/components/Tooltip.tsx","../src/components/Tabs.tsx","../src/components/Toast.tsx","../src/components/StatusBadge.tsx","../src/components/EmptyState.tsx","../src/components/FormSection.tsx","../src/components/DirtyStateIndicator.tsx","../src/components/RowActions.tsx","../src/components/Markdown.tsx","../src/components/Modal.tsx","../src/components/Drawer.tsx","../src/components/ConfirmDialog.tsx","../src/components/SaveBar.tsx","../src/hooks/usePopover.ts","../src/components/Dropdown.tsx","../src/components/Select.tsx","../src/components/Combobox.tsx"],"names":["jsx","jsxs","size","useState","forwardRef","useFloating","autoUpdate","useDismiss","useRole","useInteractions","FloatingPortal","XIcon","CheckCircle2Icon","SIZES","Fragment","AlertTriangleIcon","offset","flip","shift","useEffect","AnimatePresence","motion","CheckIcon","useRef","ChevronDownIcon"],"mappings":"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","file":"index.js","sourcesContent":["export type ThemeChoice = 'light' | 'dark' | 'system';\nexport type ResolvedTheme = 'light' | 'dark';\n\nexport const THEME_STORAGE_KEY = 'orbit-theme';\nconst CHOICES: ThemeChoice[] = ['light', 'dark', 'system'];\n\nexport function resolveTheme(choice: ThemeChoice, prefersDark: boolean): ResolvedTheme {\n if (choice === 'system') return prefersDark ? 'dark' : 'light';\n return choice;\n}\n\nexport function getStoredTheme(): ThemeChoice {\n try {\n const stored = localStorage.getItem(THEME_STORAGE_KEY);\n if (stored && (CHOICES as string[]).includes(stored)) return stored as ThemeChoice;\n } catch {\n // localStorage unavailable (SSR/private mode) — fall through to default.\n }\n return 'system';\n}\n\nexport function storeTheme(choice: ThemeChoice): void {\n try {\n localStorage.setItem(THEME_STORAGE_KEY, choice);\n } catch {\n // Ignore persistence failures.\n }\n}\n\nexport function systemPrefersDark(): boolean {\n return typeof window !== 'undefined' &&\n window.matchMedia('(prefers-color-scheme: dark)').matches;\n}\n\nexport function applyThemeClass(resolved: ResolvedTheme): void {\n const root = document.documentElement;\n root.classList.toggle('dark', resolved === 'dark');\n // Tell the UA which scheme is active (correct default canvas, form controls,\n // scrollbars) and paint the page background from the themed token, so a\n // refresh or toggle never flashes white before the app shell mounts. Reading\n // --color-bg keeps a single source of truth with the CSS.\n root.style.colorScheme = resolved;\n const bg = getComputedStyle(root).getPropertyValue('--color-bg').trim();\n if (bg) root.style.backgroundColor = bg;\n}\n","import React, {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useState,\n useCallback,\n} from 'react';\nimport {\n type ThemeChoice,\n type ResolvedTheme,\n getStoredTheme,\n storeTheme,\n resolveTheme,\n systemPrefersDark,\n applyThemeClass,\n} from './theme';\n\ninterface ThemeContextValue {\n theme: ThemeChoice;\n resolvedTheme: ResolvedTheme;\n setTheme: (choice: ThemeChoice) => void;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nexport function ThemeProvider({ children }: { children: React.ReactNode }) {\n const [theme, setThemeState] = useState<ThemeChoice>(() => getStoredTheme());\n const [prefersDark, setPrefersDark] = useState<boolean>(() => systemPrefersDark());\n\n // Track OS preference changes (only matters while theme === 'system').\n useEffect(() => {\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\n const onChange = (e: MediaQueryListEvent) => setPrefersDark(e.matches);\n mq.addEventListener('change', onChange);\n return () => mq.removeEventListener('change', onChange);\n }, []);\n\n const resolvedTheme = resolveTheme(theme, prefersDark);\n\n // Apply the resolved theme to <html> whenever it changes.\n useEffect(() => {\n applyThemeClass(resolvedTheme);\n }, [resolvedTheme]);\n\n const setTheme = useCallback((choice: ThemeChoice) => {\n storeTheme(choice);\n setThemeState(choice);\n }, []);\n\n const value = useMemo(\n () => ({ theme, resolvedTheme, setTheme }),\n [theme, resolvedTheme, setTheme],\n );\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n\nexport function useTheme(): ThemeContextValue {\n const ctx = useContext(ThemeContext);\n if (!ctx) throw new Error('useTheme must be used within a ThemeProvider');\n return ctx;\n}\n","import React from 'react';\nimport { SunIcon, MoonIcon, MonitorIcon, type LucideIcon } from 'lucide-react';\nimport { useTheme } from './ThemeProvider';\nimport type { ThemeChoice } from './theme';\n\nconst OPTIONS: { value: ThemeChoice; label: string; Icon: LucideIcon }[] = [\n { value: 'light', label: 'Light', Icon: SunIcon },\n { value: 'dark', label: 'Dark', Icon: MoonIcon },\n { value: 'system', label: 'System', Icon: MonitorIcon },\n];\n\nexport function ThemeToggle() {\n const { theme, setTheme } = useTheme();\n return (\n <div\n role=\"radiogroup\"\n aria-label=\"Theme\"\n className=\"flex items-center gap-0.5 rounded-md border border-border-strong bg-surface-raised p-0.5\"\n >\n {OPTIONS.map(({ value, label, Icon }) => {\n const active = theme === value;\n return (\n <button\n key={value}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n aria-label={label}\n title={label}\n onClick={() => setTheme(value)}\n className={`flex h-6 w-6 items-center justify-center rounded transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent ${\n active\n ? 'bg-surface text-fg shadow-sm'\n : 'text-muted hover:text-fg'\n }`}\n >\n <Icon className=\"h-3.5 w-3.5\" strokeWidth={1.75} aria-hidden=\"true\" />\n </button>\n );\n })}\n </div>\n );\n}\n","import React from 'react';\nimport { PlusIcon, CopyIcon, ExternalLinkIcon, GithubIcon } from 'lucide-react';\ntype Variant = 'primary' | 'secondary' | 'destructive';\ntype IconPos = 'none' | 'leading' | 'trailing';\ninterface ButtonProps {\n children: React.ReactNode;\n variant?: Variant;\n icon?: 'plus' | 'copy' | 'external-link' | 'github';\n iconPosition?: IconPos;\n onClick?: () => void;\n disabled?: boolean;\n /** Stretch to the container width (e.g. a full-width form/footer action). */\n fullWidth?: boolean;\n}\nconst ICONS = {\n plus: PlusIcon,\n copy: CopyIcon,\n 'external-link': ExternalLinkIcon,\n github: GithubIcon\n};\nexport function Button({\n children,\n variant = 'primary',\n icon,\n iconPosition = 'none',\n onClick,\n disabled = false,\n fullWidth = false\n}: ButtonProps) {\n const Icon = icon ? ICONS[icon] : null;\n const showLeading = Icon && iconPosition === 'leading';\n const showTrailing = Icon && iconPosition === 'trailing';\n const base =\n `${fullWidth ? 'flex w-full' : 'inline-flex'} h-[38px] items-center justify-center gap-2.5 rounded px-3.5 font-condensed text-sm font-medium leading-[17.5px] transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1 disabled:cursor-not-allowed disabled:opacity-60`;\n const variants: Record<Variant, string> = {\n primary:\n 'bg-accent text-on-accent hover:bg-accent-hover focus-visible:ring-accent shadow-[inset_0_1px_0_0_rgba(255,255,255,0.25),inset_0_0_0_1px_rgba(255,255,255,0.12)]',\n secondary:\n 'bg-surface text-fg border border-border-strong hover:bg-surface-raised focus-visible:ring-accent',\n // destructive stays hardcoded — themed in a later pass (see plan Global Constraints).\n destructive:\n 'bg-[#DC2626] text-white hover:bg-[#B91C1C] focus-visible:ring-[#DC2626] shadow-[inset_0_1px_0_0_rgba(255,255,255,0.25),inset_0_0_0_1px_rgba(255,255,255,0.12)]'\n };\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n className={`${base} ${variants[variant]}`}>\n\n {showLeading &&\n <Icon className=\"h-4 w-4\" strokeWidth={1.33} aria-hidden=\"true\" />\n }\n <span>{children}</span>\n {showTrailing &&\n <Icon className=\"h-4 w-4\" strokeWidth={1.33} aria-hidden=\"true\" />\n }\n </button>);\n\n}","import React, { useId } from 'react';\nimport {\n FloatingPortal,\n FloatingOverlay,\n FloatingFocusManager,\n useFloating,\n useDismiss,\n useRole,\n useInteractions,\n autoUpdate } from\n'@floating-ui/react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { XIcon } from 'lucide-react';\n\nexport type OverlayPosition = 'center' | 'left' | 'right';\n\ninterface OverlayProps {\n open: boolean;\n onClose: () => void;\n position: OverlayPosition;\n /** Tailwind max-width class applied to the panel, e.g. \"max-w-lg\". */\n widthClassName: string;\n title?: React.ReactNode;\n description?: React.ReactNode;\n footer?: React.ReactNode;\n hideCloseButton?: boolean;\n closeOnBackdrop?: boolean;\n closeOnEsc?: boolean;\n children: React.ReactNode;\n}\n\nconst MotionFloatingOverlay = motion(FloatingOverlay);\n\n// Per-position container alignment and panel chrome.\nconst CONTAINER: Record<OverlayPosition, string> = {\n center: 'items-center justify-center p-4',\n right: 'justify-end',\n left: 'justify-start'\n};\nconst PANEL: Record<OverlayPosition, string> = {\n center:\n 'max-h-[85vh] w-full rounded-lg border-[0.5px] border-border-strong shadow-lg',\n right: 'h-full w-full border-l-[0.5px] border-border-strong shadow-xl',\n left: 'h-full w-full border-r-[0.5px] border-border-strong shadow-xl'\n};\n// Enter/exit transform per position (opacity is handled by the backdrop fade).\nconst PANEL_MOTION = {\n center: { from: { scale: 0.96, y: 8 }, to: { scale: 1, y: 0 } },\n right: { from: { x: '100%' }, to: { x: 0 } },\n left: { from: { x: '-100%' }, to: { x: 0 } }\n} satisfies Record<OverlayPosition, { from: object; to: object }>;\n\n/**\n * Shared modal-overlay primitive used by Modal and Drawer.\n *\n * Handles the portal, scroll-locking backdrop, focus trap + restore, Escape and\n * outside-press dismissal, enter/exit animation, and the common header/body/footer\n * chrome. Position drives both layout (centered vs edge-docked) and animation.\n */\nexport function Overlay({\n open,\n onClose,\n position,\n widthClassName,\n title,\n description,\n footer,\n hideCloseButton = false,\n closeOnBackdrop = true,\n closeOnEsc = true,\n children\n}: OverlayProps) {\n const titleId = useId();\n const { refs, context } = useFloating({\n open,\n onOpenChange: (next) => {\n if (!next) onClose();\n },\n whileElementsMounted: autoUpdate\n });\n const dismiss = useDismiss(context, {\n outsidePress: closeOnBackdrop,\n escapeKey: closeOnEsc\n });\n const role = useRole(context, { role: 'dialog' });\n const { getFloatingProps } = useInteractions([dismiss, role]);\n\n const panelMotion = PANEL_MOTION[position];\n const hasHeader = Boolean(title) || !hideCloseButton;\n\n return (\n <FloatingPortal>\n <AnimatePresence>\n {open &&\n <MotionFloatingOverlay\n lockScroll\n className={`fixed inset-0 z-50 flex bg-black/40 ${CONTAINER[position]}`}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.2, ease: 'easeOut' }}>\n\n <FloatingFocusManager context={context} modal>\n <motion.div\n ref={refs.setFloating}\n {...getFloatingProps()}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n className={`relative flex flex-col overflow-hidden bg-surface font-sans ${PANEL[position]} ${widthClassName}`}\n initial={panelMotion.from}\n animate={panelMotion.to}\n exit={panelMotion.from}\n transition={{ duration: 0.2, ease: 'easeOut' }}>\n\n {hasHeader &&\n <div className=\"flex flex-shrink-0 items-start justify-between gap-4 border-b-[0.5px] border-border-strong px-6 py-4\">\n <div className=\"min-w-0\">\n {title &&\n <h2\n id={titleId}\n className=\"font-sans text-lg font-semibold text-fg\">\n\n {title}\n </h2>\n }\n {description &&\n <p className=\"mt-1 font-sans text-sm text-muted\">\n {description}\n </p>\n }\n </div>\n {!hideCloseButton &&\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close\"\n className=\"-mr-1.5 flex h-8 w-8 flex-shrink-0 items-center justify-center rounded text-muted transition-colors hover:bg-surface-raised hover:text-fg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\">\n\n <XIcon className=\"h-4 w-4\" strokeWidth={2} />\n </button>\n }\n </div>\n }\n\n <div className=\"flex-1 overflow-y-auto px-6 py-5\">{children}</div>\n\n {footer &&\n <div className=\"flex flex-shrink-0 items-center justify-end gap-3 border-t-[0.5px] border-border-strong px-6 py-4\">\n {footer}\n </div>\n }\n </motion.div>\n </FloatingFocusManager>\n </MotionFloatingOverlay>\n }\n </AnimatePresence>\n </FloatingPortal>);\n\n}\n","import React from 'react';\ninterface AvatarProps {\n name: string;\n initials?: string;\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n}\nconst SIZES = {\n sm: 'h-6 w-6 text-[10px]',\n md: 'h-7 w-7 text-[11px]',\n lg: 'h-9 w-9 text-sm'\n} as const;\n// Neutral gray treatment used for all initials avatars.\nconst GRAY = {\n bg: 'var(--color-surface-avatar)',\n color: 'var(--color-text-secondary)'\n};\nfunction getInitials(name: string) {\n const parts = name.trim().split(/\\s+/);\n if (parts.length === 1) return (parts[0] ?? '').slice(0, 2).toUpperCase();\n return ((parts[0]?.[0] ?? '') + (parts[parts.length - 1]?.[0] ?? '')).toUpperCase();\n}\nexport function Avatar({\n name,\n initials,\n size = 'md',\n className = ''\n}: AvatarProps) {\n const label = initials ?? getInitials(name);\n return (\n <div\n className={`flex flex-shrink-0 items-center justify-center rounded-full font-medium ${SIZES[size]} ${className}`}\n style={{\n backgroundColor: GRAY.bg,\n color: GRAY.color\n }}\n aria-hidden=\"true\"\n title={name}>\n\n {label}\n </div>);\n\n}\n","import React, { useState, forwardRef } from 'react';\nimport { EyeIcon, EyeOffIcon, type LucideIcon } from 'lucide-react';\nexport interface InputProps extends\n React.InputHTMLAttributes<HTMLInputElement> {\n label?: string;\n helperText?: string;\n error?: boolean;\n icon?: LucideIcon;\n}\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n label,\n helperText,\n error,\n icon: Icon,\n type = 'text',\n className = '',\n disabled,\n ...props\n },\n ref) =>\n {\n const [showPassword, setShowPassword] = useState(false);\n const isPassword = type === 'password';\n const inputType = isPassword ? showPassword ? 'text' : 'password' : type;\n return (\n <div className={`flex w-full flex-col gap-1.5 ${className}`}>\n {label &&\n <label className=\"font-sans text-sm font-medium text-fg\">\n {label}\n </label>\n }\n <div className=\"relative flex items-center\">\n {Icon &&\n <div className=\"absolute left-3 text-muted\">\n <Icon className=\"h-4 w-4\" strokeWidth={1.5} />\n </div>\n }\n <input\n ref={ref}\n type={inputType}\n disabled={disabled}\n className={`w-full rounded border bg-surface px-3 py-2 font-sans text-sm text-fg placeholder:text-muted transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1 disabled:cursor-not-allowed disabled:bg-surface-raised disabled:text-muted ${Icon ? 'pl-9' : ''} ${isPassword ? 'pr-9' : ''} ${error ? 'border-red-500 focus-visible:border-red-500 focus-visible:ring-red-500' : 'border-border hover:border-border-strong focus-visible:border-accent focus-visible:ring-accent'}`}\n {...props} />\n \n {isPassword &&\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n disabled={disabled}\n className=\"absolute right-3 text-muted hover:text-fg focus:outline-none disabled:cursor-not-allowed disabled:opacity-50\"\n aria-label={showPassword ? 'Hide password' : 'Show password'}>\n \n {showPassword ?\n <EyeOffIcon className=\"h-4 w-4\" strokeWidth={1.5} /> :\n\n <EyeIcon className=\"h-4 w-4\" strokeWidth={1.5} />\n }\n </button>\n }\n </div>\n {helperText &&\n <span\n className={`font-sans text-xs ${error ? 'text-red-500' : 'text-muted'}`}>\n \n {helperText}\n </span>\n }\n </div>);\n\n }\n);\nInput.displayName = 'Input';","import React, { forwardRef } from 'react';\nexport interface TextareaProps extends\n React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n label?: string;\n helperText?: string;\n error?: boolean;\n}\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ label, helperText, error, className = '', disabled, ...props }, ref) => {\n return (\n <div className={`flex w-full flex-col gap-1.5 ${className}`}>\n {label &&\n <label className=\"font-sans text-sm font-medium text-fg\">\n {label}\n </label>\n }\n <textarea\n ref={ref}\n disabled={disabled}\n className={`min-h-[80px] w-full rounded border bg-surface px-3 py-2 font-sans text-sm text-fg placeholder:text-muted transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1 disabled:cursor-not-allowed disabled:bg-surface-raised disabled:text-muted ${error ? 'border-red-500 focus-visible:border-red-500 focus-visible:ring-red-500' : 'border-border hover:border-border-strong focus-visible:border-accent focus-visible:ring-accent'}`}\n {...props} />\n \n {helperText &&\n <span\n className={`font-sans text-xs ${error ? 'text-red-500' : 'text-muted'}`}>\n \n {helperText}\n </span>\n }\n </div>);\n\n }\n);\nTextarea.displayName = 'Textarea';","import React from 'react';\n\n/** Standard rendering for artifact codes (REQ-/BP-/WO-/CO-, project keys).\n * Condensed grey type — the work-order row style, used everywhere. */\nexport function Code({\n children,\n className = '',\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <span className={`font-condensed text-muted ${className}`}>\n {children}\n </span>\n );\n}\n","import React, { useState } from 'react';\nimport {\n useFloating,\n useHover,\n useFocus,\n useDismiss,\n useRole,\n useInteractions,\n offset,\n flip,\n shift,\n autoUpdate,\n FloatingPortal } from\n'@floating-ui/react';\n\ninterface TooltipProps {\n label: React.ReactNode;\n children: React.ReactNode;\n placement?: 'top' | 'bottom' | 'left' | 'right';\n /** Make the trigger wrapper fill its cell and truncate (for table rows). */\n block?: boolean;\n}\n\n/** Hover/focus tooltip built on floating-ui. */\nexport function Tooltip({ label, children, placement = 'top', block }: TooltipProps) {\n const [open, setOpen] = useState(false);\n const { refs, floatingStyles, context } = useFloating({\n open,\n onOpenChange: setOpen,\n placement,\n middleware: [offset(6), flip({ padding: 8 }), shift({ padding: 8 })],\n whileElementsMounted: autoUpdate\n });\n const hover = useHover(context, { delay: { open: 250, close: 0 }, move: false });\n const focus = useFocus(context);\n const dismiss = useDismiss(context);\n const role = useRole(context, { role: 'tooltip' });\n const { getReferenceProps, getFloatingProps } = useInteractions([\n hover,\n focus,\n dismiss,\n role]\n );\n\n return (\n <>\n <span\n ref={refs.setReference}\n {...getReferenceProps()}\n className={block ? 'block min-w-0 truncate' : 'inline-flex'}>\n\n {children}\n </span>\n {open &&\n <FloatingPortal>\n <div\n ref={refs.setFloating}\n style={floatingStyles}\n {...getFloatingProps()}\n className=\"z-[60] max-w-xs rounded-md bg-black px-2.5 py-1.5 font-sans text-xs font-medium leading-snug text-white shadow-lg\">\n\n {label}\n </div>\n </FloatingPortal>\n }\n </>);\n\n}\n","import React from 'react';\nimport type { LucideIcon } from 'lucide-react';\n\nexport interface TabItem {\n id: string;\n label: string;\n icon?: LucideIcon;\n}\n\ninterface TabsProps {\n items: TabItem[];\n value: string;\n onChange: (id: string) => void;\n className?: string;\n}\n\n/** Controlled, underline-style tab navigation. */\nexport function Tabs({ items, value, onChange, className = '' }: TabsProps) {\n return (\n <div\n role=\"tablist\"\n className={`flex items-center gap-1 border-b border-border-strong ${className}`}>\n\n {items.map((item) => {\n const Icon = item.icon;\n const active = item.id === value;\n return (\n <button\n key={item.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={() => onChange(item.id)}\n className={`-mb-px flex items-center gap-2 border-b-2 px-3 py-2.5 font-sans text-sm font-medium transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-1 ${active ? 'border-accent text-accent' : 'border-transparent text-muted hover:text-fg'}`}>\n\n {Icon && <Icon className=\"h-4 w-4\" strokeWidth={1.75} />}\n {item.label}\n </button>);\n\n })}\n </div>);\n\n}\n","import React from 'react';\nimport toast, { Toaster, Toast } from 'react-hot-toast';\nimport {\n CheckCircle2Icon,\n XCircleIcon,\n InfoIcon,\n AlertTriangleIcon,\n XIcon,\n type LucideIcon } from\n'lucide-react';\n\ntype ToastVariant = 'success' | 'error' | 'info' | 'warning';\n\n// Per-variant chrome, mirroring the StatusBadge color system.\nconst VARIANT: Record<\n ToastVariant,\n { Icon: LucideIcon; fill: string; border: string; color: string }> =\n{\n success: {\n Icon: CheckCircle2Icon,\n fill: 'var(--color-success-bg)',\n border: 'var(--color-success-border)',\n color: 'var(--color-success)'\n },\n error: {\n Icon: XCircleIcon,\n fill: 'var(--color-danger-bg)',\n border: 'var(--color-danger-border)',\n color: 'var(--color-danger)'\n },\n info: {\n Icon: InfoIcon,\n fill: 'var(--color-info-bg)',\n border: 'var(--color-info-border)',\n color: 'var(--color-info)'\n },\n warning: {\n Icon: AlertTriangleIcon,\n fill: 'var(--color-warning-bg)',\n border: 'var(--color-warning-border)',\n color: 'var(--color-warning)'\n }\n};\n\ninterface NotifyOptions {\n /** Optional secondary line beneath the title. */\n description?: React.ReactNode;\n /** Override the auto-dismiss duration (ms). */\n duration?: number;\n}\n\nfunction ToastCard({\n t,\n variant,\n title,\n description\n}: {\n t: Toast;\n variant: ToastVariant;\n title: React.ReactNode;\n description?: React.ReactNode;\n}) {\n const { Icon, fill, border, color } = VARIANT[variant];\n return (\n <div\n className={`pointer-events-auto flex w-full max-w-sm items-start gap-3 rounded-lg border border-border-strong bg-surface px-4 py-3 font-sans shadow-lg transition-all duration-200 ${t.visible ? 'translate-y-0 opacity-100' : '-translate-y-1 opacity-0'}`}\n role=\"status\">\n\n <span\n className=\"mt-0.5 flex h-7 w-7 flex-shrink-0 items-center justify-center rounded-full border\"\n style={{ backgroundColor: fill, borderColor: border, color }}\n aria-hidden=\"true\">\n\n <Icon className=\"h-4 w-4\" strokeWidth={1.5} />\n </span>\n <div className=\"min-w-0 flex-1 pt-0.5\">\n <p className=\"font-sans text-sm font-semibold text-fg\">{title}</p>\n {description &&\n <p className=\"mt-0.5 font-sans text-sm leading-snug text-fg-secondary\">\n {description}\n </p>\n }\n </div>\n <button\n type=\"button\"\n onClick={() => toast.dismiss(t.id)}\n aria-label=\"Dismiss\"\n className=\"-mr-1 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded text-muted transition-colors hover:bg-surface-raised hover:text-fg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\">\n\n <XIcon className=\"h-3.5 w-3.5\" strokeWidth={2} />\n </button>\n </div>);\n\n}\n\nfunction show(variant: ToastVariant, title: React.ReactNode, options: NotifyOptions = {}) {\n return toast.custom(\n (t) =>\n <ToastCard\n t={t}\n variant={variant}\n title={title}\n description={options.description} />,\n\n { duration: options.duration }\n );\n}\n\n/** Styled, design-system toast helpers. */\nexport const notify = {\n success: (title: React.ReactNode, options?: NotifyOptions) =>\n show('success', title, options),\n error: (title: React.ReactNode, options?: NotifyOptions) =>\n show('error', title, options),\n info: (title: React.ReactNode, options?: NotifyOptions) =>\n show('info', title, options),\n warning: (title: React.ReactNode, options?: NotifyOptions) =>\n show('warning', title, options),\n dismiss: (id?: string) => toast.dismiss(id)\n};\n\n/** Mount once near the app root so toasts render on every route. */\nexport function AppToaster() {\n return (\n <Toaster\n position=\"bottom-right\"\n gutter={12}\n toastOptions={{ duration: 4000 }} />);\n\n}\n","import React from 'react';\nimport {\n ScanSearchIcon,\n CircleDashedIcon,\n Clock4Icon,\n CheckCircle2Icon,\n BanIcon,\n PlayCircleIcon,\n CircleDotIcon,\n ArchiveIcon } from\n'lucide-react';\nexport type StatusType =\n'in-review' |\n'in-progress' |\n'backlog' |\n'completed' |\n'blocked' |\n'ready';\n/** Project lifecycle — distinct from artifact StatusType, rendered by the same badge. */\nexport type ProjectStatus = 'active' | 'archived';\n/** Plan statuses for Requirements & Blueprints — distinct from execution StatusType. */\nexport type PlanStatusType = 'backlog' | 'scoped' | 'cancelled';\ninterface StatusBadgeProps {\n status: StatusType | ProjectStatus | PlanStatusType;\n}\n// Ordered along the SDLC lifecycle — this key order drives the kanban columns\n// and table grouping (STATUS_ORDER derives from it).\nexport const STATUS_CONFIG = {\n backlog: {\n label: 'Backlog',\n Icon: Clock4Icon,\n fill: 'var(--color-neutral-bg)',\n border: 'var(--color-neutral-border)',\n color: 'var(--color-neutral)'\n },\n ready: {\n label: 'Ready',\n Icon: PlayCircleIcon,\n fill: 'var(--color-info-bg)',\n border: 'var(--color-info-border)',\n color: 'var(--color-info)'\n },\n 'in-progress': {\n label: 'In progress',\n Icon: CircleDashedIcon,\n fill: 'var(--color-warning-bg)',\n border: 'var(--color-warning-border)',\n color: 'var(--color-warning)'\n },\n 'in-review': {\n label: 'In Review',\n Icon: ScanSearchIcon,\n fill: 'var(--color-review-bg)',\n border: 'var(--color-review-border)',\n color: 'var(--color-review)'\n },\n blocked: {\n label: 'Blocked',\n Icon: BanIcon,\n fill: 'var(--color-danger-bg)',\n border: 'var(--color-danger-border)',\n color: 'var(--color-danger)'\n },\n completed: {\n label: 'Completed',\n Icon: CheckCircle2Icon,\n fill: 'var(--color-success-bg)',\n border: 'var(--color-success-border)',\n color: 'var(--color-success)'\n }\n} as const;\n/** Project lifecycle statuses — kept separate from STATUS_CONFIG so artifact\n * grouping/boards (which derive columns from STATUS_CONFIG) are unaffected. */\nexport const PROJECT_STATUS_CONFIG = {\n active: {\n label: 'Active',\n Icon: CircleDotIcon,\n fill: 'var(--color-success-bg)',\n border: 'var(--color-success-border)',\n color: 'var(--color-success)'\n },\n archived: {\n label: 'Archived',\n Icon: ArchiveIcon,\n fill: 'var(--color-neutral-bg)',\n border: 'var(--color-neutral-border)',\n color: 'var(--color-neutral)'\n }\n} as const;\n/** Plan statuses — kept separate from STATUS_CONFIG so artifact execution\n * grouping/boards (which derive columns from STATUS_CONFIG) are unaffected.\n * Used by Requirements & Blueprints. */\nexport const PLAN_STATUS_CONFIG = {\n backlog: {\n label: 'Backlog',\n Icon: Clock4Icon,\n fill: 'var(--color-neutral-bg)',\n border: 'var(--color-neutral-border)',\n color: 'var(--color-neutral)'\n },\n scoped: {\n label: 'Scoped',\n Icon: ScanSearchIcon,\n fill: 'var(--color-info-bg)',\n border: 'var(--color-info-border)',\n color: 'var(--color-info)'\n },\n cancelled: {\n label: 'Cancelled',\n Icon: BanIcon,\n fill: 'var(--color-danger-bg)',\n border: 'var(--color-danger-border)',\n color: 'var(--color-danger)'\n }\n} as const;\n/** Canonical plan-status order for grouping (columns/sections). */\nexport const PLAN_STATUS_ORDER = ['backlog', 'scoped', 'cancelled'] as PlanStatusType[];\nconst ALL_STATUS_CONFIG = { ...STATUS_CONFIG, ...PROJECT_STATUS_CONFIG, ...PLAN_STATUS_CONFIG };\nexport function StatusBadge({ status }: StatusBadgeProps) {\n const { label, Icon, fill, border, color } = ALL_STATUS_CONFIG[status];\n return (\n <span\n className=\"inline-flex items-center gap-1.5 rounded border px-2 py-1 font-condensed text-xs font-medium leading-[15px]\"\n style={{\n backgroundColor: fill,\n borderColor: border,\n color\n }}>\n \n <Icon className=\"h-3.5 w-3.5\" strokeWidth={1.5} aria-hidden=\"true\" />\n {label}\n </span>);\n\n}","import React from 'react';\nimport type { LucideIcon } from 'lucide-react';\n\nexport interface EmptyStateTone {\n /** Medallion background. */\n bg: string;\n /** Medallion border color. */\n border: string;\n /** Icon color. */\n color: string;\n}\n\nconst NEUTRAL_TONE: EmptyStateTone = {\n bg: 'var(--color-surface-strong)',\n border: 'var(--color-border-strong)',\n color: 'var(--color-text-muted)'\n};\n\ninterface EmptyStateProps {\n icon: LucideIcon;\n title: React.ReactNode;\n description?: React.ReactNode;\n /** Optional action(s) rendered below the copy, e.g. a Button. */\n action?: React.ReactNode;\n /** Color treatment for the icon medallion. Defaults to neutral gray. */\n tone?: EmptyStateTone;\n className?: string;\n}\n\n/**\n * Centered empty / placeholder state: an icon medallion, a title, supporting\n * copy, and an optional action. Fills the height of its container so it sits\n * dead-center in a page or panel.\n */\nexport function EmptyState({\n icon: Icon,\n title,\n description,\n action,\n tone = NEUTRAL_TONE,\n className = ''\n}: EmptyStateProps) {\n return (\n <div\n className={`flex h-full min-h-[360px] w-full flex-col items-center justify-center px-6 py-12 text-center ${className}`}>\n\n {/* Medallion with a soft halo ring for depth */}\n <div className=\"relative mb-5 flex items-center justify-center\">\n <span\n className=\"absolute h-20 w-20 rounded-3xl opacity-60\"\n style={{ backgroundColor: tone.bg }}\n aria-hidden=\"true\" />\n\n <span\n className=\"relative flex h-14 w-14 items-center justify-center rounded-2xl border shadow-[0px_1px_2px_rgba(0,0,0,0.06)]\"\n style={{\n backgroundColor: 'var(--color-surface)',\n borderColor: tone.border,\n color: tone.color\n }}\n aria-hidden=\"true\">\n\n <Icon className=\"h-6 w-6\" strokeWidth={1.5} />\n </span>\n </div>\n\n <h2 className=\"font-sans text-lg font-semibold tracking-tight text-fg\">\n {title}\n </h2>\n {description &&\n <p className=\"mt-2 max-w-sm font-sans text-sm leading-relaxed text-muted\">\n {description}\n </p>\n }\n {action && <div className=\"mt-6\">{action}</div>}\n </div>);\n\n}\n","import React from 'react';\n\ninterface FormSectionProps {\n title?: string;\n description?: string;\n children: React.ReactNode;\n className?: string;\n}\n\n/** Titled fieldset grouping a vertical stack of fields. */\nexport function FormSection({\n title,\n description,\n children,\n className = ''\n}: FormSectionProps) {\n return (\n <section className={`flex flex-col gap-4 ${className}`}>\n {(title || description) &&\n <div>\n {title &&\n <h3 className=\"font-sans text-sm font-semibold text-fg\">{title}</h3>}\n {description &&\n <p className=\"mt-0.5 font-sans text-sm text-muted\">{description}</p>}\n </div>\n }\n <div className=\"flex flex-col gap-4\">{children}</div>\n </section>);\n\n}\n\ninterface FieldProps {\n label: string;\n htmlFor?: string;\n help?: React.ReactNode;\n error?: React.ReactNode;\n children: React.ReactNode;\n}\n\n/** A single labeled field row with optional help / error text. */\nexport function Field({ label, htmlFor, help, error, children }: FieldProps) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <label\n htmlFor={htmlFor}\n className=\"font-sans text-sm font-medium text-fg\">\n\n {label}\n </label>\n {children}\n {error ?\n <span className=\"font-sans text-xs text-red-500\">{error}</span> :\n help ?\n <span className=\"font-sans text-xs text-muted\">{help}</span> :\n null}\n </div>);\n\n}\n","import React from 'react';\nimport { CheckIcon, Loader2Icon } from 'lucide-react';\n\nexport type DirtyState = 'clean' | 'dirty' | 'saving' | 'saved';\n\nconst CONFIG: Record<\n DirtyState,\n { label: string; className: string } | null> =\n{\n clean: null,\n dirty: { label: 'Unsaved changes', className: 'text-warning' },\n saving: { label: 'Saving…', className: 'text-muted' },\n saved: { label: 'Saved', className: 'text-success' }\n};\n\n/** Small status pill reflecting an editor's save state. */\nexport function DirtyStateIndicator({ state }: { state: DirtyState }) {\n const config = CONFIG[state];\n if (!config) return null;\n return (\n <span\n className={`flex items-center gap-1.5 font-sans text-xs font-medium ${config.className}`}\n aria-live=\"polite\">\n\n {state === 'saving' &&\n <Loader2Icon className=\"h-3.5 w-3.5 animate-spin\" strokeWidth={2} />}\n {state === 'saved' && <CheckIcon className=\"h-3.5 w-3.5\" strokeWidth={2.5} />}\n {state === 'dirty' &&\n <span className=\"h-1.5 w-1.5 rounded-full bg-warning\" aria-hidden=\"true\" />}\n {config.label}\n </span>);\n\n}\n","import React from 'react';\n\nexport interface RowAction {\n icon: React.ElementType;\n label: string;\n onClick: () => void;\n /** Render in a destructive (red) hover state. */\n danger?: boolean;\n}\n\n/**\n * Standard trailing row actions — a group of icon buttons revealed on row\n * hover. Used in every table row and the phases list so actions look and\n * behave identically everywhere. The parent row must have the `group` class.\n */\nexport function RowActions({ actions }: { actions: RowAction[] }) {\n return (\n <div className=\"flex items-center justify-end gap-0.5\">\n {actions.map((a) => (\n <button\n key={a.label}\n type=\"button\"\n aria-label={a.label}\n title={a.label}\n onClick={(e) => {\n e.stopPropagation();\n a.onClick();\n }}\n className={`rounded p-1.5 text-muted transition-colors ${\n a.danger\n ? 'hover:bg-danger-bg hover:text-danger'\n : 'hover:bg-surface-raised hover:text-fg'\n }`}>\n <a.icon className=\"h-4 w-4\" strokeWidth={1.75} />\n </button>\n ))}\n </div>\n );\n}\n","import React from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\n\n/** Renders markdown with design-system typography. */\nexport function Markdown({ children }: { children: string }) {\n return (\n <div\n className={[\n 'font-sans text-[15px] leading-7 text-fg-secondary',\n '[&>*:first-child]:mt-0 [&>*:last-child]:mb-0',\n '[&_p]:my-3',\n '[&_h1]:mb-3 [&_h1]:mt-8 [&_h1]:text-2xl [&_h1]:font-bold [&_h1]:leading-snug [&_h1]:text-fg',\n '[&_h2]:mb-2.5 [&_h2]:mt-8 [&_h2]:text-xl [&_h2]:font-semibold [&_h2]:leading-snug [&_h2]:text-fg',\n '[&_h3]:mb-2 [&_h3]:mt-6 [&_h3]:text-base [&_h3]:font-semibold [&_h3]:text-fg',\n '[&_ul]:my-3.5 [&_ul]:list-disc [&_ul]:pl-6 [&_ol]:my-3.5 [&_ol]:list-decimal [&_ol]:pl-6',\n '[&_li]:my-1.5 [&_li]:pl-1.5 [&_li>p]:my-0',\n '[&_a]:text-accent [&_a]:underline [&_a]:underline-offset-2 [&_strong]:font-semibold [&_strong]:text-fg',\n '[&_blockquote]:my-4 [&_blockquote]:border-l-2 [&_blockquote]:border-accent [&_blockquote]:pl-4 [&_blockquote]:text-fg-secondary',\n '[&_code]:rounded [&_code]:bg-surface-strong [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[13px] [&_code]:text-fg-secondary',\n '[&_pre]:my-4 [&_pre]:overflow-x-auto [&_pre]:rounded-lg [&_pre]:bg-surface-raised [&_pre]:p-4 [&_pre_code]:bg-transparent [&_pre_code]:p-0',\n '[&_hr]:my-7 [&_hr]:border-border-strong',\n '[&_table]:my-4 [&_table]:w-full [&_table]:border-collapse [&_td]:border [&_td]:border-border-strong [&_td]:px-3 [&_td]:py-1.5 [&_th]:border [&_th]:border-border-strong [&_th]:bg-surface-raised [&_th]:px-3 [&_th]:py-1.5 [&_th]:text-left [&_th]:font-semibold',\n ].join(' ')}>\n <ReactMarkdown remarkPlugins={[remarkGfm]}>{children}</ReactMarkdown>\n </div>);\n\n}\n","import React from 'react';\nimport { Overlay } from './Overlay';\n\ntype Size = 'sm' | 'md' | 'lg';\n\ninterface ModalProps {\n open: boolean;\n onClose: () => void;\n title?: React.ReactNode;\n description?: React.ReactNode;\n footer?: React.ReactNode;\n size?: Size;\n hideCloseButton?: boolean;\n closeOnBackdrop?: boolean;\n closeOnEsc?: boolean;\n children: React.ReactNode;\n}\n\nconst SIZES: Record<Size, string> = {\n sm: 'max-w-sm',\n md: 'max-w-lg',\n lg: 'max-w-2xl'\n};\n\n/** Centered modal dialog with header / body / footer slots. */\nexport function Modal({\n open,\n onClose,\n title,\n description,\n footer,\n size = 'md',\n hideCloseButton,\n closeOnBackdrop,\n closeOnEsc,\n children\n}: ModalProps) {\n return (\n <Overlay\n open={open}\n onClose={onClose}\n position=\"center\"\n widthClassName={SIZES[size]}\n title={title}\n description={description}\n footer={footer}\n hideCloseButton={hideCloseButton}\n closeOnBackdrop={closeOnBackdrop}\n closeOnEsc={closeOnEsc}>\n\n {children}\n </Overlay>);\n\n}\n","import React from 'react';\nimport { Overlay } from './Overlay';\n\ntype Size = 'sm' | 'md' | 'lg';\n\ninterface DrawerProps {\n open: boolean;\n onClose: () => void;\n side?: 'right' | 'left';\n title?: React.ReactNode;\n description?: React.ReactNode;\n footer?: React.ReactNode;\n size?: Size;\n hideCloseButton?: boolean;\n closeOnBackdrop?: boolean;\n closeOnEsc?: boolean;\n children: React.ReactNode;\n}\n\nconst SIZES: Record<Size, string> = {\n sm: 'max-w-sm',\n md: 'max-w-md',\n lg: 'max-w-lg'\n};\n\n/** Side panel that slides in from the left or right edge. */\nexport function Drawer({\n open,\n onClose,\n side = 'right',\n title,\n description,\n footer,\n size = 'md',\n hideCloseButton,\n closeOnBackdrop,\n closeOnEsc,\n children\n}: DrawerProps) {\n return (\n <Overlay\n open={open}\n onClose={onClose}\n position={side}\n widthClassName={SIZES[size]}\n title={title}\n description={description}\n footer={footer}\n hideCloseButton={hideCloseButton}\n closeOnBackdrop={closeOnBackdrop}\n closeOnEsc={closeOnEsc}>\n\n {children}\n </Overlay>);\n\n}\n","import React from 'react';\nimport { AlertTriangleIcon } from 'lucide-react';\nimport { Modal } from './Modal';\nimport { Button } from './Button';\n\ninterface ConfirmDialogProps {\n open: boolean;\n onClose: () => void;\n title: string;\n message: React.ReactNode;\n confirmLabel?: string;\n cancelLabel?: string;\n onConfirm: () => void;\n variant?: 'default' | 'destructive';\n loading?: boolean;\n}\n\n/** Opinionated confirmation dialog built on Modal. */\nexport function ConfirmDialog({\n open,\n onClose,\n title,\n message,\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n onConfirm,\n variant = 'default',\n loading = false\n}: ConfirmDialogProps) {\n const destructive = variant === 'destructive';\n return (\n <Modal\n open={open}\n onClose={onClose}\n size=\"sm\"\n title={title}\n footer={\n <>\n <Button variant=\"secondary\" onClick={onClose} disabled={loading}>\n {cancelLabel}\n </Button>\n <Button\n variant={destructive ? 'destructive' : 'primary'}\n onClick={onConfirm}\n disabled={loading}>\n\n {loading ? 'Working…' : confirmLabel}\n </Button>\n </>\n }>\n\n <div className=\"flex items-start gap-3\">\n {destructive &&\n <span className=\"flex h-9 w-9 flex-shrink-0 items-center justify-center rounded-full bg-danger-bg text-danger\">\n <AlertTriangleIcon\n className=\"h-5 w-5\"\n strokeWidth={2}\n aria-hidden=\"true\" />\n\n </span>\n }\n <p className=\"font-sans text-sm leading-relaxed text-fg-secondary\">\n {message}\n </p>\n </div>\n </Modal>);\n\n}\n","import React from 'react';\nimport { Button } from './Button';\nimport { DirtyStateIndicator, type DirtyState } from './DirtyStateIndicator';\n\ninterface SaveBarProps {\n dirty: boolean;\n onSave: () => void;\n onDiscard: () => void;\n state?: DirtyState;\n saveLabel?: string;\n discardLabel?: string;\n}\n\n/** Sticky action bar: Save (disabled until dirty) + Discard, with a state pill. */\nexport function SaveBar({\n dirty,\n onSave,\n onDiscard,\n state,\n saveLabel = 'Save',\n discardLabel = 'Discard'\n}: SaveBarProps) {\n const resolvedState: DirtyState = state ?? (dirty ? 'dirty' : 'clean');\n return (\n <div className=\"sticky bottom-0 z-10 flex items-center justify-between gap-4 border-t border-border-strong bg-surface px-1 py-3 backdrop-blur\">\n <DirtyStateIndicator state={resolvedState} />\n <div className=\"flex items-center gap-3\">\n <Button variant=\"secondary\" onClick={onDiscard} disabled={!dirty}>\n {discardLabel}\n </Button>\n <Button onClick={onSave} disabled={!dirty}>\n {saveLabel}\n </Button>\n </div>\n </div>);\n\n}\n","import { useEffect, useRef, type CSSProperties } from 'react';\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n size,\n useDismiss,\n useRole,\n useInteractions,\n type Placement,\n type ExtendedRefs,\n type FloatingContext,\n type ReferenceType,\n type UseInteractionsReturn } from\n'@floating-ui/react';\n\n// App-wide guarantee: at most one usePopover-driven dropdown is open at a time.\n// Opening one closes whichever was open before.\nlet activeClose: (() => void) | null = null;\n\ninterface UsePopoverOptions {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n placement?: Placement;\n /** Distance in px between the trigger and the floating panel. */\n gap?: number;\n /** When true, the floating panel is constrained to (and matches) the trigger width. */\n matchWidth?: boolean;\n role?: 'menu' | 'listbox' | 'dialog';\n}\n\n/**\n * Shared, collision-aware popover positioning built on Floating UI.\n *\n * Provides flip (open upward when there's no room below), shift (stay in the\n * viewport horizontally), and size (cap the panel height to available space and\n * optionally match the trigger width). Also wires escape + outside-press dismissal.\n *\n * Spread getReferenceProps() on the trigger and getFloatingProps() on the panel,\n * attach refs.setReference / refs.setFloating, and apply floatingStyles to the panel.\n */\nexport function usePopover({\n open,\n onOpenChange,\n placement = 'bottom-start',\n gap = 6,\n matchWidth = false,\n role = 'menu'\n}: UsePopoverOptions): {\n refs: ExtendedRefs<ReferenceType>;\n floatingStyles: CSSProperties;\n context: FloatingContext<ReferenceType>;\n getReferenceProps: UseInteractionsReturn['getReferenceProps'];\n getFloatingProps: UseInteractionsReturn['getFloatingProps'];\n} {\n const { refs, floatingStyles, context } = useFloating({\n open,\n onOpenChange,\n placement,\n whileElementsMounted: autoUpdate,\n middleware: [\n offset(gap),\n flip({ padding: 8 }),\n shift({ padding: 8 }),\n size({\n padding: 8,\n apply({ availableHeight, rects, elements }) {\n Object.assign(elements.floating.style, {\n maxHeight: `${Math.max(160, availableHeight)}px`,\n ...(matchWidth ? { width: `${rects.reference.width}px` } : {})\n });\n }\n })]\n\n });\n\n // Coordinate single-open behavior across all popovers. Keep a stable closer\n // per instance so opening this one closes any other that's currently open.\n const onOpenChangeRef = useRef(onOpenChange);\n onOpenChangeRef.current = onOpenChange;\n const closeSelfRef = useRef<() => void>();\n if (!closeSelfRef.current) {\n closeSelfRef.current = () => onOpenChangeRef.current(false);\n }\n useEffect(() => {\n if (!open) return;\n if (activeClose && activeClose !== closeSelfRef.current) {\n activeClose();\n }\n activeClose = closeSelfRef.current!;\n return () => {\n if (activeClose === closeSelfRef.current) activeClose = null;\n };\n }, [open]);\n\n const dismiss = useDismiss(context, { outsidePress: true });\n const roleInteraction = useRole(context, { role });\n\n const { getReferenceProps, getFloatingProps } = useInteractions([\n dismiss,\n roleInteraction]\n );\n\n return {\n refs,\n floatingStyles,\n context,\n getReferenceProps,\n getFloatingProps\n };\n}","import React, { useState, Children, cloneElement, isValidElement, type ReactNode } from 'react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { FloatingPortal } from '@floating-ui/react';\nimport { usePopover } from '../hooks/usePopover';\ninterface DropdownProps {\n trigger: ReactNode;\n children: ReactNode;\n align?: 'left' | 'right';\n className?: string;\n}\nexport function Dropdown({\n trigger,\n children,\n align = 'left',\n className = ''\n}: DropdownProps) {\n const [isOpen, setIsOpen] = useState(false);\n const { refs, floatingStyles, context, getReferenceProps, getFloatingProps } =\n usePopover({\n open: isOpen,\n onOpenChange: setIsOpen,\n placement: align === 'right' ? 'bottom-end' : 'bottom-start',\n role: 'menu'\n });\n return (\n <div className={`relative inline-block text-left ${className}`}>\n <div\n ref={refs.setReference}\n {...getReferenceProps({\n onClick: () => setIsOpen((o) => !o)\n })}\n className=\"inline-block\">\n \n {trigger}\n </div>\n\n <FloatingPortal>\n <AnimatePresence>\n {isOpen &&\n <div\n ref={refs.setFloating}\n style={floatingStyles}\n {...getFloatingProps()}\n className=\"z-50\">\n \n <motion.div\n initial={{\n opacity: 0,\n y: -4,\n scale: 0.98\n }}\n animate={{\n opacity: 1,\n y: 0,\n scale: 1\n }}\n exit={{\n opacity: 0,\n y: -4,\n scale: 0.98\n }}\n transition={{\n duration: 0.15,\n ease: 'easeOut'\n }}\n className=\"min-w-[200px] overflow-auto rounded-md border border-border bg-surface py-1 shadow-lg\">\n \n {/* Clone children so they close the menu on click */}\n {Children.map(children, (child) => {\n if (isValidElement(child)) {\n return cloneElement(child as React.ReactElement<any>, {\n onClick: (e: React.MouseEvent) => {\n if (child.props.onClick) child.props.onClick(e);\n setIsOpen(false);\n }\n });\n }\n return child;\n })}\n </motion.div>\n </div>\n }\n </AnimatePresence>\n </FloatingPortal>\n </div>);\n\n}\ninterface DropdownItemProps extends\n React.ButtonHTMLAttributes<HTMLButtonElement> {\n children: ReactNode;\n icon?: React.ElementType;\n danger?: boolean;\n}\nexport function DropdownItem({\n children,\n icon: Icon,\n danger,\n className = '',\n ...props\n}: DropdownItemProps) {\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n className={`flex w-full items-center gap-2 px-4 py-2 text-left font-sans text-sm transition-colors hover:bg-surface-raised focus:bg-surface-raised focus:outline-none ${danger ? 'text-red-600' : 'text-fg'} ${className}`}\n {...props}>\n \n {Icon && <Icon className=\"h-4 w-4\" strokeWidth={1.5} />}\n {children}\n </button>);\n\n}","import React, { useState } from 'react';\nimport { ChevronDownIcon, CheckIcon } from 'lucide-react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { FloatingPortal } from '@floating-ui/react';\nimport { usePopover } from '../hooks/usePopover';\nexport interface SelectOption {\n value: string;\n label: string;\n}\nexport interface SelectProps {\n label?: string;\n placeholder?: string;\n options: SelectOption[];\n value?: string;\n onChange?: (value: string) => void;\n error?: boolean;\n helperText?: string;\n disabled?: boolean;\n className?: string;\n}\nexport function Select({\n label,\n placeholder = 'Select an option',\n options,\n value,\n onChange,\n error,\n helperText,\n disabled,\n className = ''\n}: SelectProps) {\n const [isOpen, setIsOpen] = useState(false);\n const { refs, floatingStyles, getReferenceProps, getFloatingProps } =\n usePopover({\n open: isOpen,\n onOpenChange: setIsOpen,\n placement: 'bottom-start',\n matchWidth: true,\n role: 'listbox'\n });\n const selectedOption = options.find((opt) => opt.value === value);\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (disabled) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setIsOpen(!isOpen);\n } else if (e.key === 'Escape') {\n setIsOpen(false);\n }\n };\n const handleSelect = (val: string) => {\n onChange?.(val);\n setIsOpen(false);\n };\n return (\n <div className={`flex w-full flex-col gap-1.5 ${className}`}>\n {label &&\n <label className=\"font-sans text-sm font-medium text-fg\">\n {label}\n </label>\n }\n <button\n ref={refs.setReference}\n type=\"button\"\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n {...getReferenceProps({\n onClick: () => !disabled && setIsOpen((o) => !o),\n onKeyDown: handleKeyDown\n })}\n className={`flex w-full items-center justify-between rounded border bg-surface px-3 py-2 text-left font-sans text-sm transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1 disabled:cursor-not-allowed disabled:bg-surface-raised disabled:text-muted ${error ? 'border-red-500 focus-visible:border-red-500 focus-visible:ring-red-500' : 'border-border hover:border-border-strong focus-visible:border-accent focus-visible:ring-accent'}`}>\n \n <span className={selectedOption ? 'text-fg' : 'text-muted'}>\n {selectedOption ? selectedOption.label : placeholder}\n </span>\n <ChevronDownIcon\n className={`h-4 w-4 text-muted transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}`}\n strokeWidth={1.5} />\n \n </button>\n\n <FloatingPortal>\n <AnimatePresence>\n {isOpen &&\n <div\n ref={refs.setFloating}\n style={floatingStyles}\n {...getFloatingProps()}\n className=\"z-50\">\n \n <motion.ul\n role=\"listbox\"\n initial={{\n opacity: 0,\n y: -4,\n scale: 0.98\n }}\n animate={{\n opacity: 1,\n y: 0,\n scale: 1\n }}\n exit={{\n opacity: 0,\n y: -4,\n scale: 0.98\n }}\n transition={{\n duration: 0.15,\n ease: 'easeOut'\n }}\n className=\"overflow-auto rounded-md border border-border bg-surface py-1 shadow-lg focus:outline-none\">\n \n {options.map((option) =>\n <li\n key={option.value}\n role=\"option\"\n aria-selected={value === option.value}\n onClick={() => handleSelect(option.value)}\n className={`relative flex cursor-pointer select-none items-center py-2 pl-3 pr-9 font-sans text-sm transition-colors hover:bg-surface-raised ${value === option.value ? 'bg-surface-raised font-medium text-accent' : 'text-fg'}`}>\n \n <span className=\"block truncate\">{option.label}</span>\n {value === option.value &&\n <span className=\"absolute inset-y-0 right-0 flex items-center pr-3 text-accent\">\n <CheckIcon className=\"h-4 w-4\" strokeWidth={2} />\n </span>\n }\n </li>\n )}\n </motion.ul>\n </div>\n }\n </AnimatePresence>\n </FloatingPortal>\n {helperText &&\n <span\n className={`font-sans text-xs ${error ? 'text-red-500' : 'text-muted'}`}>\n \n {helperText}\n </span>\n }\n </div>);\n\n}","import React, { useEffect, useRef, useState } from 'react';\nimport { ChevronDownIcon, CheckIcon, SearchIcon } from 'lucide-react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { FloatingPortal } from '@floating-ui/react';\nimport { usePopover } from '../hooks/usePopover';\n\nexport interface ComboboxOption {\n value: string;\n label: string;\n}\nexport interface ComboboxProps {\n label?: string;\n placeholder?: string;\n options: ComboboxOption[];\n value?: string;\n onChange?: (value: string) => void;\n error?: boolean;\n helperText?: string;\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * Searchable single-select, built on the shared usePopover (collision-aware\n * positioning + outside-press / escape dismissal + single-open guarantee).\n */\nexport function Combobox({\n label,\n placeholder = 'Search...',\n options,\n value,\n onChange,\n error,\n helperText,\n disabled,\n className = ''\n}: ComboboxProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [query, setQuery] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n const { refs, floatingStyles, getReferenceProps, getFloatingProps } =\n usePopover({\n open: isOpen,\n onOpenChange: (next) => {\n setIsOpen(next);\n if (!next) setQuery('');\n },\n placement: 'bottom-start',\n matchWidth: true,\n role: 'listbox'\n });\n\n useEffect(() => {\n if (isOpen) inputRef.current?.focus();\n }, [isOpen]);\n\n const selectedOption = options.find((opt) => opt.value === value);\n const filteredOptions =\n query === ''\n ? options\n : options.filter((option) =>\n option.label.toLowerCase().includes(query.toLowerCase())\n );\n\n const handleSelect = (val: string) => {\n onChange?.(val);\n setIsOpen(false);\n setQuery('');\n };\n\n return (\n <div className={`flex w-full flex-col gap-1.5 ${className}`}>\n {label &&\n <label className=\"font-sans text-sm font-medium text-fg\">\n {label}\n </label>\n }\n <button\n ref={refs.setReference}\n type=\"button\"\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n {...getReferenceProps({\n onClick: () => !disabled && setIsOpen((o) => !o)\n })}\n className={`flex w-full items-center justify-between rounded border bg-surface px-3 py-2 text-left font-sans text-sm transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1 disabled:cursor-not-allowed disabled:bg-surface-raised disabled:text-muted ${error ? 'border-red-500 focus-visible:ring-red-500' : 'border-border hover:border-border-strong focus-visible:border-accent focus-visible:ring-accent'}`}>\n\n <span className={selectedOption ? 'text-fg' : 'text-muted'}>\n {selectedOption ? selectedOption.label : placeholder}\n </span>\n <ChevronDownIcon\n className={`h-4 w-4 text-muted transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}`}\n strokeWidth={1.5} />\n\n </button>\n\n <FloatingPortal>\n <AnimatePresence>\n {isOpen &&\n <div\n ref={refs.setFloating}\n style={floatingStyles}\n {...getFloatingProps()}\n className=\"z-50\">\n\n <motion.div\n initial={{ opacity: 0, y: -4, scale: 0.98 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: -4, scale: 0.98 }}\n transition={{ duration: 0.15, ease: 'easeOut' }}\n className=\"overflow-hidden rounded-md border border-border bg-surface shadow-lg\">\n\n <div className=\"flex items-center gap-2 border-b border-border px-3 py-2\">\n <SearchIcon className=\"h-4 w-4 flex-shrink-0 text-muted\" strokeWidth={1.5} />\n <input\n ref={inputRef}\n type=\"text\"\n className=\"w-full bg-transparent p-0 font-sans text-sm text-fg placeholder:text-muted focus:outline-none\"\n placeholder={placeholder}\n value={query}\n onChange={(e) => setQuery(e.target.value)} />\n\n </div>\n <ul role=\"listbox\" className=\"max-h-60 overflow-auto py-1\">\n {filteredOptions.length === 0 ?\n <li className=\"px-3 py-2 font-sans text-sm text-muted\">\n No results found.\n </li> :\n\n filteredOptions.map((option) =>\n <li\n key={option.value}\n role=\"option\"\n aria-selected={value === option.value}\n onClick={() => handleSelect(option.value)}\n className={`relative flex cursor-pointer select-none items-center py-2 pl-3 pr-9 font-sans text-sm transition-colors hover:bg-surface-raised ${value === option.value ? 'bg-surface-raised font-medium text-accent' : 'text-fg'}`}>\n\n <span className=\"block truncate\">{option.label}</span>\n {value === option.value &&\n <span className=\"absolute inset-y-0 right-0 flex items-center pr-3 text-accent\">\n <CheckIcon className=\"h-4 w-4\" strokeWidth={2} />\n </span>\n }\n </li>\n )\n }\n </ul>\n </motion.div>\n </div>\n }\n </AnimatePresence>\n </FloatingPortal>\n {helperText &&\n <span\n className={`font-sans text-xs ${error ? 'text-red-500' : 'text-muted'}`}>\n\n {helperText}\n </span>\n }\n </div>);\n\n}\n"]}
@@ -0,0 +1,70 @@
1
+ /* @import url() FONT IMPORTS MUST ALWAYS BE AT THE VERY TOP OF THIS FILE — DO NOT DELETE THIS COMMENT */
2
+ @import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600;700&family=IBM+Plex+Sans+Condensed:wght@400;500;600&family=IBM+Plex+Mono:wght@400;500;600&display=swap');
3
+
4
+ :root {
5
+ color-scheme: light;
6
+ --color-bg: #FAFBFE;
7
+ --color-bg-sidebar: #FFFFFF;
8
+ --color-surface: #FFFFFF;
9
+ --color-surface-raised: #FAFBFE;
10
+ --color-surface-strong: #F7F6F8;
11
+ --color-surface-avatar: #F0F0F0;
12
+ --color-border: #F0F0F0;
13
+ --color-border-subtle: #EEEFF2;
14
+ --color-border-strong: rgba(0, 0, 0, 0.1);
15
+ --color-text: #000000;
16
+ --color-text-secondary: #5A5B63;
17
+ --color-text-muted: #94959D;
18
+ --color-text-disabled: #C4C5CC;
19
+ --color-text-on-accent: #FFFFFF;
20
+ --color-accent: #2940E8;
21
+ --color-accent-foreground: #2940E8;
22
+ --color-accent-subtle: rgba(41, 64, 232, 0.1);
23
+ --color-accent-hover: #1F33C4;
24
+ --color-violet: #7F14FF;
25
+ --color-success: #16A34A; --color-success-bg: #F0FDF4; --color-success-border: #BBF7D0;
26
+ --color-warning: #C68400; --color-warning-bg: #FFFCE1; --color-warning-border: #F6F4C0;
27
+ --color-info: #2563EB; --color-info-bg: #EFF6FF; --color-info-border: #BFDBFE;
28
+ --color-danger: #DC2626; --color-danger-bg: #FEF2F2; --color-danger-border: #FECACA;
29
+ --color-review: #7F14FF; --color-review-bg: #F9F4FF; --color-review-border: #E3CCFF;
30
+ --color-neutral: #94959D; --color-neutral-bg: #F7F6F8; --color-neutral-border: #EAEAEA;
31
+ --color-priority-low: #94959D;
32
+ --color-priority-medium: #C68400;
33
+ --color-priority-high: #DC2626;
34
+ }
35
+
36
+ .dark {
37
+ color-scheme: dark;
38
+ --color-bg: #0F0F11;
39
+ --color-bg-sidebar: #131315;
40
+ --color-surface: #131315;
41
+ --color-surface-raised: #161618;
42
+ --color-surface-strong: #1C1C1F;
43
+ --color-surface-avatar: #1F2023;
44
+ --color-border: #242427;
45
+ --color-border-subtle: #1E1E20;
46
+ --color-border-strong: #26262A;
47
+ --color-text: #E9E9EC;
48
+ --color-text-secondary: #B6B7BC;
49
+ --color-text-muted: #85868C;
50
+ --color-text-disabled: #4D4E54;
51
+ --color-text-on-accent: #FFFFFF;
52
+ --color-accent: #3D52F0;
53
+ --color-accent-foreground: #8DA0FF;
54
+ --color-accent-subtle: #191E2C;
55
+ --color-accent-hover: #5468FF;
56
+ --color-violet: #BFA0F0;
57
+ --color-success: #6DBF8F; --color-success-bg: #16301F; --color-success-border: #265C39;
58
+ --color-warning: #D9B45E; --color-warning-bg: #322B16; --color-warning-border: #4D421F;
59
+ --color-info: #84A6F0; --color-info-bg: #16243C; --color-info-border: #284A72;
60
+ --color-danger: #E08A8A; --color-danger-bg: #371E1E; --color-danger-border: #693535;
61
+ --color-review: #BFA0F0; --color-review-bg: #251539; --color-review-border: #452770;
62
+ --color-neutral: #A9AAB0; --color-neutral-bg: #1C1C1F; --color-neutral-border: #2C2C30;
63
+ --color-priority-low: #9A9BA3;
64
+ --color-priority-medium: #E0A02E;
65
+ --color-priority-high: #F05252;
66
+ }
67
+
68
+ html {
69
+ background-color: var(--color-bg);
70
+ }
@@ -0,0 +1,5 @@
1
+ import { Config } from 'tailwindcss';
2
+
3
+ declare const preset: Pick<Config, 'darkMode' | 'theme'>;
4
+
5
+ export { preset as default };
@@ -0,0 +1,60 @@
1
+ // src/tailwind-preset.ts
2
+ var preset = {
3
+ darkMode: "class",
4
+ theme: {
5
+ extend: {
6
+ fontFamily: {
7
+ sans: ['"IBM Plex Sans"', "sans-serif"],
8
+ condensed: ['"IBM Plex Sans Condensed"', "sans-serif"],
9
+ mono: ['"IBM Plex Mono"', "ui-monospace", "monospace"]
10
+ },
11
+ colors: {
12
+ bg: "var(--color-bg)",
13
+ sidebar: "var(--color-bg-sidebar)",
14
+ surface: "var(--color-surface)",
15
+ "surface-raised": "var(--color-surface-raised)",
16
+ "surface-strong": "var(--color-surface-strong)",
17
+ "surface-avatar": "var(--color-surface-avatar)",
18
+ border: "var(--color-border)",
19
+ "border-subtle": "var(--color-border-subtle)",
20
+ "border-strong": "var(--color-border-strong)",
21
+ fg: "var(--color-text)",
22
+ "fg-secondary": "var(--color-text-secondary)",
23
+ muted: "var(--color-text-muted)",
24
+ "text-disabled": "var(--color-text-disabled)",
25
+ "on-accent": "var(--color-text-on-accent)",
26
+ accent: "var(--color-accent)",
27
+ "accent-fg": "var(--color-accent-foreground)",
28
+ "accent-subtle": "var(--color-accent-subtle)",
29
+ "accent-hover": "var(--color-accent-hover)",
30
+ violet: "var(--color-violet)",
31
+ success: "var(--color-success)",
32
+ "success-bg": "var(--color-success-bg)",
33
+ "success-border": "var(--color-success-border)",
34
+ warning: "var(--color-warning)",
35
+ "warning-bg": "var(--color-warning-bg)",
36
+ "warning-border": "var(--color-warning-border)",
37
+ info: "var(--color-info)",
38
+ "info-bg": "var(--color-info-bg)",
39
+ "info-border": "var(--color-info-border)",
40
+ danger: "var(--color-danger)",
41
+ "danger-bg": "var(--color-danger-bg)",
42
+ "danger-border": "var(--color-danger-border)",
43
+ review: "var(--color-review)",
44
+ "review-bg": "var(--color-review-bg)",
45
+ "review-border": "var(--color-review-border)",
46
+ neutral: "var(--color-neutral)",
47
+ "neutral-bg": "var(--color-neutral-bg)",
48
+ "neutral-border": "var(--color-neutral-border)",
49
+ "priority-low": "var(--color-priority-low)",
50
+ "priority-medium": "var(--color-priority-medium)",
51
+ "priority-high": "var(--color-priority-high)"
52
+ }
53
+ }
54
+ }
55
+ };
56
+ var tailwind_preset_default = preset;
57
+
58
+ export { tailwind_preset_default as default };
59
+ //# sourceMappingURL=tailwind-preset.js.map
60
+ //# sourceMappingURL=tailwind-preset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tailwind-preset.ts"],"names":[],"mappings":";AAEA,IAAM,MAAA,GAA6C;AAAA,EACjD,QAAA,EAAU,OAAA;AAAA,EACV,KAAA,EAAO;AAAA,IACL,MAAA,EAAQ;AAAA,MACN,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,CAAC,iBAAA,EAAmB,YAAY,CAAA;AAAA,QACtC,SAAA,EAAW,CAAC,2BAAA,EAA6B,YAAY,CAAA;AAAA,QACrD,IAAA,EAAM,CAAC,iBAAA,EAAmB,cAAA,EAAgB,WAAW;AAAA,OACvD;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,EAAA,EAAI,iBAAA;AAAA,QACJ,OAAA,EAAS,yBAAA;AAAA,QACT,OAAA,EAAS,sBAAA;AAAA,QACT,gBAAA,EAAkB,6BAAA;AAAA,QAClB,gBAAA,EAAkB,6BAAA;AAAA,QAClB,gBAAA,EAAkB,6BAAA;AAAA,QAClB,MAAA,EAAQ,qBAAA;AAAA,QACR,eAAA,EAAiB,4BAAA;AAAA,QACjB,eAAA,EAAiB,4BAAA;AAAA,QACjB,EAAA,EAAI,mBAAA;AAAA,QACJ,cAAA,EAAgB,6BAAA;AAAA,QAChB,KAAA,EAAO,yBAAA;AAAA,QACP,eAAA,EAAiB,4BAAA;AAAA,QACjB,WAAA,EAAa,6BAAA;AAAA,QACb,MAAA,EAAQ,qBAAA;AAAA,QACR,WAAA,EAAa,gCAAA;AAAA,QACb,eAAA,EAAiB,4BAAA;AAAA,QACjB,cAAA,EAAgB,2BAAA;AAAA,QAChB,MAAA,EAAQ,qBAAA;AAAA,QACR,OAAA,EAAS,sBAAA;AAAA,QACT,YAAA,EAAc,yBAAA;AAAA,QACd,gBAAA,EAAkB,6BAAA;AAAA,QAClB,OAAA,EAAS,sBAAA;AAAA,QACT,YAAA,EAAc,yBAAA;AAAA,QACd,gBAAA,EAAkB,6BAAA;AAAA,QAClB,IAAA,EAAM,mBAAA;AAAA,QACN,SAAA,EAAW,sBAAA;AAAA,QACX,aAAA,EAAe,0BAAA;AAAA,QACf,MAAA,EAAQ,qBAAA;AAAA,QACR,WAAA,EAAa,wBAAA;AAAA,QACb,eAAA,EAAiB,4BAAA;AAAA,QACjB,MAAA,EAAQ,qBAAA;AAAA,QACR,WAAA,EAAa,wBAAA;AAAA,QACb,eAAA,EAAiB,4BAAA;AAAA,QACjB,OAAA,EAAS,sBAAA;AAAA,QACT,YAAA,EAAc,yBAAA;AAAA,QACd,gBAAA,EAAkB,6BAAA;AAAA,QAClB,cAAA,EAAgB,2BAAA;AAAA,QAChB,iBAAA,EAAmB,8BAAA;AAAA,QACnB,eAAA,EAAiB;AAAA;AACnB;AACF;AAEJ,CAAA;AAEA,IAAO,uBAAA,GAAQ","file":"tailwind-preset.js","sourcesContent":["import type { Config } from 'tailwindcss';\n\nconst preset: Pick<Config, 'darkMode' | 'theme'> = {\n darkMode: 'class',\n theme: {\n extend: {\n fontFamily: {\n sans: ['\"IBM Plex Sans\"', 'sans-serif'],\n condensed: ['\"IBM Plex Sans Condensed\"', 'sans-serif'],\n mono: ['\"IBM Plex Mono\"', 'ui-monospace', 'monospace'],\n },\n colors: {\n bg: 'var(--color-bg)',\n sidebar: 'var(--color-bg-sidebar)',\n surface: 'var(--color-surface)',\n 'surface-raised': 'var(--color-surface-raised)',\n 'surface-strong': 'var(--color-surface-strong)',\n 'surface-avatar': 'var(--color-surface-avatar)',\n border: 'var(--color-border)',\n 'border-subtle': 'var(--color-border-subtle)',\n 'border-strong': 'var(--color-border-strong)',\n fg: 'var(--color-text)',\n 'fg-secondary': 'var(--color-text-secondary)',\n muted: 'var(--color-text-muted)',\n 'text-disabled': 'var(--color-text-disabled)',\n 'on-accent': 'var(--color-text-on-accent)',\n accent: 'var(--color-accent)',\n 'accent-fg': 'var(--color-accent-foreground)',\n 'accent-subtle': 'var(--color-accent-subtle)',\n 'accent-hover': 'var(--color-accent-hover)',\n violet: 'var(--color-violet)',\n success: 'var(--color-success)',\n 'success-bg': 'var(--color-success-bg)',\n 'success-border': 'var(--color-success-border)',\n warning: 'var(--color-warning)',\n 'warning-bg': 'var(--color-warning-bg)',\n 'warning-border': 'var(--color-warning-border)',\n info: 'var(--color-info)',\n 'info-bg': 'var(--color-info-bg)',\n 'info-border': 'var(--color-info-border)',\n danger: 'var(--color-danger)',\n 'danger-bg': 'var(--color-danger-bg)',\n 'danger-border': 'var(--color-danger-border)',\n review: 'var(--color-review)',\n 'review-bg': 'var(--color-review-bg)',\n 'review-border': 'var(--color-review-border)',\n neutral: 'var(--color-neutral)',\n 'neutral-bg': 'var(--color-neutral-bg)',\n 'neutral-border': 'var(--color-neutral-border)',\n 'priority-low': 'var(--color-priority-low)',\n 'priority-medium': 'var(--color-priority-medium)',\n 'priority-high': 'var(--color-priority-high)',\n },\n },\n },\n};\n\nexport default preset;\n"]}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@orbitlabsui/ui",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "license": "UNLICENSED",
6
+ "publishConfig": {
7
+ "registry": "https://registry.npmjs.org/"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "import": "./dist/index.js"
16
+ },
17
+ "./styles.css": "./dist/styles.css",
18
+ "./tailwind-preset": {
19
+ "types": "./dist/tailwind-preset.d.ts",
20
+ "import": "./dist/tailwind-preset.js",
21
+ "default": "./dist/tailwind-preset.js"
22
+ }
23
+ },
24
+ "peerDependencies": {
25
+ "react": "^18.3.1",
26
+ "react-dom": "^18.3.1"
27
+ },
28
+ "dependencies": {
29
+ "@floating-ui/react": "^0.27.4",
30
+ "framer-motion": "^11.5.4",
31
+ "lucide-react": "0.522.0",
32
+ "react-hot-toast": "^2.6.0",
33
+ "react-markdown": "^10.1.0",
34
+ "remark-gfm": "^4.0.1"
35
+ },
36
+ "devDependencies": {
37
+ "@testing-library/jest-dom": "^6.4.0",
38
+ "@testing-library/react": "^16.0.0",
39
+ "@types/react": "^18.3.1",
40
+ "@types/react-dom": "^18.3.1",
41
+ "jsdom": "^25.0.0",
42
+ "react": "^18.3.1",
43
+ "react-dom": "^18.3.1",
44
+ "tailwindcss": "3.4.17",
45
+ "tsup": "^8.3.0",
46
+ "typescript": "^5.5.4",
47
+ "vitest": "^2.1.9"
48
+ },
49
+ "scripts": {
50
+ "build": "tsup",
51
+ "dev": "tsup --watch",
52
+ "test": "vitest run",
53
+ "typecheck": "tsc --noEmit"
54
+ }
55
+ }