Button.tsx 962 B

12345678910111213141516171819202122232425262728293031323334353637
  1. import { JSX } from "preact";
  2. interface ButtonProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {
  3. variant?: "default" | "primary" | "danger";
  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 = "box-border cursor-pointer font-normal text-sm border border-gray-300 rounded";
  15. const variantClasses = {
  16. default: "bg-white text-gray-800",
  17. primary: "bg-blue-600 text-white border-blue-600",
  18. danger: "bg-red-600 text-white border-red-600"
  19. };
  20. const sizeClasses = {
  21. sm: "px-2 py-1 text-xs",
  22. md: "px-3 py-1.5",
  23. lg: "px-4 py-2 text-base"
  24. };
  25. const combinedClasses = `${baseClasses} ${variantClasses[variant]} ${sizeClasses[size]} ${className}`;
  26. return (
  27. <button className={combinedClasses} {...props}>
  28. {children}
  29. </button>
  30. );
  31. }