The press

The line alone does not make a drawing. What looked like vector graphics in the first versions was not the lines – it was the surfaces and the sheet beneath them.

Three moves turn that into a print: the colour surface does not sit exactly inside its contour, it bleeds into the paper at its edge, and the paper is never even. On top of that comes the question of who knows the colours at all – and the answer is: nobody but the palette.

Misregistration

flaeche() does not put the surface where its contour is. It is shifted by 0.008 to 0.016 unit measure and drawn up to 1.5 % larger or smaller: the colour plate does not hit the line plate exactly. Sometimes the colour runs past the line, sometimes a pale seam is left on the other side.

Direction and amount hang off the seed, that is off the head – drawn once per pen from the trace 'register'. A sheet on which every surface slips in a different direction would not be misregistration but a loose contact.

One plate per colour

A press has one plate per colour, and each sits a little differently. Even so, almost everything here lies on the SAME one: skin, hair, lips and trimmings shift together against the line, otherwise a head would look like a loose contact.

There is one exception. The cloth at the neck – shirt collar, knitted hem – names platte: 'kleid' and gets a direction of its own, drawn from the same seed. It is not the head, it is what the head sits on, and in print it would be a pass of its own. Down there the registration reads best: it is the largest continuous area at the lower edge, and the ribs of the knitting lie on top of it as ink, without shifting along.

Bleed

Under every printed surface lies the same surface once more: 3 % larger, at 14 % opacity. The colour runs a little into the paper, and the edge becomes a seam instead of an edge. It is the same move as the seam around a punkt() – there with 7 % and 16 %, because a freckle is smaller than a cheek.

What the press does NOT apply to

Printing happens by itself: the pen prints, and a surface does not have to ask for it. Only whoever wants to stay dry says so – trocken: true. The rule once stood the other way round as druck: true on seventeen individual calls, and a counter-test without printing was only available through a rebuilt drawing path. Now it is the last argument of macheStift.

Three kinds of surface stay dry:

SurfaceReason
Neck, ear, hat band They have to join onto something. A neck that slips by one percent is a gap under the chin; a band that slips off the crown hangs in mid-air.
Plaster, teeth, tongue Trimmings, small enough that an offset does not look like printing but like a mistake.
The tint of the lens Both at once. It has to join onto the frame, and the offset is a fixed amount in head space: a fiftieth of the skin's width, a sixteenth of a lens. The offset does not grow with the surface – so the question is never "press on or off", but how large it is relative to THIS surface.

The paper

The grain is drawn once into a 128-pixel tile and after that filled over the whole sheet as a pattern. Rolled anew it would look different in every frame – paper would become television static. Apart from that, a few thousand dots per frame would cost more than all the rest of the drawing.

Two things live in the grain: dots (900, very pale) and fibres (70 short lines in random directions, paler still). Dots alone are noise. Fibres are paper.

In addition the sheet gets two or three percent darker towards the edges – a radial gradient whose centre sits a little above the middle of the sheet, where the light would come from. Paper that has exactly the same tone everywhere is a screen.

Colour as roles

No drawing step ever names a hex value. It asks for p.tinte or p.akzent. That is the same separation as with the CSS tokens of this page – except that canvas knows no variables and the resolution therefore has to happen in palette.ts.

Rolefor what
tintethe line. Everything drawn except hair and accent.
tinteWeicha restrained line: concha, fine wrinkles.
sprossefreckles – a warm tone between red and brown. In ink they read as stubble.
hautthe head surface. Very light – it does not carry colour, it carries a hint.
hautTiefthe shadow of the head surface along its lower edge.
schattenthe soft shadow IN the head, towards the far side. Semi-transparent, because it lies over the skin and should keep its tone.
blankthe light in the face: teeth, the highlight in the eye, light rings on dark trinkets. Close to paper, with a hint of the skin hue – not the skin itself, which can be dark.
akzentcheeks, lips, tongue – always darker than the skin.
sternFarbe(t)not a fixed role but a table: eight poppy tones for the stars in the eye. The accent alone was not enough – nine heads with the same coral star are a stamp.
haarhair and beard share one colour: two tones in the same face read as two people.
stoffheadwear. Sets itself apart from the hair, or it disappears into it.
stoffTiefthe same fabric, darker and a little more saturated: the band on the hat. A colour of its own would be a second garment on the head.
pflastera plaster: lighter than the skin, with a hint of sand.

haarDunkel is not a colour

Beside the ten colours stands a boolean. On black hair a line in ink is nothing; there the drawing has to be left out – light instead of dark. The question of whether that is necessary is answered by the palette itself (haarDunkel: hl < 0.5).

Computing the colour back

Symptom: The strands on dark hair are invisible, on blond hair far too hard.

Cause: The drawing wanted to read the lightness off the colour. But at that point the colour is a CSS string – whoever wants to question it would have to parse rgb(…) and convert back to OKLCH, in every frame, for every strand.

Fix: The flag is set where the lightness is still a number – in machePalette.

OKLCH: seven skin tones and what follows them

Until 17 August 2026 every head had the same lightness: L = 0.955, C = 0.007, only the hue travelled. That rule addressed a real problem – lightness scattered as random noise over one tone looks like a misprint in the grid – but drew the wrong conclusion: every head was nearly white.

Now the lightness sits in the table, row by row set by hand together with the chroma: L from 0.72 to 0.955, C from 0.06 down to 0.012. Darker skin needs more chroma or it turns grey; light skin needs almost none or it turns orange. Plus weights – the strong rows occur, but rarely (together a good tenth of the heads) – and from HAUT_BUNT_AB = 0.88 a second list with colours: mint, lilac, rosé, ice, moss, berry. The sheet is not a passport photo.

Downwards the table stops at L = 0.72. That is a statement about this style, not about people: it draws with a dark line (ink around 0.27) onto the fill, and everything in the face – lid arcs, nose, fine wrinkles, stubble – is that same line. Below 0.7 those strokes drown. A darker head would need reserved, light strokes, that is a second drawing path; until that exists, a darker row would be a promise the press does not keep.

What lies on the skin computes from its lightness: hautTief (shadow) one step below, akzent (cheeks, lips) 0.13 below, sprosse 0.22 below, pflaster above. And what must be light – teeth, the highlight in the eye, light rings on dark trinkets – uses the new role blank instead of the skin. It used to be the skin colour; that only worked while every skin was nearly white.

Hair: ten natural tones, seven dyed

There used to be six natural tones, three of which meant the same dark brown – a sheet looked like one family. Now they run from black through copper and ash to white, and the warm ones differ in chroma, not only in lightness: copper is not light brown, it is more saturated. Weights here too: ochre and copper are the loudest tones on the sheet and would stand on every second head if spread evenly.

Above BUNT_AB = 0.82 the second list takes over – barely a fifth of the heads. The dyed ones may be poppy, but they must not blow the sheet apart: the same lightness as the light natural tones and at most the chroma of the accent (0.115). A neon pink with C = 0.25 would be a sticker on a sheet made of paper and pencil.

And rare. Nine dyed heads side by side are no longer a feature but the rule.

The limit of the CSS roles

The page has its own role tokens (--flaeche, --vordergrund, …). They cover the page, not the canvas: there no browser resolves a variable. That is why the roles exist twice – in CSS for the document, in palette.ts for the drawing.

Exactly two roles cross the bridge: --marke-canvas for the labels under the heads and --flaeche for the veil over the grid. Both are named in scripts/check-rollen.mjs, and a third one is not added without somebody entering it there. More on that under Layers and Pitfalls.