Button.tsx 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import { JSX } from "preact";
  2. interface ButtonProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {
  3. variant?: "default" | "primary" | "danger" | "danger-outline";
  4. size?: "sm" | "md" | "lg";
  5. children: JSX.Element | string;
  6. }
  7. export default function Button({
  8. variant = "default",
  9. size = "md",
  10. children,
  11. className = "",
  12. ...props
  13. }: ButtonProps) {
  14. const baseClasses =
  15. "box-border cursor-pointer font-normal text-sm border border-gray-300 dark:border-gray-600 rounded";
  16. const variantClasses = {
  17. default: "bg-white dark:bg-gray-700 text-gray-800 dark:text-gray-100",
  18. primary: "bg-blue-600 text-white border-blue-600",
  19. danger: "bg-red-600 text-white border-red-600",
  20. "danger-outline":
  21. "bg-transparent text-red-600 border-red-600 dark:text-red-400 dark:border-red-400",
  22. };
  23. const sizeClasses = {
  24. sm: "px-2 py-1 text-xs",
  25. md: "px-3 py-1.5",
  26. lg: "px-4 py-2 text-base",
  27. };
  28. const combinedClasses = `${baseClasses} ${variantClasses[variant]} ${
  29. sizeClasses[size]
  30. } ${className}`;
  31. return (
  32. <button className={combinedClasses} {...props}>
  33. {children}
  34. </button>
  35. );
  36. }