web/app/components/ui/button.tsxblame
View source
4dfd09b1import { forwardRef } from "react";
4dfd09b2
4dfd09b3const variantStyles = {
4dfd09b4 primary: {
4dfd09b5 backgroundColor: "var(--accent)",
4dfd09b6 color: "var(--accent-text)",
4dfd09b7 },
4dfd09b8 secondary: {
4dfd09b9 backgroundColor: "var(--bg-inset)",
4dfd09b10 border: "1px solid var(--border)",
4dfd09b11 color: "var(--text-secondary)",
4dfd09b12 },
4dfd09b13 ghost: {
4dfd09b14 background: "none",
4dfd09b15 border: "none",
4dfd09b16 color: "var(--accent)",
4dfd09b17 },
4dfd09b18 danger: {
4dfd09b19 backgroundColor: "var(--status-closed-bg)",
4dfd09b20 border: "1px solid var(--status-closed-border)",
4dfd09b21 color: "var(--status-closed-text)",
4dfd09b22 },
4dfd09b23} as const;
4dfd09b24
4dfd09b25const sizeClasses = {
4dfd09b26 sm: "text-sm px-3 py-1",
4dfd09b27 md: "text-sm px-3 py-1.5",
4dfd09b28} as const;
4dfd09b29
4dfd09b30export interface ButtonProps
4dfd09b31 extends React.ButtonHTMLAttributes<HTMLButtonElement> {
4dfd09b32 variant?: keyof typeof variantStyles;
4dfd09b33 size?: "sm" | "md";
4dfd09b34 loading?: boolean;
4dfd09b35 loadingText?: string;
4dfd09b36}
4dfd09b37
4dfd09b38export const Button = forwardRef<HTMLButtonElement, ButtonProps>(
4dfd09b39 function Button(
4dfd09b40 {
4dfd09b41 variant = "primary",
4dfd09b42 size = "sm",
4dfd09b43 loading = false,
4dfd09b44 loadingText,
4dfd09b45 disabled,
4dfd09b46 className = "",
4dfd09b47 style,
4dfd09b48 children,
4dfd09b49 ...props
4dfd09b50 },
4dfd09b51 ref
4dfd09b52 ) {
4dfd09b53 const isDisabled = disabled || loading;
4dfd09b54
4dfd09b55 return (
4dfd09b56 <button
4dfd09b57 ref={ref}
4dfd09b58 disabled={isDisabled}
4dfd09b59 className={`${sizeClasses[size]} ${className}`}
4dfd09b60 style={{
4dfd09b61 ...variantStyles[variant],
4dfd09b62 opacity: isDisabled ? 0.5 : 1,
4dfd09b63 cursor: loading ? "wait" : isDisabled ? "default" : "pointer",
4dfd09b64 font: "inherit",
4dfd09b65 ...style,
4dfd09b66 }}
4dfd09b67 {...props}
4dfd09b68 >
4dfd09b69 {loading && loadingText ? loadingText : children}
4dfd09b70 </button>
4dfd09b71 );
4dfd09b72 }
4dfd09b73);