namps-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/index.ts","../src/theme.tsx","../src/icons.tsx","../src/utils.ts","../src/components/Button.tsx","../src/components/Form.tsx","../src/components/Display.tsx","../src/components/Accordion.tsx","../src/components/Tabs.tsx","../src/components/Navigation.tsx","../src/components/Table.tsx","../src/components/Alert.tsx","../src/components/Toast.tsx","../src/components/Overlay.tsx","../src/components/Extras.tsx"],"sourcesContent":["/**\n * paper-ui — public API.\n *\n * Consumers import components from here and the stylesheet once:\n * import { Button, ThemeProvider } from \"paper-ui\";\n * import \"paper-ui/styles.css\";\n */\n\n// Theme\nexport { ThemeProvider, useTheme, ThemeToggle } from \"./theme\";\nexport type { Theme, ThemeProviderProps } from \"./theme\";\n\n// Utilities\nexport { cx, initials } from \"./utils\";\n\n// Icons (handy for leftIcon / menu items, etc.)\nexport * as Icons from \"./icons\";\n\n// Form\nexport { Button } from \"./components/Button\";\nexport type { ButtonProps, ButtonVariant, ButtonSize } from \"./components/Button\";\nexport {\n Field,\n Input,\n SearchInput,\n Textarea,\n Select,\n Checkbox,\n Switch,\n RadioGroup,\n Slider,\n} from \"./components/Form\";\nexport type {\n FieldProps,\n InputProps,\n TextareaProps,\n SelectProps,\n CheckboxProps,\n SwitchProps,\n RadioGroupProps,\n RadioOption,\n SliderProps,\n} from \"./components/Form\";\n\n// Display\nexport {\n Badge,\n Tag,\n Avatar,\n AvatarGroup,\n Card,\n StatCard,\n Progress,\n Spinner,\n Skeleton,\n EmptyState,\n} from \"./components/Display\";\nexport type {\n Tone,\n BadgeProps,\n TagProps,\n AvatarProps,\n AvatarGroupProps,\n AvatarSize,\n CardProps,\n StatCardProps,\n ProgressProps,\n EmptyStateProps,\n} from \"./components/Display\";\n\n// Disclosure & navigation\nexport { Accordion, AccordionItem } from \"./components/Accordion\";\nexport type { AccordionProps, AccordionItemProps } from \"./components/Accordion\";\nexport { Tabs, TabList, Tab, TabPanel } from \"./components/Tabs\";\nexport type { TabsProps } from \"./components/Tabs\";\nexport { Breadcrumbs, Pagination, Segmented } from \"./components/Navigation\";\nexport type { Crumb, PaginationProps, SegmentedProps } from \"./components/Navigation\";\n\n// Data\nexport { Table } from \"./components/Table\";\nexport type { Column, TableProps } from \"./components/Table\";\n\n// Feedback\nexport { Alert } from \"./components/Alert\";\nexport type { AlertProps, AlertTone } from \"./components/Alert\";\nexport { ToastProvider, useToast } from \"./components/Toast\";\nexport type { ToastOptions, ToastTone } from \"./components/Toast\";\n\n// Overlay\nexport { Tooltip, DropdownMenu, MenuSeparator, Modal } from \"./components/Overlay\";\nexport type {\n TooltipProps,\n DropdownMenuProps,\n MenuItem,\n ModalProps,\n} from \"./components/Overlay\";\n\n// Extras\nexport {\n Separator,\n Kbd,\n Link,\n Popover,\n Drawer,\n ToggleGroup,\n Stepper,\n CodeBlock,\n List,\n ListItem,\n} from \"./components/Extras\";\nexport type {\n SeparatorProps,\n LinkProps,\n PopoverProps,\n DrawerProps,\n ToggleOption,\n ToggleGroupProps,\n Step,\n StepperProps,\n CodeBlockProps,\n} from \"./components/Extras\";\n","import * as React from \"react\";\nimport { Sun, Moon } from \"./icons\";\nimport { cx } from \"./utils\";\n\nexport type Theme = \"light\" | \"dark\";\n\ninterface ThemeContextValue {\n theme: Theme;\n setTheme: (t: Theme) => void;\n toggle: () => void;\n}\n\nconst ThemeContext = React.createContext<ThemeContextValue | null>(null);\n\nexport interface ThemeProviderProps {\n children: React.ReactNode;\n /** Initial theme when nothing is stored. Default \"light\". */\n defaultTheme?: Theme;\n /** localStorage key for persistence. Default \"pui-theme\". Pass null to disable. */\n storageKey?: string | null;\n /** Element to stamp `data-theme` on. Default document.documentElement. */\n attributeTarget?: \"html\" | \"self\";\n}\n\n/**\n * Wrap your app once. Sets `data-theme` on <html> (or a wrapper div) and\n * persists the choice. Read/control via the `useTheme()` hook.\n */\nexport function ThemeProvider({\n children,\n defaultTheme = \"light\",\n storageKey = \"pui-theme\",\n attributeTarget = \"html\",\n}: ThemeProviderProps) {\n const [theme, setThemeState] = React.useState<Theme>(defaultTheme);\n\n React.useEffect(() => {\n if (storageKey) {\n const stored = window.localStorage.getItem(storageKey) as Theme | null;\n if (stored === \"light\" || stored === \"dark\") setThemeState(stored);\n }\n }, [storageKey]);\n\n React.useEffect(() => {\n if (attributeTarget === \"html\") {\n document.documentElement.setAttribute(\"data-theme\", theme);\n }\n if (storageKey) window.localStorage.setItem(storageKey, theme);\n }, [theme, attributeTarget, storageKey]);\n\n const value = React.useMemo<ThemeContextValue>(\n () => ({\n theme,\n setTheme: setThemeState,\n toggle: () => setThemeState((t) => (t === \"light\" ? \"dark\" : \"light\")),\n }),\n [theme],\n );\n\n return (\n <ThemeContext.Provider value={value}>\n {attributeTarget === \"self\" ? <div data-theme={theme}>{children}</div> : children}\n </ThemeContext.Provider>\n );\n}\n\nexport function useTheme(): ThemeContextValue {\n const ctx = React.useContext(ThemeContext);\n if (!ctx) throw new Error(\"useTheme must be used within a <ThemeProvider>\");\n return ctx;\n}\n\n/** Drop-in icon button that flips the theme. */\nexport function ThemeToggle({ className, ...props }: React.ButtonHTMLAttributes<HTMLButtonElement>) {\n const { theme, toggle } = useTheme();\n return (\n <button\n type=\"button\"\n aria-label=\"Toggle color theme\"\n onClick={toggle}\n className={cx(\"pui-btn\", \"pui-btn--secondary\", \"pui-btn--icon\", className)}\n {...props}\n >\n {theme === \"light\" ? <Moon className=\"pui-icon\" /> : <Sun className=\"pui-icon\" />}\n </button>\n );\n}\n","import * as React from \"react\";\n\ntype IconProps = React.SVGProps<SVGSVGElement>;\n\nconst base = (path: React.ReactNode) =>\n function Icon({ className, ...props }: IconProps) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.8}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className ?? \"pui-icon\"}\n aria-hidden=\"true\"\n {...props}\n >\n {path}\n </svg>\n );\n };\n\nexport const ChevronDown = base(<path d=\"M6 9l6 6 6-6\" />);\nexport const ChevronRight = base(<path d=\"M9 6l6 6-6 6\" />);\nexport const ChevronLeft = base(<path d=\"M15 6l-6 6 6 6\" />);\nexport const Check = base(<path d=\"M5 12l4 4 10-10\" />);\nexport const X = base(<path d=\"M6 6l12 12M18 6L6 18\" />);\nexport const Search = base(<><circle cx=\"11\" cy=\"11\" r=\"7\" /><path d=\"M21 21l-4.3-4.3\" /></>);\nexport const Plus = base(<path d=\"M12 5v14M5 12h14\" />);\nexport const Sun = base(<><circle cx=\"12\" cy=\"12\" r=\"4\" /><path d=\"M12 2v2M12 20v2M4 12H2M22 12h-2M5.6 5.6l1.4 1.4M17 17l1.4 1.4M18.4 5.6L17 7M7 17l-1.4 1.4\" /></>);\nexport const Moon = base(<path d=\"M21 12.8A9 9 0 1 1 11.2 3 7 7 0 0 0 21 12.8Z\" />);\nexport const Info = base(<><circle cx=\"12\" cy=\"12\" r=\"9\" /><path d=\"M12 11v5M12 8h.01\" /></>);\nexport const AlertTriangle = base(<><path d=\"M10.3 3.3 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.3a2 2 0 0 0-3.4 0Z\" /><path d=\"M12 9v4M12 17h.01\" /></>);\nexport const CheckCircle = base(<><circle cx=\"12\" cy=\"12\" r=\"9\" /><path d=\"M8 12l3 3 5-6\" /></>);\nexport const XCircle = base(<><circle cx=\"12\" cy=\"12\" r=\"9\" /><path d=\"M15 9l-6 6M9 9l6 6\" /></>);\nexport const ArrowRight = base(<path d=\"M5 12h14M13 6l6 6-6 6\" />);\nexport const Sort = base(<path d=\"M8 9l4-4 4 4M8 15l4 4 4-4\" />);\n\nexport function DotsVertical({ className, ...props }: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className={className ?? \"pui-icon\"} aria-hidden=\"true\" {...props}>\n <circle cx=\"12\" cy=\"5\" r=\"1.6\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.6\" />\n <circle cx=\"12\" cy=\"19\" r=\"1.6\" />\n </svg>\n );\n}\n","/** Tiny classNames helper — joins truthy class fragments. */\nexport function cx(...parts: Array<string | false | null | undefined>): string {\n return parts.filter(Boolean).join(\" \");\n}\n\n/** Derive up-to-two-letter initials from a full name. */\nexport function initials(name: string): string {\n const words = name.trim().split(/\\s+/);\n if (words.length === 0) return \"?\";\n if (words.length === 1) return words[0].slice(0, 2).toUpperCase();\n return (words[0][0] + words[words.length - 1][0]).toUpperCase();\n}\n","import * as React from \"react\";\nimport { cx } from \"../utils\";\n\nexport type ButtonVariant = \"primary\" | \"secondary\" | \"outline\" | \"ghost\" | \"danger\";\nexport type ButtonSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n /** Renders a spinner and disables the button. */\n loading?: boolean;\n /** Icon-only square button. Pass an icon as the single child. */\n iconOnly?: boolean;\n /** Stretch to full container width. */\n block?: boolean;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n}\n\n/**\n * The primary action element. Five variants, three sizes, loading + icon support.\n *\n * @example\n * <Button variant=\"primary\" leftIcon={<Plus/>}>Create key</Button>\n */\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n {\n variant = \"primary\",\n size = \"md\",\n loading = false,\n iconOnly = false,\n block = false,\n leftIcon,\n rightIcon,\n disabled,\n className,\n children,\n ...props\n },\n ref,\n) {\n return (\n <button\n ref={ref}\n disabled={disabled || loading}\n className={cx(\n \"pui-btn\",\n `pui-btn--${variant}`,\n size !== \"md\" && `pui-btn--${size}`,\n iconOnly && \"pui-btn--icon\",\n block && \"pui-btn--block\",\n className,\n )}\n {...props}\n >\n {loading && <span className=\"pui-btn__spinner\" aria-hidden=\"true\" />}\n {!loading && leftIcon}\n {children}\n {!loading && rightIcon}\n </button>\n );\n});\n","import * as React from \"react\";\nimport { cx } from \"../utils\";\nimport { Check, ChevronDown, Search as SearchIcon, XCircle } from \"../icons\";\n\n/* ---------------- Field wrapper ---------------- */\nexport interface FieldProps {\n label?: React.ReactNode;\n hint?: React.ReactNode;\n error?: React.ReactNode;\n htmlFor?: string;\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** Labelled wrapper: renders label, control, and hint/error text. */\nexport function Field({ label, hint, error, htmlFor, children, className, style }: FieldProps) {\n return (\n <div className={cx(\"pui-field\", className)} style={style}>\n {label && (\n <label className=\"pui-label\" htmlFor={htmlFor}>\n {label}\n </label>\n )}\n {children}\n {error ? (\n <span className=\"pui-error\">\n <XCircle style={{ width: 13, height: 13 }} />\n {error}\n </span>\n ) : (\n hint && <span className=\"pui-hint\">{hint}</span>\n )}\n </div>\n );\n}\n\n/* ---------------- Input ---------------- */\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n invalid?: boolean;\n}\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(function Input(\n { invalid, className, ...props },\n ref,\n) {\n return (\n <input\n ref={ref}\n aria-invalid={invalid || undefined}\n className={cx(\"pui-input\", invalid && \"pui-input--invalid\", className)}\n {...props}\n />\n );\n});\n\n/** Input with a leading search glyph. */\nexport const SearchInput = React.forwardRef<HTMLInputElement, InputProps>(function SearchInput(\n { className, ...props },\n ref,\n) {\n return (\n <span className=\"pui-input-wrap\">\n <SearchIcon className=\"pui-input-wrap__icon\" />\n <Input ref={ref} className={className} {...props} />\n </span>\n );\n});\n\n/* ---------------- Textarea ---------------- */\nexport interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n invalid?: boolean;\n}\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n { invalid, className, rows = 3, ...props },\n ref,\n) {\n return (\n <textarea\n ref={ref}\n rows={rows}\n aria-invalid={invalid || undefined}\n className={cx(\"pui-textarea\", invalid && \"pui-textarea--invalid\", className)}\n {...props}\n />\n );\n});\n\n/* ---------------- Select (native, styled) ---------------- */\nexport interface SelectProps extends React.SelectHTMLAttributes<HTMLSelectElement> {\n options?: Array<{ label: string; value: string }>;\n}\nexport const Select = React.forwardRef<HTMLSelectElement, SelectProps>(function Select(\n { options, className, children, ...props },\n ref,\n) {\n return (\n <span className=\"pui-select-wrap\">\n <select ref={ref} className={cx(\"pui-select\", className)} {...props}>\n {options\n ? options.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))\n : children}\n </select>\n <ChevronDown className=\"pui-select-wrap__caret\" />\n </span>\n );\n});\n\n/* ---------------- Checkbox ---------------- */\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n label?: React.ReactNode;\n}\nexport const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(function Checkbox(\n { label, disabled, className, ...props },\n ref,\n) {\n return (\n <label className={cx(\"pui-checkbox\", disabled && \"pui-checkbox--disabled\", className)}>\n <input ref={ref} type=\"checkbox\" disabled={disabled} {...props} />\n <span className=\"pui-checkbox__box\">\n <Check />\n </span>\n {label}\n </label>\n );\n});\n\n/* ---------------- Switch ---------------- */\nexport interface SwitchProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\"> {}\nexport const Switch = React.forwardRef<HTMLInputElement, SwitchProps>(function Switch(\n { className, ...props },\n ref,\n) {\n return (\n <label className={cx(\"pui-switch\", className)}>\n <input ref={ref} type=\"checkbox\" role=\"switch\" {...props} />\n <span className=\"pui-switch__track\" />\n </label>\n );\n});\n\n/* ---------------- RadioGroup ---------------- */\nexport interface RadioOption {\n value: string;\n title: React.ReactNode;\n description?: React.ReactNode;\n}\nexport interface RadioGroupProps {\n name: string;\n value: string;\n onValueChange: (value: string) => void;\n options: RadioOption[];\n className?: string;\n}\n/** Card-style radio group. Controlled via `value` / `onValueChange`. */\nexport function RadioGroup({ name, value, onValueChange, options, className }: RadioGroupProps) {\n return (\n <div className={cx(\"pui-radio-group\", className)} role=\"radiogroup\">\n {options.map((o) => (\n <label key={o.value} className=\"pui-radio-card\">\n <input\n type=\"radio\"\n name={name}\n value={o.value}\n checked={value === o.value}\n onChange={() => onValueChange(o.value)}\n />\n <span className=\"pui-radio-card__dot\" />\n <span>\n <span className=\"pui-radio-card__title\">{o.title}</span>\n {o.description && <span className=\"pui-radio-card__desc\">{o.description}</span>}\n </span>\n </label>\n ))}\n </div>\n );\n}\n\n/* ---------------- Slider ---------------- */\nexport interface SliderProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\" | \"value\" | \"onChange\"> {\n value: number;\n min?: number;\n max?: number;\n onValueChange: (value: number) => void;\n}\nexport function Slider({ value, min = 0, max = 100, onValueChange, className, ...props }: SliderProps) {\n const pct = ((value - min) / (max - min)) * 100;\n return (\n <div className={cx(\"pui-slider\", className)}>\n <div className=\"pui-slider__row\">\n <div className=\"pui-slider__track\" />\n <div className=\"pui-slider__fill\" style={{ width: `${pct}%` }} />\n <input\n type=\"range\"\n min={min}\n max={max}\n value={value}\n onChange={(e) => onValueChange(Number(e.target.value))}\n {...props}\n />\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cx, initials as toInitials } from \"../utils\";\nimport { X } from \"../icons\";\n\nexport type Tone = \"neutral\" | \"green\" | \"amber\" | \"red\" | \"blue\" | \"accent\";\n\n/* ---------------- Badge ---------------- */\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n tone?: Tone;\n solid?: boolean;\n dot?: boolean;\n}\nexport function Badge({ tone = \"neutral\", solid, dot, className, children, ...props }: BadgeProps) {\n return (\n <span\n className={cx(\"pui-badge\", className)}\n data-tone={tone === \"neutral\" ? undefined : tone}\n data-solid={solid || undefined}\n {...props}\n >\n {dot && <span className=\"pui-badge__dot\" />}\n {children}\n </span>\n );\n}\n\n/* ---------------- Tag (removable) ---------------- */\nexport interface TagProps extends React.HTMLAttributes<HTMLSpanElement> {\n onRemove?: () => void;\n}\nexport function Tag({ onRemove, className, children, ...props }: TagProps) {\n return (\n <span className={cx(\"pui-tag\", className)} {...props}>\n {children}\n {onRemove && (\n <button type=\"button\" className=\"pui-tag__close\" aria-label=\"Remove\" onClick={onRemove}>\n <X />\n </button>\n )}\n </span>\n );\n}\n\n/* ---------------- Avatar ---------------- */\nexport type AvatarSize = \"sm\" | \"md\" | \"lg\";\nexport interface AvatarProps extends React.HTMLAttributes<HTMLSpanElement> {\n name: string;\n src?: string;\n size?: AvatarSize;\n tone?: \"accent\" | \"blue\" | \"green\" | \"amber\";\n status?: \"online\" | \"busy\" | \"away\";\n}\nexport function Avatar({ name, src, size = \"md\", tone = \"accent\", status, className, ...props }: AvatarProps) {\n return (\n <span\n className={cx(\"pui-avatar\", className)}\n data-size={size}\n data-tone={tone === \"accent\" ? undefined : tone}\n title={name}\n {...props}\n >\n {src ? <img src={src} alt={name} /> : toInitials(name)}\n {status && <span className=\"pui-avatar__status\" data-status={status} />}\n </span>\n );\n}\n\nexport interface AvatarGroupProps {\n /** Avatar elements. */\n children: React.ReactNode;\n /** Show at most this many, collapsing the rest into a \"+N\". */\n max?: number;\n size?: AvatarSize;\n className?: string;\n}\nexport function AvatarGroup({ children, max, size = \"md\", className }: AvatarGroupProps) {\n const items = React.Children.toArray(children);\n const shown = max ? items.slice(0, max) : items;\n const extra = max ? items.length - shown.length : 0;\n return (\n <div className={cx(\"pui-avatar-group\", className)}>\n {shown}\n {extra > 0 && (\n <span className=\"pui-avatar pui-avatar-group__more\" data-size={size}>\n +{extra}\n </span>\n )}\n </div>\n );\n}\n\n/* ---------------- Card ---------------- */\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n padded?: boolean;\n}\nexport function Card({ padded = true, className, children, ...props }: CardProps) {\n return (\n <div className={cx(\"pui-card\", padded && \"pui-card--pad\", className)} {...props}>\n {children}\n </div>\n );\n}\n\n/* ---------------- StatCard ---------------- */\nexport interface StatCardProps {\n label: React.ReactNode;\n value: React.ReactNode;\n delta?: { value: React.ReactNode; direction: \"up\" | \"down\" };\n className?: string;\n}\nexport function StatCard({ label, value, delta, className }: StatCardProps) {\n return (\n <div className={cx(\"pui-stat\", className)}>\n <div className=\"pui-stat__label\">{label}</div>\n <div className=\"pui-stat__value\">{value}</div>\n {delta && (\n <div className=\"pui-stat__delta\" data-dir={delta.direction}>\n {delta.direction === \"up\" ? \"▲\" : \"▼\"} {delta.value}\n </div>\n )}\n </div>\n );\n}\n\n/* ---------------- Progress ---------------- */\nexport interface ProgressProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 0–100. Omit for an indeterminate bar. */\n value?: number;\n}\nexport function Progress({ value, className, ...props }: ProgressProps) {\n const indeterminate = value == null;\n return (\n <div\n className={cx(\"pui-progress\", className)}\n data-indeterminate={indeterminate || undefined}\n role=\"progressbar\"\n aria-valuenow={indeterminate ? undefined : value}\n aria-valuemin={0}\n aria-valuemax={100}\n {...props}\n >\n <div className=\"pui-progress__bar\" style={indeterminate ? undefined : { width: `${value}%` }} />\n </div>\n );\n}\n\n/* ---------------- Spinner ---------------- */\nexport function Spinner({ size = 30, className, style, ...props }: { size?: number } & React.HTMLAttributes<HTMLSpanElement>) {\n return <span role=\"status\" aria-label=\"Loading\" className={cx(\"pui-spinner\", className)} style={{ width: size, height: size, ...style }} {...props} />;\n}\n\n/* ---------------- Skeleton ---------------- */\nexport function Skeleton({ width, height = 11, className, style, ...props }: { width?: number | string; height?: number | string } & React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cx(\"pui-skeleton\", className)} style={{ width, height, ...style }} {...props} />;\n}\n\n/* ---------------- EmptyState ---------------- */\nexport interface EmptyStateProps {\n icon?: React.ReactNode;\n title: React.ReactNode;\n description?: React.ReactNode;\n action?: React.ReactNode;\n className?: string;\n}\nexport function EmptyState({ icon, title, description, action, className }: EmptyStateProps) {\n return (\n <div className={cx(\"pui-empty\", className)}>\n {icon && <span className=\"pui-empty__icon\">{icon}</span>}\n <div className=\"pui-empty__title\">{title}</div>\n {description && <div className=\"pui-empty__desc\">{description}</div>}\n {action && <div style={{ marginTop: 10 }}>{action}</div>}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cx } from \"../utils\";\nimport { ChevronDown } from \"../icons\";\n\ninterface AccordionContextValue {\n isOpen: (value: string) => boolean;\n toggle: (value: string) => void;\n}\nconst AccordionContext = React.createContext<AccordionContextValue | null>(null);\n\nexport interface AccordionProps {\n children: React.ReactNode;\n /** \"single\" (default) collapses others; \"multiple\" allows many open. */\n type?: \"single\" | \"multiple\";\n defaultValue?: string | string[];\n className?: string;\n}\n\n/**\n * Collapsible disclosure list.\n * @example\n * <Accordion defaultValue=\"a\">\n * <AccordionItem value=\"a\" title=\"How is usage metered?\">…</AccordionItem>\n * <AccordionItem value=\"b\" title=\"Can I rotate keys?\">…</AccordionItem>\n * </Accordion>\n */\nexport function Accordion({ children, type = \"single\", defaultValue, className }: AccordionProps) {\n const [open, setOpen] = React.useState<string[]>(\n defaultValue == null ? [] : Array.isArray(defaultValue) ? defaultValue : [defaultValue],\n );\n\n const value = React.useMemo<AccordionContextValue>(\n () => ({\n isOpen: (v) => open.includes(v),\n toggle: (v) =>\n setOpen((prev) => {\n const has = prev.includes(v);\n if (type === \"single\") return has ? [] : [v];\n return has ? prev.filter((x) => x !== v) : [...prev, v];\n }),\n }),\n [open, type],\n );\n\n return (\n <div className={cx(\"pui-accordion\", className)}>\n <AccordionContext.Provider value={value}>{children}</AccordionContext.Provider>\n </div>\n );\n}\n\nexport interface AccordionItemProps {\n value: string;\n title: React.ReactNode;\n children: React.ReactNode;\n}\nexport function AccordionItem({ value, title, children }: AccordionItemProps) {\n const ctx = React.useContext(AccordionContext);\n if (!ctx) throw new Error(\"AccordionItem must be used within <Accordion>\");\n const open = ctx.isOpen(value);\n return (\n <div className=\"pui-accordion__item\" data-open={open || undefined}>\n <button\n type=\"button\"\n className=\"pui-accordion__trigger\"\n aria-expanded={open}\n onClick={() => ctx.toggle(value)}\n >\n {title}\n <ChevronDown className=\"pui-accordion__chevron\" />\n </button>\n {open && <div className=\"pui-accordion__panel\">{children}</div>}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cx } from \"../utils\";\n\ninterface TabsContextValue {\n value: string;\n setValue: (v: string) => void;\n}\nconst TabsContext = React.createContext<TabsContextValue | null>(null);\n\nexport interface TabsProps {\n children: React.ReactNode;\n defaultValue: string;\n value?: string;\n onValueChange?: (v: string) => void;\n className?: string;\n}\n\n/**\n * Underline tab set.\n * @example\n * <Tabs defaultValue=\"overview\">\n * <TabList>\n * <Tab value=\"overview\">Overview</Tab>\n * <Tab value=\"activity\">Activity</Tab>\n * </TabList>\n * <TabPanel value=\"overview\">…</TabPanel>\n * <TabPanel value=\"activity\">…</TabPanel>\n * </Tabs>\n */\nexport function Tabs({ children, defaultValue, value, onValueChange, className }: TabsProps) {\n const [internal, setInternal] = React.useState(defaultValue);\n const current = value ?? internal;\n const setValue = (v: string) => {\n if (value === undefined) setInternal(v);\n onValueChange?.(v);\n };\n return (\n <TabsContext.Provider value={{ value: current, setValue }}>\n <div className={className}>{children}</div>\n </TabsContext.Provider>\n );\n}\n\nfunction useTabs(component: string) {\n const ctx = React.useContext(TabsContext);\n if (!ctx) throw new Error(`${component} must be used within <Tabs>`);\n return ctx;\n}\n\nexport function TabList({ children, className }: { children: React.ReactNode; className?: string }) {\n return (\n <div role=\"tablist\" className={cx(\"pui-tabs__list\", className)}>\n {children}\n </div>\n );\n}\n\nexport function Tab({ value, children }: { value: string; children: React.ReactNode }) {\n const ctx = useTabs(\"Tab\");\n const active = ctx.value === value;\n return (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n data-active={active || undefined}\n className=\"pui-tabs__tab\"\n onClick={() => ctx.setValue(value)}\n >\n {children}\n </button>\n );\n}\n\nexport function TabPanel({ value, children, className }: { value: string; children: React.ReactNode; className?: string }) {\n const ctx = useTabs(\"TabPanel\");\n if (ctx.value !== value) return null;\n return (\n <div role=\"tabpanel\" className={cx(\"pui-tabs__panel\", className)}>\n {children}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cx } from \"../utils\";\nimport { ChevronRight, ChevronLeft } from \"../icons\";\n\n/* ============================================================\n Breadcrumbs\n ============================================================ */\nexport interface Crumb {\n label: React.ReactNode;\n href?: string;\n}\nexport function Breadcrumbs({ items, className }: { items: Crumb[]; className?: string }) {\n return (\n <nav aria-label=\"Breadcrumb\" className={cx(\"pui-breadcrumbs\", className)}>\n {items.map((c, i) => {\n const last = i === items.length - 1;\n return (\n <React.Fragment key={i}>\n {last || !c.href ? (\n <span className={last ? \"pui-breadcrumbs__current\" : undefined} aria-current={last ? \"page\" : undefined}>\n {c.label}\n </span>\n ) : (\n <a href={c.href}>{c.label}</a>\n )}\n {!last && <ChevronRight className=\"pui-breadcrumbs__sep\" />}\n </React.Fragment>\n );\n })}\n </nav>\n );\n}\n\n/* ============================================================\n Pagination\n ============================================================ */\nexport interface PaginationProps {\n page: number;\n count: number;\n onChange: (page: number) => void;\n /** How many sibling pages to show around the current one. Default 1. */\n siblings?: number;\n className?: string;\n}\n\nfunction range(start: number, end: number) {\n return Array.from({ length: end - start + 1 }, (_, i) => start + i);\n}\n\nexport function Pagination({ page, count, onChange, siblings = 1, className }: PaginationProps) {\n const pages = React.useMemo<(number | \"…\")[]>(() => {\n const total = count;\n const left = Math.max(2, page - siblings);\n const right = Math.min(total - 1, page + siblings);\n const out: (number | \"…\")[] = [1];\n if (left > 2) out.push(\"…\");\n out.push(...range(left, right));\n if (right < total - 1) out.push(\"…\");\n if (total > 1) out.push(total);\n return out.filter((v, i, a) => v !== a[i - 1]);\n }, [page, count, siblings]);\n\n return (\n <nav className={cx(\"pui-pagination\", className)} aria-label=\"Pagination\">\n <button className=\"pui-pagination__btn\" disabled={page <= 1} onClick={() => onChange(page - 1)}>\n <ChevronLeft />\n Prev\n </button>\n {pages.map((p, i) =>\n p === \"…\" ? (\n <span key={`e${i}`} className=\"pui-pagination__ellipsis\">\n …\n </span>\n ) : (\n <button\n key={p}\n className=\"pui-pagination__btn\"\n data-active={p === page || undefined}\n aria-current={p === page ? \"page\" : undefined}\n onClick={() => onChange(p)}\n >\n {p}\n </button>\n ),\n )}\n <button className=\"pui-pagination__btn\" disabled={page >= count} onClick={() => onChange(page + 1)}>\n Next\n <ChevronRight />\n </button>\n </nav>\n );\n}\n\n/* ============================================================\n Segmented control\n ============================================================ */\nexport interface SegmentedProps {\n options: Array<{ label: React.ReactNode; value: string }>;\n value: string;\n onValueChange: (value: string) => void;\n className?: string;\n}\nexport function Segmented({ options, value, onValueChange, className }: SegmentedProps) {\n return (\n <div className={cx(\"pui-segmented\", className)} role=\"tablist\">\n {options.map((o) => (\n <button\n key={o.value}\n type=\"button\"\n role=\"tab\"\n aria-selected={value === o.value}\n data-active={value === o.value || undefined}\n className=\"pui-segmented__btn\"\n onClick={() => onValueChange(o.value)}\n >\n {o.label}\n </button>\n ))}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cx } from \"../utils\";\nimport { Sort } from \"../icons\";\n\nexport interface Column<T> {\n key: string;\n header: React.ReactNode;\n /** Cell renderer. Receives the row. */\n cell: (row: T) => React.ReactNode;\n sortable?: boolean;\n /** Comparator used when this column is sorted. */\n sortValue?: (row: T) => string | number;\n width?: string;\n align?: \"left\" | \"right\" | \"center\";\n}\n\nexport interface TableProps<T> {\n columns: Column<T>[];\n data: T[];\n rowKey: (row: T, index: number) => React.Key;\n className?: string;\n}\n\n/**\n * Data-driven table with optional client-side sorting.\n * @example\n * <Table rowKey={(r) => r.id} data={members} columns={[\n * { key: \"name\", header: \"Member\", cell: (r) => r.name, sortable: true, sortValue: (r) => r.name },\n * { key: \"role\", header: \"Role\", cell: (r) => r.role },\n * ]} />\n */\nexport function Table<T>({ columns, data, rowKey, className }: TableProps<T>) {\n const [sort, setSort] = React.useState<{ key: string; dir: \"asc\" | \"desc\" } | null>(null);\n\n const sorted = React.useMemo(() => {\n if (!sort) return data;\n const col = columns.find((c) => c.key === sort.key);\n if (!col?.sortValue) return data;\n const next = [...data].sort((a, b) => {\n const va = col.sortValue!(a);\n const vb = col.sortValue!(b);\n if (va < vb) return sort.dir === \"asc\" ? -1 : 1;\n if (va > vb) return sort.dir === \"asc\" ? 1 : -1;\n return 0;\n });\n return next;\n }, [data, columns, sort]);\n\n const onSort = (col: Column<T>) => {\n if (!col.sortable) return;\n setSort((prev) =>\n prev?.key === col.key\n ? { key: col.key, dir: prev.dir === \"asc\" ? \"desc\" : \"asc\" }\n : { key: col.key, dir: \"asc\" },\n );\n };\n\n return (\n <div className={cx(\"pui-table-wrap\", className)}>\n <table className=\"pui-table\">\n <thead>\n <tr>\n {columns.map((col) => (\n <th\n key={col.key}\n data-sortable={col.sortable || undefined}\n onClick={() => onSort(col)}\n style={{ width: col.width, textAlign: col.align }}\n >\n {col.sortable ? (\n <span className=\"pui-table__sort\">\n {col.header}\n <Sort style={{ width: 13, height: 13 }} />\n </span>\n ) : (\n col.header\n )}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {sorted.map((row, i) => (\n <tr key={rowKey(row, i)}>\n {columns.map((col) => (\n <td key={col.key} style={{ textAlign: col.align }}>\n {col.cell(row)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cx } from \"../utils\";\nimport { Info, CheckCircle, AlertTriangle, XCircle, X } from \"../icons\";\n\nexport type AlertTone = \"info\" | \"success\" | \"warning\" | \"danger\";\n\nconst ICONS: Record<AlertTone, React.ComponentType<React.SVGProps<SVGSVGElement>>> = {\n info: Info,\n success: CheckCircle,\n warning: AlertTriangle,\n danger: XCircle,\n};\n\nexport interface AlertProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n tone?: AlertTone;\n title?: React.ReactNode;\n onDismiss?: () => void;\n}\n\n/** Inline banner for four intents. */\nexport function Alert({ tone = \"info\", title, onDismiss, className, children, ...props }: AlertProps) {\n const Icon = ICONS[tone];\n return (\n <div className={cx(\"pui-alert\", className)} data-tone={tone === \"info\" ? undefined : tone} role=\"alert\" {...props}>\n <Icon className=\"pui-alert__icon\" />\n <div style={{ flex: 1 }}>\n {title && <div className=\"pui-alert__title\">{title}</div>}\n {children && <div className=\"pui-alert__body\">{children}</div>}\n </div>\n {onDismiss && (\n <button type=\"button\" className=\"pui-alert__close\" aria-label=\"Dismiss\" onClick={onDismiss}>\n <X style={{ width: 16, height: 16 }} />\n </button>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { CheckCircle, XCircle, Info, X } from \"../icons\";\n\nexport type ToastTone = \"info\" | \"success\" | \"danger\";\n\nexport interface ToastOptions {\n title: React.ReactNode;\n description?: React.ReactNode;\n tone?: ToastTone;\n /** Auto-dismiss after this many ms. Default 4500. 0 = sticky. */\n duration?: number;\n}\n\ninterface ToastItem extends ToastOptions {\n id: number;\n}\n\ninterface ToastContextValue {\n toast: (opts: ToastOptions) => number;\n dismiss: (id: number) => void;\n}\n\nconst ToastContext = React.createContext<ToastContextValue | null>(null);\n\nconst ICONS = { info: Info, success: CheckCircle, danger: XCircle };\n\n/** Wrap your app once; call notifications with the `useToast()` hook. */\nexport function ToastProvider({ children }: { children: React.ReactNode }) {\n const [items, setItems] = React.useState<ToastItem[]>([]);\n const timers = React.useRef<Record<number, ReturnType<typeof setTimeout>>>({});\n\n const dismiss = React.useCallback((id: number) => {\n setItems((prev) => prev.filter((t) => t.id !== id));\n if (timers.current[id]) {\n clearTimeout(timers.current[id]);\n delete timers.current[id];\n }\n }, []);\n\n const toast = React.useCallback(\n (opts: ToastOptions) => {\n const id = Date.now() + Math.random();\n setItems((prev) => [...prev, { id, ...opts }]);\n const duration = opts.duration ?? 4500;\n if (duration > 0) timers.current[id] = setTimeout(() => dismiss(id), duration);\n return id;\n },\n [dismiss],\n );\n\n React.useEffect(() => () => Object.values(timers.current).forEach(clearTimeout), []);\n\n return (\n <ToastContext.Provider value={{ toast, dismiss }}>\n {children}\n <div className=\"pui-toast-region\" role=\"region\" aria-label=\"Notifications\">\n {items.map((t) => {\n const Icon = ICONS[t.tone ?? \"info\"];\n return (\n <div key={t.id} className=\"pui-toast\">\n <span className=\"pui-toast__icon\" data-tone={t.tone ?? \"info\"}>\n <Icon />\n </span>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div className=\"pui-toast__title\">{t.title}</div>\n {t.description && <div className=\"pui-toast__desc\">{t.description}</div>}\n </div>\n <button className=\"pui-toast__close\" aria-label=\"Dismiss\" onClick={() => dismiss(t.id)}>\n <X style={{ width: 15, height: 15 }} />\n </button>\n </div>\n );\n })}\n </div>\n </ToastContext.Provider>\n );\n}\n\nexport function useToast(): ToastContextValue {\n const ctx = React.useContext(ToastContext);\n if (!ctx) throw new Error(\"useToast must be used within a <ToastProvider>\");\n return ctx;\n}\n","import * as React from \"react\";\nimport { cx } from \"../utils\";\nimport { X } from \"../icons\";\n\n/* ============================================================\n Tooltip\n ============================================================ */\nexport interface TooltipProps {\n label: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n}\n/** Hover/focus tooltip. Wraps a single focusable child. */\nexport function Tooltip({ label, children, className }: TooltipProps) {\n return (\n <span className={cx(\"pui-tooltip\", className)}>\n {children}\n <span role=\"tooltip\" className=\"pui-tooltip__bubble\">\n {label}\n </span>\n </span>\n );\n}\n\n/* ============================================================\n Hook: close on outside click / Escape\n ============================================================ */\nfunction useDismiss(open: boolean, onClose: () => void) {\n const ref = React.useRef<HTMLDivElement>(null);\n React.useEffect(() => {\n if (!open) return;\n const onClick = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) onClose();\n };\n const onKey = (e: KeyboardEvent) => e.key === \"Escape\" && onClose();\n document.addEventListener(\"mousedown\", onClick);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"mousedown\", onClick);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [open, onClose]);\n return ref;\n}\n\n/* ============================================================\n DropdownMenu\n ============================================================ */\nexport interface MenuItem {\n label: React.ReactNode;\n icon?: React.ReactNode;\n onSelect?: () => void;\n tone?: \"default\" | \"danger\";\n}\nexport interface DropdownMenuProps {\n trigger: React.ReactNode;\n children?: React.ReactNode;\n items?: MenuItem[];\n align?: \"start\" | \"end\";\n className?: string;\n}\n/**\n * Click-to-open menu. Provide `items` for a simple list, or `children`\n * for custom content. Closes on outside click and Escape.\n */\nexport function DropdownMenu({ trigger, children, items, align = \"start\", className }: DropdownMenuProps) {\n const [open, setOpen] = React.useState(false);\n const ref = useDismiss(open, () => setOpen(false));\n return (\n <div className={cx(\"pui-menu\", className)} ref={ref}>\n <span onClick={() => setOpen((o) => !o)}>{trigger}</span>\n {open && (\n <div className=\"pui-menu__panel\" data-align={align} role=\"menu\">\n {items\n ? items.map((item, i) => (\n <button\n key={i}\n type=\"button\"\n role=\"menuitem\"\n className=\"pui-menu__item\"\n data-tone={item.tone === \"danger\" ? \"danger\" : undefined}\n onClick={() => {\n item.onSelect?.();\n setOpen(false);\n }}\n >\n {item.icon}\n {item.label}\n </button>\n ))\n : children}\n </div>\n )}\n </div>\n );\n}\n\nexport function MenuSeparator() {\n return <div className=\"pui-menu__sep\" />;\n}\n\n/* ============================================================\n Modal\n ============================================================ */\nexport interface ModalProps {\n open: boolean;\n onClose: () => void;\n title?: React.ReactNode;\n children?: React.ReactNode;\n footer?: React.ReactNode;\n /** Decorative icon shown beside the title. */\n icon?: React.ReactNode;\n}\n/** Overlay dialog. Closes on backdrop click and Escape. */\nexport function Modal({ open, onClose, title, children, footer, icon }: ModalProps) {\n React.useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => e.key === \"Escape\" && onClose();\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [open, onClose]);\n\n if (!open) return null;\n return (\n <div className=\"pui-overlay\" onClick={onClose}>\n <div className=\"pui-dialog\" role=\"dialog\" aria-modal=\"true\" onClick={(e) => e.stopPropagation()}>\n <div className=\"pui-dialog__head\">\n <div style={{ display: \"flex\", gap: 13, alignItems: \"flex-start\" }}>\n {icon}\n {title && <div className=\"pui-dialog__title\">{title}</div>}\n </div>\n <button type=\"button\" className=\"pui-dialog__close\" aria-label=\"Close\" onClick={onClose}>\n <X style={{ width: 20, height: 20 }} />\n </button>\n </div>\n {children && <div className=\"pui-dialog__body\">{children}</div>}\n {footer && <div className=\"pui-dialog__footer\">{footer}</div>}\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cx } from \"../utils\";\nimport { X, Check } from \"../icons\";\n\n/* ============================================================\n Separator\n ============================================================ */\nexport interface SeparatorProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: \"horizontal\" | \"vertical\";\n}\nexport function Separator({ orientation = \"horizontal\", className, ...props }: SeparatorProps) {\n return (\n <div\n role=\"separator\"\n aria-orientation={orientation}\n data-orientation={orientation}\n className={cx(\"pui-separator\", className)}\n {...props}\n />\n );\n}\n\n/* ============================================================\n Kbd\n ============================================================ */\nexport function Kbd({ children, className }: { children: React.ReactNode; className?: string }) {\n return <kbd className={cx(\"pui-kbd\", className)}>{children}</kbd>;\n}\n\n/* ============================================================\n Link\n ============================================================ */\nexport interface LinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n external?: boolean;\n}\nexport function Link({ external, className, children, ...props }: LinkProps) {\n return (\n <a\n className={cx(\"pui-link\", className)}\n {...(external ? { target: \"_blank\", rel: \"noreferrer\" } : {})}\n {...props}\n >\n {children}\n </a>\n );\n}\n\n/* ============================================================\n close-on-outside-click / Escape hook\n ============================================================ */\nfunction useDismiss(open: boolean, onClose: () => void) {\n const ref = React.useRef<HTMLDivElement>(null);\n React.useEffect(() => {\n if (!open) return;\n const onClick = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) onClose();\n };\n const onKey = (e: KeyboardEvent) => e.key === \"Escape\" && onClose();\n document.addEventListener(\"mousedown\", onClick);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"mousedown\", onClick);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [open, onClose]);\n return ref;\n}\n\n/* ============================================================\n Popover\n ============================================================ */\nexport interface PopoverProps {\n trigger: React.ReactNode;\n children: React.ReactNode;\n align?: \"start\" | \"end\";\n className?: string;\n}\nexport function Popover({ trigger, children, align = \"start\", className }: PopoverProps) {\n const [open, setOpen] = React.useState(false);\n const ref = useDismiss(open, () => setOpen(false));\n return (\n <div className={cx(\"pui-menu\", className)} ref={ref}>\n <span onClick={() => setOpen((o) => !o)}>{trigger}</span>\n {open && (\n <div className=\"pui-popover\" data-align={align} role=\"dialog\">\n {children}\n </div>\n )}\n </div>\n );\n}\n\n/* ============================================================\n Drawer (side sheet)\n ============================================================ */\nexport interface DrawerProps {\n open: boolean;\n onClose: () => void;\n side?: \"left\" | \"right\";\n title?: React.ReactNode;\n children?: React.ReactNode;\n footer?: React.ReactNode;\n}\nexport function Drawer({ open, onClose, side = \"right\", title, children, footer }: DrawerProps) {\n React.useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => e.key === \"Escape\" && onClose();\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [open, onClose]);\n\n if (!open) return null;\n return (\n <div className=\"pui-drawer-overlay\" onClick={onClose}>\n <div className=\"pui-drawer\" data-side={side} role=\"dialog\" aria-modal=\"true\" onClick={(e) => e.stopPropagation()}>\n <div className=\"pui-drawer__head\">\n {title && <div className=\"pui-drawer__title\">{title}</div>}\n <button type=\"button\" className=\"pui-dialog__close\" aria-label=\"Close\" onClick={onClose}>\n <X style={{ width: 20, height: 20 }} />\n </button>\n </div>\n <div className=\"pui-drawer__body\">{children}</div>\n {footer && <div className=\"pui-drawer__footer\">{footer}</div>}\n </div>\n </div>\n );\n}\n\n/* ============================================================\n ToggleGroup (single-select)\n ============================================================ */\nexport interface ToggleOption {\n value: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n}\nexport interface ToggleGroupProps {\n options: ToggleOption[];\n value: string;\n onValueChange: (value: string) => void;\n className?: string;\n}\nexport function ToggleGroup({ options, value, onValueChange, className }: ToggleGroupProps) {\n return (\n <div className={cx(\"pui-toggle-group\", className)} role=\"group\">\n {options.map((o) => (\n <button\n key={o.value}\n type=\"button\"\n aria-pressed={value === o.value}\n data-active={value === o.value || undefined}\n className=\"pui-toggle\"\n onClick={() => onValueChange(o.value)}\n >\n {o.icon}\n {o.label}\n </button>\n ))}\n </div>\n );\n}\n\n/* ============================================================\n Stepper\n ============================================================ */\nexport interface Step {\n label: React.ReactNode;\n description?: React.ReactNode;\n}\nexport interface StepperProps {\n steps: Step[];\n /** Zero-based index of the active step. Earlier steps render as complete. */\n current: number;\n className?: string;\n}\nexport function Stepper({ steps, current, className }: StepperProps) {\n return (\n <ol className={cx(\"pui-stepper\", className)}>\n {steps.map((s, i) => {\n const state = i < current ? \"done\" : i === current ? \"current\" : \"upcoming\";\n return (\n <li key={i} className=\"pui-step\" data-state={state}>\n <span className=\"pui-step__marker\">{i < current ? <Check /> : i + 1}</span>\n <span className=\"pui-step__body\">\n <span className=\"pui-step__label\">{s.label}</span>\n {s.description && <span className=\"pui-step__desc\">{s.description}</span>}\n </span>\n </li>\n );\n })}\n </ol>\n );\n}\n\n/* ============================================================\n CodeBlock\n ============================================================ */\nexport interface CodeBlockProps {\n code: string;\n filename?: React.ReactNode;\n className?: string;\n}\nexport function CodeBlock({ code, filename, className }: CodeBlockProps) {\n return (\n <div className={cx(\"pui-code\", className)}>\n {filename && <div className=\"pui-code__bar\">{filename}</div>}\n <pre className=\"pui-code__pre\">\n <code>{code}</code>\n </pre>\n </div>\n );\n}\n\n/* ============================================================\n List / ListItem\n ============================================================ */\nexport function List({ children, className }: { children: React.ReactNode; className?: string }) {\n return <ul className={cx(\"pui-list\", className)}>{children}</ul>;\n}\nexport function ListItem({ children, className, ...props }: React.LiHTMLAttributes<HTMLLIElement>) {\n return (\n <li className={cx(\"pui-list-item\", className)} {...props}>\n {children}\n </li>\n );\n}\n"],"mappings":"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","names":["import_jsx_runtime","React","import_jsx_runtime","Button","React","import_jsx_runtime","Input","SearchInput","Textarea","Select","Checkbox","Switch","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","ICONS","React","import_jsx_runtime","React","import_jsx_runtime","useDismiss"]}
@@ -0,0 +1,453 @@
1
+ import * as React from 'react';
2
+
3
+ type Theme = "light" | "dark";
4
+ interface ThemeContextValue {
5
+ theme: Theme;
6
+ setTheme: (t: Theme) => void;
7
+ toggle: () => void;
8
+ }
9
+ interface ThemeProviderProps {
10
+ children: React.ReactNode;
11
+ /** Initial theme when nothing is stored. Default "light". */
12
+ defaultTheme?: Theme;
13
+ /** localStorage key for persistence. Default "pui-theme". Pass null to disable. */
14
+ storageKey?: string | null;
15
+ /** Element to stamp `data-theme` on. Default document.documentElement. */
16
+ attributeTarget?: "html" | "self";
17
+ }
18
+ /**
19
+ * Wrap your app once. Sets `data-theme` on <html> (or a wrapper div) and
20
+ * persists the choice. Read/control via the `useTheme()` hook.
21
+ */
22
+ declare function ThemeProvider({ children, defaultTheme, storageKey, attributeTarget, }: ThemeProviderProps): React.JSX.Element;
23
+ declare function useTheme(): ThemeContextValue;
24
+ /** Drop-in icon button that flips the theme. */
25
+ declare function ThemeToggle({ className, ...props }: React.ButtonHTMLAttributes<HTMLButtonElement>): React.JSX.Element;
26
+
27
+ /** Tiny classNames helper — joins truthy class fragments. */
28
+ declare function cx(...parts: Array<string | false | null | undefined>): string;
29
+ /** Derive up-to-two-letter initials from a full name. */
30
+ declare function initials(name: string): string;
31
+
32
+ type IconProps = React.SVGProps<SVGSVGElement>;
33
+ declare const ChevronDown: ({ className, ...props }: IconProps) => React.JSX.Element;
34
+ declare const ChevronRight: ({ className, ...props }: IconProps) => React.JSX.Element;
35
+ declare const ChevronLeft: ({ className, ...props }: IconProps) => React.JSX.Element;
36
+ declare const Check: ({ className, ...props }: IconProps) => React.JSX.Element;
37
+ declare const X: ({ className, ...props }: IconProps) => React.JSX.Element;
38
+ declare const Search: ({ className, ...props }: IconProps) => React.JSX.Element;
39
+ declare const Plus: ({ className, ...props }: IconProps) => React.JSX.Element;
40
+ declare const Sun: ({ className, ...props }: IconProps) => React.JSX.Element;
41
+ declare const Moon: ({ className, ...props }: IconProps) => React.JSX.Element;
42
+ declare const Info: ({ className, ...props }: IconProps) => React.JSX.Element;
43
+ declare const AlertTriangle: ({ className, ...props }: IconProps) => React.JSX.Element;
44
+ declare const CheckCircle: ({ className, ...props }: IconProps) => React.JSX.Element;
45
+ declare const XCircle: ({ className, ...props }: IconProps) => React.JSX.Element;
46
+ declare const ArrowRight: ({ className, ...props }: IconProps) => React.JSX.Element;
47
+ declare const Sort: ({ className, ...props }: IconProps) => React.JSX.Element;
48
+ declare function DotsVertical({ className, ...props }: IconProps): React.JSX.Element;
49
+
50
+ declare const icons_AlertTriangle: typeof AlertTriangle;
51
+ declare const icons_ArrowRight: typeof ArrowRight;
52
+ declare const icons_Check: typeof Check;
53
+ declare const icons_CheckCircle: typeof CheckCircle;
54
+ declare const icons_ChevronDown: typeof ChevronDown;
55
+ declare const icons_ChevronLeft: typeof ChevronLeft;
56
+ declare const icons_ChevronRight: typeof ChevronRight;
57
+ declare const icons_DotsVertical: typeof DotsVertical;
58
+ declare const icons_Info: typeof Info;
59
+ declare const icons_Moon: typeof Moon;
60
+ declare const icons_Plus: typeof Plus;
61
+ declare const icons_Search: typeof Search;
62
+ declare const icons_Sort: typeof Sort;
63
+ declare const icons_Sun: typeof Sun;
64
+ declare const icons_X: typeof X;
65
+ declare const icons_XCircle: typeof XCircle;
66
+ declare namespace icons {
67
+ export { icons_AlertTriangle as AlertTriangle, icons_ArrowRight as ArrowRight, icons_Check as Check, icons_CheckCircle as CheckCircle, icons_ChevronDown as ChevronDown, icons_ChevronLeft as ChevronLeft, icons_ChevronRight as ChevronRight, icons_DotsVertical as DotsVertical, icons_Info as Info, icons_Moon as Moon, icons_Plus as Plus, icons_Search as Search, icons_Sort as Sort, icons_Sun as Sun, icons_X as X, icons_XCircle as XCircle };
68
+ }
69
+
70
+ type ButtonVariant = "primary" | "secondary" | "outline" | "ghost" | "danger";
71
+ type ButtonSize = "sm" | "md" | "lg";
72
+ interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
73
+ variant?: ButtonVariant;
74
+ size?: ButtonSize;
75
+ /** Renders a spinner and disables the button. */
76
+ loading?: boolean;
77
+ /** Icon-only square button. Pass an icon as the single child. */
78
+ iconOnly?: boolean;
79
+ /** Stretch to full container width. */
80
+ block?: boolean;
81
+ leftIcon?: React.ReactNode;
82
+ rightIcon?: React.ReactNode;
83
+ }
84
+ /**
85
+ * The primary action element. Five variants, three sizes, loading + icon support.
86
+ *
87
+ * @example
88
+ * <Button variant="primary" leftIcon={<Plus/>}>Create key</Button>
89
+ */
90
+ declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
91
+
92
+ interface FieldProps {
93
+ label?: React.ReactNode;
94
+ hint?: React.ReactNode;
95
+ error?: React.ReactNode;
96
+ htmlFor?: string;
97
+ children: React.ReactNode;
98
+ className?: string;
99
+ style?: React.CSSProperties;
100
+ }
101
+ /** Labelled wrapper: renders label, control, and hint/error text. */
102
+ declare function Field({ label, hint, error, htmlFor, children, className, style }: FieldProps): React.JSX.Element;
103
+ interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {
104
+ invalid?: boolean;
105
+ }
106
+ declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<HTMLInputElement>>;
107
+ /** Input with a leading search glyph. */
108
+ declare const SearchInput: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<HTMLInputElement>>;
109
+ interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {
110
+ invalid?: boolean;
111
+ }
112
+ declare const Textarea: React.ForwardRefExoticComponent<TextareaProps & React.RefAttributes<HTMLTextAreaElement>>;
113
+ interface SelectProps extends React.SelectHTMLAttributes<HTMLSelectElement> {
114
+ options?: Array<{
115
+ label: string;
116
+ value: string;
117
+ }>;
118
+ }
119
+ declare const Select: React.ForwardRefExoticComponent<SelectProps & React.RefAttributes<HTMLSelectElement>>;
120
+ interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "type"> {
121
+ label?: React.ReactNode;
122
+ }
123
+ declare const Checkbox: React.ForwardRefExoticComponent<CheckboxProps & React.RefAttributes<HTMLInputElement>>;
124
+ interface SwitchProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "type"> {
125
+ }
126
+ declare const Switch: React.ForwardRefExoticComponent<SwitchProps & React.RefAttributes<HTMLInputElement>>;
127
+ interface RadioOption {
128
+ value: string;
129
+ title: React.ReactNode;
130
+ description?: React.ReactNode;
131
+ }
132
+ interface RadioGroupProps {
133
+ name: string;
134
+ value: string;
135
+ onValueChange: (value: string) => void;
136
+ options: RadioOption[];
137
+ className?: string;
138
+ }
139
+ /** Card-style radio group. Controlled via `value` / `onValueChange`. */
140
+ declare function RadioGroup({ name, value, onValueChange, options, className }: RadioGroupProps): React.JSX.Element;
141
+ interface SliderProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "type" | "value" | "onChange"> {
142
+ value: number;
143
+ min?: number;
144
+ max?: number;
145
+ onValueChange: (value: number) => void;
146
+ }
147
+ declare function Slider({ value, min, max, onValueChange, className, ...props }: SliderProps): React.JSX.Element;
148
+
149
+ type Tone = "neutral" | "green" | "amber" | "red" | "blue" | "accent";
150
+ interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
151
+ tone?: Tone;
152
+ solid?: boolean;
153
+ dot?: boolean;
154
+ }
155
+ declare function Badge({ tone, solid, dot, className, children, ...props }: BadgeProps): React.JSX.Element;
156
+ interface TagProps extends React.HTMLAttributes<HTMLSpanElement> {
157
+ onRemove?: () => void;
158
+ }
159
+ declare function Tag({ onRemove, className, children, ...props }: TagProps): React.JSX.Element;
160
+ type AvatarSize = "sm" | "md" | "lg";
161
+ interface AvatarProps extends React.HTMLAttributes<HTMLSpanElement> {
162
+ name: string;
163
+ src?: string;
164
+ size?: AvatarSize;
165
+ tone?: "accent" | "blue" | "green" | "amber";
166
+ status?: "online" | "busy" | "away";
167
+ }
168
+ declare function Avatar({ name, src, size, tone, status, className, ...props }: AvatarProps): React.JSX.Element;
169
+ interface AvatarGroupProps {
170
+ /** Avatar elements. */
171
+ children: React.ReactNode;
172
+ /** Show at most this many, collapsing the rest into a "+N". */
173
+ max?: number;
174
+ size?: AvatarSize;
175
+ className?: string;
176
+ }
177
+ declare function AvatarGroup({ children, max, size, className }: AvatarGroupProps): React.JSX.Element;
178
+ interface CardProps extends React.HTMLAttributes<HTMLDivElement> {
179
+ padded?: boolean;
180
+ }
181
+ declare function Card({ padded, className, children, ...props }: CardProps): React.JSX.Element;
182
+ interface StatCardProps {
183
+ label: React.ReactNode;
184
+ value: React.ReactNode;
185
+ delta?: {
186
+ value: React.ReactNode;
187
+ direction: "up" | "down";
188
+ };
189
+ className?: string;
190
+ }
191
+ declare function StatCard({ label, value, delta, className }: StatCardProps): React.JSX.Element;
192
+ interface ProgressProps extends React.HTMLAttributes<HTMLDivElement> {
193
+ /** 0–100. Omit for an indeterminate bar. */
194
+ value?: number;
195
+ }
196
+ declare function Progress({ value, className, ...props }: ProgressProps): React.JSX.Element;
197
+ declare function Spinner({ size, className, style, ...props }: {
198
+ size?: number;
199
+ } & React.HTMLAttributes<HTMLSpanElement>): React.JSX.Element;
200
+ declare function Skeleton({ width, height, className, style, ...props }: {
201
+ width?: number | string;
202
+ height?: number | string;
203
+ } & React.HTMLAttributes<HTMLDivElement>): React.JSX.Element;
204
+ interface EmptyStateProps {
205
+ icon?: React.ReactNode;
206
+ title: React.ReactNode;
207
+ description?: React.ReactNode;
208
+ action?: React.ReactNode;
209
+ className?: string;
210
+ }
211
+ declare function EmptyState({ icon, title, description, action, className }: EmptyStateProps): React.JSX.Element;
212
+
213
+ interface AccordionProps {
214
+ children: React.ReactNode;
215
+ /** "single" (default) collapses others; "multiple" allows many open. */
216
+ type?: "single" | "multiple";
217
+ defaultValue?: string | string[];
218
+ className?: string;
219
+ }
220
+ /**
221
+ * Collapsible disclosure list.
222
+ * @example
223
+ * <Accordion defaultValue="a">
224
+ * <AccordionItem value="a" title="How is usage metered?">…</AccordionItem>
225
+ * <AccordionItem value="b" title="Can I rotate keys?">…</AccordionItem>
226
+ * </Accordion>
227
+ */
228
+ declare function Accordion({ children, type, defaultValue, className }: AccordionProps): React.JSX.Element;
229
+ interface AccordionItemProps {
230
+ value: string;
231
+ title: React.ReactNode;
232
+ children: React.ReactNode;
233
+ }
234
+ declare function AccordionItem({ value, title, children }: AccordionItemProps): React.JSX.Element;
235
+
236
+ interface TabsProps {
237
+ children: React.ReactNode;
238
+ defaultValue: string;
239
+ value?: string;
240
+ onValueChange?: (v: string) => void;
241
+ className?: string;
242
+ }
243
+ /**
244
+ * Underline tab set.
245
+ * @example
246
+ * <Tabs defaultValue="overview">
247
+ * <TabList>
248
+ * <Tab value="overview">Overview</Tab>
249
+ * <Tab value="activity">Activity</Tab>
250
+ * </TabList>
251
+ * <TabPanel value="overview">…</TabPanel>
252
+ * <TabPanel value="activity">…</TabPanel>
253
+ * </Tabs>
254
+ */
255
+ declare function Tabs({ children, defaultValue, value, onValueChange, className }: TabsProps): React.JSX.Element;
256
+ declare function TabList({ children, className }: {
257
+ children: React.ReactNode;
258
+ className?: string;
259
+ }): React.JSX.Element;
260
+ declare function Tab({ value, children }: {
261
+ value: string;
262
+ children: React.ReactNode;
263
+ }): React.JSX.Element;
264
+ declare function TabPanel({ value, children, className }: {
265
+ value: string;
266
+ children: React.ReactNode;
267
+ className?: string;
268
+ }): React.JSX.Element | null;
269
+
270
+ interface Crumb {
271
+ label: React.ReactNode;
272
+ href?: string;
273
+ }
274
+ declare function Breadcrumbs({ items, className }: {
275
+ items: Crumb[];
276
+ className?: string;
277
+ }): React.JSX.Element;
278
+ interface PaginationProps {
279
+ page: number;
280
+ count: number;
281
+ onChange: (page: number) => void;
282
+ /** How many sibling pages to show around the current one. Default 1. */
283
+ siblings?: number;
284
+ className?: string;
285
+ }
286
+ declare function Pagination({ page, count, onChange, siblings, className }: PaginationProps): React.JSX.Element;
287
+ interface SegmentedProps {
288
+ options: Array<{
289
+ label: React.ReactNode;
290
+ value: string;
291
+ }>;
292
+ value: string;
293
+ onValueChange: (value: string) => void;
294
+ className?: string;
295
+ }
296
+ declare function Segmented({ options, value, onValueChange, className }: SegmentedProps): React.JSX.Element;
297
+
298
+ interface Column<T> {
299
+ key: string;
300
+ header: React.ReactNode;
301
+ /** Cell renderer. Receives the row. */
302
+ cell: (row: T) => React.ReactNode;
303
+ sortable?: boolean;
304
+ /** Comparator used when this column is sorted. */
305
+ sortValue?: (row: T) => string | number;
306
+ width?: string;
307
+ align?: "left" | "right" | "center";
308
+ }
309
+ interface TableProps<T> {
310
+ columns: Column<T>[];
311
+ data: T[];
312
+ rowKey: (row: T, index: number) => React.Key;
313
+ className?: string;
314
+ }
315
+ /**
316
+ * Data-driven table with optional client-side sorting.
317
+ * @example
318
+ * <Table rowKey={(r) => r.id} data={members} columns={[
319
+ * { key: "name", header: "Member", cell: (r) => r.name, sortable: true, sortValue: (r) => r.name },
320
+ * { key: "role", header: "Role", cell: (r) => r.role },
321
+ * ]} />
322
+ */
323
+ declare function Table<T>({ columns, data, rowKey, className }: TableProps<T>): React.JSX.Element;
324
+
325
+ type AlertTone = "info" | "success" | "warning" | "danger";
326
+ interface AlertProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title"> {
327
+ tone?: AlertTone;
328
+ title?: React.ReactNode;
329
+ onDismiss?: () => void;
330
+ }
331
+ /** Inline banner for four intents. */
332
+ declare function Alert({ tone, title, onDismiss, className, children, ...props }: AlertProps): React.JSX.Element;
333
+
334
+ type ToastTone = "info" | "success" | "danger";
335
+ interface ToastOptions {
336
+ title: React.ReactNode;
337
+ description?: React.ReactNode;
338
+ tone?: ToastTone;
339
+ /** Auto-dismiss after this many ms. Default 4500. 0 = sticky. */
340
+ duration?: number;
341
+ }
342
+ interface ToastContextValue {
343
+ toast: (opts: ToastOptions) => number;
344
+ dismiss: (id: number) => void;
345
+ }
346
+ /** Wrap your app once; call notifications with the `useToast()` hook. */
347
+ declare function ToastProvider({ children }: {
348
+ children: React.ReactNode;
349
+ }): React.JSX.Element;
350
+ declare function useToast(): ToastContextValue;
351
+
352
+ interface TooltipProps {
353
+ label: React.ReactNode;
354
+ children: React.ReactNode;
355
+ className?: string;
356
+ }
357
+ /** Hover/focus tooltip. Wraps a single focusable child. */
358
+ declare function Tooltip({ label, children, className }: TooltipProps): React.JSX.Element;
359
+ interface MenuItem {
360
+ label: React.ReactNode;
361
+ icon?: React.ReactNode;
362
+ onSelect?: () => void;
363
+ tone?: "default" | "danger";
364
+ }
365
+ interface DropdownMenuProps {
366
+ trigger: React.ReactNode;
367
+ children?: React.ReactNode;
368
+ items?: MenuItem[];
369
+ align?: "start" | "end";
370
+ className?: string;
371
+ }
372
+ /**
373
+ * Click-to-open menu. Provide `items` for a simple list, or `children`
374
+ * for custom content. Closes on outside click and Escape.
375
+ */
376
+ declare function DropdownMenu({ trigger, children, items, align, className }: DropdownMenuProps): React.JSX.Element;
377
+ declare function MenuSeparator(): React.JSX.Element;
378
+ interface ModalProps {
379
+ open: boolean;
380
+ onClose: () => void;
381
+ title?: React.ReactNode;
382
+ children?: React.ReactNode;
383
+ footer?: React.ReactNode;
384
+ /** Decorative icon shown beside the title. */
385
+ icon?: React.ReactNode;
386
+ }
387
+ /** Overlay dialog. Closes on backdrop click and Escape. */
388
+ declare function Modal({ open, onClose, title, children, footer, icon }: ModalProps): React.JSX.Element | null;
389
+
390
+ interface SeparatorProps extends React.HTMLAttributes<HTMLDivElement> {
391
+ orientation?: "horizontal" | "vertical";
392
+ }
393
+ declare function Separator({ orientation, className, ...props }: SeparatorProps): React.JSX.Element;
394
+ declare function Kbd({ children, className }: {
395
+ children: React.ReactNode;
396
+ className?: string;
397
+ }): React.JSX.Element;
398
+ interface LinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
399
+ external?: boolean;
400
+ }
401
+ declare function Link({ external, className, children, ...props }: LinkProps): React.JSX.Element;
402
+ interface PopoverProps {
403
+ trigger: React.ReactNode;
404
+ children: React.ReactNode;
405
+ align?: "start" | "end";
406
+ className?: string;
407
+ }
408
+ declare function Popover({ trigger, children, align, className }: PopoverProps): React.JSX.Element;
409
+ interface DrawerProps {
410
+ open: boolean;
411
+ onClose: () => void;
412
+ side?: "left" | "right";
413
+ title?: React.ReactNode;
414
+ children?: React.ReactNode;
415
+ footer?: React.ReactNode;
416
+ }
417
+ declare function Drawer({ open, onClose, side, title, children, footer }: DrawerProps): React.JSX.Element | null;
418
+ interface ToggleOption {
419
+ value: string;
420
+ label: React.ReactNode;
421
+ icon?: React.ReactNode;
422
+ }
423
+ interface ToggleGroupProps {
424
+ options: ToggleOption[];
425
+ value: string;
426
+ onValueChange: (value: string) => void;
427
+ className?: string;
428
+ }
429
+ declare function ToggleGroup({ options, value, onValueChange, className }: ToggleGroupProps): React.JSX.Element;
430
+ interface Step {
431
+ label: React.ReactNode;
432
+ description?: React.ReactNode;
433
+ }
434
+ interface StepperProps {
435
+ steps: Step[];
436
+ /** Zero-based index of the active step. Earlier steps render as complete. */
437
+ current: number;
438
+ className?: string;
439
+ }
440
+ declare function Stepper({ steps, current, className }: StepperProps): React.JSX.Element;
441
+ interface CodeBlockProps {
442
+ code: string;
443
+ filename?: React.ReactNode;
444
+ className?: string;
445
+ }
446
+ declare function CodeBlock({ code, filename, className }: CodeBlockProps): React.JSX.Element;
447
+ declare function List({ children, className }: {
448
+ children: React.ReactNode;
449
+ className?: string;
450
+ }): React.JSX.Element;
451
+ declare function ListItem({ children, className, ...props }: React.LiHTMLAttributes<HTMLLIElement>): React.JSX.Element;
452
+
453
+ export { Accordion, AccordionItem, type AccordionItemProps, type AccordionProps, Alert, type AlertProps, type AlertTone, Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, type AvatarSize, Badge, type BadgeProps, Breadcrumbs, Button, type ButtonProps, type ButtonSize, type ButtonVariant, Card, type CardProps, Checkbox, type CheckboxProps, CodeBlock, type CodeBlockProps, type Column, type Crumb, Drawer, type DrawerProps, DropdownMenu, type DropdownMenuProps, EmptyState, type EmptyStateProps, Field, type FieldProps, icons as Icons, Input, type InputProps, Kbd, Link, type LinkProps, List, ListItem, type MenuItem, MenuSeparator, Modal, type ModalProps, Pagination, type PaginationProps, Popover, type PopoverProps, Progress, type ProgressProps, RadioGroup, type RadioGroupProps, type RadioOption, SearchInput, Segmented, type SegmentedProps, Select, type SelectProps, Separator, type SeparatorProps, Skeleton, Slider, type SliderProps, Spinner, StatCard, type StatCardProps, type Step, Stepper, type StepperProps, Switch, type SwitchProps, Tab, TabList, TabPanel, Table, type TableProps, Tabs, type TabsProps, Tag, type TagProps, Textarea, type TextareaProps, type Theme, ThemeProvider, type ThemeProviderProps, ThemeToggle, type ToastOptions, ToastProvider, type ToastTone, ToggleGroup, type ToggleGroupProps, type ToggleOption, type Tone, Tooltip, type TooltipProps, cx, initials, useTheme, useToast };