Adds dark design tokens, Inter + JetBrains Mono, a header with Notes, Process, About and a Book a call button, and a footer with the availability line driven by the tested domain core. Shared primitives live in src/components/site, site constants in src/content/site.ts. Legacy pages (blog, legal, contact, tags, technologies) keep a light surface via LegacyLightSurface. Stub routes for /notes, /process and /book. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
32 lines
936 B
TypeScript
32 lines
936 B
TypeScript
import Link from "next/link";
|
|
import * as React from "react";
|
|
|
|
type ButtonVariant = "primary" | "secondary";
|
|
|
|
type ButtonLinkProps = {
|
|
readonly href: string;
|
|
readonly children: React.ReactNode;
|
|
readonly variant?: ButtonVariant;
|
|
readonly className?: string;
|
|
};
|
|
|
|
const BASE =
|
|
"inline-flex items-center justify-center rounded-md px-5 py-2.5 text-sm font-semibold transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent";
|
|
|
|
const VARIANTS: Record<ButtonVariant, string> = {
|
|
primary: "bg-accent !text-accent-fg hover:bg-accent-hover",
|
|
secondary:
|
|
"border border-border-strong !text-fg hover:border-muted hover:bg-surface",
|
|
};
|
|
|
|
export const ButtonLink: React.FC<ButtonLinkProps> = ({
|
|
href,
|
|
children,
|
|
variant = "primary",
|
|
className = "",
|
|
}) => (
|
|
<Link href={href} className={`${BASE} ${VARIANTS[variant]} ${className}`}>
|
|
{children}
|
|
</Link>
|
|
);
|