elahi-ui 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.
Files changed (73) hide show
  1. package/README.md +156 -0
  2. package/dist/components/Avatar/Avatar.d.ts +25 -0
  3. package/dist/components/Avatar/index.d.ts +2 -0
  4. package/dist/components/Badge/Badge.d.ts +21 -0
  5. package/dist/components/Badge/index.d.ts +2 -0
  6. package/dist/components/Button/Button.d.ts +49 -0
  7. package/dist/components/Button/index.d.ts +2 -0
  8. package/dist/components/Card/Card.d.ts +16 -0
  9. package/dist/components/Card/index.d.ts +2 -0
  10. package/dist/components/Checkbox/Checkbox.d.ts +17 -0
  11. package/dist/components/Checkbox/index.d.ts +2 -0
  12. package/dist/components/Icons/index.d.ts +18 -0
  13. package/dist/components/Input/Input.d.ts +46 -0
  14. package/dist/components/Input/index.d.ts +2 -0
  15. package/dist/components/Modal/Modal.d.ts +27 -0
  16. package/dist/components/Modal/index.d.ts +2 -0
  17. package/dist/components/Select/Select.d.ts +40 -0
  18. package/dist/components/Select/index.d.ts +2 -0
  19. package/dist/components/Switch/Switch.d.ts +21 -0
  20. package/dist/components/Switch/index.d.ts +2 -0
  21. package/dist/components/Table/Table.d.ts +72 -0
  22. package/dist/components/Table/TablePagination.d.ts +15 -0
  23. package/dist/components/Table/index.d.ts +2 -0
  24. package/dist/components/Tabs/Tabs.d.ts +32 -0
  25. package/dist/components/Tabs/index.d.ts +2 -0
  26. package/dist/components/Textarea/Textarea.d.ts +23 -0
  27. package/dist/components/Textarea/index.d.ts +2 -0
  28. package/dist/components/Toast/Toast.d.ts +25 -0
  29. package/dist/components/Toast/index.d.ts +2 -0
  30. package/dist/components/Tooltip/Tooltip.d.ts +18 -0
  31. package/dist/components/Tooltip/index.d.ts +2 -0
  32. package/dist/constants/index.d.ts +16 -0
  33. package/dist/hooks/index.d.ts +13 -0
  34. package/dist/hooks/useClickOutside.d.ts +10 -0
  35. package/dist/hooks/useControllableState.d.ts +20 -0
  36. package/dist/hooks/useDisclosure.d.ts +16 -0
  37. package/dist/hooks/useFocusTrap.d.ts +14 -0
  38. package/dist/hooks/useLockBodyScroll.d.ts +10 -0
  39. package/dist/hooks/useMediaQuery.d.ts +10 -0
  40. package/dist/hooks/useRipple.d.ts +20 -0
  41. package/dist/hooks/useTablePagination.d.ts +19 -0
  42. package/dist/hooks/useTableSort.d.ts +22 -0
  43. package/dist/hooks.cjs +2 -0
  44. package/dist/hooks.cjs.map +1 -0
  45. package/dist/hooks.d.ts +2 -0
  46. package/dist/hooks.js +13 -0
  47. package/dist/hooks.js.map +1 -0
  48. package/dist/index-Bxv2g5GP.js +2487 -0
  49. package/dist/index-Bxv2g5GP.js.map +1 -0
  50. package/dist/index-DwhoHMcS.cjs +2 -0
  51. package/dist/index-DwhoHMcS.cjs.map +1 -0
  52. package/dist/index.cjs +2 -0
  53. package/dist/index.cjs.map +1 -0
  54. package/dist/index.d.ts +35 -0
  55. package/dist/index.js +1714 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/main.d.ts +0 -0
  58. package/dist/styles/globals.css +118 -0
  59. package/dist/test/setup.d.ts +1 -0
  60. package/dist/useTablePagination-CKuaTNxN.js +236 -0
  61. package/dist/useTablePagination-CKuaTNxN.js.map +1 -0
  62. package/dist/useTablePagination-DS3CDBea.cjs +2 -0
  63. package/dist/useTablePagination-DS3CDBea.cjs.map +1 -0
  64. package/dist/utils/cn.d.ts +10 -0
  65. package/dist/utils/id.d.ts +5 -0
  66. package/dist/utils/index.d.ts +3 -0
  67. package/dist/utils/polymorphic.d.ts +26 -0
  68. package/dist/utils.cjs +2 -0
  69. package/dist/utils.cjs.map +1 -0
  70. package/dist/utils.d.ts +2 -0
  71. package/dist/utils.js +6 -0
  72. package/dist/utils.js.map +1 -0
  73. package/package.json +118 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../node_modules/class-variance-authority/dist/index.mjs","../src/components/Icons/index.tsx","../src/components/Button/Button.tsx","../src/components/Input/Input.tsx","../src/components/Textarea/Textarea.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Switch/Switch.tsx","../src/components/Select/Select.tsx","../src/components/Modal/Modal.tsx","../src/components/Toast/Toast.tsx","../src/components/Tabs/Tabs.tsx","../src/components/Tooltip/Tooltip.tsx","../src/components/Card/Card.tsx","../src/components/Badge/Badge.tsx","../src/components/Avatar/Avatar.tsx","../src/components/Table/TablePagination.tsx","../src/components/Table/Table.tsx"],"sourcesContent":["/**\n * Copyright 2022 Joe Bell. All rights reserved.\n *\n * This file is licensed to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR REPRESENTATIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */ import { clsx } from \"clsx\";\nconst falsyToString = (value)=>typeof value === \"boolean\" ? `${value}` : value === 0 ? \"0\" : value;\nexport const cx = clsx;\nexport const cva = (base, config)=>(props)=>{\n var _config_compoundVariants;\n if ((config === null || config === void 0 ? void 0 : config.variants) == null) return cx(base, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);\n const { variants, defaultVariants } = config;\n const getVariantClassNames = Object.keys(variants).map((variant)=>{\n const variantProp = props === null || props === void 0 ? void 0 : props[variant];\n const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant];\n if (variantProp === null) return null;\n const variantKey = falsyToString(variantProp) || falsyToString(defaultVariantProp);\n return variants[variant][variantKey];\n });\n const propsWithoutUndefined = props && Object.entries(props).reduce((acc, param)=>{\n let [key, value] = param;\n if (value === undefined) {\n return acc;\n }\n acc[key] = value;\n return acc;\n }, {});\n const getCompoundVariantClassNames = config === null || config === void 0 ? void 0 : (_config_compoundVariants = config.compoundVariants) === null || _config_compoundVariants === void 0 ? void 0 : _config_compoundVariants.reduce((acc, param)=>{\n let { class: cvClass, className: cvClassName, ...compoundVariantOptions } = param;\n return Object.entries(compoundVariantOptions).every((param)=>{\n let [key, value] = param;\n return Array.isArray(value) ? value.includes({\n ...defaultVariants,\n ...propsWithoutUndefined\n }[key]) : ({\n ...defaultVariants,\n ...propsWithoutUndefined\n })[key] === value;\n }) ? [\n ...acc,\n cvClass,\n cvClassName\n ] : acc;\n }, []);\n return cx(base, getVariantClassNames, getCompoundVariantClassNames, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);\n };\n\n","import React from 'react'\n\nexport interface IconProps extends React.SVGProps<SVGSVGElement> {\n className?: string\n}\n\n/**\n * Reusable icon components extracted from various components\n * These are common SVG icons used throughout the UI library\n */\n\nexport const SpinnerIcon: React.FC<IconProps> = ({ className, ...props }) => (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n {...props}\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n)\n\nexport const CloseIcon: React.FC<IconProps> = ({ className, ...props }) => (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n)\n\nexport const ChevronDownIcon: React.FC<IconProps> = ({ className, ...props }) => (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n)\n\nexport const CheckIcon: React.FC<IconProps> = ({ className, ...props }) => (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n)\n\nexport const AlertCircleIcon: React.FC<IconProps> = ({ className, ...props }) => (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n)\n\nexport const AlertTriangleIcon: React.FC<IconProps> = ({ className, ...props }) => (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n)\n\nexport const InfoIcon: React.FC<IconProps> = ({ className, ...props }) => (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n)\n\nexport const SortAscIcon: React.FC<IconProps> = ({ className, ...props }) => (\n <svg\n className={className}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n {...props}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 15l7-7 7 7\" />\n </svg>\n)\n\nexport const SortDescIcon: React.FC<IconProps> = ({ className, ...props }) => (\n <svg\n className={className}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n {...props}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n)\n\nexport const ChevronRightIcon: React.FC<IconProps> = ({ className, ...props }) => (\n <svg\n className={className}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n {...props}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n)\n","import React, { forwardRef } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@/utils/cn'\nimport { useRipple } from '@/hooks'\nimport { SpinnerIcon } from '@/components/Icons'\nimport type {\n PolymorphicComponentPropsWithRef,\n PolymorphicRef,\n} from '@/utils/polymorphic'\n\n/**\n * Button variants using class-variance-authority\n * Provides a type-safe way to manage button styles and variants\n */\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 relative overflow-hidden',\n {\n variants: {\n variant: {\n primary:\n 'bg-primary text-primary-foreground hover:bg-primary-600 active:bg-primary-700',\n secondary:\n 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\n outline:\n 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',\n ghost: 'hover:bg-accent hover:text-accent-foreground',\n danger:\n 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\n success: 'bg-success text-success-foreground hover:bg-success/90',\n warning: 'bg-warning text-warning-foreground hover:bg-warning/90',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n xs: 'h-7 px-2 text-xs',\n sm: 'h-9 px-3',\n md: 'h-10 px-4 py-2',\n lg: 'h-11 px-8',\n xl: 'h-12 px-10 text-base',\n icon: 'h-10 w-10',\n },\n fullWidth: {\n true: 'w-full',\n },\n rounded: {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n full: 'rounded-full',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'md',\n rounded: 'md',\n },\n }\n)\n\nexport interface ButtonBaseProps extends VariantProps<typeof buttonVariants> {\n /** Whether button is in loading state */\n loading?: boolean\n /** Icon to display before text */\n leftIcon?: React.ReactNode\n /** Icon to display after text */\n rightIcon?: React.ReactNode\n /** Enable ripple effect on click */\n enableRipple?: boolean\n}\n\nexport type ButtonProps<C extends React.ElementType = 'button'> =\n PolymorphicComponentPropsWithRef<C, ButtonBaseProps>\n\n/**\n * Versatile Button component with multiple variants, sizes, and features\n *\n * Features:\n * - Multiple variants: primary, secondary, outline, ghost, danger, success, warning, link\n * - 6 size options from xs to xl\n * - Loading state with spinner\n * - Left/right icon support\n * - Ripple effect animation\n * - Polymorphic (can render as any element via 'as' prop)\n * - Full TypeScript support\n * - Accessible by default\n *\n * @example\n * <Button>Click me</Button>\n * <Button variant=\"outline\" size=\"sm\" leftIcon={<Icon />}>With Icon</Button>\n * <Button loading>Loading...</Button>\n * <Button as=\"a\" href=\"/link\">Link Button</Button>\n */\nexport const Button = (forwardRef as any)(\n <C extends React.ElementType = 'button'>(\n {\n as,\n variant,\n size,\n fullWidth,\n rounded,\n loading = false,\n leftIcon,\n rightIcon,\n enableRipple = true,\n className,\n children,\n disabled,\n onClick,\n ...props\n }: ButtonProps<C>,\n ref?: PolymorphicRef<C>\n ) => {\n const Component = as || 'button'\n const { ripples, createRipple } = useRipple()\n\n const handleClick = (\n e: React.MouseEvent<HTMLButtonElement | HTMLAnchorElement>\n ) => {\n if (enableRipple && !disabled && !loading) {\n createRipple(e as React.MouseEvent<HTMLElement>)\n }\n\n onClick?.(e as React.MouseEvent<HTMLButtonElement | HTMLAnchorElement>)\n }\n\n return (\n <Component\n ref={ref}\n className={cn(\n buttonVariants({ variant, size, fullWidth, rounded }),\n className\n )}\n disabled={disabled || loading}\n onClick={handleClick}\n {...props}\n >\n {/* Ripple effect */}\n {enableRipple &&\n ripples.map((ripple) => (\n <span\n key={ripple.id}\n className=\"absolute animate-ripple rounded-full bg-white/30\"\n style={{\n left: ripple.x,\n top: ripple.y,\n width: 10,\n height: 10,\n transform: 'translate(-50%, -50%)',\n }}\n />\n ))}\n\n {/* Loading spinner */}\n {loading && <SpinnerIcon className=\"h-4 w-4 animate-spin\" />}\n\n {/* Left icon */}\n {!loading && leftIcon && <span>{leftIcon}</span>}\n\n {/* Button text */}\n {children}\n\n {/* Right icon */}\n {!loading && rightIcon && <span>{rightIcon}</span>}\n </Component>\n )\n }\n) as (<C extends React.ElementType = 'button'>(\n props: ButtonProps<C> & { ref?: PolymorphicRef<C> }\n) => React.ReactElement | null) & { displayName?: string }\n\nButton.displayName = 'Button'\n\nexport { buttonVariants }\n","import React, { forwardRef, useState, useMemo } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@/utils/cn'\nimport { generateId } from '@/utils/id'\n\nconst inputVariants = cva(\n 'flex w-full rounded-md border bg-background text-sm transition-all file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50',\n {\n variants: {\n variant: {\n outlined:\n 'border-input focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n filled: 'border-transparent bg-muted focus-visible:bg-background',\n underlined:\n 'rounded-none border-x-0 border-t-0 border-b-2 px-0 focus-visible:border-primary',\n },\n inputSize: {\n sm: 'h-8 px-3 py-1 text-xs',\n md: 'h-10 px-3 py-2',\n lg: 'h-12 px-4 py-3 text-base',\n },\n state: {\n default: '',\n error: 'border-destructive focus-visible:ring-destructive',\n success: 'border-success focus-visible:ring-success',\n },\n },\n defaultVariants: {\n variant: 'outlined',\n inputSize: 'md',\n state: 'default',\n },\n }\n)\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix'>,\n VariantProps<typeof inputVariants> {\n /** Label text for the input */\n label?: string\n /** Helper text displayed below input */\n helperText?: string\n /** Error message (sets error state automatically) */\n error?: string\n /** Icon or element to show before input */\n prefix?: React.ReactNode\n /** Icon or element to show after input */\n suffix?: React.ReactNode\n /** Enable floating label animation */\n floatingLabel?: boolean\n /** Show character count (requires maxLength) */\n showCount?: boolean\n /** Wrapper className */\n wrapperClassName?: string\n}\n\n/**\n * Flexible Input component with multiple variants and features\n *\n * Features:\n * - Three variants: outlined, filled, underlined\n * - Three sizes: sm, md, lg\n * - Label with floating animation option\n * - Prefix/suffix icons\n * - Error and success states\n * - Helper text and error messages\n * - Character counter\n * - Fully accessible\n *\n * @example\n * <Input label=\"Email\" type=\"email\" />\n * <Input floatingLabel label=\"Username\" />\n * <Input prefix={<Icon />} placeholder=\"Search...\" />\n * <Input error=\"This field is required\" />\n */\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n className,\n wrapperClassName,\n variant,\n inputSize,\n state,\n label,\n helperText,\n error,\n prefix,\n suffix,\n floatingLabel = false,\n showCount = false,\n maxLength,\n value,\n onChange,\n id,\n ...props\n },\n ref\n ) => {\n const [isFocused, setIsFocused] = useState(false)\n const [charCount, setCharCount] = useState(\n value ? String(value).length : 0\n )\n\n // Memoize ID to prevent regeneration on every render\n const inputId = useMemo(() => id || generateId('input'), [id])\n const hasValue = value !== undefined && value !== ''\n const showFloatingLabel = floatingLabel && (isFocused || hasValue)\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setCharCount(e.target.value.length)\n onChange?.(e)\n }\n\n const finalState = error ? 'error' : state\n\n return (\n <div className={cn('w-full', wrapperClassName)}>\n {/* Label */}\n {label && !floatingLabel && (\n <label\n htmlFor={inputId}\n className=\"mb-2 block text-sm font-medium text-foreground\"\n >\n {label}\n </label>\n )}\n\n {/* Input wrapper */}\n <div className=\"relative\">\n {/* Floating label */}\n {floatingLabel && label && (\n <label\n htmlFor={inputId}\n className={cn(\n 'pointer-events-none absolute left-3 transition-all duration-200',\n showFloatingLabel\n ? 'top-0 -translate-y-1/2 bg-background px-1 text-xs font-medium text-primary'\n : 'top-1/2 -translate-y-1/2 text-sm text-muted-foreground'\n )}\n >\n {label}\n </label>\n )}\n\n {/* Prefix */}\n {prefix && (\n <div className=\"pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground\">\n {prefix}\n </div>\n )}\n\n {/* Input */}\n <input\n ref={ref}\n id={inputId}\n value={value}\n onChange={handleChange}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n maxLength={maxLength}\n className={cn(\n inputVariants({ variant, inputSize, state: finalState }),\n prefix && 'pl-10',\n suffix && 'pr-10',\n floatingLabel && 'pt-3',\n className\n )}\n {...props}\n />\n\n {/* Suffix */}\n {suffix && (\n <div className=\"pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground\">\n {suffix}\n </div>\n )}\n </div>\n\n {/* Helper text, error, or character count */}\n <div className=\"mt-1 flex items-center justify-between\">\n <div className=\"flex-1\">\n {error && (\n <p className=\"text-xs text-destructive\" role=\"alert\">\n {error}\n </p>\n )}\n {!error && helperText && (\n <p className=\"text-xs text-muted-foreground\">{helperText}</p>\n )}\n </div>\n {showCount && maxLength && (\n <p className=\"text-xs text-muted-foreground\">\n {charCount}/{maxLength}\n </p>\n )}\n </div>\n </div>\n )\n }\n)\n\nInput.displayName = 'Input'\n\nexport { inputVariants }\n","import React, { forwardRef, useEffect, useRef } from 'react'\nimport { cn } from '@/utils/cn'\nimport { inputVariants } from '../Input/Input'\n\nexport interface TextareaProps\n extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n /** Label text */\n label?: string\n /** Helper text */\n helperText?: string\n /** Error message */\n error?: string\n /** Auto-resize based on content */\n autoResize?: boolean\n /** Show character count */\n showCount?: boolean\n /** Wrapper className */\n wrapperClassName?: string\n}\n\n/**\n * Textarea component with auto-resize and character count\n *\n * @example\n * <Textarea label=\"Description\" rows={4} />\n * <Textarea autoResize maxLength={500} showCount />\n */\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n className,\n wrapperClassName,\n label,\n helperText,\n error,\n autoResize = false,\n showCount = false,\n maxLength,\n value,\n onChange,\n id,\n ...props\n },\n ref\n ) => {\n const textareaRef = useRef<HTMLTextAreaElement | null>(null)\n const textareaId = id || `textarea-${Math.random().toString(36).substr(2, 9)}`\n\n const charCount = value ? String(value).length : 0\n\n // Auto-resize functionality\n useEffect(() => {\n if (autoResize && textareaRef.current) {\n textareaRef.current.style.height = 'auto'\n textareaRef.current.style.height = `${textareaRef.current.scrollHeight}px`\n }\n }, [value, autoResize])\n\n const handleRef = (node: HTMLTextAreaElement) => {\n textareaRef.current = node\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n ref.current = node\n }\n }\n\n return (\n <div className={cn('w-full', wrapperClassName)}>\n {label && (\n <label\n htmlFor={textareaId}\n className=\"mb-2 block text-sm font-medium text-foreground\"\n >\n {label}\n </label>\n )}\n\n <textarea\n ref={handleRef}\n id={textareaId}\n value={value}\n onChange={onChange}\n maxLength={maxLength}\n className={cn(\n inputVariants({\n variant: 'outlined',\n inputSize: 'md',\n state: error ? 'error' : 'default',\n }),\n 'min-h-[80px] resize-none',\n !autoResize && 'resize-y',\n className\n )}\n {...props}\n />\n\n <div className=\"mt-1 flex items-center justify-between\">\n <div className=\"flex-1\">\n {error && (\n <p className=\"text-xs text-destructive\" role=\"alert\">\n {error}\n </p>\n )}\n {!error && helperText && (\n <p className=\"text-xs text-muted-foreground\">{helperText}</p>\n )}\n </div>\n {showCount && maxLength && (\n <p className=\"text-xs text-muted-foreground\">\n {charCount}/{maxLength}\n </p>\n )}\n </div>\n </div>\n )\n }\n)\n\nTextarea.displayName = 'Textarea'\n","import React, { forwardRef } from 'react'\nimport { cn } from '@/utils/cn'\n\nexport interface CheckboxProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\n /** Label for the checkbox */\n label?: string\n /** Helper text */\n helperText?: string\n /** Error message */\n error?: string\n}\n\n/**\n * Modern checkbox component styled with Tailwind CSS\n *\n * @example\n * <Checkbox label=\"Accept terms\" />\n * <Checkbox checked onChange={(e) => console.log(e.target.checked)} />\n */\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\n ({ className, label, helperText, error, id, ...props }, ref) => {\n const checkboxId = id || `checkbox-${Math.random().toString(36).substr(2, 9)}`\n\n return (\n <div className=\"flex flex-col gap-1\">\n <div className=\"flex items-center gap-2\">\n <input\n ref={ref}\n type=\"checkbox\"\n id={checkboxId}\n className={cn(\n // Base styles\n 'peer h-5 w-5 shrink-0 cursor-pointer appearance-none rounded border-2 border-primary/60',\n 'transition-all duration-200',\n // Focus styles\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/20 focus-visible:ring-offset-2',\n // Hover styles\n 'hover:border-primary',\n // Checked state\n 'checked:border-primary checked:bg-primary',\n // Checkmark via background SVG\n 'checked:bg-[url(\"data:image/svg+xml,%3csvg%20viewBox=%270%200%2016%2016%27%20fill=%27white%27%20xmlns=%27http://www.w3.org/2000/svg%27%3e%3cpath%20d=%27M12.207%204.793a1%201%200%20010%201.414l-5%205a1%201%200%2001-1.414%200l-2-2a1%201%200%20011.414-1.414L6.5%209.086l4.293-4.293a1%201%200%20011.414%200z%27/%3e%3c/svg%3e\")]',\n 'checked:bg-center checked:bg-no-repeat checked:bg-[length:80%]',\n // Disabled state\n 'disabled:cursor-not-allowed disabled:opacity-50',\n // Error state\n error && 'border-destructive checked:border-destructive checked:bg-destructive',\n className\n )}\n {...props}\n />\n\n {label && (\n <label\n htmlFor={checkboxId}\n className=\"cursor-pointer text-sm font-medium leading-none select-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n </label>\n )}\n </div>\n\n {error && (\n <p className=\"text-xs text-destructive\" role=\"alert\">\n {error}\n </p>\n )}\n {!error && helperText && (\n <p className=\"text-xs text-muted-foreground\">{helperText}</p>\n )}\n </div>\n )\n }\n)\n\nCheckbox.displayName = 'Checkbox'\n","import React, { forwardRef, useState } from 'react'\nimport { cn } from '@/utils/cn'\n\nexport interface SwitchProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\n /** Label for the switch */\n label?: string\n /** Helper text */\n helperText?: string\n /** Label position */\n labelPosition?: 'left' | 'right'\n /** Controlled checked state */\n checked?: boolean\n /** Callback when checked state changes */\n onCheckedChange?: (checked: boolean) => void\n}\n\n/**\n * Modern toggle switch styled with Tailwind CSS\n *\n * @example\n * <Switch label=\"Enable notifications\" />\n * <Switch checked={enabled} onCheckedChange={setEnabled} />\n */\nexport const Switch = forwardRef<HTMLInputElement, SwitchProps>(\n (\n {\n className,\n label,\n helperText,\n labelPosition = 'right',\n checked: controlledChecked,\n onCheckedChange,\n onChange,\n id,\n ...props\n },\n ref\n ) => {\n const [internalChecked, setInternalChecked] = useState(false)\n const isControlled = controlledChecked !== undefined\n const checked = isControlled ? controlledChecked : internalChecked\n\n const switchId = id || `switch-${Math.random().toString(36).substr(2, 9)}`\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newChecked = e.target.checked\n\n if (!isControlled) {\n setInternalChecked(newChecked)\n }\n\n onCheckedChange?.(newChecked)\n onChange?.(e)\n }\n\n const switchElement = (\n <div className=\"relative inline-block\">\n <input\n ref={ref}\n type=\"checkbox\"\n id={switchId}\n checked={checked}\n onChange={handleChange}\n role=\"switch\"\n aria-checked={checked}\n className={cn('peer sr-only', className)}\n {...props}\n />\n <label\n htmlFor={switchId}\n className={cn(\n // Switch track\n 'flex h-6 w-11 cursor-pointer items-center rounded-full p-0.5 transition-colors duration-200',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/20 focus-visible:ring-offset-2',\n // Unchecked state\n 'bg-input',\n // Checked state (peer-checked = when checkbox is checked)\n 'peer-checked:bg-primary',\n // Hover\n 'hover:bg-input/80 peer-checked:hover:bg-primary/90',\n // Disabled state\n 'peer-disabled:cursor-not-allowed peer-disabled:opacity-50'\n )}\n >\n {/* Switch thumb */}\n <span\n className={cn(\n 'pointer-events-none block h-5 w-5 rounded-full bg-background shadow-lg transition-transform duration-200',\n // Unchecked position\n 'translate-x-0',\n // Checked position\n checked && 'translate-x-5'\n )}\n />\n </label>\n </div>\n )\n\n if (!label) {\n return switchElement\n }\n\n return (\n <div className=\"flex flex-col gap-1\">\n <div\n className={cn(\n 'flex items-center gap-3',\n labelPosition === 'left' && 'flex-row-reverse justify-end'\n )}\n >\n {switchElement}\n <label\n htmlFor={switchId}\n className=\"cursor-pointer text-sm font-medium leading-none select-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n </label>\n </div>\n {helperText && (\n <p className=\"text-xs text-muted-foreground\">{helperText}</p>\n )}\n </div>\n )\n }\n)\n\nSwitch.displayName = 'Switch'\n","import React, { forwardRef, useState, useRef, useEffect } from 'react'\nimport { cn } from '@/utils/cn'\nimport { useClickOutside } from '@/hooks'\n\nexport interface SelectOption {\n value: string\n label: string\n disabled?: boolean\n}\n\nexport interface SelectProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Options to display */\n options: SelectOption[]\n /** Selected value */\n value?: string\n /** Callback when value changes */\n onChange?: (value: string) => void\n /** Placeholder text */\n placeholder?: string\n /** Label for the select */\n label?: string\n /** Helper text */\n helperText?: string\n /** Error message */\n error?: string\n /** Disabled state */\n disabled?: boolean\n /** Enable search/filter */\n searchable?: boolean\n}\n\n/**\n * Modern select dropdown with search functionality\n *\n * @example\n * <Select\n * options={[\n * { value: 'us', label: 'United States' },\n * { value: 'uk', label: 'United Kingdom' }\n * ]}\n * value={country}\n * onChange={setCountry}\n * />\n */\nexport const Select = forwardRef<HTMLDivElement, SelectProps>(\n (\n {\n options,\n value,\n onChange,\n placeholder = 'Select...',\n label,\n helperText,\n error,\n disabled = false,\n searchable = false,\n className,\n ...props\n },\n ref\n ) => {\n const [isOpen, setIsOpen] = useState(false)\n const [searchQuery, setSearchQuery] = useState('')\n const containerRef = useRef<HTMLDivElement>(null)\n const searchInputRef = useRef<HTMLInputElement>(null)\n\n useClickOutside(containerRef, () => setIsOpen(false))\n\n const selectedOption = options.find((opt) => opt.value === value)\n\n const filteredOptions = searchable\n ? options.filter((opt) =>\n opt.label.toLowerCase().includes(searchQuery.toLowerCase())\n )\n : options\n\n const handleSelect = (optionValue: string) => {\n onChange?.(optionValue)\n setIsOpen(false)\n setSearchQuery('')\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsOpen(false)\n } else if (e.key === 'ArrowDown' && !isOpen) {\n setIsOpen(true)\n }\n }\n\n useEffect(() => {\n if (isOpen && searchable && searchInputRef.current) {\n searchInputRef.current.focus()\n }\n }, [isOpen, searchable])\n\n return (\n <div ref={ref} className={cn('w-full', className)} {...props}>\n {label && (\n <label className=\"mb-2 block text-sm font-medium text-foreground\">\n {label}\n </label>\n )}\n\n <div ref={containerRef} className=\"relative\">\n {/* Select trigger */}\n <button\n type=\"button\"\n onClick={() => !disabled && setIsOpen(!isOpen)}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n className={cn(\n 'flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm',\n 'ring-offset-background transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n error && 'border-destructive',\n isOpen && 'ring-2 ring-ring ring-offset-2'\n )}\n >\n <span className={selectedOption ? 'text-foreground' : 'text-muted-foreground'}>\n {selectedOption?.label || placeholder}\n </span>\n <svg\n className={cn(\n 'h-4 w-4 transition-transform',\n isOpen && 'rotate-180'\n )}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </button>\n\n {/* Dropdown */}\n {isOpen && (\n <div className=\"absolute z-50 mt-1 w-full rounded-md border border-input bg-popover shadow-lg animate-scale-in\">\n {searchable && (\n <div className=\"border-b border-border p-2\">\n <input\n ref={searchInputRef}\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder=\"Search...\"\n className=\"w-full rounded-md border border-input bg-background px-3 py-1.5 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n </div>\n )}\n\n <div className=\"max-h-60 overflow-y-auto p-1\">\n {filteredOptions.length === 0 ? (\n <div className=\"px-3 py-2 text-sm text-muted-foreground\">\n No options found\n </div>\n ) : (\n filteredOptions.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n onClick={() => !option.disabled && handleSelect(option.value)}\n disabled={option.disabled}\n className={cn(\n 'flex w-full items-center rounded-sm px-3 py-2 text-left text-sm transition-colors',\n 'hover:bg-accent hover:text-accent-foreground',\n 'focus-visible:bg-accent focus-visible:outline-none',\n 'disabled:pointer-events-none disabled:opacity-50',\n option.value === value && 'bg-accent font-medium'\n )}\n >\n {option.label}\n {option.value === value && (\n <svg\n className=\"ml-auto h-4 w-4\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )}\n </button>\n ))\n )}\n </div>\n </div>\n )}\n </div>\n\n {error && (\n <p className=\"mt-1 text-xs text-destructive\" role=\"alert\">\n {error}\n </p>\n )}\n {!error && helperText && (\n <p className=\"mt-1 text-xs text-muted-foreground\">{helperText}</p>\n )}\n </div>\n )\n }\n)\n\nSelect.displayName = 'Select'\n","import React, { forwardRef, useEffect, useRef } from 'react'\nimport { cn } from '@/utils/cn'\nimport { useFocusTrap, useLockBodyScroll } from '@/hooks'\nimport { CloseIcon } from '@/components/Icons'\nimport { KEYBOARD_KEYS } from '@/constants'\n\nexport interface ModalProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Whether modal is open */\n open: boolean\n /** Callback when modal should close */\n onClose: () => void\n /** Modal size */\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full'\n /** Show close button */\n showClose?: boolean\n /** Prevent closing on overlay click */\n preventClose?: boolean\n}\n\n/**\n * Modal/Dialog component with overlay and focus trap\n *\n * @example\n * <Modal open={isOpen} onClose={() => setIsOpen(false)}>\n * <h2>Modal Title</h2>\n * <p>Modal content</p>\n * </Modal>\n */\nexport const Modal = forwardRef<HTMLDivElement, ModalProps>(\n (\n {\n open,\n onClose,\n size = 'md',\n showClose = true,\n preventClose = false,\n className,\n children,\n ...props\n },\n ref\n ) => {\n const modalRef = useRef<HTMLDivElement>(null)\n\n // Lock body scroll when modal is open\n useLockBodyScroll(open)\n\n // Trap focus within modal\n useFocusTrap(modalRef, open, true)\n\n // Handle ESC key\n useEffect(() => {\n if (!open) return\n\n const handleEsc = (e: KeyboardEvent) => {\n if (e.key === KEYBOARD_KEYS.ESCAPE && !preventClose) {\n onClose()\n }\n }\n\n document.addEventListener('keydown', handleEsc)\n return () => document.removeEventListener('keydown', handleEsc)\n }, [open, onClose, preventClose])\n\n if (!open) return null\n\n const sizeClasses = {\n sm: 'max-w-sm',\n md: 'max-w-md',\n lg: 'max-w-lg',\n xl: 'max-w-xl',\n full: 'max-w-full mx-4',\n }\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center\"\n role=\"dialog\"\n aria-modal=\"true\"\n >\n {/* Overlay */}\n <div\n className=\"absolute inset-0 bg-black/50 animate-fade-in\"\n onClick={() => !preventClose && onClose()}\n />\n\n {/* Modal content */}\n <div\n ref={(node) => {\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n ref.current = node\n }\n // Update internal ref\n if (modalRef.current !== node) {\n (modalRef as React.MutableRefObject<HTMLDivElement | null>).current = node\n }\n }}\n className={cn(\n 'relative z-10 w-full rounded-lg bg-popover border border-border p-6 shadow-xl animate-scale-in',\n sizeClasses[size],\n className\n )}\n onClick={(e) => e.stopPropagation()}\n {...props}\n >\n {/* Close button */}\n {showClose && (\n <button\n onClick={onClose}\n className=\"absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\"\n aria-label=\"Close modal\"\n >\n <CloseIcon className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </button>\n )}\n\n {children}\n </div>\n </div>\n )\n }\n)\n\nModal.displayName = 'Modal'\n\n// Compound components for better structure\nexport const ModalHeader = forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn('mb-4 space-y-2', className)} {...props} />\n))\nModalHeader.displayName = 'ModalHeader'\n\nexport const ModalTitle = forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h2\n ref={ref}\n className={cn('text-xl font-semibold text-foreground leading-none', className)}\n {...props}\n />\n))\nModalTitle.displayName = 'ModalTitle'\n\nexport const ModalDescription = forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn('text-sm text-muted-foreground leading-relaxed', className)}\n {...props}\n />\n))\nModalDescription.displayName = 'ModalDescription'\n\nexport const ModalFooter = forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('mt-6 flex items-center justify-end gap-3', className)}\n {...props}\n />\n))\nModalFooter.displayName = 'ModalFooter'\n","import React, { createContext, useContext, useState, useCallback, useEffect } from 'react'\nimport { cn } from '@/utils/cn'\nimport { generateId } from '@/utils/id'\nimport { ANIMATION_DURATION } from '@/constants'\nimport { CheckIcon, AlertCircleIcon, AlertTriangleIcon, InfoIcon, CloseIcon } from '@/components/Icons'\n\nexport interface Toast {\n id: string\n title?: string\n description?: string\n variant?: 'default' | 'success' | 'error' | 'warning' | 'info'\n duration?: number\n}\n\ninterface ToastContextValue {\n toasts: Toast[]\n addToast: (toast: Omit<Toast, 'id'>) => void\n removeToast: (id: string) => void\n}\n\nconst ToastContext = createContext<ToastContextValue | undefined>(undefined)\n\nexport const useToast = () => {\n const context = useContext(ToastContext)\n if (!context) {\n throw new Error('useToast must be used within ToastProvider')\n }\n return context\n}\n\nexport const ToastProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => {\n const [toasts, setToasts] = useState<Toast[]>([])\n\n const removeToast = useCallback((id: string) => {\n setToasts((prev) => prev.filter((toast) => toast.id !== id))\n }, [])\n\n const addToast = useCallback((toast: Omit<Toast, 'id'>) => {\n const id = generateId('toast')\n const newToast = { ...toast, id }\n\n setToasts((prev) => [...prev, newToast])\n\n const duration = toast.duration ?? ANIMATION_DURATION.TOAST_DEFAULT\n if (duration > 0) {\n setTimeout(() => {\n removeToast(id)\n }, duration)\n }\n }, [removeToast])\n\n // Listen for custom toast events (for imperative toast API)\n useEffect(() => {\n const handleToastEvent = (e: Event) => {\n const customEvent = e as CustomEvent\n addToast(customEvent.detail)\n }\n\n window.addEventListener('toast', handleToastEvent)\n return () => window.removeEventListener('toast', handleToastEvent)\n }, [addToast])\n\n return (\n <ToastContext.Provider value={{ toasts, addToast, removeToast }}>\n {children}\n <ToastContainer />\n </ToastContext.Provider>\n )\n}\n\nconst ToastContainer: React.FC = () => {\n const { toasts, removeToast } = useToast()\n\n return (\n <div className=\"fixed bottom-4 right-4 z-50 flex flex-col gap-2 w-full max-w-sm pointer-events-none\">\n {toasts.map((toast) => (\n <ToastItem key={toast.id} toast={toast} onClose={() => removeToast(toast.id)} />\n ))}\n </div>\n )\n}\n\ninterface ToastItemProps {\n toast: Toast\n onClose: () => void\n}\n\nconst ToastItem: React.FC<ToastItemProps> = ({ toast, onClose }) => {\n const variantStyles: Record<Toast['variant'] & string, string> = {\n default: 'bg-popover border-border backdrop-blur-sm shadow-xl',\n success: 'bg-popover border-green-300 dark:border-green-700 backdrop-blur-sm shadow-xl',\n error: 'bg-popover border-red-300 dark:border-red-700 backdrop-blur-sm shadow-xl',\n warning: 'bg-popover border-amber-300 dark:border-amber-700 backdrop-blur-sm shadow-xl',\n info: 'bg-popover border-blue-300 dark:border-blue-700 backdrop-blur-sm shadow-xl',\n }\n\n const iconContainerStyles: Record<string, string> = {\n success: 'bg-green-100 dark:bg-green-900/30 text-green-600 dark:text-green-400',\n error: 'bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400',\n warning: 'bg-amber-100 dark:bg-amber-900/30 text-amber-600 dark:text-amber-400',\n info: 'bg-blue-100 dark:bg-blue-900/30 text-blue-600 dark:text-blue-400',\n }\n\n const variantIcons: Record<string, React.ReactNode> = {\n success: <CheckIcon className=\"h-4 w-4\" />,\n error: <AlertCircleIcon className=\"h-4 w-4\" />,\n warning: <AlertTriangleIcon className=\"h-4 w-4\" />,\n info: <InfoIcon className=\"h-4 w-4\" />,\n }\n\n const variant = toast.variant || 'default'\n\n return (\n <div\n className={cn(\n 'pointer-events-auto flex items-start gap-3 rounded-xl border p-4 shadow-lg shadow-black/5 animate-slide-in-from-bottom',\n variantStyles[variant]\n )}\n >\n {variant !== 'default' && iconContainerStyles[variant] && (\n <div className={cn(\n 'shrink-0 rounded-lg p-1.5',\n iconContainerStyles[variant]\n )}>\n {variantIcons[variant]}\n </div>\n )}\n\n <div className=\"flex-1 pt-0.5\">\n {toast.title && (\n <div className=\"font-medium text-sm text-foreground leading-none\">\n {toast.title}\n </div>\n )}\n {toast.description && (\n <div className=\"mt-1.5 text-sm text-muted-foreground leading-snug\">\n {toast.description}\n </div>\n )}\n </div>\n\n <button\n onClick={onClose}\n className=\"shrink-0 rounded-md p-1 text-foreground/40 transition-colors hover:text-foreground/60 hover:bg-accent focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1\"\n aria-label=\"Close notification\"\n >\n <CloseIcon className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </button>\n </div>\n )\n}\n\n// Helper function for quick toast (imperative API)\nexport const toast = {\n success: (title: string, description?: string) => {\n const event = new CustomEvent('toast', {\n detail: { title, description, variant: 'success' },\n })\n window.dispatchEvent(event)\n },\n error: (title: string, description?: string) => {\n const event = new CustomEvent('toast', {\n detail: { title, description, variant: 'error' },\n })\n window.dispatchEvent(event)\n },\n warning: (title: string, description?: string) => {\n const event = new CustomEvent('toast', {\n detail: { title, description, variant: 'warning' },\n })\n window.dispatchEvent(event)\n },\n info: (title: string, description?: string) => {\n const event = new CustomEvent('toast', {\n detail: { title, description, variant: 'info' },\n })\n window.dispatchEvent(event)\n },\n message: (title: string, description?: string) => {\n const event = new CustomEvent('toast', {\n detail: { title, description, variant: 'default' },\n })\n window.dispatchEvent(event)\n },\n}\n","import React, { forwardRef, useState, createContext, useContext } from 'react'\nimport { cn } from '@/utils/cn'\n\ninterface TabsContextValue {\n activeTab: string\n setActiveTab: (value: string) => void\n}\n\nconst TabsContext = createContext<TabsContextValue | undefined>(undefined)\n\nconst useTabsContext = () => {\n const context = useContext(TabsContext)\n if (!context) {\n throw new Error('Tabs compound components must be used within Tabs')\n }\n return context\n}\n\nexport interface TabsProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Default active tab */\n defaultValue: string\n /** Controlled active tab */\n value?: string\n /** Callback when tab changes */\n onValueChange?: (value: string) => void\n}\n\n/**\n * Tabs container - use with TabsList, TabsTrigger, and TabsContent\n *\n * @example\n * <Tabs defaultValue=\"tab1\">\n * <TabsList>\n * <TabsTrigger value=\"tab1\">Tab 1</TabsTrigger>\n * <TabsTrigger value=\"tab2\">Tab 2</TabsTrigger>\n * </TabsList>\n * <TabsContent value=\"tab1\">Content 1</TabsContent>\n * <TabsContent value=\"tab2\">Content 2</TabsContent>\n * </Tabs>\n */\nexport const Tabs = forwardRef<HTMLDivElement, TabsProps>(\n ({ defaultValue, value: controlledValue, onValueChange, className, children, ...props }, ref) => {\n const [internalValue, setInternalValue] = useState(defaultValue)\n const isControlled = controlledValue !== undefined\n const activeTab = isControlled ? controlledValue : internalValue\n\n const setActiveTab = (newValue: string) => {\n if (!isControlled) {\n setInternalValue(newValue)\n }\n onValueChange?.(newValue)\n }\n\n return (\n <TabsContext.Provider value={{ activeTab, setActiveTab }}>\n <div ref={ref} className={cn('w-full', className)} {...props}>\n {children}\n </div>\n </TabsContext.Provider>\n )\n }\n)\n\nTabs.displayName = 'Tabs'\n\nexport const TabsList = forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground',\n className\n )}\n role=\"tablist\"\n {...props}\n />\n )\n)\n\nTabsList.displayName = 'TabsList'\n\nexport interface TabsTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n value: string\n}\n\nexport const TabsTrigger = forwardRef<HTMLButtonElement, TabsTriggerProps>(\n ({ value, className, ...props }, ref) => {\n const { activeTab, setActiveTab } = useTabsContext()\n const isActive = activeTab === value\n\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n onClick={() => setActiveTab(value)}\n className={cn(\n 'inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium',\n 'ring-offset-background transition-all',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:pointer-events-none disabled:opacity-50',\n isActive\n ? 'bg-background text-foreground shadow-sm'\n : 'hover:bg-background/50 hover:text-foreground',\n className\n )}\n {...props}\n />\n )\n }\n)\n\nTabsTrigger.displayName = 'TabsTrigger'\n\nexport interface TabsContentProps extends React.HTMLAttributes<HTMLDivElement> {\n value: string\n}\n\nexport const TabsContent = forwardRef<HTMLDivElement, TabsContentProps>(\n ({ value, className, ...props }, ref) => {\n const { activeTab } = useTabsContext()\n const isActive = activeTab === value\n\n if (!isActive) return null\n\n return (\n <div\n ref={ref}\n role=\"tabpanel\"\n className={cn('mt-4 ring-offset-background', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2', className)}\n {...props}\n />\n )\n }\n)\n\nTabsContent.displayName = 'TabsContent'\n","import React, { forwardRef, useState, useRef, useEffect } from 'react'\nimport { cn } from '@/utils/cn'\n\nexport interface TooltipProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'content'> {\n /** Content to show in tooltip */\n content: React.ReactNode\n /** Tooltip position */\n position?: 'top' | 'bottom' | 'left' | 'right'\n /** Delay before showing (ms) */\n delay?: number\n}\n\n/**\n * Tooltip component that shows on hover\n *\n * @example\n * <Tooltip content=\"This is a tooltip\">\n * <button>Hover me</button>\n * </Tooltip>\n */\nexport const Tooltip = forwardRef<HTMLDivElement, TooltipProps>(\n ({ content, position = 'top', delay = 200, className, children, ...props }, ref) => {\n const [isVisible, setIsVisible] = useState(false)\n const [coords, setCoords] = useState({ x: 0, y: 0 })\n const timeoutRef = useRef<ReturnType<typeof setTimeout>>()\n const triggerRef = useRef<HTMLDivElement>(null)\n\n const showTooltip = () => {\n timeoutRef.current = setTimeout(() => {\n setIsVisible(true)\n updatePosition()\n }, delay)\n }\n\n const hideTooltip = () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n setIsVisible(false)\n }\n\n const updatePosition = () => {\n if (!triggerRef.current) return\n\n const rect = triggerRef.current.getBoundingClientRect()\n const offset = 8\n\n const positions = {\n top: {\n x: rect.left + rect.width / 2,\n y: rect.top - offset,\n },\n bottom: {\n x: rect.left + rect.width / 2,\n y: rect.bottom + offset,\n },\n left: {\n x: rect.left - offset,\n y: rect.top + rect.height / 2,\n },\n right: {\n x: rect.right + offset,\n y: rect.top + rect.height / 2,\n },\n }\n\n setCoords(positions[position])\n }\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n }\n }, [])\n\n const positionClasses = {\n top: '-translate-x-1/2 -translate-y-full',\n bottom: '-translate-x-1/2',\n left: '-translate-x-full -translate-y-1/2',\n right: '-translate-y-1/2',\n }\n\n return (\n <>\n <div\n ref={triggerRef}\n onMouseEnter={showTooltip}\n onMouseLeave={hideTooltip}\n onFocus={showTooltip}\n onBlur={hideTooltip}\n className=\"inline-block\"\n >\n {children}\n </div>\n\n {isVisible && (\n <div\n ref={ref}\n role=\"tooltip\"\n style={{\n position: 'fixed',\n left: `${coords.x}px`,\n top: `${coords.y}px`,\n }}\n className={cn(\n 'z-50 rounded-md bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md border border-border',\n 'pointer-events-none animate-fade-in',\n positionClasses[position],\n className\n )}\n {...props}\n >\n {content}\n {/* Arrow */}\n <div\n className={cn(\n 'absolute h-2 w-2 rotate-45 bg-popover',\n position === 'top' && 'bottom-[-4px] left-1/2 -translate-x-1/2',\n position === 'bottom' && 'top-[-4px] left-1/2 -translate-x-1/2',\n position === 'left' && 'right-[-4px] top-1/2 -translate-y-1/2',\n position === 'right' && 'left-[-4px] top-1/2 -translate-y-1/2'\n )}\n />\n </div>\n )}\n </>\n )\n }\n)\n\nTooltip.displayName = 'Tooltip'\n","import React, { forwardRef } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@/utils/cn'\n\nconst cardVariants = cva(\n 'rounded-lg border bg-card text-card-foreground shadow-sm transition-all',\n {\n variants: {\n variant: {\n default: '',\n outline: 'border-2',\n elevated: 'shadow-lg',\n ghost: 'border-transparent shadow-none',\n },\n hoverable: {\n true: 'hover:shadow-md cursor-pointer',\n },\n padding: {\n none: '',\n sm: 'p-4',\n md: 'p-6',\n lg: 'p-8',\n },\n },\n defaultVariants: {\n variant: 'default',\n padding: 'md',\n },\n }\n)\n\nexport interface CardProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof cardVariants> {}\n\nexport const Card = forwardRef<HTMLDivElement, CardProps>(\n ({ className, variant, hoverable, padding, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(cardVariants({ variant, hoverable, padding }), className)}\n {...props}\n />\n )\n }\n)\n\nCard.displayName = 'Card'\n\n// Compound components for Card structure\nexport const CardHeader = forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex flex-col space-y-1.5 pb-4', className)}\n {...props}\n />\n))\nCardHeader.displayName = 'CardHeader'\n\nexport const CardTitle = forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn('text-2xl font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n))\nCardTitle.displayName = 'CardTitle'\n\nexport const CardDescription = forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n))\nCardDescription.displayName = 'CardDescription'\n\nexport const CardContent = forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn('py-4 first:pt-0', className)} {...props} />\n))\nCardContent.displayName = 'CardContent'\n\nexport const CardFooter = forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex items-center pt-4', className)}\n {...props}\n />\n))\nCardFooter.displayName = 'CardFooter'\n\nexport { cardVariants }\n","import React, { forwardRef } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@/utils/cn'\n\nconst badgeVariants = cva(\n 'inline-flex items-center rounded-full border font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n {\n variants: {\n variant: {\n default: 'border-transparent bg-primary text-primary-foreground',\n secondary: 'border-transparent bg-secondary text-secondary-foreground',\n destructive:\n 'border-transparent bg-destructive text-destructive-foreground',\n success: 'border-transparent bg-success text-success-foreground',\n warning: 'border-transparent bg-warning text-warning-foreground',\n outline: 'border-border text-foreground',\n },\n size: {\n sm: 'px-2 py-0.5 text-xs',\n md: 'px-2.5 py-0.5 text-sm',\n lg: 'px-3 py-1 text-base',\n },\n dot: {\n true: 'gap-1.5',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n },\n }\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {\n /** Show a dot indicator */\n showDot?: boolean\n}\n\n/**\n * Badge component for labels and status indicators\n *\n * @example\n * <Badge>New</Badge>\n * <Badge variant=\"success\">Active</Badge>\n * <Badge showDot>Live</Badge>\n */\nexport const Badge = forwardRef<HTMLDivElement, BadgeProps>(\n ({ className, variant, size, showDot, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(badgeVariants({ variant, size, dot: showDot }), className)}\n {...props}\n >\n {showDot && (\n <span className=\"h-1.5 w-1.5 rounded-full bg-current animate-pulse\" />\n )}\n {children}\n </div>\n )\n }\n)\n\nBadge.displayName = 'Badge'\n\nexport { badgeVariants }\n","import React, { forwardRef, useState } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@/utils/cn'\n\nconst avatarVariants = cva(\n 'relative inline-flex shrink-0 items-center justify-center overflow-hidden bg-muted font-medium text-muted-foreground',\n {\n variants: {\n size: {\n sm: 'h-8 w-8 text-xs',\n md: 'h-10 w-10 text-sm',\n lg: 'h-12 w-12 text-base',\n xl: 'h-16 w-16 text-lg',\n '2xl': 'h-20 w-20 text-xl',\n },\n shape: {\n circle: 'rounded-full',\n square: 'rounded-md',\n },\n },\n defaultVariants: {\n size: 'md',\n shape: 'circle',\n },\n }\n)\n\nexport interface AvatarProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof avatarVariants> {\n /** Image source */\n src?: string\n /** Alt text for image */\n alt?: string\n /** Fallback text (usually initials) */\n fallback?: string\n /** Show status indicator */\n status?: 'online' | 'offline' | 'away' | 'busy'\n}\n\n/**\n * Modern avatar component styled with Tailwind CSS\n *\n * @example\n * <Avatar src=\"/avatar.jpg\" alt=\"John Doe\" />\n * <Avatar fallback=\"JD\" status=\"online\" />\n */\nexport const Avatar = forwardRef<HTMLDivElement, AvatarProps>(\n ({ className, size, shape, src, alt, fallback, status, ...props }, ref) => {\n const [imageError, setImageError] = useState(false)\n const [imageLoaded, setImageLoaded] = useState(false)\n\n const statusColors = {\n online: 'bg-success',\n offline: 'bg-muted-foreground',\n away: 'bg-warning',\n busy: 'bg-destructive',\n }\n\n const shouldShowImage = src && !imageError\n const shouldShowFallback = !shouldShowImage || !imageLoaded\n\n // Generate initials from alt or fallback\n const initials =\n fallback ||\n alt\n ?.split(' ')\n .map((word) => word[0])\n .join('')\n .toUpperCase()\n .slice(0, 2) ||\n '?'\n\n return (\n <div className=\"relative inline-block\">\n <div\n ref={ref}\n className={cn(avatarVariants({ size, shape }), className)}\n {...props}\n >\n {/* Image */}\n {shouldShowImage && (\n <img\n src={src}\n alt={alt}\n onError={() => setImageError(true)}\n onLoad={() => setImageLoaded(true)}\n className={cn(\n 'aspect-square h-full w-full object-cover',\n !imageLoaded && 'hidden'\n )}\n />\n )}\n\n {/* Fallback initials */}\n {shouldShowFallback && <span>{initials}</span>}\n </div>\n\n {/* Status indicator */}\n {status && (\n <span\n className={cn(\n 'absolute bottom-0 right-0 block rounded-full border-2 border-background',\n statusColors[status],\n size === 'sm' && 'h-2 w-2',\n size === 'md' && 'h-2.5 w-2.5',\n size === 'lg' && 'h-3 w-3',\n size === 'xl' && 'h-4 w-4',\n size === '2xl' && 'h-5 w-5'\n )}\n aria-label={`Status: ${status}`}\n />\n )}\n </div>\n )\n }\n)\n\nAvatar.displayName = 'Avatar'\n\nexport { avatarVariants }\n","import React from 'react'\nimport { cn } from '@/utils/cn'\n\nexport interface TablePaginationProps {\n currentPage: number\n totalPages: number\n pageSize: number\n totalItems: number\n onPageChange: (page: number) => void\n canGoNext: boolean\n canGoPrevious: boolean\n}\n\n/**\n * Table pagination component\n * Separated for better maintainability\n */\nexport const TablePagination: React.FC<TablePaginationProps> = ({\n currentPage,\n totalPages,\n pageSize,\n totalItems,\n onPageChange,\n canGoNext,\n canGoPrevious,\n}) => {\n const startItem = (currentPage - 1) * pageSize + 1\n const endItem = Math.min(currentPage * pageSize, totalItems)\n\n return (\n <div className=\"mt-4 flex items-center justify-between\">\n <p className=\"text-sm text-muted-foreground\">\n Showing {startItem} to {endItem} of {totalItems} results\n </p>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => onPageChange(currentPage - 1)}\n disabled={!canGoPrevious}\n className={cn(\n 'rounded-md border border-border px-3 py-1 text-sm transition-colors',\n !canGoPrevious ? 'cursor-not-allowed opacity-50' : 'hover:bg-muted'\n )}\n aria-label=\"Previous page\"\n >\n Previous\n </button>\n <span className=\"text-sm text-muted-foreground\">\n Page {currentPage} of {totalPages}\n </span>\n <button\n onClick={() => onPageChange(currentPage + 1)}\n disabled={!canGoNext}\n className={cn(\n 'rounded-md border border-border px-3 py-1 text-sm transition-colors',\n !canGoNext ? 'cursor-not-allowed opacity-50' : 'hover:bg-muted'\n )}\n aria-label=\"Next page\"\n >\n Next\n </button>\n </div>\n </div>\n )\n}\n","import React, { forwardRef, useState } from 'react'\nimport { cn } from '@/utils/cn'\nimport { useTableSort } from '@/hooks/useTableSort'\nimport { useTablePagination } from '@/hooks/useTablePagination'\nimport { SortAscIcon, SortDescIcon, ChevronRightIcon } from '@/components/Icons'\nimport { TablePagination } from './TablePagination'\n\n// Types\nexport interface Column<T = unknown> {\n key: string\n header: React.ReactNode\n accessor?: (row: T) => React.ReactNode\n sortable?: boolean\n width?: string\n align?: 'left' | 'center' | 'right'\n}\n\nexport interface TableProps<T = unknown> extends React.HTMLAttributes<HTMLTableElement> {\n /** Table columns configuration */\n columns: Column<T>[]\n /** Table data */\n data: T[]\n /** Enable striped rows */\n striped?: boolean\n /** Enable hover effect */\n hoverable?: boolean\n /** Table size */\n size?: 'sm' | 'md' | 'lg'\n /** Enable sorting */\n sortable?: boolean\n /** Default sort column */\n defaultSortKey?: string\n /** Default sort direction */\n defaultSortDirection?: 'asc' | 'desc'\n /** Callback when sort changes */\n onSortChange?: (key: string, direction: 'asc' | 'desc') => void\n /** Enable expandable rows */\n expandable?: boolean\n /** Render expanded content */\n renderExpanded?: (row: T, index: number) => React.ReactNode\n /** Enable pagination */\n pagination?: boolean\n /** Items per page */\n pageSize?: number\n /** Current page (controlled) */\n currentPage?: number\n /** Callback when page changes */\n onPageChange?: (page: number) => void\n /** Loading state */\n loading?: boolean\n /** Empty state message */\n emptyMessage?: string\n}\n\n/**\n * Comprehensive Table component with sorting, pagination, and expandable rows\n * Refactored for better maintainability\n *\n * Features:\n * - Sortable columns\n * - Expandable rows\n * - Pagination\n * - Striped and hoverable rows\n * - Responsive design\n * - Loading state\n * - Empty state\n * - Size variants\n *\n * @example\n * <Table\n * columns={[\n * { key: 'name', header: 'Name', sortable: true },\n * { key: 'email', header: 'Email' }\n * ]}\n * data={users}\n * sortable\n * pagination\n * pageSize={10}\n * />\n */\nexport const Table = forwardRef<HTMLTableElement, TableProps>(\n (\n {\n columns,\n data,\n striped = false,\n hoverable = true,\n size = 'md',\n sortable = false,\n defaultSortKey,\n defaultSortDirection = 'asc',\n onSortChange,\n expandable = false,\n renderExpanded,\n pagination = false,\n pageSize = 10,\n currentPage,\n onPageChange,\n loading = false,\n emptyMessage = 'No data available',\n className,\n ...props\n },\n ref\n ) => {\n // Expandable rows state\n const [expandedRows, setExpandedRows] = useState<Set<number>>(new Set())\n\n // Sorting\n const { sortedData, sortKey, sortDirection, handleSort } = useTableSort({\n data,\n columns,\n defaultSortKey,\n defaultSortDirection,\n onSortChange,\n })\n\n // Pagination\n const {\n paginatedData,\n currentPage: page,\n totalPages,\n handlePageChange,\n canGoNext,\n canGoPrevious,\n } = useTablePagination({\n data: sortedData,\n pageSize,\n currentPage,\n onPageChange,\n })\n\n // Toggle row expansion\n const toggleExpanded = (index: number) => {\n const newExpanded = new Set(expandedRows)\n if (newExpanded.has(index)) {\n newExpanded.delete(index)\n } else {\n newExpanded.add(index)\n }\n setExpandedRows(newExpanded)\n }\n\n // Size classes\n const sizeClasses = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n }\n\n const cellPadding = {\n sm: 'px-3 py-2',\n md: 'px-4 py-3',\n lg: 'px-6 py-4',\n }\n\n const displayData = pagination ? paginatedData : sortedData\n\n return (\n <div className=\"w-full\">\n <div className=\"overflow-x-auto rounded-lg border border-border\">\n <table\n ref={ref}\n className={cn('w-full border-collapse', sizeClasses[size], className)}\n {...props}\n >\n {/* Table Header */}\n <thead className=\"bg-muted/50\">\n <tr>\n {expandable && <th className={cn('w-12', cellPadding[size])} />}\n {columns.map((column) => (\n <th\n key={column.key}\n className={cn(\n cellPadding[size],\n 'text-left font-semibold text-foreground',\n column.align === 'center' && 'text-center',\n column.align === 'right' && 'text-right',\n sortable && column.sortable !== false && 'cursor-pointer select-none hover:bg-muted',\n column.width && `w-[${column.width}]`\n )}\n onClick={() => sortable && column.sortable !== false && handleSort(column.key)}\n style={{ width: column.width }}\n >\n <div className=\"flex items-center gap-2\">\n {column.header}\n {sortable && column.sortable !== false && (\n <span className=\"text-muted-foreground\">\n {sortKey === column.key ? (\n sortDirection === 'asc' ? (\n <SortAscIcon className=\"h-4 w-4\" />\n ) : (\n <SortDescIcon className=\"h-4 w-4\" />\n )\n ) : (\n <div className=\"h-4 w-4\" />\n )}\n </span>\n )}\n </div>\n </th>\n ))}\n </tr>\n </thead>\n\n {/* Table Body */}\n <tbody>\n {loading ? (\n <tr>\n <td\n colSpan={columns.length + (expandable ? 1 : 0)}\n className={cn(cellPadding[size], 'text-center text-muted-foreground')}\n >\n Loading...\n </td>\n </tr>\n ) : displayData.length === 0 ? (\n <tr>\n <td\n colSpan={columns.length + (expandable ? 1 : 0)}\n className={cn(cellPadding[size], 'text-center text-muted-foreground')}\n >\n {emptyMessage}\n </td>\n </tr>\n ) : (\n displayData.map((row, rowIndex) => {\n const isExpanded = expandedRows.has(rowIndex)\n return (\n <React.Fragment key={rowIndex}>\n <tr\n className={cn(\n 'border-t border-border',\n striped && rowIndex % 2 === 1 && 'bg-muted/30',\n hoverable && 'hover:bg-muted/50 transition-colors',\n expandable && 'cursor-pointer'\n )}\n onClick={expandable ? () => toggleExpanded(rowIndex) : undefined}\n >\n {expandable && (\n <td className={cellPadding[size]}>\n <div\n className=\"flex items-center justify-center text-muted-foreground hover:text-foreground transition-all\"\n aria-label={isExpanded ? 'Collapse row' : 'Expand row'}\n >\n <ChevronRightIcon\n className={cn(\n 'h-4 w-4 transition-transform duration-200',\n isExpanded && 'rotate-90'\n )}\n />\n </div>\n </td>\n )}\n {columns.map((column) => {\n const value = column.accessor\n ? column.accessor(row)\n : (row as Record<string, unknown>)[column.key]\n return (\n <td\n key={column.key}\n className={cn(\n cellPadding[size],\n 'text-foreground',\n column.align === 'center' && 'text-center',\n column.align === 'right' && 'text-right'\n )}\n >\n {value as React.ReactNode}\n </td>\n )\n })}\n </tr>\n {expandable && isExpanded && renderExpanded && (\n <tr className=\"border-t border-border bg-muted/20\">\n <td colSpan={columns.length + 1} className={cellPadding[size]}>\n {renderExpanded(row, rowIndex)}\n </td>\n </tr>\n )}\n </React.Fragment>\n )\n })\n )}\n </tbody>\n </table>\n </div>\n\n {/* Pagination */}\n {pagination && !loading && displayData.length > 0 && (\n <TablePagination\n currentPage={page}\n totalPages={totalPages}\n pageSize={pageSize}\n totalItems={sortedData.length}\n onPageChange={handlePageChange}\n canGoNext={canGoNext}\n canGoPrevious={canGoPrevious}\n />\n )}\n </div>\n )\n }\n)\n\nTable.displayName = 'Table'\n"],"names":["falsyToString","value","cx","clsx","cva","base","config","props","_config_compoundVariants","variants","class","className","defaultVariants","getVariantClassNames","Object","keys","map","variant","variantProp","defaultVariantProp","variantKey","propsWithoutUndefined","entries","reduce","acc","param","key","getCompoundVariantClassNames","compoundVariants","cvClass","cvClassName","compoundVariantOptions","every","Array","isArray","includes","SpinnerIcon","jsxs","xmlns","fill","viewBox","children","jsx","cy","r","stroke","strokeWidth","d","CloseIcon","strokeLinecap","strokeLinejoin","x1","y1","x2","y2","CheckIcon","points","AlertCircleIcon","AlertTriangleIcon","InfoIcon","SortAscIcon","SortDescIcon","ChevronRightIcon","buttonVariants","primary","secondary","outline","ghost","danger","success","warning","link","size","xs","sm","md","lg","xl","icon","fullWidth","true","rounded","none","full","Button","forwardRef","as","loading","leftIcon","rightIcon","enableRipple","disabled","onClick","ref","Component","ripples","createRipple","useRipple","cn","e","ripple","style","left","x","top","y","width","height","transform","id","displayName","inputVariants","outlined","filled","underlined","inputSize","state","default","error","Input","wrapperClassName","label","helperText","prefix","suffix","floatingLabel","showCount","maxLength","onChange","isFocused","setIsFocused","useState","charCount","setCharCount","String","length","inputId","useMemo","generateId","showFloatingLabel","finalState","htmlFor","target","onFocus","onBlur","role","Textarea","autoResize","textareaRef","useRef","textareaId","Math","random","toString","substr","useEffect","current","scrollHeight","node","Checkbox","checkboxId","type","Switch","labelPosition","checked","controlledChecked","onCheckedChange","internalChecked","setInternalChecked","isControlled","switchId","switchElement","newChecked","Select","options","placeholder","searchable","isOpen","setIsOpen","searchQuery","setSearchQuery","containerRef","searchInputRef","useClickOutside","selectedOption","find","opt","filteredOptions","filter","toLowerCase","focus","onKeyDown","option","optionValue","Modal","open","onClose","showClose","preventClose","modalRef","useLockBodyScroll","useFocusTrap","handleEsc","KEYBOARD_KEYS","ESCAPE","document","addEventListener","removeEventListener","stopPropagation","ModalHeader","ModalTitle","ModalDescription","ModalFooter","ToastContext","createContext","useToast","context","useContext","Error","ToastContainer","toasts","removeToast","toast","ToastItem","iconContainerStyles","info","variantIcons","title","description","event","CustomEvent","detail","window","dispatchEvent","message","TabsContext","useTabsContext","Tabs","defaultValue","controlledValue","onValueChange","internalValue","setInternalValue","activeTab","Provider","setActiveTab","newValue","TabsList","TabsTrigger","isActive","TabsContent","Tooltip","content","position","delay","isVisible","setIsVisible","coords","setCoords","timeoutRef","triggerRef","showTooltip","setTimeout","updatePosition","hideTooltip","clearTimeout","rect","getBoundingClientRect","positions","bottom","right","Fragment","onMouseEnter","onMouseLeave","cardVariants","elevated","hoverable","padding","Card","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","badgeVariants","destructive","dot","Badge","showDot","avatarVariants","shape","circle","square","Avatar","src","alt","fallback","status","imageError","setImageError","imageLoaded","setImageLoaded","shouldShowImage","shouldShowFallback","initials","split","word","join","toUpperCase","slice","onError","onLoad","online","offline","away","busy","TablePagination","currentPage","totalPages","pageSize","totalItems","onPageChange","canGoNext","canGoPrevious","startItem","endItem","min","Table","columns","data","striped","sortable","defaultSortKey","defaultSortDirection","onSortChange","expandable","renderExpanded","pagination","emptyMessage","expandedRows","setExpandedRows","Set","sortedData","sortKey","sortDirection","handleSort","useTableSort","paginatedData","page","handlePageChange","useTablePagination","cellPadding","displayData","column","align","header","colSpan","row","rowIndex","isExpanded","has","React","index","newExpanded","delete","add","toggleExpanded","accessor","setToasts","useCallback","prev","addToast","newToast","duration","ANIMATION_DURATION","TOAST_DEFAULT","handleToastEvent"],"mappings":"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","x_google_ignoreList":[0]}
@@ -0,0 +1,35 @@
1
+ export { Button, buttonVariants } from './components/Button';
2
+ export type { ButtonProps } from './components/Button';
3
+ export { Input, inputVariants } from './components/Input';
4
+ export type { InputProps } from './components/Input';
5
+ export { Textarea } from './components/Textarea';
6
+ export type { TextareaProps } from './components/Textarea';
7
+ export { Checkbox } from './components/Checkbox';
8
+ export type { CheckboxProps } from './components/Checkbox';
9
+ export { Switch } from './components/Switch';
10
+ export type { SwitchProps } from './components/Switch';
11
+ export { Select } from './components/Select';
12
+ export type { SelectProps, SelectOption } from './components/Select';
13
+ export { Modal, ModalHeader, ModalTitle, ModalDescription, ModalFooter, } from './components/Modal';
14
+ export type { ModalProps } from './components/Modal';
15
+ export { ToastProvider, useToast, toast } from './components/Toast';
16
+ export type { Toast } from './components/Toast';
17
+ export { Tabs, TabsList, TabsTrigger, TabsContent } from './components/Tabs';
18
+ export type { TabsProps, TabsTriggerProps, TabsContentProps } from './components/Tabs';
19
+ export { Tooltip } from './components/Tooltip';
20
+ export type { TooltipProps } from './components/Tooltip';
21
+ export { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter, cardVariants, } from './components/Card';
22
+ export type { CardProps } from './components/Card';
23
+ export { Badge, badgeVariants } from './components/Badge';
24
+ export type { BadgeProps } from './components/Badge';
25
+ export { Avatar, avatarVariants } from './components/Avatar';
26
+ export type { AvatarProps } from './components/Avatar';
27
+ export { Table } from './components/Table';
28
+ export type { TableProps, Column } from './components/Table';
29
+ export { cn, generateId } from './utils';
30
+ export type { PolymorphicComponentProps, PolymorphicComponentPropsWithRef, PolymorphicRef, } from './utils/polymorphic';
31
+ export { SpinnerIcon, CloseIcon, ChevronDownIcon, CheckIcon, AlertCircleIcon, AlertTriangleIcon, InfoIcon, } from './components/Icons';
32
+ export type { IconProps } from './components/Icons';
33
+ export { useMediaQuery, useClickOutside, useDisclosure, useControllableState, useRipple, useFocusTrap, useLockBodyScroll, } from './hooks';
34
+ export type { UseDisclosureReturn, UseControllableStateProps, } from './hooks';
35
+ export { ANIMATION_DURATION, KEYBOARD_KEYS } from './constants';