@assassin1717/aifelib 1.0.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/README.md +739 -0
- package/dist/index.cjs +1534 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +342 -0
- package/dist/index.d.ts +342 -0
- package/dist/index.js +1458 -0
- package/dist/index.js.map +1 -0
- package/package.json +95 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/cn.ts","../src/components/button/button.tsx","../src/components/input/input.tsx","../src/components/textarea/textarea.tsx","../src/components/select/select.tsx","../src/components/checkbox/checkbox.tsx","../src/components/label/label.tsx","../src/components/form-field/form-field.tsx","../src/components/spinner/spinner.tsx","../src/components/badge/badge.tsx","../src/components/alert/alert.tsx","../src/components/card/card.tsx","../src/components/modal/modal.tsx","../src/components/confirm-dialog/confirm-dialog.tsx","../src/components/toast/toast.tsx","../src/components/toast/toast-context.tsx","../src/components/toast/use-toast.ts","../src/components/table/table.tsx","../src/components/table/table-toolbar.tsx","../src/components/table/table-empty-state.tsx","../src/components/page-header/page-header.tsx","../src/components/empty-state/empty-state.tsx","../src/components/app-shell/app-shell.tsx","../src/components/drawer/drawer.tsx","../src/components/sidebar/sidebar.tsx","../src/components/topbar/topbar.tsx","../src/components/tabs/tabs.tsx","../src/components/dropdown-menu/dropdown-menu.tsx","../src/components/pagination/pagination.tsx","../src/components/tooltip/tooltip.tsx"],"sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\nimport { Loader2 } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\nexport type ButtonVariant =\n | \"primary\"\n | \"secondary\"\n | \"ghost\"\n | \"destructive\"\n | \"outline\";\n\nexport type ButtonSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n loading?: boolean;\n fullWidth?: boolean;\n}\n\nconst variantClasses: Record<ButtonVariant, string> = {\n primary:\n \"bg-blue-600 text-white hover:bg-blue-700 active:bg-blue-800 focus-visible:ring-blue-500\",\n secondary:\n \"bg-gray-100 text-gray-900 hover:bg-gray-200 active:bg-gray-300 focus-visible:ring-gray-400\",\n ghost:\n \"bg-transparent text-gray-700 hover:bg-gray-100 active:bg-gray-200 focus-visible:ring-gray-400\",\n destructive:\n \"bg-red-600 text-white hover:bg-red-700 active:bg-red-800 focus-visible:ring-red-500\",\n outline:\n \"border border-gray-300 bg-white text-gray-700 hover:bg-gray-50 active:bg-gray-100 focus-visible:ring-gray-400\",\n};\n\nconst sizeClasses: Record<ButtonSize, string> = {\n sm: \"h-8 px-3 text-xs gap-1.5\",\n md: \"h-10 px-4 text-sm gap-2\",\n lg: \"h-12 px-5 text-base gap-2\",\n};\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant = \"primary\",\n size = \"md\",\n loading = false,\n fullWidth = false,\n disabled,\n children,\n ...props\n },\n ref\n ) => {\n const isDisabled = disabled || loading;\n\n return (\n <button\n ref={ref}\n disabled={isDisabled}\n aria-busy={loading}\n className={cn(\n // base\n \"inline-flex items-center justify-center rounded-md font-medium\",\n \"transition-colors duration-150\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2\",\n // disabled\n \"disabled:pointer-events-none disabled:opacity-50\",\n // touch target — mínimo 44px em mobile\n \"min-h-[2.75rem] sm:min-h-0\",\n variantClasses[variant],\n sizeClasses[size],\n fullWidth && \"w-full\",\n className\n )}\n {...props}\n >\n {loading && (\n <Loader2\n className=\"shrink-0 animate-spin\"\n size={size === \"sm\" ? 14 : size === \"lg\" ? 18 : 16}\n aria-hidden=\"true\"\n />\n )}\n {children}\n </button>\n );\n }\n);\n\nButton.displayName = \"Button\";\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {\n error?: boolean;\n startIcon?: React.ReactNode;\n endIcon?: React.ReactNode;\n}\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, error, startIcon, endIcon, ...props }, ref) => {\n if (startIcon || endIcon) {\n return (\n <div className=\"relative flex items-center\">\n {startIcon && (\n <span className=\"pointer-events-none absolute left-3 flex shrink-0 items-center text-gray-400\">\n {startIcon}\n </span>\n )}\n <input\n ref={ref}\n className={cn(\n inputBase,\n error && inputError,\n startIcon && \"pl-9\",\n endIcon && \"pr-9\",\n className\n )}\n aria-invalid={error ? true : undefined}\n {...props}\n />\n {endIcon && (\n <span className=\"pointer-events-none absolute right-3 flex shrink-0 items-center text-gray-400\">\n {endIcon}\n </span>\n )}\n </div>\n );\n }\n\n return (\n <input\n ref={ref}\n className={cn(inputBase, error && inputError, className)}\n aria-invalid={error ? true : undefined}\n {...props}\n />\n );\n }\n);\n\nInput.displayName = \"Input\";\n\nconst inputBase = [\n \"w-full rounded-md border border-gray-300 bg-white px-3\",\n \"text-sm text-gray-900 placeholder:text-gray-400\",\n // mobile-friendly height\n \"h-11 sm:h-10\",\n \"transition-colors duration-150\",\n \"focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\",\n \"disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-gray-50\",\n].join(\" \");\n\nconst inputError = \"border-red-500 focus:ring-red-500\";\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface TextareaProps\n extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n error?: boolean;\n}\n\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, error, ...props }, ref) => (\n <textarea\n ref={ref}\n className={cn(\n \"w-full rounded-md border border-gray-300 bg-white px-3 py-2\",\n \"text-sm text-gray-900 placeholder:text-gray-400\",\n \"min-h-[80px] resize-y\",\n \"transition-colors duration-150\",\n \"focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\",\n \"disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-gray-50\",\n error && \"border-red-500 focus:ring-red-500\",\n className\n )}\n aria-invalid={error ? true : undefined}\n {...props}\n />\n )\n);\n\nTextarea.displayName = \"Textarea\";\n","import * as React from \"react\";\nimport { ChevronDown } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface SelectOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps\n extends React.SelectHTMLAttributes<HTMLSelectElement> {\n options: SelectOption[];\n placeholder?: string;\n error?: boolean;\n}\n\nexport const Select = React.forwardRef<HTMLSelectElement, SelectProps>(\n ({ className, options, placeholder, error, ...props }, ref) => (\n <div className=\"relative\">\n <select\n ref={ref}\n className={cn(\n \"w-full appearance-none rounded-md border border-gray-300 bg-white px-3 pr-9\",\n \"text-sm text-gray-900\",\n // mobile-friendly height\n \"h-11 sm:h-10\",\n \"transition-colors duration-150\",\n \"focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\",\n \"disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-gray-50\",\n error && \"border-red-500 focus:ring-red-500\",\n className\n )}\n aria-invalid={error ? true : undefined}\n {...props}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value} disabled={opt.disabled}>\n {opt.label}\n </option>\n ))}\n </select>\n <ChevronDown\n className=\"pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 text-gray-400\"\n size={16}\n aria-hidden=\"true\"\n />\n </div>\n )\n);\n\nSelect.displayName = \"Select\";\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface CheckboxProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n label?: string;\n error?: boolean;\n}\n\nexport const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n ({ className, label, error, id, ...props }, ref) => {\n const generatedId = React.useId();\n const checkboxId = id ?? generatedId;\n\n return (\n <div className=\"flex items-start gap-3\">\n {/* touch target wrapper — mínimo 44px */}\n <span className=\"flex min-h-[44px] min-w-[44px] items-center justify-center sm:min-h-0 sm:min-w-0\">\n <input\n ref={ref}\n id={checkboxId}\n type=\"checkbox\"\n className={cn(\n \"h-4 w-4 shrink-0 rounded border-gray-300 text-blue-600\",\n \"focus:ring-2 focus:ring-blue-500 focus:ring-offset-2\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"cursor-pointer\",\n error && \"border-red-500\",\n className\n )}\n aria-invalid={error ? true : undefined}\n {...props}\n />\n </span>\n {label && (\n <label\n htmlFor={checkboxId}\n className=\"cursor-pointer select-none pt-0.5 text-sm text-gray-700\"\n >\n {label}\n </label>\n )}\n </div>\n );\n }\n);\n\nCheckbox.displayName = \"Checkbox\";\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface LabelProps\n extends React.LabelHTMLAttributes<HTMLLabelElement> {\n required?: boolean;\n}\n\nexport const Label = React.forwardRef<HTMLLabelElement, LabelProps>(\n ({ className, children, required, ...props }, ref) => (\n <label\n ref={ref}\n className={cn(\n \"block text-sm font-medium text-gray-700 select-none\",\n className\n )}\n {...props}\n >\n {children}\n {required && (\n <span className=\"ml-1 text-red-500\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n )\n);\n\nLabel.displayName = \"Label\";\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { Label } from \"../label/label\";\n\nexport interface FormFieldProps {\n label?: string;\n htmlFor?: string;\n required?: boolean;\n hint?: string;\n error?: string;\n className?: string;\n children: React.ReactNode;\n}\n\nexport function FormField({\n label,\n htmlFor,\n required,\n hint,\n error,\n className,\n children,\n}: FormFieldProps) {\n const errorId = React.useId();\n const hintId = React.useId();\n\n const childrenWithProps = React.Children.map(children, (child) => {\n if (!React.isValidElement(child)) return child;\n return React.cloneElement(child as React.ReactElement<Record<string, unknown>>, {\n id: htmlFor ?? (child.props as Record<string, unknown>).id,\n error: !!error || (child.props as Record<string, unknown>).error,\n \"aria-describedby\":\n [error ? errorId : null, hint ? hintId : null]\n .filter(Boolean)\n .join(\" \") || undefined,\n });\n });\n\n return (\n <div className={cn(\"flex flex-col gap-1.5\", className)}>\n {label && (\n <Label {...(htmlFor !== undefined ? { htmlFor } : {})} {...(required ? { required } : {})}>\n {label}\n </Label>\n )}\n {childrenWithProps}\n {hint && !error && (\n <p id={hintId} className=\"text-xs text-gray-500\">\n {hint}\n </p>\n )}\n {error && (\n <p id={errorId} className=\"text-xs text-red-600\" role=\"alert\">\n {error}\n </p>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { Loader2 } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\nexport type SpinnerSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface SpinnerProps {\n size?: SpinnerSize;\n label?: string;\n className?: string;\n}\n\nconst sizeClasses: Record<SpinnerSize, number> = { sm: 16, md: 24, lg: 36 };\n\nexport function Spinner({ size = \"md\", label = \"Loading…\", className }: SpinnerProps) {\n return (\n <span role=\"status\" aria-label={label} className={cn(\"inline-flex\", className)}>\n <Loader2\n size={sizeClasses[size]}\n className=\"animate-spin text-current\"\n aria-hidden=\"true\"\n />\n </span>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport type BadgeVariant = \"default\" | \"success\" | \"warning\" | \"destructive\" | \"info\" | \"outline\";\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n variant?: BadgeVariant;\n}\n\nconst variantClasses: Record<BadgeVariant, string> = {\n default: \"bg-gray-100 text-gray-700\",\n success: \"bg-green-100 text-green-700\",\n warning: \"bg-yellow-100 text-yellow-700\",\n destructive: \"bg-red-100 text-red-700\",\n info: \"bg-blue-100 text-blue-700\",\n outline: \"border border-gray-300 text-gray-700 bg-transparent\",\n};\n\nexport function Badge({ variant = \"default\", className, children, ...props }: BadgeProps) {\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 variantClasses[variant],\n className\n )}\n {...props}\n >\n {children}\n </span>\n );\n}\n","import * as React from \"react\";\nimport { CheckCircle2, AlertTriangle, XCircle, Info } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\nexport type AlertVariant = \"info\" | \"success\" | \"warning\" | \"destructive\";\n\nexport interface AlertProps {\n variant?: AlertVariant;\n title?: string;\n children?: React.ReactNode;\n className?: string;\n onDismiss?: () => void;\n}\n\nconst config: Record<AlertVariant, { icon: React.ElementType; classes: string }> = {\n info: { icon: Info, classes: \"bg-blue-50 border-blue-200 text-blue-800\" },\n success: { icon: CheckCircle2, classes: \"bg-green-50 border-green-200 text-green-800\" },\n warning: { icon: AlertTriangle, classes: \"bg-yellow-50 border-yellow-200 text-yellow-800\" },\n destructive: { icon: XCircle, classes: \"bg-red-50 border-red-200 text-red-800\" },\n};\n\nexport function Alert({ variant = \"info\", title, children, className, onDismiss }: AlertProps) {\n const { icon: Icon, classes } = config[variant];\n\n return (\n <div\n role=\"alert\"\n className={cn(\"flex gap-3 rounded-md border p-4\", classes, className)}\n >\n <Icon size={18} className=\"mt-0.5 shrink-0\" aria-hidden=\"true\" />\n <div className=\"min-w-0 flex-1 text-sm\">\n {title && <p className=\"font-medium\">{title}</p>}\n {children && <p className={cn(title && \"mt-1\", \"opacity-90\")}>{children}</p>}\n </div>\n {onDismiss && (\n <button\n onClick={onDismiss}\n aria-label=\"Dismiss\"\n className=\"shrink-0 rounded p-0.5 opacity-60 hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-current\"\n >\n <XCircle size={16} aria-hidden=\"true\" />\n </button>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\";\n}\n\nconst paddingClasses = { none: \"\", sm: \"p-3\", md: \"p-5\", lg: \"p-7\" };\n\nexport function Card({ className, padding = \"md\", children, ...props }: CardProps) {\n return (\n <div\n className={cn(\n \"rounded-lg border border-gray-200 bg-white shadow-sm\",\n paddingClasses[padding],\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport function CardHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn(\"mb-4 flex flex-col gap-1\", className)} {...props} />;\n}\n\nexport function CardTitle({ className, ...props }: React.HTMLAttributes<HTMLHeadingElement>) {\n return <h3 className={cn(\"text-base font-semibold text-gray-900\", className)} {...props} />;\n}\n\nexport function CardDescription({ className, ...props }: React.HTMLAttributes<HTMLParagraphElement>) {\n return <p className={cn(\"text-sm text-gray-500\", className)} {...props} />;\n}\n\nexport function CardContent({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn(\"text-sm text-gray-700\", className)} {...props} />;\n}\n\nexport function CardFooter({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\"mt-4 flex flex-wrap items-center gap-2 border-t border-gray-100 pt-4\", className)}\n {...props}\n />\n );\n}\n","import * as React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\nexport type ModalSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n\nexport interface ModalProps {\n open: boolean;\n onClose: () => void;\n title?: string;\n description?: string;\n size?: ModalSize;\n className?: string;\n children: React.ReactNode;\n /** Footer slot — place action Buttons here, they stay inside the Modal */\n footer?: React.ReactNode;\n}\n\nconst sizeClasses: Record<ModalSize, string> = {\n sm: \"sm:max-w-sm\",\n md: \"sm:max-w-md\",\n lg: \"sm:max-w-lg\",\n xl: \"sm:max-w-xl\",\n full: \"sm:max-w-[95vw]\",\n};\n\nexport function Modal({\n open,\n onClose,\n title,\n description,\n size = \"md\",\n className,\n children,\n footer,\n}: ModalProps) {\n const overlayRef = React.useRef<HTMLDivElement>(null);\n const titleId = React.useId();\n const descId = React.useId();\n\n // ESC to close\n React.useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => { if (e.key === \"Escape\") onClose(); };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [open, onClose]);\n\n // lock body scroll\n React.useEffect(() => {\n if (open) {\n document.body.style.overflow = \"hidden\";\n return () => { document.body.style.overflow = \"\"; };\n }\n }, [open]);\n\n // focus trap\n React.useEffect(() => {\n if (!open) return;\n const el = overlayRef.current;\n if (!el) return;\n const focusable = el.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n first?.focus();\n const trap = (e: KeyboardEvent) => {\n if (e.key !== \"Tab\") return;\n if (e.shiftKey) {\n if (document.activeElement === first) { e.preventDefault(); last?.focus(); }\n } else {\n if (document.activeElement === last) { e.preventDefault(); first?.focus(); }\n }\n };\n document.addEventListener(\"keydown\", trap);\n return () => document.removeEventListener(\"keydown\", trap);\n }, [open]);\n\n if (!open) return null;\n\n return createPortal(\n <div\n ref={overlayRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={description ? descId : undefined}\n className=\"fixed inset-0 z-50 flex items-end justify-center sm:items-center sm:p-4\"\n >\n {/* backdrop */}\n <div\n className=\"absolute inset-0 bg-black/50 backdrop-blur-sm\"\n aria-hidden=\"true\"\n onClick={onClose}\n />\n\n {/* panel — full width on mobile, max-w constrained on sm+ */}\n <div\n className={cn(\n \"relative z-10 flex w-full flex-col bg-white shadow-xl\",\n // mobile: slides from bottom, rounded top only\n \"rounded-t-2xl sm:rounded-xl\",\n // desktop: constrained width\n sizeClasses[size],\n // max height with scroll\n \"max-h-[90dvh] overflow-hidden\",\n className\n )}\n >\n {/* header */}\n <div className=\"flex items-start justify-between gap-4 border-b border-gray-100 px-5 py-4\">\n <div className=\"min-w-0\">\n {title && (\n <h2 id={titleId} className=\"text-base font-semibold text-gray-900\">\n {title}\n </h2>\n )}\n {description && (\n <p id={descId} className=\"mt-0.5 text-sm text-gray-500\">\n {description}\n </p>\n )}\n </div>\n <button\n onClick={onClose}\n aria-label=\"Close\"\n className=\"shrink-0 rounded p-1 text-gray-400 hover:text-gray-600 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500\"\n >\n <X size={18} aria-hidden=\"true\" />\n </button>\n </div>\n\n {/* body — scrollable */}\n <div className=\"flex-1 overflow-y-auto px-5 py-4\">{children}</div>\n\n {/* footer — action Buttons stay inside the Modal, never leak */}\n {footer && (\n <div className=\"flex flex-col-reverse gap-2 border-t border-gray-100 px-5 py-4 sm:flex-row sm:justify-end\">\n {footer}\n </div>\n )}\n </div>\n </div>,\n document.body\n );\n}\n","import * as React from \"react\";\nimport { Modal } from \"../modal/modal\";\nimport { Button } from \"../button/button\";\n\nexport interface ConfirmDialogProps {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n title: string;\n description?: string;\n confirmLabel?: string;\n cancelLabel?: string;\n /** Use \"destructive\" for delete/danger actions */\n variant?: \"primary\" | \"destructive\";\n loading?: boolean;\n}\n\nexport function ConfirmDialog({\n open,\n onClose,\n onConfirm,\n title,\n description,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n variant = \"primary\",\n loading = false,\n}: ConfirmDialogProps) {\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={title}\n {...(description !== undefined ? { description } : {})}\n size=\"sm\"\n footer={\n <>\n {/* Buttons are defined here, inside ConfirmDialog — they never escape to the outside */}\n <Button variant=\"ghost\" onClick={onClose} disabled={loading} fullWidth>\n {cancelLabel}\n </Button>\n <Button variant={variant} onClick={onConfirm} loading={loading} fullWidth>\n {confirmLabel}\n </Button>\n </>\n }\n >\n {/* empty body — title + description carry the message */}\n <span />\n </Modal>\n );\n}\n","import * as React from \"react\";\nimport { CheckCircle2, AlertTriangle, XCircle, Info, X } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\nexport type ToastType = \"success\" | \"error\" | \"warning\" | \"info\";\n\nexport interface Toast {\n id: string;\n type: ToastType;\n title: string;\n description?: string;\n duration?: number;\n}\n\nconst iconMap: Record<ToastType, React.ElementType> = {\n success: CheckCircle2,\n error: XCircle,\n warning: AlertTriangle,\n info: Info,\n};\n\nconst styleMap: Record<ToastType, string> = {\n success: \"border-green-200 bg-green-50 text-green-800\",\n error: \"border-red-200 bg-red-50 text-red-800\",\n warning: \"border-yellow-200 bg-yellow-50 text-yellow-800\",\n info: \"border-blue-200 bg-blue-50 text-blue-800\",\n};\n\ninterface ToastItemProps {\n toast: Toast;\n onDismiss: (id: string) => void;\n}\n\nexport function ToastItem({ toast, onDismiss }: ToastItemProps) {\n const Icon = iconMap[toast.type];\n\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={cn(\n \"flex w-full items-start gap-3 rounded-lg border p-4 shadow-md\",\n \"animate-in slide-in-from-bottom-2 duration-200\",\n styleMap[toast.type]\n )}\n >\n <Icon size={18} className=\"mt-0.5 shrink-0\" aria-hidden=\"true\" />\n <div className=\"min-w-0 flex-1 text-sm\">\n <p className=\"font-medium\">{toast.title}</p>\n {toast.description && (\n <p className=\"mt-0.5 opacity-80\">{toast.description}</p>\n )}\n </div>\n <button\n onClick={() => onDismiss(toast.id)}\n aria-label=\"Dismiss\"\n className=\"shrink-0 rounded p-0.5 opacity-60 hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-current\"\n >\n <X size={14} aria-hidden=\"true\" />\n </button>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { ToastItem } from \"./toast\";\nimport type { Toast, ToastType } from \"./toast\";\n\nexport interface ToastContextValue {\n addToast: (opts: { type: ToastType; title: string; description?: string; duration?: number }) => void;\n removeToast: (id: string) => void;\n}\n\nexport const ToastContext = React.createContext<ToastContextValue | null>(null);\n\nexport function ToastProvider({ children }: { children: React.ReactNode }) {\n const [toasts, setToasts] = React.useState<Toast[]>([]);\n\n const removeToast = React.useCallback((id: string) => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, []);\n\n const addToast = React.useCallback(\n ({ type, title, description, duration = 4000 }: {\n type: ToastType;\n title: string;\n description?: string;\n duration?: number;\n }) => {\n const id: string = crypto.randomUUID();\n setToasts((prev) => [\n ...prev,\n {\n id,\n type,\n title,\n ...(description !== undefined ? { description } : {}),\n ...(duration !== undefined ? { duration } : {}),\n },\n ]);\n if (duration > 0) {\n setTimeout(() => removeToast(id), duration);\n }\n },\n [removeToast]\n );\n\n return (\n <ToastContext.Provider value={{ addToast, removeToast }}>\n {children}\n {/* Portal: toasts rendered at bottom of screen, full-width on mobile */}\n <div\n aria-label=\"Notifications\"\n className=\"fixed bottom-0 left-0 right-0 z-50 flex flex-col gap-2 p-4 sm:bottom-4 sm:left-auto sm:right-4 sm:w-96\"\n >\n {toasts.map((toast) => (\n <ToastItem key={toast.id} toast={toast} onDismiss={removeToast} />\n ))}\n </div>\n </ToastContext.Provider>\n );\n}\n","import * as React from \"react\";\nimport { ToastContext } from \"./toast-context\";\n\nexport function useToast() {\n const ctx = React.useContext(ToastContext);\n if (!ctx) {\n throw new Error(\"useToast must be used inside <ToastProvider>\");\n }\n return ctx;\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\n\n/**\n * Wrapper.\n * - Mobile: each TableRow renders as a card (block layout), no horizontal scroll needed.\n * - sm+: classic table with overflow-x-auto.\n */\nexport function Table({ className, children, ...props }: React.HTMLAttributes<HTMLTableElement>) {\n return (\n <div className=\"w-full sm:overflow-x-auto sm:rounded-lg sm:border sm:border-gray-200\">\n <table\n className={cn(\n \"w-full border-collapse text-sm\",\n // desktop keeps min-width so columns never crush\n \"sm:min-w-[600px]\",\n className\n )}\n {...props}\n >\n {children}\n </table>\n </div>\n );\n}\n\n/** Hidden on mobile — column labels come from TableCell's `label` prop instead */\nexport function TableHeader({ className, ...props }: React.HTMLAttributes<HTMLTableSectionElement>) {\n return (\n <thead\n className={cn(\n \"hidden sm:table-header-group\",\n \"border-b border-gray-200 bg-gray-50\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport function TableBody({ className, ...props }: React.HTMLAttributes<HTMLTableSectionElement>) {\n return (\n <tbody\n className={cn(\n // mobile: stack rows as cards\n \"flex flex-col gap-3\",\n // sm+: normal tbody\n \"sm:table-row-group sm:gap-0 sm:divide-y sm:divide-gray-100 sm:bg-white\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport function TableRow({ className, ...props }: React.HTMLAttributes<HTMLTableRowElement>) {\n return (\n <tr\n className={cn(\n // mobile: card\n \"block rounded-lg border border-gray-200 bg-white p-4 shadow-sm\",\n // sm+: normal row\n \"sm:table-row sm:rounded-none sm:border-0 sm:p-0 sm:shadow-none sm:transition-colors sm:hover:bg-gray-50\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport interface TableHeadProps extends React.ThHTMLAttributes<HTMLTableCellElement> {\n align?: \"left\" | \"center\" | \"right\";\n}\n\nexport function TableHead({ className, align = \"left\", ...props }: TableHeadProps) {\n return (\n <th\n scope=\"col\"\n className={cn(\n \"px-4 py-3 text-xs font-semibold uppercase tracking-wide text-gray-500 whitespace-nowrap\",\n align === \"center\" && \"text-center\",\n align === \"right\" && \"text-right\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport interface TableCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {\n align?: \"left\" | \"center\" | \"right\";\n /**\n * Column label shown on mobile (before the value).\n * Should match the corresponding TableHead content.\n * Example: <TableCell label=\"Status\">Active</TableCell>\n */\n label?: string;\n}\n\nexport function TableCell({ className, align = \"left\", label, children, ...props }: TableCellProps) {\n return (\n <td\n className={cn(\n // mobile: each cell is a flex row — \"Label value\"\n \"flex items-start justify-between gap-4 py-1.5 text-gray-700\",\n \"last:pb-0 first:pt-0\",\n // sm+: normal table cell\n \"sm:table-cell sm:px-4 sm:py-3\",\n align === \"center\" && \"sm:text-center\",\n align === \"right\" && \"sm:text-right\",\n className\n )}\n {...props}\n >\n {/* mobile label — hidden on sm+ */}\n {label && (\n <span className=\"shrink-0 text-xs font-semibold uppercase tracking-wide text-gray-400 sm:hidden\">\n {label}\n </span>\n )}\n <span className={cn(\"sm:contents\", label && \"text-right sm:text-left\")}>\n {children}\n </span>\n </td>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface TableToolbarProps {\n /** Left side — search input or filters. Stay inside TableToolbar. */\n filters?: React.ReactNode;\n /** Right side — action buttons. Stay inside TableToolbar. */\n actions?: React.ReactNode;\n className?: string;\n}\n\nexport function TableToolbar({ filters, actions, className }: TableToolbarProps) {\n return (\n <div\n className={cn(\n \"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\",\n \"mb-3\",\n className\n )}\n >\n {filters && (\n <div className=\"flex flex-wrap items-center gap-2\">{filters}</div>\n )}\n {actions && (\n <div className=\"flex shrink-0 flex-wrap items-center gap-2 sm:ml-auto\">\n {actions}\n </div>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface TableEmptyStateProps {\n colSpan: number;\n title?: string;\n description?: string;\n /** Action button — stays inside the table, never leaks out */\n action?: React.ReactNode;\n icon?: React.ReactNode;\n className?: string;\n}\n\nexport function TableEmptyState({\n colSpan,\n title = \"No results\",\n description,\n action,\n icon,\n className,\n}: TableEmptyStateProps) {\n return (\n <tr className=\"block sm:table-row\">\n <td colSpan={colSpan} className={cn(\"block px-4 py-12 text-center sm:table-cell\", className)}>\n <div className=\"flex flex-col items-center gap-3\">\n {icon && (\n <span className=\"text-gray-300\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <p className=\"text-sm font-medium text-gray-600\">{title}</p>\n {description && (\n <p className=\"max-w-xs text-xs text-gray-400\">{description}</p>\n )}\n {action && <div className=\"mt-1\">{action}</div>}\n </div>\n </td>\n </tr>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface PageHeaderProps {\n title: string;\n description?: string;\n /** Breadcrumb or back link slot */\n prefix?: React.ReactNode;\n /** Action buttons — defined by caller but rendered inside PageHeader, never escape */\n actions?: React.ReactNode;\n className?: string;\n}\n\nexport function PageHeader({ title, description, prefix, actions, className }: PageHeaderProps) {\n return (\n <div className={cn(\"mb-6\", className)}>\n {prefix && <div className=\"mb-2\">{prefix}</div>}\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"min-w-0\">\n <h1 className=\"truncate text-2xl font-bold text-gray-900 sm:text-3xl\">\n {title}\n </h1>\n {description && (\n <p className=\"mt-1 text-sm text-gray-500\">{description}</p>\n )}\n </div>\n {actions && (\n <div className=\"flex shrink-0 flex-wrap items-center gap-2\">\n {actions}\n </div>\n )}\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface EmptyStateProps {\n icon?: React.ReactNode;\n title: string;\n description?: string;\n /** Primary action button — stays inside EmptyState */\n action?: React.ReactNode;\n /** Secondary action button */\n secondaryAction?: React.ReactNode;\n className?: string;\n}\n\nexport function EmptyState({\n icon,\n title,\n description,\n action,\n secondaryAction,\n className,\n}: EmptyStateProps) {\n return (\n <div\n className={cn(\n \"flex flex-col items-center justify-center gap-4 rounded-lg border border-dashed border-gray-200 bg-gray-50 px-6 py-16 text-center\",\n className\n )}\n >\n {icon && (\n <span className=\"text-gray-300\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <div className=\"max-w-xs\">\n <p className=\"text-sm font-semibold text-gray-700\">{title}</p>\n {description && (\n <p className=\"mt-1 text-sm text-gray-400\">{description}</p>\n )}\n </div>\n {(action || secondaryAction) && (\n <div className=\"flex flex-col items-center gap-2 sm:flex-row\">\n {action}\n {secondaryAction}\n </div>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { Drawer } from \"../drawer/drawer\";\nimport { Sidebar } from \"../sidebar/sidebar\";\nimport { Topbar } from \"../topbar/topbar\";\nimport type { SidebarProps } from \"../sidebar/sidebar\";\nimport type { TopbarProps } from \"../topbar/topbar\";\n\nexport interface AppShellProps {\n /** Props forwarded to the Sidebar */\n sidebar: SidebarProps;\n /** Props forwarded to the Topbar (onMenuOpen is wired automatically) */\n topbar?: Omit<TopbarProps, \"onMenuOpen\" | \"hideMenuButton\">;\n /** Page content */\n children: React.ReactNode;\n className?: string;\n}\n\nexport function AppShell({ sidebar, topbar, children, className }: AppShellProps) {\n const [mobileOpen, setMobileOpen] = React.useState(false);\n\n return (\n <div className={cn(\"flex h-dvh overflow-hidden bg-gray-50\", className)}>\n\n {/* Desktop sidebar — hidden on mobile */}\n <div className=\"hidden sm:flex sm:shrink-0\">\n <Sidebar {...sidebar} />\n </div>\n\n {/* Mobile sidebar — Drawer from bottom/side */}\n <Drawer\n open={mobileOpen}\n onClose={() => setMobileOpen(false)}\n side=\"left\"\n widthClass=\"sm:w-64\"\n className=\"p-0 sm:rounded-none\"\n >\n {/* Sidebar rendered inside Drawer on mobile — fully self-contained */}\n <div className=\"-mx-5 -my-4 h-full\">\n <Sidebar\n {...sidebar}\n className=\"h-full border-r-0\"\n />\n </div>\n </Drawer>\n\n {/* Main area: Topbar + scrollable content */}\n <div className=\"flex flex-1 flex-col overflow-hidden\">\n {topbar !== undefined && (\n <Topbar\n {...topbar}\n onMenuOpen={() => setMobileOpen(true)}\n hideMenuButton={false}\n />\n )}\n <main className=\"flex-1 overflow-y-auto p-4 sm:p-6\">\n {children}\n </main>\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\nexport type DrawerSide = \"right\" | \"left\";\n\nexport interface DrawerProps {\n open: boolean;\n onClose: () => void;\n title?: string;\n description?: string;\n side?: DrawerSide;\n /** Width on sm+ (default: \"sm:w-96\") */\n widthClass?: string;\n className?: string;\n children: React.ReactNode;\n /** Footer slot — action buttons stay inside the Drawer */\n footer?: React.ReactNode;\n}\n\nexport function Drawer({\n open,\n onClose,\n title,\n description,\n side = \"right\",\n widthClass = \"sm:w-96\",\n className,\n children,\n footer,\n}: DrawerProps) {\n const overlayRef = React.useRef<HTMLDivElement>(null);\n const titleId = React.useId();\n const descId = React.useId();\n\n // ESC\n React.useEffect(() => {\n if (!open) return;\n const h = (e: KeyboardEvent) => { if (e.key === \"Escape\") onClose(); };\n document.addEventListener(\"keydown\", h);\n return () => document.removeEventListener(\"keydown\", h);\n }, [open, onClose]);\n\n // body scroll lock\n React.useEffect(() => {\n if (open) {\n document.body.style.overflow = \"hidden\";\n return () => { document.body.style.overflow = \"\"; };\n }\n }, [open]);\n\n // focus trap\n React.useEffect(() => {\n if (!open) return;\n const el = overlayRef.current;\n if (!el) return;\n const focusable = el.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n first?.focus();\n const trap = (e: KeyboardEvent) => {\n if (e.key !== \"Tab\") return;\n if (e.shiftKey) {\n if (document.activeElement === first) { e.preventDefault(); last?.focus(); }\n } else {\n if (document.activeElement === last) { e.preventDefault(); first?.focus(); }\n }\n };\n document.addEventListener(\"keydown\", trap);\n return () => document.removeEventListener(\"keydown\", trap);\n }, [open]);\n\n if (!open) return null;\n\n return createPortal(\n <div\n ref={overlayRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={description ? descId : undefined}\n className=\"fixed inset-0 z-50 flex\"\n >\n {/* backdrop */}\n <div\n className=\"absolute inset-0 bg-black/50 backdrop-blur-sm\"\n aria-hidden=\"true\"\n onClick={onClose}\n />\n\n {/* panel\n mobile: bottom sheet (full width, slides from bottom)\n sm+: side panel (right or left) */}\n <div\n className={cn(\n \"absolute bottom-0 left-0 right-0 z-10 flex flex-col bg-white shadow-xl\",\n \"max-h-[90dvh] rounded-t-2xl\",\n // sm+: full height side panel\n \"sm:inset-y-0 sm:bottom-auto sm:top-0 sm:max-h-full sm:rounded-none\",\n side === \"right\" ? \"sm:right-0 sm:left-auto\" : \"sm:left-0 sm:right-auto\",\n widthClass,\n className\n )}\n >\n {/* header */}\n <div className=\"flex items-start justify-between gap-4 border-b border-gray-100 px-5 py-4\">\n <div className=\"min-w-0\">\n {title && (\n <h2 id={titleId} className=\"text-base font-semibold text-gray-900\">\n {title}\n </h2>\n )}\n {description && (\n <p id={descId} className=\"mt-0.5 text-sm text-gray-500\">\n {description}\n </p>\n )}\n </div>\n <button\n onClick={onClose}\n aria-label=\"Close\"\n className=\"shrink-0 rounded p-1 text-gray-400 hover:text-gray-600 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500\"\n >\n <X size={18} aria-hidden=\"true\" />\n </button>\n </div>\n\n {/* body */}\n <div className=\"flex-1 overflow-y-auto px-5 py-4\">{children}</div>\n\n {/* footer — buttons stay inside the Drawer */}\n {footer && (\n <div className=\"flex flex-col-reverse gap-2 border-t border-gray-100 px-5 py-4 sm:flex-row sm:justify-end\">\n {footer}\n </div>\n )}\n </div>\n </div>,\n document.body\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface SidebarNavItem {\n label: string;\n href?: string;\n icon?: React.ReactNode;\n active?: boolean;\n disabled?: boolean;\n onClick?: () => void;\n /** Badge count or label shown on the right */\n badge?: string | number;\n}\n\nexport interface SidebarNavGroup {\n title?: string;\n items: SidebarNavItem[];\n}\n\nexport interface SidebarProps {\n /** Logo or brand slot */\n logo?: React.ReactNode;\n /** Navigation groups */\n groups: SidebarNavGroup[];\n /** Bottom slot — user avatar, settings, logout */\n footer?: React.ReactNode;\n className?: string;\n}\n\nexport function Sidebar({ logo, groups, footer, className }: SidebarProps) {\n return (\n <aside\n className={cn(\n \"flex h-full w-64 flex-col border-r border-gray-200 bg-white\",\n className\n )}\n aria-label=\"Sidebar navigation\"\n >\n {/* logo */}\n {logo && (\n <div className=\"flex h-16 shrink-0 items-center border-b border-gray-100 px-4\">\n {logo}\n </div>\n )}\n\n {/* nav groups — scrollable */}\n <nav className=\"flex-1 overflow-y-auto px-3 py-4\">\n {groups.map((group, gi) => (\n <div key={gi} className={cn(gi > 0 && \"mt-6\")}>\n {group.title && (\n <p className=\"mb-1 px-2 text-xs font-semibold uppercase tracking-wider text-gray-400\">\n {group.title}\n </p>\n )}\n <ul role=\"list\" className=\"flex flex-col gap-0.5\">\n {group.items.map((item, ii) => (\n <li key={ii}>\n <SidebarItem item={item} />\n </li>\n ))}\n </ul>\n </div>\n ))}\n </nav>\n\n {/* footer — user info, settings, etc. */}\n {footer && (\n <div className=\"shrink-0 border-t border-gray-100 p-3\">{footer}</div>\n )}\n </aside>\n );\n}\n\nfunction SidebarItem({ item }: { item: SidebarNavItem }) {\n const Tag = item.href ? \"a\" : \"button\";\n\n return (\n <Tag\n href={item.href}\n onClick={item.onClick}\n disabled={item.disabled}\n aria-current={item.active ? \"page\" : undefined}\n className={cn(\n \"group flex w-full items-center gap-3 rounded-md px-3 py-2 text-sm font-medium\",\n \"transition-colors duration-100\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500\",\n // mobile touch target\n \"min-h-[44px] sm:min-h-[36px]\",\n item.active\n ? \"bg-blue-50 text-blue-700\"\n : \"text-gray-600 hover:bg-gray-100 hover:text-gray-900\",\n item.disabled && \"cursor-not-allowed opacity-40 pointer-events-none\"\n )}\n >\n {item.icon && (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"shrink-0\",\n item.active ? \"text-blue-600\" : \"text-gray-400 group-hover:text-gray-600\"\n )}\n >\n {item.icon}\n </span>\n )}\n <span className=\"flex-1 truncate text-left\">{item.label}</span>\n {item.badge !== undefined && (\n <span\n className={cn(\n \"shrink-0 rounded-full px-2 py-0.5 text-xs font-medium\",\n item.active ? \"bg-blue-100 text-blue-700\" : \"bg-gray-100 text-gray-500\"\n )}\n >\n {item.badge}\n </span>\n )}\n </Tag>\n );\n}\n","import * as React from \"react\";\nimport { Menu } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface TopbarProps {\n /** Called when the hamburger is pressed — open the Drawer/Sidebar */\n onMenuOpen?: () => void;\n /** Center slot — page title or breadcrumb */\n title?: React.ReactNode;\n /** Right slot — user avatar, notifications, etc. Stays inside Topbar. */\n actions?: React.ReactNode;\n /** Hide the hamburger button (e.g. when sidebar is always visible) */\n hideMenuButton?: boolean;\n className?: string;\n}\n\nexport function Topbar({\n onMenuOpen,\n title,\n actions,\n hideMenuButton = false,\n className,\n}: TopbarProps) {\n return (\n <header\n className={cn(\n \"flex h-14 shrink-0 items-center gap-3 border-b border-gray-200 bg-white px-4\",\n className\n )}\n >\n {/* hamburger — shown on mobile, hidden on sm+ when sidebar is visible */}\n {!hideMenuButton && onMenuOpen && (\n <button\n onClick={onMenuOpen}\n aria-label=\"Open navigation menu\"\n className={cn(\n \"inline-flex h-9 w-9 items-center justify-center rounded-md text-gray-500\",\n \"hover:bg-gray-100 hover:text-gray-700\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500\",\n // visible on mobile, hidden when sidebar renders on sm+\n \"sm:hidden\"\n )}\n >\n <Menu size={20} aria-hidden=\"true\" />\n </button>\n )}\n\n {/* title */}\n {title && (\n <div className=\"flex-1 truncate text-sm font-semibold text-gray-900 sm:text-base\">\n {title}\n </div>\n )}\n {!title && <div className=\"flex-1\" />}\n\n {/* right actions — stay inside Topbar */}\n {actions && (\n <div className=\"flex shrink-0 items-center gap-2\">{actions}</div>\n )}\n </header>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface Tab {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface TabsProps {\n tabs: Tab[];\n value: string;\n onChange: (value: string) => void;\n /** Content panels — use TabPanel to associate with a tab value */\n children?: React.ReactNode;\n className?: string;\n}\n\nexport function Tabs({ tabs, value, onChange, children, className }: TabsProps) {\n const tabListRef = React.useRef<HTMLDivElement>(null);\n\n // arrow key navigation\n const onKeyDown = (e: React.KeyboardEvent, current: string) => {\n const enabled = tabs.filter((t) => !t.disabled);\n const idx = enabled.findIndex((t) => t.value === current);\n if (e.key === \"ArrowRight\") {\n e.preventDefault();\n const next = enabled[(idx + 1) % enabled.length];\n if (next) onChange(next.value);\n }\n if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n const prev = enabled[(idx - 1 + enabled.length) % enabled.length];\n if (prev) onChange(prev.value);\n }\n };\n\n return (\n <div className={cn(\"w-full\", className)}>\n {/* tab list — horizontal scroll on mobile */}\n <div\n ref={tabListRef}\n role=\"tablist\"\n className=\"flex overflow-x-auto border-b border-gray-200 scrollbar-none\"\n style={{ scrollbarWidth: \"none\" }}\n >\n {tabs.map((tab) => {\n const isActive = tab.value === value;\n return (\n <button\n key={tab.value}\n role=\"tab\"\n id={`tab-${tab.value}`}\n aria-selected={isActive}\n aria-controls={`panel-${tab.value}`}\n disabled={tab.disabled}\n tabIndex={isActive ? 0 : -1}\n onClick={() => !tab.disabled && onChange(tab.value)}\n onKeyDown={(e) => onKeyDown(e, tab.value)}\n className={cn(\n \"inline-flex shrink-0 items-center whitespace-nowrap border-b-2 px-4 py-3 text-sm font-medium\",\n \"transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-blue-500\",\n // mobile touch target\n \"min-h-[44px]\",\n isActive\n ? \"border-blue-600 text-blue-600\"\n : \"border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700\",\n tab.disabled && \"cursor-not-allowed opacity-40\"\n )}\n >\n {tab.label}\n </button>\n );\n })}\n </div>\n\n {/* panels */}\n {children}\n </div>\n );\n}\n\nexport interface TabPanelProps {\n value: string;\n activeValue: string;\n children: React.ReactNode;\n className?: string;\n}\n\nexport function TabPanel({ value, activeValue, children, className }: TabPanelProps) {\n const isActive = value === activeValue;\n return (\n <div\n role=\"tabpanel\"\n id={`panel-${value}`}\n aria-labelledby={`tab-${value}`}\n hidden={!isActive}\n className={cn(\"py-4\", className)}\n >\n {isActive ? children : null}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface DropdownMenuItem {\n label: string;\n onClick?: () => void;\n icon?: React.ReactNode;\n disabled?: boolean;\n destructive?: boolean;\n /** Renders a visual divider above this item */\n divider?: boolean;\n}\n\nexport type DropdownAlign = \"left\" | \"right\";\n\nexport interface DropdownMenuProps {\n /** The trigger element — button or icon button. Stays inside DropdownMenu. */\n trigger: React.ReactNode;\n items: DropdownMenuItem[];\n align?: DropdownAlign;\n className?: string;\n}\n\nexport function DropdownMenu({ trigger, items, align = \"right\", className }: DropdownMenuProps) {\n const [open, setOpen] = React.useState(false);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const menuRef = React.useRef<HTMLDivElement>(null);\n\n // close on outside click\n React.useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (!containerRef.current?.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [open]);\n\n // ESC to close, focus first item on open\n React.useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n setOpen(false);\n // return focus to trigger\n (containerRef.current?.querySelector(\"[data-trigger]\") as HTMLElement)?.focus();\n }\n };\n document.addEventListener(\"keydown\", handler);\n // focus first enabled item\n const first = menuRef.current?.querySelector<HTMLElement>(\"[role='menuitem']:not([disabled])\");\n first?.focus();\n return () => document.removeEventListener(\"keydown\", handler);\n }, [open]);\n\n return (\n <div ref={containerRef} className={cn(\"relative inline-block\", className)}>\n {/* trigger — wrapped to attach toggle and aria attrs */}\n <span\n data-trigger\n onClick={() => setOpen((v) => !v)}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n className=\"inline-flex\"\n >\n {trigger}\n </span>\n\n {/* menu — items stay inside, never escape */}\n {open && (\n <div\n ref={menuRef}\n role=\"menu\"\n className={cn(\n \"absolute z-50 mt-1 min-w-[160px] overflow-hidden rounded-lg border border-gray-200 bg-white py-1 shadow-lg\",\n align === \"right\" ? \"right-0\" : \"left-0\"\n )}\n >\n {items.map((item, i) => (\n <React.Fragment key={i}>\n {item.divider && <div className=\"my-1 border-t border-gray-100\" />}\n <button\n role=\"menuitem\"\n disabled={item.disabled}\n onClick={() => {\n if (item.disabled) return;\n item.onClick?.();\n setOpen(false);\n }}\n className={cn(\n \"flex w-full items-center gap-2 px-4 py-2 text-left text-sm\",\n \"transition-colors duration-100\",\n \"focus-visible:outline-none focus-visible:bg-gray-50\",\n item.destructive\n ? \"text-red-600 hover:bg-red-50\"\n : \"text-gray-700 hover:bg-gray-50\",\n item.disabled && \"cursor-not-allowed opacity-40\"\n )}\n >\n {item.icon && (\n <span className=\"shrink-0 text-current\" aria-hidden=\"true\">\n {item.icon}\n </span>\n )}\n {item.label}\n </button>\n </React.Fragment>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface PaginationProps {\n page: number;\n totalPages: number;\n onChange: (page: number) => void;\n /** Max page buttons to show (default 5) */\n siblingCount?: number;\n className?: string;\n}\n\nfunction getPages(page: number, total: number, siblings: number): (number | \"…\")[] {\n const delta = siblings;\n const range: number[] = [];\n for (\n let i = Math.max(2, page - delta);\n i <= Math.min(total - 1, page + delta);\n i++\n ) range.push(i);\n\n const pages: (number | \"…\")[] = [1];\n const rangeFirst = range[0];\n const rangeLast = range[range.length - 1];\n if (rangeFirst !== undefined && rangeFirst > 2) pages.push(\"…\");\n pages.push(...range);\n if (rangeLast !== undefined && rangeLast < total - 1) pages.push(\"…\");\n if (total > 1) pages.push(total);\n return pages;\n}\n\nconst btnBase =\n \"inline-flex h-9 min-w-[36px] items-center justify-center rounded-md px-2 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 disabled:pointer-events-none disabled:opacity-40\";\n\nexport function Pagination({\n page,\n totalPages,\n onChange,\n siblingCount = 1,\n className,\n}: PaginationProps) {\n if (totalPages <= 1) return null;\n\n const pages = getPages(page, totalPages, siblingCount);\n\n return (\n <nav\n aria-label=\"Pagination\"\n className={cn(\"flex flex-wrap items-center justify-center gap-1\", className)}\n >\n {/* prev */}\n <button\n onClick={() => onChange(page - 1)}\n disabled={page === 1}\n aria-label=\"Previous page\"\n className={cn(btnBase, \"text-gray-600 hover:bg-gray-100\")}\n >\n <ChevronLeft size={16} aria-hidden=\"true\" />\n <span className=\"ml-1 hidden sm:inline\">Prev</span>\n </button>\n\n {/* page numbers — hidden on mobile, show only current/total */}\n <div className=\"hidden sm:flex sm:items-center sm:gap-1\">\n {pages.map((p, i) =>\n p === \"…\" ? (\n <span key={`ellipsis-${i}`} className=\"px-1 text-gray-400\">\n <MoreHorizontal size={16} aria-hidden=\"true\" />\n </span>\n ) : (\n <button\n key={p}\n onClick={() => onChange(p)}\n aria-label={`Page ${p}`}\n aria-current={p === page ? \"page\" : undefined}\n className={cn(\n btnBase,\n p === page\n ? \"bg-blue-600 text-white hover:bg-blue-700\"\n : \"text-gray-600 hover:bg-gray-100\"\n )}\n >\n {p}\n </button>\n )\n )}\n </div>\n\n {/* mobile: compact current/total */}\n <span className=\"text-sm text-gray-500 sm:hidden\">\n {page} / {totalPages}\n </span>\n\n {/* next */}\n <button\n onClick={() => onChange(page + 1)}\n disabled={page === totalPages}\n aria-label=\"Next page\"\n className={cn(btnBase, \"text-gray-600 hover:bg-gray-100\")}\n >\n <span className=\"mr-1 hidden sm:inline\">Next</span>\n <ChevronRight size={16} aria-hidden=\"true\" />\n </button>\n </nav>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport type TooltipSide = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface TooltipProps {\n content: string;\n side?: TooltipSide;\n children: React.ReactElement;\n className?: string;\n}\n\nconst sideClasses: Record<TooltipSide, { wrapper: string; tip: string }> = {\n top: {\n wrapper: \"bottom-full left-1/2 mb-2 -translate-x-1/2\",\n tip: \"top-full left-1/2 -translate-x-1/2 border-t-gray-800 border-x-transparent border-b-transparent\",\n },\n bottom: {\n wrapper: \"top-full left-1/2 mt-2 -translate-x-1/2\",\n tip: \"bottom-full left-1/2 -translate-x-1/2 border-b-gray-800 border-x-transparent border-t-transparent\",\n },\n left: {\n wrapper: \"right-full top-1/2 mr-2 -translate-y-1/2\",\n tip: \"left-full top-1/2 -translate-y-1/2 border-l-gray-800 border-y-transparent border-r-transparent\",\n },\n right: {\n wrapper: \"left-full top-1/2 ml-2 -translate-y-1/2\",\n tip: \"right-full top-1/2 -translate-y-1/2 border-r-gray-800 border-y-transparent border-l-transparent\",\n },\n};\n\nexport function Tooltip({ content, side = \"top\", children, className }: TooltipProps) {\n const id = React.useId();\n const [visible, setVisible] = React.useState(false);\n\n const show = () => setVisible(true);\n const hide = () => setVisible(false);\n\n const child = React.cloneElement(children, {\n \"aria-describedby\": visible ? id : undefined,\n onMouseEnter: (e: React.MouseEvent) => { show(); children.props.onMouseEnter?.(e); },\n onMouseLeave: (e: React.MouseEvent) => { hide(); children.props.onMouseLeave?.(e); },\n onFocus: (e: React.FocusEvent) => { show(); children.props.onFocus?.(e); },\n onBlur: (e: React.FocusEvent) => { hide(); children.props.onBlur?.(e); },\n });\n\n return (\n <span className=\"relative inline-flex\">\n {child}\n {visible && (\n <span\n id={id}\n role=\"tooltip\"\n className={cn(\n \"pointer-events-none absolute z-50 whitespace-nowrap rounded bg-gray-800 px-2 py-1 text-xs text-white shadow-sm\",\n sideClasses[side].wrapper,\n className\n )}\n >\n {content}\n {/* arrow */}\n <span\n aria-hidden=\"true\"\n className={cn(\n \"absolute h-0 w-0 border-4\",\n sideClasses[side].tip\n )}\n />\n </span>\n )}\n </span>\n );\n}\n"],"mappings":"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","names":["React","jsx","jsxs","React","jsx","React","jsx","jsxs","React","jsx","jsxs","React","jsx","jsxs","React","jsx","jsxs","Loader2","jsx","sizeClasses","Loader2","jsx","variantClasses","jsx","jsxs","jsx","React","jsx","jsxs","sizeClasses","jsx","jsxs","CheckCircle2","AlertTriangle","XCircle","Info","X","jsx","jsxs","CheckCircle2","XCircle","AlertTriangle","Info","X","React","jsx","jsxs","React","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","React","React","createPortal","X","jsx","jsxs","createPortal","X","jsx","jsxs","jsx","jsxs","jsx","jsxs","React","jsx","jsxs","React","jsx","jsxs","jsx","jsxs","React","jsx","jsxs"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@assassin1717/aifelib",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Private UI component library — React + TypeScript + Tailwind + Lucide",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"require": "./dist/index.cjs",
|
|
13
|
+
"types": "./dist/index.d.ts"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"sideEffects": false,
|
|
20
|
+
"scripts": {
|
|
21
|
+
"dev": "storybook dev -p 6006",
|
|
22
|
+
"build": "tsup",
|
|
23
|
+
"build-storybook": "storybook build",
|
|
24
|
+
"test": "vitest run",
|
|
25
|
+
"test:watch": "vitest",
|
|
26
|
+
"lint": "eslint src --ext .ts,.tsx",
|
|
27
|
+
"type-check": "tsc --noEmit"
|
|
28
|
+
},
|
|
29
|
+
"peerDependencies": {
|
|
30
|
+
"react": "^18.0.0",
|
|
31
|
+
"react-dom": "^18.0.0"
|
|
32
|
+
},
|
|
33
|
+
"release": {
|
|
34
|
+
"branches": [
|
|
35
|
+
"main"
|
|
36
|
+
],
|
|
37
|
+
"plugins": [
|
|
38
|
+
"@semantic-release/commit-analyzer",
|
|
39
|
+
"@semantic-release/release-notes-generator",
|
|
40
|
+
"@semantic-release/npm",
|
|
41
|
+
[
|
|
42
|
+
"@semantic-release/git",
|
|
43
|
+
{
|
|
44
|
+
"assets": [
|
|
45
|
+
"package.json"
|
|
46
|
+
],
|
|
47
|
+
"message": "chore(release): ${nextRelease.version} [skip ci]"
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@storybook/addon-essentials": "^8.0.0",
|
|
54
|
+
"@storybook/react": "^8.0.0",
|
|
55
|
+
"@storybook/react-vite": "^8.0.0",
|
|
56
|
+
"@testing-library/jest-dom": "^6.0.0",
|
|
57
|
+
"@testing-library/react": "^16.0.0",
|
|
58
|
+
"@testing-library/user-event": "^14.0.0",
|
|
59
|
+
"@types/react": "^18.0.0",
|
|
60
|
+
"@types/react-dom": "^18.0.0",
|
|
61
|
+
"@typescript-eslint/eslint-plugin": "^7.0.0",
|
|
62
|
+
"@typescript-eslint/parser": "^7.0.0",
|
|
63
|
+
"@vitejs/plugin-react": "^4.0.0",
|
|
64
|
+
"autoprefixer": "^10.4.0",
|
|
65
|
+
"eslint": "^8.0.0",
|
|
66
|
+
"eslint-plugin-react": "^7.0.0",
|
|
67
|
+
"eslint-plugin-react-hooks": "^4.0.0",
|
|
68
|
+
"jsdom": "^25.0.0",
|
|
69
|
+
"postcss": "^8.4.0",
|
|
70
|
+
"react": "^18.0.0",
|
|
71
|
+
"react-dom": "^18.0.0",
|
|
72
|
+
"storybook": "^8.0.0",
|
|
73
|
+
"tailwindcss": "^3.4.0",
|
|
74
|
+
"tsup": "^8.0.0",
|
|
75
|
+
"typescript": "^5.0.0",
|
|
76
|
+
"vite": "^5.0.0",
|
|
77
|
+
"vitest": "^2.0.0",
|
|
78
|
+
"semantic-release": "^24.0.0",
|
|
79
|
+
"@semantic-release/commit-analyzer": "^13.0.0",
|
|
80
|
+
"@semantic-release/release-notes-generator": "^14.0.0",
|
|
81
|
+
"@semantic-release/npm": "^12.0.0",
|
|
82
|
+
"@semantic-release/git": "^10.0.0"
|
|
83
|
+
},
|
|
84
|
+
"dependencies": {
|
|
85
|
+
"clsx": "^2.1.0",
|
|
86
|
+
"lucide-react": "^0.400.0",
|
|
87
|
+
"tailwind-merge": "^2.3.0"
|
|
88
|
+
},
|
|
89
|
+
"engines": {
|
|
90
|
+
"node": ">=20"
|
|
91
|
+
},
|
|
92
|
+
"publishConfig": {
|
|
93
|
+
"access": "public"
|
|
94
|
+
}
|
|
95
|
+
}
|