feat: rebuild mintel.me as a single-page freelance site

The site now presents one freelance developer on one page: hero, introduction,
four typical cases (developer for a product, make an app reliable, automate a
process, a website) with what you get, how it runs and what it costs, a
process automation section, technology and project fit, how I work, two live
references, questions and contact.

- Hero and closing headline are drawn from running binary digits.
- Each case explains its four steps with an animated drawing; the automation
  section shows example workflows with work travelling between systems; a
  pipeline run shows what a test catches before a release.
- Contact is one email address, kept in parts and assembled in the browser so
  it never appears in the page source (src/domain/email.ts, spec first).
- Imprint and privacy pages added.
- The old site (blog, case studies, contact form, fixed-price pages, video
  rendering and related scripts) is removed. Its URLs redirect to the homepage.
- The deploy smoke test checks the legal pages and the redirects instead of
  the removed case study.
- Dev scripts use docker compose v2.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-03 22:33:06 +02:00
co-authored by Claude Opus 5.5
parent 4eb663f42a
commit fa40fefe2f
781 changed files with 4925 additions and 55137 deletions
+12 -58
View File
@@ -2,40 +2,6 @@
@tailwind components;
@tailwind utilities;
/* Theme tokens. Dark is the site default; legacy pages (blog, legal, ...) opt into
the light variant by wrapping their content in `.theme-light` (LegacyLightSurface). */
:root {
--color-bg: #0a0d12;
--color-surface: #0d1219;
--color-fg: #e6edf3;
--color-muted: #8b98a8;
--color-faint: #5b6879;
--color-border: #1f2630;
--color-border-strong: #2b3544;
--color-accent: #3fb98a;
--color-accent-hover: #55c99d;
--color-accent-fg: #0a0d12;
--color-code-bg: #0d1219;
--color-code-border: #1f2630;
--color-scrollbar-track: #0a0d12;
--color-scrollbar-thumb: #2b3544;
}
.theme-light {
--color-bg: #ffffff;
--color-surface: #f8fafc;
--color-fg: #0f172a;
--color-muted: #334155;
--color-faint: #64748b;
--color-border: #e2e8f0;
--color-border-strong: #cbd5e1;
--color-code-bg: #f8fafc;
--color-code-border: #f1f5f9;
background-color: var(--color-bg);
color: #1e293b;
font-family: var(--font-newsreader), Georgia, serif;
}
/* Base styles - Tailwind only */
@layer base {
html {
@@ -43,7 +9,7 @@
}
body {
@apply bg-bg text-fg font-sans antialiased;
@apply bg-white text-slate-800 font-serif antialiased selection:bg-slate-900 selection:text-white;
line-height: 1.6;
}
@@ -54,7 +20,7 @@
h4,
h5,
h6 {
@apply font-sans font-bold text-fg tracking-tighter;
@apply font-sans font-bold text-slate-900 tracking-tighter;
}
h1 {
@@ -74,7 +40,7 @@
}
p {
@apply mb-6 text-base leading-relaxed text-muted;
@apply mb-6 text-base leading-relaxed text-slate-700;
}
.lead {
@@ -83,7 +49,7 @@
}
a {
@apply text-fg hover:text-muted transition-colors no-underline;
@apply text-slate-900 hover:text-slate-700 transition-colors no-underline;
}
ul,
@@ -96,34 +62,22 @@
}
code:not([class*="language-"]) {
@apply px-1.5 py-0.5 rounded-md font-mono text-[0.9em] text-fg border;
background-color: var(--color-code-bg);
border-color: var(--color-code-border);
@apply bg-slate-50 px-1.5 py-0.5 rounded-md font-mono text-[0.9em] text-slate-800 border border-slate-100;
}
blockquote {
@apply border-l-4 border-fg pl-6 italic text-muted my-8 text-lg md:text-2xl font-serif;
@apply border-l-4 border-slate-900 pl-6 italic text-slate-700 my-8 text-lg md:text-2xl font-serif;
}
/* Focus states */
a:focus,
button:focus,
input:focus,
textarea:focus {
outline: none !important;
box-shadow: none !important;
}
/* Keep mouse focus quiet, but never hide the keyboard focus ring */
a:focus:not(:focus-visible),
button:focus:not(:focus-visible) {
outline: none;
}
a:focus-visible,
button:focus-visible {
outline: 2px solid var(--color-accent);
outline-offset: 2px;
}
/* Interactive elements pointer */
a,
button,
@@ -374,11 +328,11 @@
}
::-webkit-scrollbar-track {
background: var(--color-scrollbar-track);
background: #f1f5f9;
}
::-webkit-scrollbar-thumb {
background: var(--color-scrollbar-thumb);
background: #cbd5e1;
border-radius: 4px;
transition: background 0.2s ease;
}
@@ -389,8 +343,8 @@
/* Selection color */
::selection {
background: var(--color-accent);
color: var(--color-accent-fg);
background: #0f172a;
color: #ffffff;
}
/* Tag Styles */