import "hono/jsx" import type { JSX, FC } from "hono/jsx" import { VStack, HStack } from "./stack" import { Section } from "./section" import { H2 } from "./text" import { CodeExamples } from "./code" export type ButtonProps = JSX.IntrinsicElements["button"] & { variant?: "primary" | "secondary" | "outline" | "ghost" | "destructive" size?: "sm" | "md" | "lg" } export const Button: FC = (props) => { const { variant = "primary", size = "md", style, ...buttonProps } = props const baseStyles: JSX.CSSProperties = { display: "inline-flex", alignItems: "center", justifyContent: "center", fontWeight: "500", transition: "all 0.2s", outline: "none", cursor: "pointer", borderRadius: "4px", border: "1px solid transparent", } const variantStyles: Record = { primary: { backgroundColor: "#3b82f6", color: "#ffffff", }, secondary: { backgroundColor: "#64748b", color: "#ffffff", }, outline: { backgroundColor: "transparent", color: "#000000", borderColor: "#d1d5db", }, ghost: { backgroundColor: "transparent", color: "#000000", }, destructive: { backgroundColor: "#ef4444", color: "#ffffff", }, } const sizeStyles: Record = { sm: { height: "32px", padding: "0 12px", fontSize: "14px", }, md: { height: "40px", padding: "0 16px", fontSize: "14px", }, lg: { height: "48px", padding: "0 24px", fontSize: "16px", }, } const combinedStyles: JSX.CSSProperties = { ...baseStyles, ...variantStyles[variant], ...sizeStyles[size], ...(style as JSX.CSSProperties), } return ', '', '', '', ]} /> {/* Variants */}

Button Variants

{/* Sizes */}

Button Sizes

{/* With custom content */}

Custom Content

{/* Native attributes work */}

Native Attributes

) }