Paper
A sheet resting on the table.
One set of tokens shared by the Unfolded app and this landing page. Primitives keep the app's own names; components only use the semantic layer on top. Every value below is read straight from src/styles/tokens.css at build time.
Paper, ink and a single red for errors. Each colour's contrast is measured in the pairing it is used in: dark colours as text on --paper, light colours as a background behind --ink text.
--groundAA textthe table--paperAA textthe sheet--paper-shadeAA text--paper-creaseAA text--hairlineAA text--inkAA text--ink-softAA text--mutedAA text5.3:1 on paper — OK for body text--faintLarge text / UI3.1:1 on paper — decoration only, never text--disabledAA text--tagAA text--on-inkAA text--signalAA texterrors only| Token | Points to | Preview |
|---|---|---|
--color-bg | var(--ground) | |
--color-surface | var(--paper) | |
--color-surface-sunken | var(--paper-shade) | |
--color-surface-tag | var(--tag) | |
--color-border | var(--hairline) | |
--color-border-strong | var(--ink) | |
--color-text | var(--ink) | |
--color-text-soft | var(--ink-soft) | |
--color-text-muted | var(--muted) | |
--color-text-inverse | var(--on-ink) | |
--color-action | var(--ink) | |
--color-action-hover | var(--ink-soft) | |
--color-action-text | var(--on-ink) | |
--color-error | var(--signal) |
Every family works in English and Hebrew: Frank Ruhl Libre for headings, IBM Plex Sans (and Plex Sans Hebrew) for reading, Newsreader for the wordmark. Sizes from --text-2xl up are fluid — resize the window to watch them scale.
--font-wordmark--font-display--font-ui--font-mono--text-hero--text-3xl--text-2xl--text-xl--text-lg--text-md--text-sm--text-xs--weight-regular400--weight-medium500--weight-semibold600--leading-tight1.05 — display headings--leading-snug1.25 — small headings--leading-body1.55 — paragraphs--tracking-tight-0.02em--tracking-label0.08em — uppercase labels / badges--measure62ch — comfortable line length for readingThe app's 4px-based scale (1–7), plus two larger steps for the landing page.
--space-14px--space-28px--space-312px--space-416px--space-524px--space-632px--space-748px--space-864px--space-996px--container-max1200px--container-narrow760px--gutterclamp(var(--space-4), 4vw, var(--space-7)) — 16 → 48px--section-yclamp(var(--space-8), 10vw, 128px) — 64 → 128pxPaper has sharp corners. Shadows say how far a sheet sits above the table.
--radius-none0--radius-dot2px--radius-field3px--shadow-rest--shadow-lift--shadow-inkThe app's own timings, now named. Press a row to play it. With reduced motion turned on in your system, every duration collapses to 1ms and nothing travels.
The building blocks in src/components/ui/, plus the signatures from the finished story. Hover and tab through them.
variant: primary · secondary · ghost — size: md · lg. Renders an <a> when given href, otherwise a <button>.
level (h1–h4, structure) and size (look) are independent.
.eyebrow — the small label above every section title.
How it works
variant: paper · outline — interactive adds the hover lift.
A sheet resting on the table.
A quieter container.
Lifts on hover, or when a link inside has focus.
variant: outline · solid · soft
variant: default · quiet — external opens a new tab and says so to screen readers.
The unicorn. variant: app (the app's drawing) · doodle (redrawn in the hero's ink line) — size in px. Winks on hover, or when a script calls wink(). Always decorative.
names — real handwritten signatures (traced SVGs in src/assets/img/signatures/), each with its own tilt. A name without a drawing falls back to plain text in --font-display, like “Dana” here, so a new name can never break the page.
items (id, question, answer) · idPrefix keeps ids unique when two share a page · headingLevel fits the page outline (h4 here). Each question is a real button that says whether it's open; several can be open at once. Without JavaScript every answer is simply shown.
2–10 friends. A game runs 6–12 rounds, so there’s room for everyone to write more than once.
No, you can play with friends who are somewhere else too, as long as everyone plays at the same time. But it’s made for being together: a party or an evening in, ending with the story read out loud. There are no notifications on purpose. Everyone plays at once, phones in hand.
No. Unfolded runs in the browser on any phone. Friends join with a link or a 4-digit room code.
Section tone: ground · paper · ink, with --section-y padding. Container width: default (--container-max) · narrow (--container-narrow).
The same components with dir="rtl" and the app's Hebrew wording. Layout uses logical properties (padding-inline, not padding-left), so nothing needs a mirrored version, and :lang(he) resets the letter-spacing Hebrew doesn't use.
רואים רק את תחילת המשפט. משלימים, מקפלים ומשאירים התחלה לתור הבא.
כותבים יחד סיפור אחד, שורה בכל תור.
2 עד 10 חברים. כל אחד מצטרף מהטלפון שלו עם הקוד.
המשחק בוחר מי יכתוב. יש שתי דקות לכל תור.