feat: binary glow effects, refined drawings and calls to action

Dark surfaces now carry light: frames glow along their edge and shed binary
digits (BitAura), dark sections open with a lit seam (BitSeam), the career
path is a line of light and "My work" became a dark stage. Buttons carry a
travelling light and a spot that follows the pointer (BitGlow).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-04 13:07:09 +02:00
co-authored by Claude Opus 5.5
parent e9f05b02fc
commit e89a248ca5
21 changed files with 1532 additions and 606 deletions
@@ -1,5 +1,6 @@
"use client";
import { BitAura } from "@/src/components/bits/BitAura";
import * as React from "react";
/**
@@ -285,125 +286,127 @@ export const PipelineRun: React.FC = () => {
</div>
<div className="md:col-span-8">
<div className="overflow-hidden rounded-3xl bg-slate-900 font-mono text-[12px] leading-relaxed text-slate-300 md:text-[13px]">
{/* Run header */}
<div className="flex flex-wrap items-center justify-between gap-3 border-b border-slate-800 px-5 py-4 md:px-7">
<div className="flex items-center gap-3">
<span className="flex gap-1.5" aria-hidden="true">
<span className="h-2.5 w-2.5 rounded-full bg-slate-700" />
<span className="h-2.5 w-2.5 rounded-full bg-slate-700" />
<span className="h-2.5 w-2.5 rounded-full bg-slate-700" />
</span>
<span className="text-slate-400">
{scenario.branch}
<span className="text-slate-600"> → </span>main
<BitAura source="right" tone="light">
<div className="overflow-hidden rounded-3xl bg-slate-900 font-mono text-[12px] leading-relaxed text-slate-300 md:text-[13px]">
{/* Run header */}
<div className="flex flex-wrap items-center justify-between gap-3 border-b border-slate-800 px-5 py-4 md:px-7">
<div className="flex items-center gap-3">
<span className="flex gap-1.5" aria-hidden="true">
<span className="h-2.5 w-2.5 rounded-full bg-slate-700" />
<span className="h-2.5 w-2.5 rounded-full bg-slate-700" />
<span className="h-2.5 w-2.5 rounded-full bg-slate-700" />
</span>
<span className="text-slate-400">
{scenario.branch}
<span className="text-slate-600"> → </span>main
</span>
</div>
<span className="text-slate-500">
run #{frame.attempt === 1 ? 481 : 482}
{frame.attempt === 2 && (
<span className="text-slate-400"> · fix pushed</span>
)}
</span>
</div>
<span className="text-slate-500">
run #{frame.attempt === 1 ? 481 : 482}
{frame.attempt === 2 && (
<span className="text-slate-400"> · fix pushed</span>
)}
</span>
</div>
{/* Stages */}
<div className="grid grid-cols-2 gap-2 border-b border-slate-800 px-5 py-4 sm:grid-cols-4 md:px-7">
{STAGES.map((stage, index) => {
const state = stageState(index);
return (
<div
key={stage}
className={`flex items-center justify-between rounded-xl border px-3 py-2.5 transition-colors duration-200 ${STAGE_STYLE[state]}`}
>
<span>{stage}</span>
<span aria-hidden="true">{STAGE_MARK[state]}</span>
</div>
);
})}
</div>
{/* Test output */}
<div className="min-h-[21rem] px-5 py-5 md:px-7 md:py-6">
{frame.stagesDone < 2 && (
<p className="m-0 text-[12px] leading-relaxed text-slate-500 md:text-[13px]">
{frame.stagesDone === 0
? "$ lint: checking the code style…"
: "$ types: checking that the parts fit together…"}
</p>
)}
{SUITES.slice(0, frame.suitesDone).map((suite, index) => {
const failed = firstAttempt && index === failingIndex;
return (
<div key={suite.file}>
<div className="flex items-baseline gap-3">
<span
className={`w-10 shrink-0 font-bold ${failed ? "text-rose-400" : "text-emerald-400"}`}
>
{failed ? "FAIL" : "PASS"}
</span>
<span className="min-w-0 flex-1 truncate text-slate-200">
{suite.file}
</span>
<span className="hidden text-slate-500 sm:inline">
{suite.tests} tests
</span>
<span className="w-14 shrink-0 text-right text-slate-600">
{suite.ms} ms
</span>
{/* Stages */}
<div className="grid grid-cols-2 gap-2 border-b border-slate-800 px-5 py-4 sm:grid-cols-4 md:px-7">
{STAGES.map((stage, index) => {
const state = stageState(index);
return (
<div
key={stage}
className={`flex items-center justify-between rounded-xl border px-3 py-2.5 transition-colors duration-200 ${STAGE_STYLE[state]}`}
>
<span>{stage}</span>
<span aria-hidden="true">{STAGE_MARK[state]}</span>
</div>
{failed && (
<div className="my-2 ml-[3.25rem] border-l border-rose-500/50 pl-4">
<p className="m-0 text-[12px] leading-relaxed text-slate-200 md:text-[13px]">
● {scenario.testName}
</p>
<p className="m-0 text-[12px] leading-relaxed text-emerald-400 md:text-[13px]">
expected&nbsp; {scenario.expected}
</p>
<p className="m-0 text-[12px] leading-relaxed text-rose-400 md:text-[13px]">
received&nbsp; {scenario.received}
</p>
</div>
)}
</div>
);
})}
{frame.stagesDone === 2 && frame.suitesDone < SUITES.length && (
<p className="m-0 text-[12px] leading-relaxed text-slate-500 md:text-[13px]">
running {SUITES[frame.suitesDone]?.file}…
</p>
)}
</div>
);
})}
</div>
{/* Summary */}
<div className="flex flex-wrap items-center justify-between gap-3 border-t border-slate-800 px-5 py-4 md:px-7">
<span>
<span className="text-slate-500">Tests </span>
{failedCount > 0 && (
<span className="text-rose-400">{failedCount} failed, </span>
{/* Test output */}
<div className="min-h-[21rem] px-5 py-5 md:px-7 md:py-6">
{frame.stagesDone < 2 && (
<p className="m-0 text-[12px] leading-relaxed text-slate-500 md:text-[13px]">
{frame.stagesDone === 0
? "$ lint: checking the code style…"
: "$ types: checking that the parts fit together…"}
</p>
)}
<span className="text-emerald-400">
{reportedTests - failedCount} passed
{SUITES.slice(0, frame.suitesDone).map((suite, index) => {
const failed = firstAttempt && index === failingIndex;
return (
<div key={suite.file}>
<div className="flex items-baseline gap-3">
<span
className={`w-10 shrink-0 font-bold ${failed ? "text-rose-400" : "text-emerald-400"}`}
>
{failed ? "FAIL" : "PASS"}
</span>
<span className="min-w-0 flex-1 truncate text-slate-200">
{suite.file}
</span>
<span className="hidden text-slate-500 sm:inline">
{suite.tests} tests
</span>
<span className="w-14 shrink-0 text-right text-slate-600">
{suite.ms} ms
</span>
</div>
{failed && (
<div className="my-2 ml-[3.25rem] border-l border-rose-500/50 pl-4">
<p className="m-0 text-[12px] leading-relaxed text-slate-200 md:text-[13px]">
● {scenario.testName}
</p>
<p className="m-0 text-[12px] leading-relaxed text-emerald-400 md:text-[13px]">
expected&nbsp; {scenario.expected}
</p>
<p className="m-0 text-[12px] leading-relaxed text-rose-400 md:text-[13px]">
received&nbsp; {scenario.received}
</p>
</div>
)}
</div>
);
})}
{frame.stagesDone === 2 && frame.suitesDone < SUITES.length && (
<p className="m-0 text-[12px] leading-relaxed text-slate-500 md:text-[13px]">
running {SUITES[frame.suitesDone]?.file}…
</p>
)}
</div>
{/* Summary */}
<div className="flex flex-wrap items-center justify-between gap-3 border-t border-slate-800 px-5 py-4 md:px-7">
<span>
<span className="text-slate-500">Tests </span>
{failedCount > 0 && (
<span className="text-rose-400">{failedCount} failed, </span>
)}
<span className="text-emerald-400">
{reportedTests - failedCount} passed
</span>
<span className="text-slate-500"> of {TOTAL_TESTS}</span>
</span>
<span className="text-slate-500"> of {TOTAL_TESTS}</span>
</span>
<span
className={`rounded-full px-3 py-1 font-bold uppercase tracking-[0.15em] ${
!finished
? "bg-slate-800 text-slate-400"
<span
className={`rounded-full px-3 py-1 font-bold uppercase tracking-[0.15em] ${
!finished
? "bg-slate-800 text-slate-400"
: firstAttempt
? "bg-rose-500/15 text-rose-400"
: "bg-emerald-500/15 text-emerald-400"
}`}
>
{!finished
? "release pending"
: firstAttempt
? "bg-rose-500/15 text-rose-400"
: "bg-emerald-500/15 text-emerald-400"
}`}
>
{!finished
? "release pending"
: firstAttempt
? "release blocked"
: "released"}
</span>
? "release blocked"
: "released"}
</span>
</div>
</div>
</div>
</BitAura>
<p className="m-0 mt-4 font-sans text-sm leading-relaxed text-slate-400">
An illustration with made-up file names and numbers, modelled on a
real test run. Tests do not catch every mistake, but they do catch