@sypra-ui/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.
- package/LICENSE +21 -0
- package/README.md +84 -0
- package/dist/index.d.ts +286 -0
- package/dist/index.js +1554 -0
- package/dist/index.js.map +1 -0
- package/package.json +64 -0
- package/src/styles.css +70 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts","../src/components/forms.tsx","../src/components/display.tsx","../src/components/dialog.tsx","../src/components/overlays.tsx","../src/components/navigation.tsx","../src/components/feedback.tsx","../src/components/layout.tsx","../src/components/tables.tsx","../src/components/utilities.tsx"],"sourcesContent":["export const cn = (...values: Array<string | false | null | undefined>) =>\n values.filter(Boolean).join(' ');\n","import type {\n ButtonHTMLAttributes,\n ComponentPropsWithoutRef,\n InputHTMLAttributes,\n SelectHTMLAttributes,\n} from 'react';\nimport { cn } from '../lib/utils';\n\nconst buttonStyles = {\n primary:\n 'bg-[hsl(var(--rui-primary))] text-[hsl(var(--rui-primary-foreground))] hover:opacity-90',\n secondary:\n 'bg-[hsl(var(--rui-secondary))] text-[hsl(var(--rui-secondary-foreground))] hover:opacity-80',\n outline:\n 'border border-[hsl(var(--rui-border))] bg-transparent hover:bg-[hsl(var(--rui-accent))]',\n ghost: 'bg-transparent hover:bg-[hsl(var(--rui-accent))]',\n destructive:\n 'bg-[hsl(var(--rui-destructive))] text-[hsl(var(--rui-destructive-foreground))] hover:opacity-90',\n} as const;\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: keyof typeof buttonStyles;\n size?: 'sm' | 'md' | 'lg';\n loading?: boolean;\n}\nexport function Button({\n variant = 'primary',\n size = 'md',\n loading,\n className,\n children,\n disabled,\n ...props\n}: ButtonProps) {\n const padding =\n size === 'sm'\n ? 'h-8 px-3 text-sm'\n : size === 'lg'\n ? 'h-11 px-5 text-base'\n : 'h-10 px-4 text-sm';\n return (\n <button\n className={cn(\n 'rui-focus inline-flex items-center justify-center gap-2 rounded-[var(--rui-radius)] font-medium transition disabled:pointer-events-none disabled:opacity-50',\n padding,\n buttonStyles[variant],\n className,\n )}\n disabled={disabled || loading}\n aria-busy={loading}\n {...props}\n >\n {loading && (\n <span className=\"size-4 animate-spin rounded-full border-2 border-current border-r-transparent\" />\n )}{' '}\n {children}\n </button>\n );\n}\nexport function IconButton({\n children,\n 'aria-label': label,\n className,\n ...props\n}: ButtonProps) {\n return (\n <Button\n className={cn('size-10 px-0', className)}\n aria-label={label}\n {...props}\n >\n {children}\n </Button>\n );\n}\nexport const Input = ({\n className,\n ...props\n}: InputHTMLAttributes<HTMLInputElement>) => (\n <input\n className={cn(\n 'rui-focus h-10 w-full rounded-[var(--rui-radius)] border border-[hsl(var(--rui-input))] bg-transparent px-3 text-sm placeholder:text-[hsl(var(--rui-muted-foreground))] disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n);\nexport const Textarea = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'textarea'>) => (\n <textarea\n className={cn(\n 'rui-focus min-h-24 w-full rounded-[var(--rui-radius)] border border-[hsl(var(--rui-input))] bg-transparent px-3 py-2 text-sm placeholder:text-[hsl(var(--rui-muted-foreground))] disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n);\nexport const Label = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'label'>) => (\n <label\n className={cn('mb-1.5 block text-sm font-medium', className)}\n {...props}\n />\n);\nexport const Checkbox = ({\n className,\n ...props\n}: InputHTMLAttributes<HTMLInputElement>) => (\n <input\n type=\"checkbox\"\n className={cn(\n 'rui-focus size-4 accent-[hsl(var(--rui-primary))]',\n className,\n )}\n {...props}\n />\n);\nexport const Radio = ({\n className,\n ...props\n}: InputHTMLAttributes<HTMLInputElement>) => (\n <input\n type=\"radio\"\n className={cn(\n 'rui-focus size-4 accent-[hsl(var(--rui-primary))]',\n className,\n )}\n {...props}\n />\n);\nexport const Switch = ({\n checked,\n onChange,\n disabled,\n className,\n ...props\n}: Omit<InputHTMLAttributes<HTMLInputElement>, 'type'>) => (\n <label\n className={cn(\n 'inline-flex cursor-pointer items-center',\n disabled && 'cursor-not-allowed opacity-50',\n className,\n )}\n >\n <input\n type=\"checkbox\"\n className=\"peer sr-only\"\n checked={checked}\n onChange={onChange}\n disabled={disabled}\n {...props}\n />\n <span className=\"rui-focus h-6 w-11 rounded-full bg-[hsl(var(--rui-muted))] p-0.5 transition peer-checked:bg-[hsl(var(--rui-primary))]\">\n <span className=\"block size-5 rounded-full bg-[hsl(var(--rui-switch-thumb))] transition peer-checked:translate-x-5\" />\n </span>\n </label>\n);\nexport const Select = ({\n className,\n children,\n ...props\n}: SelectHTMLAttributes<HTMLSelectElement>) => (\n <select\n className={cn(\n 'rui-focus h-10 w-full rounded-[var(--rui-radius)] border border-[hsl(var(--rui-input))] bg-[hsl(var(--rui-background))] px-3 text-sm',\n className,\n )}\n {...props}\n >\n {children}\n </select>\n);\n","import type { ComponentPropsWithoutRef, ReactNode } from 'react';\nimport { cn } from '../lib/utils';\n\ntype ChildrenProps = { children?: ReactNode; className?: string };\nexport function Card({\n className,\n ...props\n}: ComponentPropsWithoutRef<'section'>) {\n return (\n <section\n className={cn(\n 'rounded-[calc(var(--rui-radius)+.15rem)] border border-[hsl(var(--rui-border))] bg-[hsl(var(--rui-card))] p-5 shadow-sm',\n className,\n )}\n {...props}\n />\n );\n}\nexport function CardHeader({\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'>) {\n return (\n <div\n className={cn('mb-4 flex items-start justify-between gap-3', className)}\n {...props}\n />\n );\n}\nexport function CardTitle({\n className,\n ...props\n}: ComponentPropsWithoutRef<'h3'>) {\n return (\n <h3 className={cn('font-semibold leading-none', className)} {...props} />\n );\n}\nexport function CardDescription({\n className,\n ...props\n}: ComponentPropsWithoutRef<'p'>) {\n return (\n <p\n className={cn(\n 'mt-1 text-sm text-[hsl(var(--rui-muted-foreground))]',\n className,\n )}\n {...props}\n />\n );\n}\nexport function Badge({\n className,\n variant = 'default',\n ...props\n}: ChildrenProps & {\n variant?: 'default' | 'success' | 'warning' | 'destructive' | 'outline';\n}) {\n const variants = {\n default: 'bg-[hsl(var(--rui-secondary))]',\n success:\n 'bg-[hsl(var(--rui-success-background))] text-[hsl(var(--rui-success-foreground))]',\n warning:\n 'bg-[hsl(var(--rui-warning-background))] text-[hsl(var(--rui-warning-foreground))]',\n destructive:\n 'bg-[hsl(var(--rui-destructive-background))] text-[hsl(var(--rui-destructive-text))]',\n outline: 'border border-[hsl(var(--rui-border))]',\n };\n return (\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium',\n variants[variant],\n className,\n )}\n >\n {props.children}\n </span>\n );\n}\nexport function Avatar({\n src,\n alt = '',\n fallback,\n className,\n}: {\n src?: string;\n alt?: string;\n fallback?: ReactNode;\n className?: string;\n}) {\n return (\n <span\n className={cn(\n 'inline-flex size-9 shrink-0 items-center justify-center overflow-hidden rounded-full bg-[hsl(var(--rui-muted))] text-sm font-medium',\n className,\n )}\n >\n {src ? (\n <img className=\"size-full object-cover\" src={src} alt={alt} />\n ) : (\n (fallback ?? alt.slice(0, 2).toUpperCase())\n )}\n </span>\n );\n}\nexport const Separator = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'>) => (\n <div\n role=\"separator\"\n className={cn('h-px w-full bg-[hsl(var(--rui-border))]', className)}\n {...props}\n />\n);\nexport const Skeleton = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'>) => (\n <div\n className={cn(\n 'animate-pulse rounded bg-[hsl(var(--rui-muted))]',\n className,\n )}\n {...props}\n />\n);\nexport function Progress({\n value,\n max = 100,\n label,\n className,\n}: {\n value: number;\n max?: number;\n label?: string;\n className?: string;\n}) {\n const percent = Math.max(0, Math.min(100, (value / max) * 100));\n return (\n <div\n className={className}\n role=\"progressbar\"\n aria-label={label}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={value}\n >\n <div className=\"h-2 overflow-hidden rounded-full bg-[hsl(var(--rui-muted))]\">\n <div\n className=\"h-full rounded-full bg-[hsl(var(--rui-primary))] transition-all\"\n style={{ width: `${percent}%` }}\n />\n </div>\n </div>\n );\n}\n","'use client';\n\nimport {\n cloneElement,\n createContext,\n isValidElement,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { Button } from './forms';\nimport { cn } from '../lib/utils';\n\ntype ChildrenProps = { children?: ReactNode; className?: string };\n\ntype DialogState = { open: boolean; setOpen: (open: boolean) => void };\nconst DialogContext = createContext<DialogState | null>(null);\nconst DialogTitleContext = createContext<string | undefined>(undefined);\nconst useDialog = () => {\n const value = useContext(DialogContext);\n if (!value) throw new Error('Dialog components must be inside Dialog');\n return value;\n};\nexport function Dialog({\n open: controlled,\n defaultOpen = false,\n onOpenChange,\n children,\n}: {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n children: ReactNode;\n}) {\n const [uncontrolled, setUncontrolled] = useState(defaultOpen);\n const open = controlled ?? uncontrolled;\n const setOpen = useCallback(\n (next: boolean) => {\n if (controlled === undefined) setUncontrolled(next);\n onOpenChange?.(next);\n },\n [controlled, onOpenChange],\n );\n return (\n <DialogContext.Provider value={{ open, setOpen }}>\n {children}\n </DialogContext.Provider>\n );\n}\nexport function DialogTrigger({\n children,\n asChild = false,\n}: {\n children: ReactNode;\n asChild?: boolean;\n}) {\n const { setOpen } = useDialog();\n if (asChild && isValidElement<{ onClick?: () => void }>(children))\n return cloneElement(children, {\n onClick: () => {\n children.props.onClick?.();\n setOpen(true);\n },\n });\n return <Button onClick={() => setOpen(true)}>{children}</Button>;\n}\nexport function DialogClose({\n children,\n asChild = false,\n}: {\n children: ReactNode;\n asChild?: boolean;\n}) {\n const { setOpen } = useDialog();\n if (asChild && isValidElement<{ onClick?: () => void }>(children))\n return cloneElement(children, {\n onClick: () => {\n children.props.onClick?.();\n setOpen(false);\n },\n });\n return (\n <Button variant=\"ghost\" onClick={() => setOpen(false)}>\n {children}\n </Button>\n );\n}\nexport function DialogContent({\n children,\n className,\n movable = false,\n constrainToViewport = true,\n style,\n ...props\n}: ChildrenProps & {\n movable?: boolean;\n constrainToViewport?: boolean;\n style?: CSSProperties;\n}) {\n const { open, setOpen } = useDialog();\n const panel = useRef<HTMLDivElement>(null);\n const previousFocus = useRef<HTMLElement | null>(null);\n const [drag, setDrag] = useState<{ x: number; y: number } | null>(null);\n const [offset, setOffset] = useState({ x: 0, y: 0 });\n const titleId = useId();\n useEffect(() => {\n if (!open) return;\n previousFocus.current = document.activeElement as HTMLElement;\n const timer = window.setTimeout(() => panel.current?.focus(), 0);\n const key = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setOpen(false);\n if (event.key === 'Tab' && panel.current) {\n const nodes = panel.current.querySelectorAll<HTMLElement>(\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\n );\n const first = nodes[0],\n last = nodes[nodes.length - 1];\n if (!first || !last) return;\n if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n }\n };\n document.addEventListener('keydown', key);\n return () => {\n window.clearTimeout(timer);\n document.removeEventListener('keydown', key);\n previousFocus.current?.focus();\n };\n }, [open, setOpen]);\n useEffect(() => {\n if (!drag) return;\n const move = (event: PointerEvent) => {\n let x = offset.x + event.clientX - drag.x;\n let y = offset.y + event.clientY - drag.y;\n if (constrainToViewport && panel.current) {\n const rect = panel.current.getBoundingClientRect();\n x = Math.min(\n Math.max(x, -rect.left + 12),\n window.innerWidth - rect.right - 12 + offset.x,\n );\n y = Math.min(\n Math.max(y, -rect.top + 12),\n window.innerHeight - rect.bottom - 12 + offset.y,\n );\n }\n setOffset({ x, y });\n };\n const up = () => setDrag(null);\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n return () => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', up);\n };\n }, [drag, offset, constrainToViewport]);\n if (!open || typeof document === 'undefined') return null;\n return createPortal(\n <div\n className=\"fixed inset-0 z-50 grid place-items-center p-4\"\n role=\"presentation\"\n >\n <button\n className=\"absolute inset-0 cursor-default bg-[hsl(var(--rui-overlay))]/50\"\n aria-label=\"Close dialog\"\n onClick={() => setOpen(false)}\n />\n <div\n ref={panel}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n tabIndex={-1}\n className={cn(\n 'relative z-10 max-h-[calc(100vh-2rem)] w-full max-w-lg overflow-auto rounded-[calc(var(--rui-radius)+.2rem)] bg-[hsl(var(--rui-card))] p-6 text-[hsl(var(--rui-foreground))] shadow-2xl outline-none',\n drag && 'select-none',\n className,\n )}\n style={{\n ...style,\n transform: `translate(${offset.x}px, ${offset.y}px)`,\n }}\n {...props}\n >\n {movable && (\n <div\n onPointerDown={(event) => {\n if (\n window.innerWidth < 640 ||\n (event.target as HTMLElement).closest(\n 'button,input,select,textarea,a,[role=button]',\n )\n )\n return;\n event.preventDefault();\n setDrag({ x: event.clientX, y: event.clientY });\n }}\n className=\"-mx-2 -mt-2 mb-3 cursor-grab touch-none rounded px-2 py-1 text-xs text-[hsl(var(--rui-muted-foreground))] active:cursor-grabbing\"\n >\n Drag to move\n </div>\n )}\n <DialogTitleContext.Provider value={titleId}>\n {children}\n </DialogTitleContext.Provider>\n </div>\n </div>,\n document.body,\n );\n}\nexport const DialogHeader = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'>) => (\n <div className={cn('mb-5 space-y-1.5', className)} {...props} />\n);\nexport const DialogTitle = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'h2'>) => {\n const id = useContext(DialogTitleContext);\n return (\n <h2 id={id} className={cn('text-lg font-semibold', className)} {...props} />\n );\n};\nexport const DialogDescription = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'p'>) => (\n <p\n className={cn('text-sm text-[hsl(var(--rui-muted-foreground))]', className)}\n {...props}\n />\n);\nexport const DialogBody = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'>) => (\n <div className={cn('space-y-4', className)} {...props} />\n);\nexport const DialogFooter = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'>) => (\n <div\n className={cn('mt-6 flex flex-wrap justify-end gap-2', className)}\n {...props}\n />\n);\nexport const AlertDialog = Dialog;\nexport const AlertDialogTrigger = DialogTrigger;\nexport const AlertDialogContent = DialogContent;\nexport const AlertDialogHeader = DialogHeader;\nexport const AlertDialogTitle = DialogTitle;\nexport const AlertDialogDescription = DialogDescription;\nexport const AlertDialogFooter = DialogFooter;\nexport const AlertDialogClose = DialogClose;\nexport function Sheet({\n children,\n ...props\n}: ComponentPropsWithoutRef<typeof Dialog>) {\n return <Dialog {...props}>{children}</Dialog>;\n}\nexport const SheetTrigger = DialogTrigger;\nexport const SheetClose = DialogClose;\nexport function SheetContent({\n className,\n ...props\n}: ComponentPropsWithoutRef<typeof DialogContent>) {\n return (\n <DialogContent\n className={cn('ml-auto h-full max-h-none rounded-r-none', className)}\n {...props}\n />\n );\n}\nexport const Drawer = Sheet;\nexport const DrawerTrigger = SheetTrigger;\nexport const DrawerContent = SheetContent;\n","'use client';\n\nimport {\n cloneElement,\n isValidElement,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport { cn } from '../lib/utils';\n\nexport function Popover({\n trigger,\n children,\n className,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n}: {\n trigger: ReactNode;\n children: ReactNode;\n className?: string;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n}) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const open = controlledOpen ?? uncontrolledOpen;\n const root = useRef<HTMLSpanElement>(null);\n const contentId = useId();\n const setOpen = useCallback(\n (next: boolean) => {\n if (controlledOpen === undefined) setUncontrolledOpen(next);\n onOpenChange?.(next);\n },\n [controlledOpen, onOpenChange],\n );\n useEffect(() => {\n if (!open) return;\n const dismiss = (event: PointerEvent) => {\n if (!root.current?.contains(event.target as Node)) setOpen(false);\n };\n const escape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setOpen(false);\n };\n document.addEventListener('pointerdown', dismiss);\n document.addEventListener('keydown', escape);\n return () => {\n document.removeEventListener('pointerdown', dismiss);\n document.removeEventListener('keydown', escape);\n };\n }, [open, setOpen]);\n const triggerProps = {\n 'aria-controls': contentId,\n 'aria-expanded': open,\n 'aria-haspopup': 'dialog' as const,\n onClick: () => setOpen(!open),\n };\n const triggerElement = isValidElement<{\n onClick?: () => void;\n 'aria-controls'?: string;\n 'aria-expanded'?: boolean;\n 'aria-haspopup'?: 'dialog';\n }>(trigger) ? (\n cloneElement(trigger, {\n ...triggerProps,\n onClick: () => {\n trigger.props.onClick?.();\n setOpen(!open);\n },\n })\n ) : (\n <button type=\"button\" {...triggerProps}>\n {trigger}\n </button>\n );\n return (\n <span ref={root} className=\"relative inline-block\">\n {triggerElement}\n {open && (\n <span\n id={contentId}\n role=\"dialog\"\n className={cn(\n 'absolute z-30 mt-2 block min-w-52 rounded-[var(--rui-radius)] border border-[hsl(var(--rui-border))] bg-[hsl(var(--rui-card))] p-3 shadow-lg',\n className,\n )}\n >\n {children}\n </span>\n )}\n </span>\n );\n}\nexport const Tooltip = ({\n content,\n children,\n className,\n}: {\n content: string;\n children: ReactNode;\n className?: string;\n}) => {\n const [visible, setVisible] = useState(false);\n const id = useId();\n return (\n <span\n className=\"relative inline-flex\"\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n onFocus={() => setVisible(true)}\n onBlur={() => setVisible(false)}\n aria-describedby={visible ? id : undefined}\n >\n {children}\n {visible && (\n <span\n id={id}\n role=\"tooltip\"\n className={cn(\n 'absolute bottom-full left-1/2 z-30 mb-2 w-max max-w-52 -translate-x-1/2 rounded bg-[hsl(var(--rui-tooltip))] px-2 py-1 text-xs text-[hsl(var(--rui-tooltip-foreground))] shadow',\n className,\n )}\n >\n {content}\n </span>\n )}\n </span>\n );\n};\nexport function DropdownMenu({\n trigger,\n children,\n}: {\n trigger: ReactNode;\n children: ReactNode;\n}) {\n return (\n <Popover trigger={trigger} className=\"right-0 p-1\">\n {children}\n </Popover>\n );\n}\nexport const DropdownMenuItem = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'button'>) => (\n <button\n className={cn(\n 'rui-focus block w-full rounded px-2 py-1.5 text-left text-sm hover:bg-[hsl(var(--rui-accent))]',\n className,\n )}\n {...props}\n />\n);\n","'use client';\n\nimport { useState, type ReactNode } from 'react';\nimport { Button, Select } from './forms';\nimport { cn } from '../lib/utils';\n\ntype ChildrenProps = { children?: ReactNode; className?: string };\n\nexport function Navbar({\n brand,\n children,\n className,\n label = 'Main navigation',\n}: {\n brand?: ReactNode;\n children?: ReactNode;\n className?: string;\n label?: string;\n}) {\n return (\n <nav\n aria-label={label}\n className={cn(\n 'flex min-h-14 items-center justify-between border-b border-[hsl(var(--rui-border))] px-4',\n className,\n )}\n >\n {brand}\n <div className=\"flex items-center gap-2\">{children}</div>\n </nav>\n );\n}\nexport function Sidebar({\n children,\n className,\n label = 'Sidebar',\n}: ChildrenProps & { label?: string }) {\n return (\n <aside\n aria-label={label}\n className={cn(\n 'w-60 shrink-0 border-r border-[hsl(var(--rui-border))] p-3',\n className,\n )}\n >\n {children}\n </aside>\n );\n}\nexport function MobileNav({\n children,\n className,\n label = 'Mobile navigation',\n}: ChildrenProps & { label?: string }) {\n return (\n <nav\n aria-label={label}\n className={cn(\n 'fixed inset-x-0 bottom-0 z-40 flex justify-around border-t border-[hsl(var(--rui-border))] bg-[hsl(var(--rui-card))] p-2 sm:hidden',\n className,\n )}\n >\n {children}\n </nav>\n );\n}\nexport function Breadcrumb({\n items,\n}: {\n items: Array<{ label: string; href?: string }>;\n}) {\n return (\n <nav aria-label=\"Breadcrumb\">\n <ol className=\"flex flex-wrap items-center gap-2 text-sm text-[hsl(var(--rui-muted-foreground))]\">\n {items.map((item, index) => (\n <li\n key={`${item.label}-${index}`}\n className=\"flex items-center gap-2\"\n >\n {index > 0 && <span aria-hidden>/</span>}\n {item.href ? (\n <a\n className=\"hover:text-[hsl(var(--rui-foreground))]\"\n href={item.href}\n >\n {item.label}\n </a>\n ) : (\n <span\n aria-current={index === items.length - 1 ? 'page' : undefined}\n >\n {item.label}\n </span>\n )}\n </li>\n ))}\n </ol>\n </nav>\n );\n}\nexport function Tabs({\n tabs,\n value,\n defaultValue,\n onValueChange,\n className,\n}: {\n tabs: Array<{\n value: string;\n label: ReactNode;\n content: ReactNode;\n disabled?: boolean;\n }>;\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n className?: string;\n}) {\n const [local, setLocal] = useState(defaultValue ?? tabs[0]?.value ?? '');\n const selected = value ?? local;\n const choose = (next: string) => {\n if (value === undefined) setLocal(next);\n onValueChange?.(next);\n };\n const active = tabs.find((tab) => tab.value === selected);\n return (\n <div className={className}>\n <div\n role=\"tablist\"\n className=\"flex gap-1 border-b border-[hsl(var(--rui-border))]\"\n >\n {tabs.map((tab) => (\n <button\n key={tab.value}\n role=\"tab\"\n aria-selected={tab.value === selected}\n disabled={tab.disabled}\n onClick={() => choose(tab.value)}\n className={cn(\n 'rui-focus border-b-2 px-3 py-2 text-sm font-medium transition',\n tab.value === selected\n ? 'border-[hsl(var(--rui-primary))]'\n : 'border-transparent text-[hsl(var(--rui-muted-foreground))]',\n )}\n >\n {tab.label}\n </button>\n ))}\n </div>\n <div role=\"tabpanel\" className=\"py-4\">\n {active?.content}\n </div>\n </div>\n );\n}\nexport function Accordion({\n items,\n type = 'single',\n}: {\n items: Array<{ value: string; title: ReactNode; content: ReactNode }>;\n type?: 'single' | 'multiple';\n}) {\n const [open, setOpen] = useState<string[]>([]);\n const toggle = (value: string) =>\n setOpen((current) =>\n current.includes(value)\n ? current.filter((item) => item !== value)\n : type === 'single'\n ? [value]\n : [...current, value],\n );\n return (\n <div className=\"divide-y divide-[hsl(var(--rui-border))]\">\n {items.map((item) => (\n <div key={item.value}>\n <button\n className=\"rui-focus flex w-full items-center justify-between py-3 text-left font-medium\"\n aria-expanded={open.includes(item.value)}\n onClick={() => toggle(item.value)}\n >\n {item.title}\n <span>{open.includes(item.value) ? '−' : '+'}</span>\n </button>\n {open.includes(item.value) && (\n <div className=\"pb-3 text-sm text-[hsl(var(--rui-muted-foreground))]\">\n {item.content}\n </div>\n )}\n </div>\n ))}\n </div>\n );\n}\nexport function Pagination({\n page,\n pageSize,\n total,\n onPageChange,\n onPageSizeChange,\n pageSizeOptions = [10, 20, 50],\n ariaLabel = 'Pagination',\n className,\n}: {\n page: number;\n pageSize: number;\n total: number;\n onPageChange: (page: number) => void;\n onPageSizeChange?: (size: number) => void;\n pageSizeOptions?: number[];\n ariaLabel?: string;\n className?: string;\n}) {\n const pages = Math.max(1, Math.ceil(total / pageSize));\n const visible = Array.from(\n { length: Math.min(pages, 5) },\n (_, i) => Math.max(1, Math.min(pages - 4, page - 3)) + i,\n );\n return (\n <nav\n aria-label={ariaLabel}\n className={cn('flex flex-wrap items-center gap-2', className)}\n >\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={page <= 1}\n onClick={() => onPageChange(page - 1)}\n >\n Previous\n </Button>\n {visible.map((number) => (\n <Button\n key={number}\n variant={number === page ? 'primary' : 'ghost'}\n size=\"sm\"\n aria-current={number === page ? 'page' : undefined}\n onClick={() => onPageChange(number)}\n >\n {number}\n </Button>\n ))}\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={page >= pages}\n onClick={() => onPageChange(page + 1)}\n >\n Next\n </Button>\n {onPageSizeChange && (\n <Select\n aria-label=\"Rows per page\"\n className=\"ml-auto w-auto\"\n value={pageSize}\n onChange={(event) => onPageSizeChange(Number(event.target.value))}\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size} / page\n </option>\n ))}\n </Select>\n )}\n </nav>\n );\n}\n","import { type ReactNode } from 'react';\nimport { Button } from './forms';\nimport { cn } from '../lib/utils';\n\nexport function Alert({\n title,\n children,\n variant = 'default',\n className,\n}: {\n title?: ReactNode;\n children?: ReactNode;\n variant?: 'default' | 'destructive' | 'success';\n className?: string;\n}) {\n const color =\n variant === 'destructive'\n ? 'border-[hsl(var(--rui-destructive))] bg-[hsl(var(--rui-destructive-background))] text-[hsl(var(--rui-destructive-text))]'\n : variant === 'success'\n ? 'border-[hsl(var(--rui-success))] bg-[hsl(var(--rui-success-background))] text-[hsl(var(--rui-success-foreground))]'\n : 'border-[hsl(var(--rui-border))] bg-[hsl(var(--rui-muted))]';\n return (\n <div\n role=\"alert\"\n className={cn(\n 'rounded-[var(--rui-radius)] border p-3 text-sm',\n color,\n className,\n )}\n >\n {title && <strong className=\"block\">{title}</strong>}\n {children}\n </div>\n );\n}\nexport function Toast({\n title,\n description,\n action,\n className,\n}: {\n title: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n className?: string;\n}) {\n return (\n <div\n role=\"status\"\n className={cn(\n 'flex max-w-sm items-start gap-4 rounded-[var(--rui-radius)] border border-[hsl(var(--rui-border))] bg-[hsl(var(--rui-card))] p-4 shadow-lg',\n className,\n )}\n >\n <div className=\"flex-1\">\n <strong className=\"text-sm\">{title}</strong>\n {description && (\n <p className=\"mt-1 text-sm text-[hsl(var(--rui-muted-foreground))]\">\n {description}\n </p>\n )}\n </div>\n {action}\n </div>\n );\n}\nexport const EmptyState = ({\n title = 'Nothing here yet',\n description,\n action,\n className,\n}: {\n title?: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n className?: string;\n}) => (\n <div\n className={cn(\n 'rounded-[var(--rui-radius)] border border-dashed border-[hsl(var(--rui-border))] p-10 text-center',\n className,\n )}\n >\n <h3 className=\"font-semibold\">{title}</h3>\n {description && (\n <p className=\"mt-1 text-sm text-[hsl(var(--rui-muted-foreground))]\">\n {description}\n </p>\n )}\n {action && <div className=\"mt-4\">{action}</div>}\n </div>\n);\nexport const ErrorState = ({\n title = 'Something went wrong',\n onRetry,\n className,\n}: {\n title?: ReactNode;\n onRetry?: () => void;\n className?: string;\n}) => (\n <Alert title={title} variant=\"destructive\" className={className}>\n {onRetry && (\n <Button variant=\"outline\" size=\"sm\" className=\"mt-3\" onClick={onRetry}>\n Try again\n </Button>\n )}\n </Alert>\n);\nexport const LoadingState = ({\n label = 'Loading',\n className,\n}: {\n label?: string;\n className?: string;\n}) => (\n <div\n role=\"status\"\n className={cn(\n 'flex items-center gap-2 p-4 text-sm text-[hsl(var(--rui-muted-foreground))]',\n className,\n )}\n >\n <span className=\"size-4 animate-spin rounded-full border-2 border-current border-r-transparent\" />\n {label}\n </div>\n);\n","import { type ComponentPropsWithoutRef, type ReactNode } from 'react';\nimport { cn } from '../lib/utils';\n\ntype ChildrenProps = { children?: ReactNode; className?: string };\n\nexport const PageShell = ({\n as: Component = 'main',\n className,\n ...props\n}: ComponentPropsWithoutRef<'main'> & { as?: 'main' | 'div' }) => (\n <Component\n className={cn(\n 'min-h-screen bg-[hsl(var(--rui-background))] text-[hsl(var(--rui-foreground))]',\n className,\n )}\n {...props}\n />\n);\nexport const PageHeader = ({\n as: Heading = 'h1',\n title,\n description,\n actions,\n className,\n}: {\n title: ReactNode;\n as?: 'h1' | 'h2' | 'h3';\n description?: ReactNode;\n actions?: ReactNode;\n className?: string;\n}) => (\n <header\n className={cn(\n 'flex flex-wrap items-start justify-between gap-4 border-b border-[hsl(var(--rui-border))] pb-5',\n className,\n )}\n >\n <div>\n <Heading className=\"text-2xl font-bold tracking-tight\">{title}</Heading>\n {description && (\n <p className=\"mt-1 text-sm text-[hsl(var(--rui-muted-foreground))]\">\n {description}\n </p>\n )}\n </div>\n {actions}\n </header>\n);\nexport const PageContent = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'>) => (\n <div className={cn('py-6', className)} {...props} />\n);\nexport const Section = ({\n title,\n description,\n children,\n className,\n}: ChildrenProps & { title?: ReactNode; description?: ReactNode }) => (\n <section className={cn('space-y-4', className)}>\n {title && (\n <div>\n <h2 className=\"font-semibold\">{title}</h2>\n {description && (\n <p className=\"mt-1 text-sm text-[hsl(var(--rui-muted-foreground))]\">\n {description}\n </p>\n )}\n </div>\n )}\n {children}\n </section>\n);\nexport const Stack = ({\n gap = 4,\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'> & { gap?: 1 | 2 | 3 | 4 | 6 | 8 }) => (\n <div\n className={cn(\n 'flex flex-col',\n {\n 1: 'gap-1',\n 2: 'gap-2',\n 3: 'gap-3',\n 4: 'gap-4',\n 6: 'gap-6',\n 8: 'gap-8',\n }[gap],\n className,\n )}\n {...props}\n />\n);\nexport const Container = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'div'>) => (\n <div\n className={cn('mx-auto w-full max-w-6xl px-4 sm:px-6', className)}\n {...props}\n />\n);\n","'use client';\n\nimport {\n useMemo,\n useState,\n type ComponentPropsWithoutRef,\n type ReactNode,\n type TableHTMLAttributes,\n} from 'react';\nimport { Input } from './forms';\nimport { EmptyState, ErrorState, LoadingState } from './feedback';\nimport { Pagination } from './navigation';\nimport { cn } from '../lib/utils';\n\nexport const Table = ({\n className,\n ...props\n}: TableHTMLAttributes<HTMLTableElement>) => (\n <div className=\"w-full overflow-x-auto\">\n <table className={cn('w-full text-left text-sm', className)} {...props} />\n </div>\n);\nexport const TableHeader = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'thead'>) => (\n <thead\n className={cn(\n 'border-b border-[hsl(var(--rui-border))] text-xs uppercase tracking-wide text-[hsl(var(--rui-muted-foreground))]',\n className,\n )}\n {...props}\n />\n);\nexport const TableBody = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'tbody'>) => (\n <tbody\n className={cn('divide-y divide-[hsl(var(--rui-border))]', className)}\n {...props}\n />\n);\nexport const TableFooter = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'tfoot'>) => (\n <tfoot\n className={cn('border-t border-[hsl(var(--rui-border))]', className)}\n {...props}\n />\n);\nexport const TableRow = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'tr'>) => (\n <tr\n className={cn('transition hover:bg-[hsl(var(--rui-muted))]/60', className)}\n {...props}\n />\n);\nexport const TableHead = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'th'>) => (\n <th\n scope=\"col\"\n className={cn('px-4 py-3 font-medium', className)}\n {...props}\n />\n);\nexport const TableCell = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'td'>) => (\n <td className={cn('px-4 py-3', className)} {...props} />\n);\nexport const TableCaption = ({\n className,\n ...props\n}: ComponentPropsWithoutRef<'caption'>) => (\n <caption\n className={cn(\n 'mt-3 text-left text-sm text-[hsl(var(--rui-muted-foreground))]',\n className,\n )}\n {...props}\n />\n);\nexport type DataColumn<T> = {\n key: keyof T | string;\n header: ReactNode;\n cell?: (row: T) => ReactNode;\n sortable?: boolean;\n className?: string;\n};\nexport type DataTablePagination = {\n page: number;\n pageSize: number;\n total: number;\n};\nexport function DataTable<T extends Record<string, unknown>>({\n data,\n columns,\n loading,\n error,\n pagination,\n onPageChange,\n onRowClick,\n emptyMessage = 'No results found.',\n className,\n}: {\n data: T[];\n columns: DataColumn<T>[];\n loading?: boolean;\n error?: ReactNode;\n pagination?: DataTablePagination;\n onPageChange?: (page: number) => void;\n onRowClick?: (row: T) => void;\n emptyMessage?: ReactNode;\n className?: string;\n}) {\n const [sort, setSort] = useState<{\n key: string;\n direction: 'asc' | 'desc';\n } | null>(null);\n const rows = useMemo(() => {\n if (!sort) return data;\n return [...data].sort((a, b) => {\n const result = String(a[sort.key] ?? '').localeCompare(\n String(b[sort.key] ?? ''),\n undefined,\n { numeric: true },\n );\n return sort.direction === 'asc' ? result : -result;\n });\n }, [data, sort]);\n const toggle = (column: DataColumn<T>) => {\n if (!column.sortable) return;\n const key = String(column.key);\n setSort((current) =>\n current?.key === key && current.direction === 'asc'\n ? { key, direction: 'desc' }\n : { key, direction: 'asc' },\n );\n };\n if (error) return <ErrorState title={error} />;\n return (\n <div className={className} aria-busy={loading}>\n {loading && <LoadingState label=\"Updating table…\" />}\n {!loading && !rows.length ? (\n <EmptyState title={emptyMessage} />\n ) : (\n <>\n <Table>\n <TableHeader>\n <TableRow>\n {columns.map((column) => (\n <TableHead\n key={String(column.key)}\n className={column.className}\n >\n {column.sortable ? (\n <button\n className=\"rui-focus inline-flex items-center gap-1\"\n onClick={() => toggle(column)}\n >\n {column.header}\n <span aria-hidden=\"true\">\n {sort?.key === String(column.key)\n ? sort.direction === 'asc'\n ? '↑'\n : '↓'\n : '↕'}\n </span>\n </button>\n ) : (\n column.header\n )}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((row, index) => (\n <TableRow\n key={String(row.id ?? index)}\n tabIndex={onRowClick ? 0 : undefined}\n onClick={() => onRowClick?.(row)}\n onKeyDown={(event) => {\n if (\n onRowClick &&\n (event.key === 'Enter' || event.key === ' ')\n )\n onRowClick(row);\n }}\n className={onRowClick ? 'cursor-pointer' : undefined}\n >\n {columns.map((column) => (\n <TableCell\n key={String(column.key)}\n className={column.className}\n >\n {column.cell\n ? column.cell(row)\n : String(row[column.key] ?? '')}\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n {pagination && onPageChange && (\n <Pagination\n className=\"mt-4\"\n {...pagination}\n ariaLabel=\"Table pagination\"\n onPageChange={onPageChange}\n />\n )}\n </>\n )}\n </div>\n );\n}\nexport function SearchableTable<T extends Record<string, unknown>>({\n data,\n columns,\n searchKeys,\n ...props\n}: Omit<ComponentPropsWithoutRef<typeof DataTable<T>>, 'data'> & {\n data: T[];\n columns: DataColumn<T>[];\n searchKeys: Array<keyof T>;\n}) {\n const [query, setQuery] = useState('');\n const filtered = data.filter((row) =>\n searchKeys.some((key) =>\n String(row[key] ?? '')\n .toLowerCase()\n .includes(query.toLowerCase()),\n ),\n );\n return (\n <div className=\"space-y-3\">\n <Input\n aria-label=\"Search table\"\n placeholder=\"Search…\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n />\n <DataTable data={filtered} columns={columns} {...props} />\n </div>\n );\n}\nexport const PaginatedTable = DataTable;\n","'use client';\n\nimport { createPortal } from 'react-dom';\nimport {\n useEffect,\n useId,\n useState,\n type InputHTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { Button, Input, Label } from './forms';\nimport { Dialog, DialogContent } from './dialog';\nimport { cn } from '../lib/utils';\n\nexport function Command({\n open,\n onOpenChange,\n items,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n items: Array<{ label: string; onSelect: () => void; keywords?: string[] }>;\n}) {\n const [query, setQuery] = useState('');\n useEffect(() => {\n const listener = (event: KeyboardEvent) => {\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'k') {\n event.preventDefault();\n onOpenChange(!open);\n }\n };\n window.addEventListener('keydown', listener);\n return () => window.removeEventListener('keydown', listener);\n }, [open, onOpenChange]);\n const matches = items.filter((item) =>\n `${item.label} ${item.keywords?.join(' ') ?? ''}`\n .toLowerCase()\n .includes(query.toLowerCase()),\n );\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-w-md p-3\">\n <Input\n autoFocus\n placeholder=\"Type a command…\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n />{' '}\n <div className=\"mt-2\">\n {matches.map((item) => (\n <button\n key={item.label}\n className=\"rui-focus block w-full rounded p-2 text-left text-sm hover:bg-[hsl(var(--rui-accent))]\"\n onClick={() => {\n item.onSelect();\n onOpenChange(false);\n }}\n >\n {item.label}\n </button>\n ))}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\nexport function ContextMenu({\n children,\n menu,\n}: {\n children: ReactNode;\n menu: ReactNode;\n}) {\n const [point, setPoint] = useState<{ x: number; y: number } | null>(null);\n useEffect(() => {\n if (!point) return;\n const close = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setPoint(null);\n };\n document.addEventListener('keydown', close);\n return () => document.removeEventListener('keydown', close);\n }, [point]);\n return (\n <div\n onContextMenu={(event) => {\n event.preventDefault();\n setPoint({\n x: Math.min(event.clientX, window.innerWidth - 180),\n y: Math.min(event.clientY, window.innerHeight - 120),\n });\n }}\n >\n {children}\n {point &&\n createPortal(\n <>\n <button\n className=\"fixed inset-0 z-40 cursor-default\"\n aria-label=\"Close context menu\"\n onClick={() => setPoint(null)}\n />\n <div\n role=\"menu\"\n className=\"fixed z-50 rounded border border-[hsl(var(--rui-border))] bg-[hsl(var(--rui-card))] p-1 shadow-lg\"\n style={{ left: point.x, top: point.y }}\n >\n {menu}\n </div>\n </>,\n document.body,\n )}\n </div>\n );\n}\nexport function CopyButton({\n value,\n children = 'Copy',\n onCopy,\n}: {\n value: string;\n children?: ReactNode;\n onCopy?: () => void;\n}) {\n const [copied, setCopied] = useState(false);\n return (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={async () => {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n onCopy?.();\n window.setTimeout(() => setCopied(false), 1500);\n }}\n >\n {copied ? 'Copied' : children}\n </Button>\n );\n}\nexport function PasswordInput({\n className,\n ...props\n}: InputHTMLAttributes<HTMLInputElement>) {\n const [visible, setVisible] = useState(false);\n return (\n <div className=\"relative\">\n <Input\n type={visible ? 'text' : 'password'}\n className={cn('pr-16', className)}\n {...props}\n />\n <button\n type=\"button\"\n className=\"rui-focus absolute right-2 top-2 text-xs text-[hsl(var(--rui-muted-foreground))]\"\n onClick={() => setVisible(!visible)}\n >\n {visible ? 'Hide' : 'Show'}\n </button>\n </div>\n );\n}\nexport function FileUpload({\n accept,\n multiple,\n onFiles,\n label = 'Choose files',\n}: {\n accept?: string;\n multiple?: boolean;\n onFiles: (files: File[]) => void;\n label?: string;\n}) {\n const id = useId();\n return (\n <div>\n <input\n id={id}\n className=\"sr-only\"\n type=\"file\"\n accept={accept}\n multiple={multiple}\n onChange={(event) => onFiles(Array.from(event.target.files ?? []))}\n />\n <Label\n htmlFor={id}\n className=\"cursor-pointer rounded-[var(--rui-radius)] border border-dashed border-[hsl(var(--rui-border))] p-6 text-center text-sm text-[hsl(var(--rui-muted-foreground))]\"\n >\n {label}\n </Label>\n </div>\n );\n}\n"],"mappings":"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","names":["jsx","jsx","jsxs","cloneElement","isValidElement","useCallback","useEffect","useId","useRef","useState","jsx","jsxs","useState","useRef","useId","useCallback","useEffect","isValidElement","cloneElement","useState","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","useState","jsx","jsxs","useState","createPortal","useEffect","useId","useState","Fragment","jsx","jsxs","useState","useEffect","createPortal","useId"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sypra-ui/ui",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Accessible, themeable React UI primitives.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/surya-mp/ui-components.git",
|
|
9
|
+
"directory": "ui"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/surya-mp/ui-components#readme",
|
|
12
|
+
"bugs": "https://github.com/surya-mp/ui-components/issues",
|
|
13
|
+
"keywords": [
|
|
14
|
+
"accessible",
|
|
15
|
+
"components",
|
|
16
|
+
"react",
|
|
17
|
+
"tailwindcss",
|
|
18
|
+
"typescript",
|
|
19
|
+
"ui"
|
|
20
|
+
],
|
|
21
|
+
"type": "module",
|
|
22
|
+
"sideEffects": [
|
|
23
|
+
"./src/styles.css"
|
|
24
|
+
],
|
|
25
|
+
"publishConfig": {
|
|
26
|
+
"access": "public"
|
|
27
|
+
},
|
|
28
|
+
"exports": {
|
|
29
|
+
".": {
|
|
30
|
+
"types": "./dist/index.d.ts",
|
|
31
|
+
"import": "./dist/index.js"
|
|
32
|
+
},
|
|
33
|
+
"./styles.css": "./src/styles.css"
|
|
34
|
+
},
|
|
35
|
+
"files": [
|
|
36
|
+
"dist",
|
|
37
|
+
"src/styles.css",
|
|
38
|
+
"README.md",
|
|
39
|
+
"LICENSE"
|
|
40
|
+
],
|
|
41
|
+
"peerDependencies": {
|
|
42
|
+
"react": ">=18",
|
|
43
|
+
"react-dom": ">=18"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@testing-library/react": "^16.1.0",
|
|
47
|
+
"@testing-library/jest-dom": "^6.6.3",
|
|
48
|
+
"@testing-library/user-event": "^14.5.2",
|
|
49
|
+
"@types/react": "^19.0.2",
|
|
50
|
+
"@types/react-dom": "^19.0.2",
|
|
51
|
+
"jsdom": "^25.0.1",
|
|
52
|
+
"react": "^19.0.0",
|
|
53
|
+
"react-dom": "^19.0.0",
|
|
54
|
+
"tsup": "^8.3.5",
|
|
55
|
+
"typescript": "^5.7.2",
|
|
56
|
+
"vitest": "^2.1.8"
|
|
57
|
+
},
|
|
58
|
+
"scripts": {
|
|
59
|
+
"build": "tsup src/index.tsx --format esm --dts --sourcemap --external react --external react-dom --clean",
|
|
60
|
+
"typecheck": "tsc --noEmit",
|
|
61
|
+
"test": "vitest run",
|
|
62
|
+
"lint": "eslint src && prettier --check src"
|
|
63
|
+
}
|
|
64
|
+
}
|
package/src/styles.css
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--rui-background: 0 0% 100%;
|
|
3
|
+
--rui-foreground: 222 47% 11%;
|
|
4
|
+
--rui-card: 0 0% 100%;
|
|
5
|
+
--rui-muted: 210 40% 96%;
|
|
6
|
+
--rui-muted-foreground: 215 16% 47%;
|
|
7
|
+
--rui-border: 214 32% 91%;
|
|
8
|
+
--rui-input: 214 32% 91%;
|
|
9
|
+
--rui-primary: 221 83% 45%;
|
|
10
|
+
--rui-primary-foreground: 210 40% 98%;
|
|
11
|
+
--rui-secondary: 210 40% 96%;
|
|
12
|
+
--rui-secondary-foreground: 222 47% 11%;
|
|
13
|
+
--rui-accent: 210 40% 96%;
|
|
14
|
+
--rui-accent-foreground: 222 47% 11%;
|
|
15
|
+
--rui-destructive: 0 72% 40%;
|
|
16
|
+
--rui-destructive-foreground: 210 40% 98%;
|
|
17
|
+
--rui-destructive-background: 0 86% 97%;
|
|
18
|
+
--rui-destructive-text: 0 72% 30%;
|
|
19
|
+
--rui-success: 142 71% 35%;
|
|
20
|
+
--rui-success-background: 138 76% 97%;
|
|
21
|
+
--rui-success-foreground: 142 72% 22%;
|
|
22
|
+
--rui-warning: 38 92% 40%;
|
|
23
|
+
--rui-warning-background: 48 96% 89%;
|
|
24
|
+
--rui-warning-foreground: 32 81% 29%;
|
|
25
|
+
--rui-overlay: 0 0% 0%;
|
|
26
|
+
--rui-tooltip: 222 47% 11%;
|
|
27
|
+
--rui-tooltip-foreground: 210 40% 98%;
|
|
28
|
+
--rui-switch-thumb: 0 0% 100%;
|
|
29
|
+
--rui-ring: 221 83% 53%;
|
|
30
|
+
--rui-radius: 0.65rem;
|
|
31
|
+
}
|
|
32
|
+
.rui-dark,
|
|
33
|
+
[data-theme='dark'] {
|
|
34
|
+
--rui-background: 222 47% 8%;
|
|
35
|
+
--rui-foreground: 210 40% 98%;
|
|
36
|
+
--rui-card: 222 47% 11%;
|
|
37
|
+
--rui-muted: 217 33% 17%;
|
|
38
|
+
--rui-muted-foreground: 215 20% 65%;
|
|
39
|
+
--rui-border: 217 33% 20%;
|
|
40
|
+
--rui-input: 217 33% 20%;
|
|
41
|
+
--rui-primary: 217 91% 60%;
|
|
42
|
+
--rui-primary-foreground: 222 47% 8%;
|
|
43
|
+
--rui-secondary: 217 33% 17%;
|
|
44
|
+
--rui-secondary-foreground: 210 40% 98%;
|
|
45
|
+
--rui-accent: 217 33% 17%;
|
|
46
|
+
--rui-accent-foreground: 210 40% 98%;
|
|
47
|
+
--rui-destructive: 0 63% 45%;
|
|
48
|
+
--rui-destructive-foreground: 210 40% 98%;
|
|
49
|
+
--rui-destructive-background: 0 52% 16%;
|
|
50
|
+
--rui-destructive-text: 0 93% 90%;
|
|
51
|
+
--rui-success: 142 71% 45%;
|
|
52
|
+
--rui-success-background: 142 45% 14%;
|
|
53
|
+
--rui-success-foreground: 142 70% 82%;
|
|
54
|
+
--rui-warning: 38 92% 50%;
|
|
55
|
+
--rui-warning-background: 36 45% 16%;
|
|
56
|
+
--rui-warning-foreground: 45 93% 81%;
|
|
57
|
+
--rui-overlay: 0 0% 0%;
|
|
58
|
+
--rui-tooltip: 210 40% 98%;
|
|
59
|
+
--rui-tooltip-foreground: 222 47% 11%;
|
|
60
|
+
--rui-switch-thumb: 210 40% 98%;
|
|
61
|
+
--rui-ring: 224 76% 58%;
|
|
62
|
+
}
|
|
63
|
+
.rui-root {
|
|
64
|
+
color: hsl(var(--rui-foreground));
|
|
65
|
+
background: hsl(var(--rui-background));
|
|
66
|
+
}
|
|
67
|
+
.rui-focus:focus-visible {
|
|
68
|
+
outline: 2px solid hsl(var(--rui-ring));
|
|
69
|
+
outline-offset: 2px;
|
|
70
|
+
}
|