Files
ai-agent/landing/styles.css
Gabriel Vidal 3ca5983ecd feat(landing): embed the Tokunia motion-design reel
Adds a 'See it in motion' section on the Tokunia landing page with the
rendered motion-design video (re-encoded 44MB -> ~20MB via ffmpeg
libx264 CRF 23, same resolution/duration) and poster frame. Autoplay
muted on load, tap/click the overlay button to unmute (browsers block
unmuted autoplay anyway), styled to match the page's dark ink/receipt
aesthetic.
2026-10-06 20:47:54 +02:00

839 lines
18 KiB
CSS

/* ───────────────────────────────────────────────────────────────────────
Tokunia — landing page.
The page is a ledger printed on ink: a warm near-black ground, and one
piece of cream receipt stock carrying the product's whole thesis. Two
accents encode the two axes the product measures — ember for what a run
costs you, matcha for what it costs the planet. Nothing else is coloured.
─────────────────────────────────────────────────────────────────────── */
:root {
--ink: #0e0d0c;
--ink-2: #161311;
--ink-3: #1d1917;
--rule: #2c2622;
--fg: #ede9e3;
--muted: #8e857a;
--paper: #ede7da;
--paper-2: #ded5c3;
--paper-ink: #26221e;
--paper-muted: #6f675c;
--ember: #f97316;
--matcha: #8fb173;
--display: "Bricolage Grotesque", ui-sans-serif, system-ui, sans-serif;
--body: "IBM Plex Sans", ui-sans-serif, system-ui, sans-serif;
--mono: "IBM Plex Mono", ui-monospace, "SF Mono", Menlo, monospace;
--gutter: clamp(1.25rem, 5vw, 5rem);
--measure: 60ch;
}
*,
*::before,
*::after {
box-sizing: border-box;
}
html {
-webkit-text-size-adjust: 100%;
scroll-behavior: smooth;
}
@media (prefers-reduced-motion: reduce) {
html {
scroll-behavior: auto;
}
}
body {
margin: 0;
background: var(--ink);
color: var(--fg);
font-family: var(--body);
font-size: clamp(1rem, 0.96rem + 0.2vw, 1.0625rem);
line-height: 1.65;
/* A faint vertical ledger tint, so the ground isn't a flat black field. */
background-image: radial-gradient(
120% 80% at 70% -10%,
rgba(249, 115, 22, 0.06),
transparent 60%
);
background-repeat: no-repeat;
}
a {
color: inherit;
}
code {
font-family: var(--mono);
font-size: 0.9em;
color: var(--ember);
}
.skip {
position: absolute;
left: -9999px;
top: 0;
background: var(--paper);
color: var(--paper-ink);
padding: 0.6rem 1rem;
z-index: 20;
}
.skip:focus {
left: 0.5rem;
top: 0.5rem;
}
:focus-visible {
outline: 2px solid var(--ember);
outline-offset: 3px;
}
/* ── Top bar ─────────────────────────────────────────────────────────── */
.bar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
padding: 1.1rem var(--gutter);
border-bottom: 1px solid var(--rule);
}
.wordmark {
font-family: var(--display);
font-weight: 800;
font-size: 1.15rem;
letter-spacing: -0.02em;
text-decoration: none;
}
.wordmark__ia {
color: var(--ember);
}
.wordmark__dot {
color: var(--muted);
padding: 0 0.06em;
}
.bar__nav {
display: flex;
gap: 1.5rem;
font-family: var(--mono);
font-size: 0.78rem;
text-transform: uppercase;
letter-spacing: 0.09em;
}
.bar__nav a {
color: var(--muted);
text-decoration: none;
padding-bottom: 2px;
border-bottom: 1px solid transparent;
transition: color 0.18s, border-color 0.18s;
}
.bar__nav a:hover {
color: var(--fg);
border-bottom-color: var(--ember);
}
/* ── Hero ────────────────────────────────────────────────────────────── */
.hero {
display: grid;
grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr);
gap: clamp(2rem, 6vw, 5rem);
align-items: center;
padding: clamp(3rem, 9vw, 7rem) var(--gutter) clamp(3rem, 8vw, 6rem);
}
.eyebrow {
margin: 0 0 1.4rem;
font-family: var(--mono);
font-size: 0.74rem;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--muted);
}
.eyebrow::before {
content: "";
display: inline-block;
width: 1.6rem;
height: 1px;
background: var(--ember);
vertical-align: middle;
margin-right: 0.7rem;
}
.display {
margin: 0;
font-family: var(--display);
font-weight: 800;
font-size: clamp(2.9rem, 8.5vw, 5.6rem);
line-height: 0.94;
letter-spacing: -0.035em;
}
.display em {
font-style: normal;
color: var(--ember);
}
.lede {
margin: 1.6rem 0 0;
max-width: 44ch;
color: #cfc8bf;
font-size: 1.08em;
}
.cta {
display: flex;
flex-wrap: wrap;
gap: 0.75rem;
margin-top: 2rem;
}
.btn {
display: inline-block;
font-family: var(--mono);
font-size: 0.82rem;
letter-spacing: 0.06em;
text-transform: uppercase;
text-decoration: none;
padding: 0.82rem 1.5rem;
border: 1px solid var(--rule);
color: var(--fg);
background: var(--ink-2);
transition: border-color 0.18s, background 0.18s, transform 0.18s;
}
.btn:hover {
border-color: var(--muted);
transform: translateY(-1px);
}
.btn--primary {
background: var(--ember);
border-color: var(--ember);
color: #1a0d02;
font-weight: 600;
}
.btn--primary:hover {
background: #ff8a35;
border-color: #ff8a35;
}
.footnote {
margin: 1.4rem 0 0;
max-width: 42ch;
font-size: 0.85rem;
color: var(--muted);
}
/* ── The receipt (signature) ─────────────────────────────────────────── */
.receipt {
margin: 0;
justify-self: center;
}
.receipt__paper {
position: relative;
width: min(23rem, 100%);
background: var(--paper);
color: var(--paper-ink);
font-family: var(--mono);
font-size: 0.8rem;
line-height: 1.9;
padding: 2rem 1.6rem 2.6rem;
transform: rotate(-1.1deg);
box-shadow:
0 24px 50px -18px rgba(0, 0, 0, 0.85),
0 4px 14px rgba(0, 0, 0, 0.4);
}
/* Torn thermal-paper edges, drawn as two zigzag strips that overhang the paper
rather than as a mask on the paper itself — a mask on the parent would clip
these pseudo-elements away, and would take the drop shadow with it. */
.receipt__paper::before,
.receipt__paper::after {
content: "";
position: absolute;
left: 0;
right: 0;
height: 9px;
background: var(--paper);
-webkit-mask: var(--zigzag);
mask: var(--zigzag);
--zigzag: conic-gradient(from 135deg at 50% 0, #000 0 90deg, transparent 0) 0 0 /
14px 100% repeat-x;
}
.receipt__paper::before {
top: -9px;
transform: rotate(180deg);
}
.receipt__paper::after {
bottom: -9px;
}
.receipt__head {
text-align: center;
}
.receipt__brand {
margin: 0;
font-family: var(--display);
font-weight: 800;
font-size: 1.5rem;
letter-spacing: 0.16em;
line-height: 1.2;
}
.receipt__sub {
margin: 0.15rem 0 0;
font-size: 0.68rem;
letter-spacing: 0.2em;
color: var(--paper-muted);
}
.receipt__rule {
border: 0;
border-top: 1px dashed rgba(38, 34, 30, 0.42);
margin: 0.9rem 0;
}
.receipt__rule--double {
border-top: 3px double rgba(38, 34, 30, 0.6);
}
.receipt__meta {
margin: 0;
}
.receipt__meta > div {
display: flex;
justify-content: space-between;
gap: 1rem;
}
.receipt__meta dt {
color: var(--paper-muted);
letter-spacing: 0.08em;
font-size: 0.72rem;
}
.receipt__meta dd {
margin: 0;
}
.receipt__items {
list-style: none;
margin: 0;
padding: 0;
}
/* The dotted leader is the page's structural device: label … value, which is
exactly what the product does to an agent run. */
.receipt__items li {
display: flex;
align-items: baseline;
gap: 0.4rem;
}
.receipt__items li::before {
content: "";
order: 2;
flex: 1;
border-bottom: 1px dotted rgba(38, 34, 30, 0.45);
transform: translateY(-0.22em);
}
.receipt__items li span {
order: 1;
}
.receipt__items li b {
order: 3;
font-weight: 600;
font-variant-numeric: tabular-nums;
}
.receipt__items--eco b {
color: #4d6b39;
}
.receipt__total {
display: flex;
justify-content: space-between;
align-items: baseline;
margin: 0;
font-size: 1.15rem;
font-weight: 600;
letter-spacing: 0.02em;
}
.receipt__total span {
font-size: 0.8rem;
letter-spacing: 0.16em;
}
.receipt__total b {
font-variant-numeric: tabular-nums;
}
.receipt__note {
margin: 0;
text-align: right;
font-size: 0.72rem;
color: var(--paper-muted);
}
.receipt__note--eco {
color: #4d6b39;
}
.receipt__section {
margin: 0;
text-align: center;
font-size: 0.68rem;
letter-spacing: 0.18em;
color: #4d6b39;
}
.receipt__thanks {
margin: 0;
text-align: center;
font-size: 0.7rem;
letter-spacing: 0.22em;
color: var(--paper-muted);
}
.receipt__caption {
margin: 2.2rem auto 0;
max-width: 30ch;
text-align: center;
font-size: 0.78rem;
line-height: 1.5;
color: var(--muted);
}
.receipt__caption a {
color: var(--muted);
text-underline-offset: 3px;
}
.receipt__caption a:hover {
color: var(--fg);
}
/* Lines print in sequence on load, the way a thermal printer feeds paper. */
@media (prefers-reduced-motion: no-preference) {
.js [data-line] {
opacity: 0;
transform: translateY(-4px);
}
.js .receipt--printing [data-line] {
animation: print-line 0.34s ease-out forwards;
animation-delay: calc(var(--i, 0) * 55ms + 200ms);
}
}
@keyframes print-line {
from {
opacity: 0;
transform: translateY(-4px);
}
to {
opacity: 1;
transform: none;
}
}
/* ── The reel ────────────────────────────────────────────────────────── */
.section--reel {
padding-top: 0;
padding-bottom: clamp(2.5rem, 6vw, 4rem);
border-bottom: 1px solid var(--rule);
}
.section--reel .section__title {
margin-top: clamp(2rem, 5vw, 3.5rem);
}
.reel {
position: relative;
/* Fixed aspect-ratio box so the layout never jumps between the poster
frame and the first decoded video frame. */
aspect-ratio: 16 / 9;
background: var(--ink-2);
border: 1px solid var(--rule);
overflow: hidden;
}
.reel__video {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
}
.reel__sound {
position: absolute;
right: 1rem;
bottom: 1rem;
display: inline-flex;
align-items: center;
gap: 0.55rem;
background: rgba(14, 13, 12, 0.72);
border-color: rgba(237, 233, 227, 0.22);
backdrop-filter: blur(6px);
}
.reel__sound:hover {
background: rgba(14, 13, 12, 0.9);
border-color: var(--muted);
}
/* One pure-CSS speaker glyph (a wedge + a sound-wave arc), with a slash drawn
on top while muted. Unmuting just hides the slash and lets the arc read. */
.reel__sound-icon {
position: relative;
display: inline-block;
width: 0.95em;
height: 0.9em;
}
.reel__sound-icon::before {
/* the speaker wedge */
content: "";
position: absolute;
left: 0;
top: 50%;
width: 0.5em;
height: 0.6em;
transform: translateY(-50%);
background: currentColor;
clip-path: polygon(0% 35%, 35% 35%, 70% 0%, 70% 100%, 35% 65%, 0% 65%);
}
.reel__sound-icon::after {
/* the muted slash; rotated to a sound-wave arc once unmuted */
content: "";
position: absolute;
right: 0;
top: 50%;
width: 0.55em;
height: 0.55em;
transform: translateY(-50%) rotate(45deg);
border-top: 1.5px solid currentColor;
}
.reel__sound.is-unmuted .reel__sound-icon::after {
right: -0.1em;
width: 0.4em;
height: 0.65em;
border: 1.5px solid currentColor;
border-left: 0;
border-top-right-radius: 999px;
border-bottom-right-radius: 999px;
transform: translateY(-50%);
}
/* ── Archive strip ───────────────────────────────────────────────────── */
.strip {
padding: clamp(2rem, 5vw, 3.2rem) var(--gutter);
border-top: 1px solid var(--rule);
border-bottom: 1px solid var(--rule);
background: var(--ink-2);
}
.strip__intro {
margin: 0 0 1.6rem;
font-family: var(--mono);
font-size: 0.74rem;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--muted);
}
.strip__stats {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr));
gap: 1.8rem 2.5rem;
margin: 0;
}
.strip__stats dt {
font-family: var(--mono);
font-size: 0.72rem;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--muted);
order: 2;
}
.strip__stats dd {
margin: 0;
font-family: var(--display);
font-weight: 600;
font-size: clamp(2rem, 4.5vw, 2.9rem);
line-height: 1;
letter-spacing: -0.03em;
font-variant-numeric: tabular-nums;
order: 1;
}
.strip__stats dd span {
color: var(--ember);
}
.strip__stats > div {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
/* ── Generic section ─────────────────────────────────────────────────── */
.section {
padding: clamp(3.5rem, 9vw, 6.5rem) var(--gutter);
border-bottom: 1px solid var(--rule);
}
.section__title {
margin: 0 0 clamp(2rem, 4vw, 3rem);
font-family: var(--mono);
font-size: 0.76rem;
font-weight: 500;
letter-spacing: 0.2em;
text-transform: uppercase;
color: var(--muted);
}
.section__title::after {
content: "";
display: block;
height: 1px;
margin-top: 0.9rem;
background: linear-gradient(
to right,
var(--rule) 0%,
var(--rule) 92%,
transparent 100%
);
}
/* ── What it does: ledger lines ──────────────────────────────────────── */
.lines {
list-style: none;
margin: 0;
padding: 0;
counter-reset: none;
}
.line {
display: grid;
grid-template-columns: minmax(0, 15rem) minmax(0, 1fr);
gap: 1rem clamp(1.5rem, 5vw, 4rem);
padding: 1.6rem 0;
border-top: 1px solid var(--rule);
}
.line:last-child {
border-bottom: 1px solid var(--rule);
}
.line__label {
font-family: var(--display);
font-weight: 600;
font-size: 1.35rem;
letter-spacing: -0.02em;
line-height: 1.2;
}
.line__label span {
border-bottom: 2px solid var(--ember);
padding-bottom: 0.15rem;
}
.line__body p {
margin: 0;
max-width: var(--measure);
color: #c6bfb6;
}
/* ── Screens ─────────────────────────────────────────────────────────── */
.shot {
margin: 0;
}
.shot img {
display: block;
width: 100%;
height: auto;
border: 1px solid var(--rule);
background: var(--ink-2);
}
.shot figcaption {
margin-top: 0.85rem;
font-family: var(--mono);
font-size: 0.76rem;
color: var(--muted);
}
.shot--wide {
margin-bottom: 2.5rem;
}
.shot-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(20rem, 1fr));
gap: 2.5rem;
}
/* ── Pillars ─────────────────────────────────────────────────────────── */
.pillars {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(17rem, 1fr));
gap: 1px;
background: var(--rule);
border: 1px solid var(--rule);
}
.pillar {
background: var(--ink-2);
padding: clamp(1.6rem, 3vw, 2.2rem);
}
.pillar h3 {
margin: 0 0 0.9rem;
font-family: var(--display);
font-weight: 600;
font-size: 1.2rem;
letter-spacing: -0.02em;
}
.pillar p {
margin: 0;
color: #c6bfb6;
font-size: 0.96em;
}
.pillar--eco {
border-top: 2px solid var(--matcha);
}
.pillar--eco h3 {
color: var(--matcha);
}
/* ── Run it ──────────────────────────────────────────────────────────── */
.run {
max-width: 52rem;
}
.run__code {
margin: 0;
padding: 1.5rem;
background: var(--ink-2);
border: 1px solid var(--rule);
border-left: 2px solid var(--ember);
overflow-x: auto;
font-family: var(--mono);
font-size: 0.85rem;
line-height: 1.9;
color: var(--fg);
}
.run__code code {
color: inherit;
font-size: inherit;
}
.run__comment {
color: var(--matcha);
}
.run__note {
margin: 1.3rem 0 0;
max-width: var(--measure);
color: #c6bfb6;
font-size: 0.95em;
}
/* The build caveat is set apart rather than buried: it is the one thing a
reader would otherwise discover the hard way. */
.run__caveat {
margin: 1.3rem 0 0;
max-width: var(--measure);
padding-left: 1rem;
border-left: 2px solid var(--matcha);
font-size: 0.9em;
color: var(--muted);
}
.run__caveat b {
color: var(--matcha);
font-weight: 600;
}
.run__caveat a {
color: #c6bfb6;
text-underline-offset: 3px;
}
.run__caveat a:hover {
color: var(--fg);
}
.section--run .cta {
margin-top: 1.8rem;
}
/* ── Footer ──────────────────────────────────────────────────────────── */
.foot {
display: flex;
flex-wrap: wrap;
align-items: baseline;
gap: 0.9rem 2rem;
padding: clamp(2.5rem, 6vw, 4rem) var(--gutter);
}
.foot__mark {
margin: 0;
font-family: var(--display);
font-weight: 800;
font-size: 1.05rem;
letter-spacing: -0.02em;
}
.foot__mark span {
color: var(--muted);
}
.foot__etym {
margin: 0;
flex: 1;
min-width: 16rem;
font-size: 0.85rem;
color: var(--muted);
}
.foot__etym i {
color: #c6bfb6;
}
.foot__nav {
display: flex;
gap: 1.5rem;
font-family: var(--mono);
font-size: 0.76rem;
text-transform: uppercase;
letter-spacing: 0.09em;
}
.foot__nav a {
color: var(--muted);
text-decoration: none;
border-bottom: 1px solid transparent;
transition: color 0.18s, border-color 0.18s;
}
.foot__nav a:hover {
color: var(--fg);
border-bottom-color: var(--ember);
}
/* ── Narrow screens ──────────────────────────────────────────────────── */
@media (max-width: 60rem) {
.hero {
grid-template-columns: minmax(0, 1fr);
gap: 3.5rem;
}
.receipt {
justify-self: start;
}
.line {
grid-template-columns: minmax(0, 1fr);
gap: 0.7rem;
}
}
@media (max-width: 30rem) {
.receipt__paper {
transform: none;
width: 100%;
}
.bar__nav {
gap: 1rem;
}
.reel__sound-label {
display: none;
}
}