A systems programming languagePre-1.0 · closed beta
EN / PTGitHub
VIIIPaper InkColorscheme · 24 inks · 2 variants · 1 accent

A colorscheme you read like print.

The palette behind this site, made official. Paper for daylight, Ink for the dark, warm ink for strings, and a single vermilion for what deserves your attention.

PaperLight · #F2F0EB

use io

decl Reading { sensor: string; value: f64; live: bool }

@mm(arena)
fn ingest(src: Channel[->Reading]) {
    loop r in src {
        if r.live == true && r.value > 40.0 {
            // strings in warm ink, numbers in ochre
            io.println("hot: {{r.sensor}} at {{r.value}}")
        }
    }
}

reply := store <-> batch timeout(5s)

InkDark · #12151B

use io

decl Reading { sensor: string; value: f64; live: bool }

@mm(arena)
fn ingest(src: Channel[->Reading]) {
    loop r in src {
        if r.live == true && r.value > 40.0 {
            // strings in warm ink, numbers in ochre
            io.println("hot: {{r.sensor}} at {{r.value}}")
        }
    }
}

reply := store <-> batch timeout(5s)

24 inks. Two papers.

Three grounds for each paper, three weights of text for each, the vermilion family, and four pigments that tell code apart. Each variant prints with its own half of the set.

PaperThe light grounds, from the page down to the recesses.
InkThe dark grounds, the same three steps reversed.
GraphiteText on Paper, from headings to captions.
ChalkText on Ink, the same three weights.
VermilionThe accent, and the warm ink for strings: one tone for each paper.
OchreNumbers; warnings and changed lines.
MossFunction names; success and added lines.
IndigoTypes; information and links.
PlumConstants; hints.

Click any ink to copy it. The few in-between tones, like the code ground or the color of function names, are mixes of two inks, never new colors.

Every hue, in two tones.

A deep tone that reads on Paper and a light one that reads on Ink. In code the pigments name what each token is; the vermilion stays the one that asks for attention. Measured on the code ground: 5.6 to 5.8:1 on Paper, 4.2 to 8.6:1 on Ink.

AccentDecorators, channel operators, escapes

@mm(arena) <->Shu deep5.6:1
@mm(arena) <->Shu4.2:1

Warm inkStrings

"hot: 40.0"Rust5.8:1
"hot: 40.0"Apricot8.5:1

OchreNumbers; warnings

40.0 5s 0xffOchre deep5.6:1
40.0 5s 0xffOchre8.4:1

MossFunctions; success

ingest printlnMoss deep5.7:1
ingest printlnMoss8.6:1

IndigoTypes; information

Reading f64Indigo deep5.6:1
Reading f64Indigo8.5:1

PlumConstants; hints

true nonePlum deep5.6:1
true nonePlum8.5:1

Every color, on its own ground.

Each swatch is shown where it lives, with its contrast measured against that ground. Syntax colors sit on the code background, text sits on the page.

RolePaperInk

Syntax

KeywordsKeywords and storage
fn match loop spawn16.1:1 · AAAGraphite
fn match loop spawn14.7:1 · AAAChalk
TypesTypes and type names
Reading Result Channel5.6:1 · AAIndigo deep
Reading Result Channel8.5:1 · AAAIndigo
FunctionsFunction names, declared and called
ingest println5.7:1 · AAMoss deep
ingest println8.6:1 · AAAMoss
IdentifiersIdentifiers and everything unmarked
src value batch10.5:1 · AAAMix · Graphite → Graphite muted 55%
src value batch9.9:1 · AAAMix · Chalk → Chalk muted 55%
StringsStrings and characters
"hot: {{r.sensor}}"5.8:1 · AARust
"hot: {{r.sensor}}"8.5:1 · AAAApricot
NumbersNumbers, with their units
40.0 5s 0xff 64kib5.6:1 · AAOchre deep
40.0 5s 0xff 64kib8.4:1 · AAAOchre
ConstantsConstants: true, false, none, self
true false none5.6:1 · AAPlum deep
true false none8.5:1 · AAAPlum
CommentsComments, quiet on purpose
// quiet on purpose4.6:1 · AAGraphite faint
// quiet on purpose4.6:1 · AAChalk faint
Decorators and channelsDecorators, channel operators, escapes
@mm(arena) <-> {{ }}5.6:1 · AAShu deep
@mm(arena) <-> {{ }}4.2:1 · AA largeShu
OperatorsOperators and punctuation
:= -> == +4.6:1 · AAGraphite faint
:= -> == +6.9:1 · AAChalk muted

Text

Primary textBody text and headings
A systems language that tells the truth.15.4:1 · AAA
A systems language that tells the truth.15.4:1 · AAA
Secondary textLedes and supporting text
You only pay for what you summon.6.7:1 · AA
You only pay for what you summon.7.2:1 · AAA
Tertiary textMetadata and captions
Spec · 72,796 words4.4:1 · AA large
Spec · 72,796 words4.8:1 · AA

Grounds

PageThe page
Paper · Page
Ink · Page
RaisedCards and panels lifted off the page
Paper · Raised
Ink · Raised
SunkRecessed areas, tab bars, inline code
Paper · Sunk
Ink · Sunk
CodeCode blocks and editor background
Paper · Code
Ink · Code

Four rules behind it.

One accent

Red means look here.

Vermilion paints decorators, channel operators and escapes, and nothing else. The pigments around it are softer, so it never has to compete.

Color by kind

Each color names a kind.

Strings in warm ink, numbers in ochre, constants in plum, types in indigo, functions in moss. Learn the five and a line reads at a glance.

Weight before color

Structure in bold.

Keywords keep the text color and go bold; operators and comments step back. The shape of the program comes from weight, its meaning from color.

Measured contrast

19 of 20 syntax colors pass AA.

Measured on the code ground and computed from the palette when this page builds. Below the line: decorators and channels on Ink (4.2:1), kept to short tokens. Nothing drops under 4.2:1, past the 3:1 bar for large text.

Ports

Paper Ink lives in its own repository as a single palette file: 24 inks, and every theme generated from them. Today it highlights this site; editor and terminal ports come later.