Design languageResources

Design language Resources

Resources

The design language as files you can open. Download the glyph, read the token file the site is built from and the Zero Door token snapshot, see the tests and gates that hold the language and follow the dated history of what changed and how a change lands.

The glyph and the tokens, as files

#

The glyph comes as two SVG files and the tokens as two text files. Each one matches the source this page reads, so what you download is what these pages show.

Two files, one glyph.

Both glyph files draw the same single path the site draws in code, so the mark you download is the mark you see on this page.

  • The Zerone glyph in ink.

    Glyph in ink

    For light surfaces. The glyph is drawn in ink with no ground of its own, so the surface beneath it shows through.

    Download SVG: zerone-glyph.svg
    File
    zerone-glyph.svg
    Canvas
    viewBox 0 0 101.6 134.69
    Colours
    • #0f1c26--color-ink
    Size
    412 bytes
    Path
    Identical to the glyph path the site draws
  • The Zerone glyph in paper on a square ink tile.

    Glyph on the ink tile

    For places that need a square mark with its own ground. It is the designer’s ink square: square corners, the glyph in paper at its own size in the centre.

    Download SVG: zerone-glyph-ink-tile.svg
    File
    zerone-glyph-ink-tile.svg
    Canvas
    viewBox 0 0 283.465 283.465
    Colours
    • #0f1c26--color-ink
    • #fdfaf6--color-paper
    Size
    516 bytes
    Path
    Identical to the glyph path the site draws
    Browser icon
    /favicon.svg is its own file: this square and its colours, with the glyph enlarged to two thirds of the side so that it reads at tab size.
  • Use the logo as its files draw it. Do not recolour it, rotate it or add effects.

    WhyThe designer gave the logo two colourways, ink on light grounds and paper on ink. Holding to them keeps it recognisable everywhere. The rule is written in the press kit.

    ReviewKept by review, not by a test.

  • The download files draw the glyph from the code, not from a redrawn copy.

    WhyIf the glyph path in the code changes, the files have to change with it or the test fails.

    TestEnforced by a test on every change.

  • Every fill in the download files is a token colour.

    WhyA file that leaves the site still carries the palette: ink and paper, exactly as the token file defines them.

    TestEnforced by a test on every change.

  • The browser icon, /favicon.svg, keeps the square, colours and centring of the ink tile, with the glyph at two thirds of the side.

    WhyAt 16 px the designer’s square leaves the glyph too small to read in a tab, so the icon is its own file. A test measures it, so the larger glyph cannot drift from the tile’s square.

    TestEnforced by a test on every change.

The tokens as files

The token file the site is built from and the Zero Door token snapshot, the two files the next two sections show.

  • Site token file

    The file the site is built from, as it is. It is a Tailwind 4 @theme block rather than a plain stylesheet.

    Download CSS: tokens.css
    File
    tokens.css
    Source
    The token file the site is built from, identical byte for byte
    Type
    text/css
  • Zero Door token snapshot

    Both colour themes, spacing, radius, shadow, curves and durations from the product's token file, values read from its code, such as the typeface and the icon sizes, and the two dates shown with the snapshot below. It carries no commit identifier.

    Download JSON: product-tokens.json
    File
    product-tokens.json
    Source
    The snapshot these pages read, without the internal repository name in source.repo
    Type
    application/json

Not defined yet

There is no raster version. Clear space, minimum sizes and print values for paper and accent are rules Zerone added; the logo page states them with their method and shows the whole logo system. The press kit offers its six files: the two lockups in ink and in paper, and these two glyph files. The typeface files are served for this site and are not offered here.

The token file, as the build reads it

#

The site's named colours, typeface stacks, curve, radii and shadow are declared in one file. The block below is that file, read when the site is built, so it cannot differ from what ships. In use, components also write some radii and colour mixes in place rather than naming a token.

Published as
/design/tokens.css
Lines
35
Named tokens
19
Last changed
tokens.cssRead at build time and printed as it is
/* Zerone tasarim tokenlari: renk, yazi tipi yigini, egri, yaricap ve golge
   degerleri. Bilesenler renkleri token adiyla kullanir (var(--color-*)).
   CSS disindaki kopyalar (theme-color, SVG, OG gorseli, e-posta)
   tasarim kaynaklari betiginde, RAW_HEX_COPIES
   listesinde tutulur. */
@theme {
  --color-*: initial;
  --color-transparent: transparent;
  --color-current: currentColor;

  --color-paper: #fdfaf6;
  --color-paper-2: #f6f3ee;
  --color-hair: #e2dfdb;
  --color-hair-2: #cdcac6;
  --color-ink: #0f1c26;
  --color-ink-muted: #5c5753;
  --color-ink-subtle: #736d69;
  --color-accent: #00847e;
  --color-accent-deep: #006560;
  --color-accent-tint: #d9f5f3;
  /* Ham, dogrulanmamis degisim. Kanit sahnesinde inen egri ve isaretleri bu
     renktedir: accent "dogrulanmis tek sinyal" demek oldugu icin gurultunun
     de kendi rengi olmali, yoksa ikisi de koyu kaliyor ve sahne tek renkli
     bir grafige donuyor. Alarm kirmizisi DEGIL, kirilmis bir tugla tonu:
     kagit uzerinde 5,7:1, uzerindeki beyaz tik 5,9:1. */
  --color-raw: #a9432c;

  --font-sans: var(--font-newblack), system-ui, sans-serif;
  --font-mono: var(--font-geistmono), ui-monospace, SFMono-Regular, monospace;

  --ease-out-quart: cubic-bezier(0.23, 1, 0.32, 1);
  --radius-sm: 6px;
  --radius-md: 8px;
  --shadow-float: 0 12px 30px -18px rgb(15 28 38 / 0.45);
}

The page prints the file as it is, and the build gate rejects a number beside a percent sign other than 99.5. A unit test therefore keeps percent signs out of the file and names the reason when it fails.

How the file works.

The file is a Tailwind 4 @theme block. Its first declaration, --color-*: initial, removes Tailwind's default palette, so a colour utility that uses a palette name, such as bg-red-500, exists only if that name is declared here. Two keywords are added back: transparent and currentColor. The comment above --color-raw is part of the file because it records why that colour exists.

Which tokens a test holds.

This table is read from the tests when the site is built. Value means the token test holds the exact value; present means it holds only that the token exists. The last column counts the other tests that read the token. A token with nothing in either column is held by review alone.

Every named token in the token file and the tests that read it
TokenIn the token testAlso read by
--color-transparentNot checkedNone
--color-currentNot checkedNone
--color-paperValue1 other test
--color-paper-2Value1 other test
--color-hairValue1 other test
--color-hair-2Value1 other test
--color-inkValue1 other test
--color-ink-mutedValue1 other test
--color-ink-subtleValue1 other test
--color-accentValue1 other test
--color-accent-deepValue1 other test
--color-accent-tintValue1 other test
--color-rawValue1 other test
--font-sansPresent1 other test
--font-monoPresent1 other test
--ease-out-quartPresent1 other test
--radius-smPresent1 other test
--radius-mdPresent1 other test
--shadow-floatNot checked1 other test
  • Every palette colour, the 11 hex colours, keeps the exact value it was given.

    WhyContrast on every page is computed from these values; a colour that drifts moves every ratio at once.

    TestEnforced by a test on every change.

  • The token file holds no pure black and no pure white.

    WhyInk and paper are the darkest and the lightest colours in the palette.

    TestEnforced by a test on every change.

  • Tailwind's default palette stays switched off.

    WhyWithout --color-*: initial, a default colour utility such as bg-red-500 would still work and step outside the palette unnoticed.

    TestEnforced by a test on every change.

The Zero Door token snapshot

#

The Zero Door interface keeps its own token file. We do not retype it: a script reads the product's files without changing them and writes the values into one JSON file in this repository.

Besides the token file, the script reads values the product sets in its own code, such as the typeface, the default theme and the icon sizes. It records two dates, the day the token file last changed and the last day any file it reads a value from changed, so the dates below say which version this is.

Published as
/design/product-tokens.json
Read from
The Zero Door token file and 13 other source files
Token file last changed
Source files last changed

Both themes

Both themes painted with the snapshot: the three surfaces, the three text levels, the four signal colours, brand and the focus ring. Set in this site's typeface; the product itself uses Inter.

Colour tokens

6 light-theme colours compute to exactly the value of a site colour; their swatches name the site colour.

Light theme

  • --surfaceoklch(0.985 0.006 75) · #fdfaf6Same as paper
  • --surface-subtleoklch(0.965 0.007 75) · #f6f3eeSame as paper-2
  • --surface-raisedoklch(1 0 0) · #ffffff
  • --fgoklch(0.235 0.010 60) · #221d19
  • --fg-mutedoklch(0.460 0.010 60) · #5c5753Same as ink-muted
  • --fg-subtleoklch(0.540 0.010 60) · #736d69Same as ink-subtle
  • --zd-borderoklch(0.905 0.006 75) · #e2dfdbSame as hair
  • --zd-border-strongoklch(0.840 0.006 75) · #cdcac6Same as hair-2
  • --brandoklch(0.25 0.025 233) · #15242c
  • --brand-mutedoklch(0.40 0.030 233) · #384b55
  • --signal-successoklch(0.53 0.11 150) · #347d48
  • --signal-warningoklch(0.53 0.12 70) · #975d00
  • --signal-dangeroklch(0.53 0.17 25) · #ba3535
  • --signal-infooklch(0.54 0.12 240) · #0d76ad
  • --focus-ringoklch(0.45 0.10 233) · #005d83

Dark theme

  • --surfaceoklch(0.190 0.008 250) · #111417
  • --surface-subtleoklch(0.225 0.008 250) · #191c1f
  • --surface-raisedoklch(0.255 0.008 250) · #202327
  • --fgoklch(0.930 0.005 85) · #e9e8e4
  • --fg-mutedoklch(0.665 0.008 250) · #909499
  • --fg-subtleoklch(0.640 0.010 250) · #888d92
  • --zd-borderoklch(0.300 0.008 250) · #2b2e32
  • --zd-border-strongoklch(0.390 0.008 250) · #424549
  • --brandoklch(0.62 0.060 245) · #688aa8
  • --brand-mutedoklch(0.45 0.050 245) · #3d586f
  • --signal-successoklch(0.66 0.13 150) · #4fa866
  • --signal-warningoklch(0.76 0.13 75) · #e1a447
  • --signal-dangeroklch(0.66 0.18 25) · #ec5b57
  • --signal-infooklch(0.66 0.12 240) · #419bd4
  • --focus-ringoklch(0.62 0.09 245) · #558cb9

Each hex value is computed from the oklch value by the same code that computes contrast on these pages; a colour channel outside the sRGB range is clipped.

Spacing, radius, shadow and motion

Spacing scale, each bar drawn at its value
  • --space-12px
  • --space-24px
  • --space-36px
  • --space-48px
  • --space-512px
  • --space-616px
  • --space-720px
  • --space-824px
  • --space-932px
  • --space-1040px
  • --space-1148px
  • --space-1264px
Radius, curves and durations
TokenValue
--radius-sm4px
--radius-md8px
--radius-lg12px
--ease-outcubic-bezier(0.23, 1, 0.32, 1)
--ease-in-outcubic-bezier(0.77, 0, 0.175, 1)
--ease-drawercubic-bezier(0.32, 0.72, 0, 1)
--duration-feedback130ms
--duration-fast160ms
--duration-default200ms
--duration-slow300ms
--duration-drawer400ms
Shadows, light and dark
TokenLightDark
--shadow-flat0 1px 2px rgb(0 0 0 / 0.04)0 1px 2px rgb(0 0 0 / 0.20)
--shadow-raised0 8px 24px rgb(0 0 0 / 0.08)0 8px 24px rgb(0 0 0 / 0.40)
  • Product values are copied by a script, never typed.

    WhyA typed copy goes stale the day the product changes. The snapshot records the day the product's token file last changed and the last day any file it reads changed, so a stale copy shows.

    ReviewKept by review, not by a test.

  • Every product text token reads at 4.5:1 or more on all three surfaces, in both themes.

    WhyThe interface is dense; text has to stay legible on whichever surface it lands on.

    TestEnforced by a test on every change.

  • The product border token --zd-border is not claimed at 3:1.

    WhyIt separates regions and stays below 3:1 against the surface in both themes. The test pins that, so no page can claim more.

    TestEnforced by a test on every change.

What holds the language.

#

Every rule on these pages says what holds it. These are the tests and gates that hold the language across the site, grouped by the stage of the pipeline that runs them, with what each one holds. A test that holds a single page's rule is marked on that rule's card.

Before the build: unit tests

  • Token values

    Pins the exact value of every palette colour in the token file, the 11 hex colours. Checks that the typeface stacks, the curve and the radii are defined, keeps pure black and white out of the file in any hex spelling and keeps Tailwind's default palette switched off.

  • Font files

    Checks that each of the 6 font files the site serves itself is a real WOFF2 file of a sensible size: more than 8,000 bytes and less than 120,000. Weights checked: New Black 400, 500, 600, 700; Geist Mono 400, 500.

  • Both languages

    Reads every page dictionary, these design pages included, and fails if the Turkish and English versions differ in shape or if any string carries an em dash, the one-word form of the product name, another banned string or a percentage other than 99.5.

  • Colour maths

    Proves the colour maths these pages use against known values, checks that a displayed ratio rounds down so it never looks like a pass when it is not one, reads every colour from the token file in order, confirms the ratios quoted in the comments of the token file and the primary button style and checks that ink, ink-muted, ink-subtle and accent-deep reach at least 4.5:1 on paper and paper-2.

  • Design pages

    Checks that every design page has its dictionary, component, route entry and navigation label, that previous and next visit each page once, that the site tokens are read with the expected values and that the Zero Door snapshot keeps its contrast claims in both themes.

  • This page's claims

    Holds the claims this page makes about files: the download files draw the glyph path from the code and use only token colours, the browser icon keeps the ink tile’s square with the glyph at two thirds of the side, the token file carries no percent sign, every rule card on this page that says a test holds it is tied to a test that exists and the list of files that repeat token colours stays complete.

  • The shared motion setting

    Checks the one motion setting the whole site shares: it starts playing, a pause or a resume reaches every listener once and the choice is stored under one fixed key.

  • Framework list

    Pins the site's list of compliance frameworks to 13 identifiers in a fixed order, copied from the product's catalogue; a change on the product side is caught by review, not by this test. Also checks that no listed name is empty or contains a name from the fixed list of frameworks the product does not ship.

After the build: gates on the built site

  • The built site

    Runs over every built page and stylesheet. No em dash, no one-word product name and no four-column grid class at the large breakpoint; no percentage except 99.5; a security policy on every page, a canonical link and language links on every page except the 404 page, no Google Fonts and no external script beyond one named exception on the contact page; in shipped CSS, no pure black or white in any spelling (hex, keyword or colour function, inline SVG images included) apart from one named Tailwind default, and no opacity in a keyframe or in a transition that names it; no skipped heading level inside main; no name from the site's list of unsupported compliance frameworks in the main content of pages outside research and legal.

In a browser

  • Accessibility in a browser

    Scans every built page, the 404 page included, with axe at the WCAG tags below and expects zero violations; the mobile run leaves out the legal documents and research articles, though not the two index pages. A loop started through the shared reveal motion marks itself, as do several loops that run their own script, such as the noise field on the home page; the test fails a page where a marked loop runs without a visible pause control. It also checks that no page scrolls sideways at 320 CSS px, that keyboard focus stays clear of the sticky header on the pages named in the gaps below, in a desktop window and again at 390 CSS px wide, and that a pause decision carries from page to page.

    WCAG tags

    • wcag2a
    • wcag2aa
    • wcag21a
    • wcag21aa
    • wcag22aa
  • Lighthouse on desktop

    Lighthouse on a fixed list of pages. A score below a threshold stops the pipeline, because the jobs that publish the site wait for this one.

    Thresholds

    Preset
    desktop
    Pages
    21
    Runs per page
    2
    Performance
    at least 95 of 100 (best run)
    Accessibility
    100 of 100 (worst run)
    Best practices
    100 of 100 (best run)
    SEO
    100 of 100 (best run)

    Legal documents skip the SEO score but keep its other individual checks; is-crawlable is off.

  • Lighthouse on mobile

    advisory

    Lighthouse with mobile emulation on a shorter list of pages. The job is advisory: CI lets it fail without stopping the pipeline.

    Thresholds

    Preset
    mobile emulation
    Pages
    11
    Runs per page
    3
    Performance
    at least 90 of 100 (median)
    Accessibility
    100 of 100 (worst run)
    Largest contentful paint
    at most 2,800 ms (median, warning only)

Before a release

  • Launch gate

    started by hand

    Runs first in the production release job.

    Stops the release when

    • the build is missing or incomplete
    • a legal page still carries an unfilled field
    • the home page is marked noindex
    • a page loads a script or frame from a host the published privacy page does not name
    • a link to one of our own subdomains does not answer

What no test holds yet.

  • Raw hex outside the token file. The header of the token file says components use colours by token name and points to a list of the copies kept outside CSS. A unit test fails when a palette value turns up anywhere else in the site, the shared package or the form service, but a hex value outside the palette is caught only when it is pure black or white. The copies, by what each one is for:
    • Browser theme colour
    • Share-card renderer
    • Logo SVG files
    • Form service, deployed apart from the site
  • The test that keeps focus clear of the sticky header runs on 3 pages, not on every page: /, /zero-door and /tr/contact.

Change history

#

The design language is not released in versions; git is its record. Each date is the day a change was committed, newest first, except where an entry says it reached the main branch.

  1. The mascot gets his page and his name.

    The beaver of the Zero Door page got a page of his own, and with it his name. It tells what each part of his scene stands for, pairing every part with the copy of the Zero Door page it echoes, and it shows how he is drawn from the glyph and how he moves. Its rules say where he may appear. The name is used wherever he is described, the text alternative of the Zero Door opening included. The mascot page is in the foundations, after the logo.

    The gate figure retired; the dam became a figure.

    The gate figure left the design language, and the dam of the Zero Door page took its place among the figure types. The visualisation page now shows the dam live with its measures and rules. The primitives on the diagrams page draw its card, original, stopped card and verdict tag at the size the dam has in the Zero Door opening on a wide screen.

  2. One vocabulary for scripted motion

    Scripted motion moved to one module of named durations, curves and moves, and a unit test began to fail a script that writes its own curve or a bare duration, apart from a short list of named exceptions. Before it, each component described the same motion with its own numbers. The motion page describes the vocabulary.

  3. The design language section

    This section arrived with the parts every page shares: navigation, a last-changed date read from git and rule cards that say what holds each rule. Underneath sat a measurement layer: site tokens read from the token file when the site is built, contrast ratios computed rather than typed and the Zero Door tokens copied from the product by a script.

    A guard for the pause control

    A loop started through the shared reveal motion began to mark itself, and the accessibility test began to fail a page where such a loop runs without a visible pause control. The flow diagram on the architecture page, which had shipped without one, got its control the same day.

  4. The accessibility gate reached main.

    From this day the built pages had to pass axe with zero violations, and a page that scrolled sideways at 320 CSS px failed the gate. The gate was written the day before and reached the main branch on this date. The accessibility page describes what it tests.

  5. One pause control; focus clears the menu.

    One motion setting came to cover the whole site: pausing one animation paused all of them on every page, and the browser remembered the choice. The looping visuals of that time got a small round pause button beside them. Focusable elements also gained a scroll margin to keep keyboard focus clear of the sticky header. The motion page describes the control.

  6. A colour for raw change

    --color-raw, #a9432c, joined the palette: a muted brick tone for raw, unverified change. Accent means the one verified signal, so noise needed a colour of its own. It is the only colour added after the first day, and the token test pinned its value the same day.

  7. The foundation

    One commit brought the token file, New Black and Geist Mono served from the site itself, the glyph, the base styles and the first token and font tests. Later that day the primary button moved to accent-deep to reach 4.5:1 with paper text, and reveal motion became transform-only. Build gates arrived for banned strings, for external fonts and for any pure black or white, and the press kit published the two glyph files.

How a change lands.

#

A change to the language is a change to a file, and it reaches the site only through the pipeline every other change takes. These are the steps, in the order the pipeline runs them.

  1. Check

    • Type check and unit tests
  2. Build

    • Build and gates
  3. Test

    • Browser tests
    • Lighthouse on desktop
    • Lighthouse on mobileadvisory
  4. Release

    • Production releasestarted by handwaits for the build and its gates, the browser tests and Lighthouse on desktop
Read from the pipeline configuration when the site is built. The release stage shows the production release only.
  1. Edit the token or the component.

    Colours, typeface stacks, the curve, the radii and the shadow change in the token file; the typefaces themselves are declared in the build configuration. Buttons, links and the base type change in the site stylesheet or in the component itself. By convention a component names a colour token rather than copying its value.

  2. Unit tests pin the values.

    The first stage runs the type check and the unit tests across the workspace. One test fails on a palette colour that changed without its test, another rechecks the ratios quoted in the token file and the button style and a third holds both languages to the same shape.

  3. The built site passes the gates.

    The build stage builds every page in both languages, then runs the gates over the result: banned strings, pure black and white and animated opacity in shipped CSS, heading order and every internal link and anchor.

  4. A browser checks what a reader meets.

    Browser tests open the built site in a desktop and a mobile browser: each page's own tests, axe on the built pages, reflow at 320 CSS px and a visible pause control on any page that runs a marked loop.

  5. Lighthouse scores the result.

    Lighthouse scores a fixed list of pages on desktop and stops the release below its thresholds; the mobile run reports but does not stop anything.

  6. The release runs one more gate.

    Jobs that publish the site wait for the build and its gates, the browser tests and Lighthouse on desktop. The production release is started by hand and runs the launch gate as its first step.

.note { color: var(--color-ink-muted); }
DoName the token. A change to the token then reaches every use at once.
.note { color: #5c5753; }
Do notDo not copy a token's value into a component. The copy would stay behind when the token changes; the copies test fails on it until it is removed or listed.
  • A component names a colour token; it does not write a hex value.

    WhyThe header of the token file says so. A hex value outside the palette is caught only when it is pure black or white, so review holds this rule.

    ReviewKept by review, not by a test.

  • A palette value written outside the token file is a listed copy.

    WhyThe test scans the site, the shared package and the form service for every palette value. It fails on a file that the list of copies does not name and on a listed file that no longer holds one.

    TestEnforced by a test on every change.

  • A commit that changes a pinned value changes its test too.

    WhyThe token test holds the exact value of every palette colour, the 11 hex colours, so a colour change without a test change fails the first stage of the pipeline.

    TestEnforced by a test on every change.