e7738de6d2
CI / Deep Native Runtime Cases (1/6) (push) Has been skipped
CI / Native Preflight (push) Failing after 1s
CI / Native Runtime Cases (1/2) (push) Failing after 0s
CI / Native Runtime Cases (2/2) (push) Failing after 1s
CI / Native Metadata Reports (push) Failing after 0s
CI / Native Direct Backend Artifacts (push) Failing after 0s
CI / Native Sanitizer Smoke (push) Failing after 1s
CI / Command Contract Snapshots (push) Failing after 1s
CI / Deep Conformance Suite (push) Has been skipped
CI / Graph Build Perf (push) Failing after 1s
CI / Deep Native Preflight (push) Has been skipped
CI / Deep Native Runtime Cases (2/6) (push) Has been skipped
CI / Deep Native Runtime Cases (3/6) (push) Has been skipped
CI / Conformance Suite (push) Failing after 1s
CI / Workspace Checks (push) Failing after 0s
CI / Deep Native Runtime Cases (5/6) (push) Has been skipped
CI / Deep Native Runtime Cases (6/6) (push) Has been skipped
CI / Deep Native Runtime Cases (4/6) (push) Has been skipped
CI / Deep Graph Build Perf (push) Has been skipped
47 lines
1.3 KiB
TypeScript
47 lines
1.3 KiB
TypeScript
import Link from "next/link";
|
|
import type { ButtonHTMLAttributes, ComponentProps } from "react";
|
|
|
|
const SIZES = {
|
|
sm: "h-8 px-4 text-[0.8125rem]",
|
|
md: "h-10 px-6 text-sm",
|
|
lg: "h-11 gap-2 px-8 text-[0.9375rem]",
|
|
};
|
|
|
|
const VARIANTS = {
|
|
default: "border-border bg-bg text-fg hover:border-fg",
|
|
primary:
|
|
"border-accent bg-accent text-accent-fg hover:bg-transparent hover:text-accent",
|
|
};
|
|
|
|
type ButtonVariant = keyof typeof VARIANTS;
|
|
type ButtonSize = keyof typeof SIZES;
|
|
|
|
type ButtonStyleProps = {
|
|
variant?: ButtonVariant;
|
|
size?: ButtonSize;
|
|
className?: string;
|
|
};
|
|
|
|
function classes({ variant = "default", size = "md", className = "" }: ButtonStyleProps): string {
|
|
return [
|
|
"inline-flex items-center justify-center rounded-md border font-medium no-underline transition",
|
|
VARIANTS[variant],
|
|
SIZES[size],
|
|
className,
|
|
]
|
|
.filter(Boolean)
|
|
.join(" ");
|
|
}
|
|
|
|
type ButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & ButtonStyleProps;
|
|
|
|
export function Button({ variant, size, className, ...rest }: ButtonProps) {
|
|
return <button className={classes({ variant, size, className })} {...rest} />;
|
|
}
|
|
|
|
type ButtonLinkProps = ComponentProps<typeof Link> & ButtonStyleProps;
|
|
|
|
export function ButtonLink({ variant, size, className, ...rest }: ButtonLinkProps) {
|
|
return <Link className={classes({ variant, size, className })} {...rest} />;
|
|
}
|