feat: dark theme foundation, new header/footer, shared site primitives

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>
This commit is contained in:
2026-10-03 19:00:07 +02:00
co-authored by Claude Sonnet 5.5
parent d33a5d6c63
commit f258e2a483
24 changed files with 579 additions and 317 deletions
+62
View File
@@ -0,0 +1,62 @@
import {
parseAvailabilityConfig,
type AvailabilityConfig,
} from "@/src/domain/availability";
export const SITE_NAME = "Marc Mintel";
export const SITE_URL = "https://mintel.me";
// TODO(owner): replace with the real Cal.com link before launch.
export const BOOKING_URL = "https://cal.com/PLACEHOLDER/intro";
// TODO(owner): replace with the real contact address before launch.
export const CONTACT_EMAIL = "hello@example.com";
// PLACEHOLDER VALUES: the owner must confirm the next free date and weekly hours.
const RAW_AVAILABILITY_CONFIG = {
freeFrom: "2026-11-01",
hoursPerWeek: 20,
} as const;
const parsedAvailability = parseAvailabilityConfig(RAW_AVAILABILITY_CONFIG);
if (parsedAvailability.ok === false) {
throw new Error(
`Invalid AVAILABILITY_CONFIG in src/content/site.ts: ${parsedAvailability.error}`,
);
}
export const AVAILABILITY_CONFIG: AvailabilityConfig = parsedAvailability.value;
export type EngagementBlock = {
readonly name: string;
readonly hoursPerWeek: string;
readonly pricePerMonth: string;
};
export const ENGAGEMENT_BLOCKS: readonly EngagementBlock[] = [
{
name: "Focus",
hoursPerWeek: "15 h/week",
pricePerMonth: "6,000 EUR/month",
},
{
name: "Half-time",
hoursPerWeek: "20 h/week",
pricePerMonth: "8,000 EUR/month",
},
{
name: "Full-time",
hoursPerWeek: "35-40 h/week",
pricePerMonth: "14,000-16,000 EUR/month",
},
];
export const STACK: readonly string[] = [
"TypeScript",
"Next.js",
"React",
"Node.js",
"Rust",
"Solidity",
"PostgreSQL",
"Tailwind CSS",
];