The ink field is the hero's living art: the colourway's band inks flowing across a plate and handing over to each other through a printed screen, never a blur. It only ever prints true inks and the paper they sit on. It is art, so it sits behind nothing but its own plate: words go on a reading plate beside it, never on top (D-B1).
Example#
Four modes share one shader (D-E2):
| Mode | Hand-over | Paper | Inks |
|---|---|---|---|
fountain (default) | fine stochastic riso grain, wide | yes | 4 |
posterized | 45° halftone, narrow | yes | 4 |
smooth | continuous, mixed in OKLab | no | 4 |
split | the squeegee: 45° halftone along one pull | yes | 3, Rave 4 |
Usage#
Use the ink field as a living gradient behind hero art and covers: inks flowing through a halftone screen, printed by WebGL where it can and as a still everywhere else. It is the moving gradient Max picked (D-E2), never behind words.
- Modes. The fountain field is the default; smooth, posterized and split fountain ship as modes.
- Settling. At Studio it bursts on arrival and on each tap or key press, then holds still within 5 s; loops need
loopand a motion toggle on the page (D-E3). - Fallbacks. Without WebGL, under reduced motion or on a slow device it prints the still, then the flat ink.
prioritymarks the hero field so it loads first;fadebleeds it into the paper.
Layer and volume#
The volume dial decides what the field does; the reading layer around it never changes.
| Volume | The field |
|---|---|
| Quiet | one flat ink (--mk-band-1), no motion, no WebGL |
| Studio | a burst on arrival and on each tap or key press, settled within 5 s, then one held frame |
| Press | bursts; it loops only with loop and while a motion toggle is on the page |
| Rave | loops while a motion toggle is on the page, otherwise bursts |
High contrast prints the flat ink too (D-C9). Reduced motion, Save-Data and the paused motion toggle hold one
still frame. Without WebGL 2, or on a software renderer, the slot keeps its poster: the same bands and halftone
hand-overs, drawn in CSS. At most two fields run at once on a page; the hero one comes first.
mk:pulse jolts the bands forward: a stamp sends 0.5, a sent form 0.6, a tidy 0.4. A scoped pin that changes the
inks under a field sends mk:reink from the pinned element.
Anatomy#
- FieldA canvas, or its still, filling the slot.
.mk-ink-field
Volume#
Quiet
Studio
Press
Rave
Content#
- The field has no words. Its slot sits beside the reading column or under a hero's art, never under text.
Do and don't#
Do
Don't
An ink field behind a paragraph, looping forever with no pause key.
Accessibility#
- The slot is
aria-hiddenand takes no pointer events or focus: it means nothing, so it says nothing. - Motion always has a cause and stops on its own within five seconds at Quiet and Studio (WCAG 2.2.2). A loop only
runs while a
MotionToggleis mounted, so a visible pause control always comes with it. - Reduced motion always wins over the volume; the field then shows one still frame.
- No area flashes: bands drift, and colourway changes crossfade over 700 ms.
Props#
| Prop | Type | Default | Description |
|---|---|---|---|
mode | "fountain" | "posterized" | "smooth" | "split" | fountain | Default `fountain` (D-E2). |
loop | boolean | none | Press only: loop while a `MotionToggle` is mounted (2.2.2). |
speed | number | 1 | 0.25 to 2, default 1. |
t0 | number | none | |
fade | number | 0 | px, default 0: the AM dissolve into the stock along the bottom edge. |
look | Partial<FieldLook> | none | |
priority | "hero" | "section" | none | `hero` engines start first (≤ 2 live per page). |
still | ReactNode | none | The server's SVG still of the field (IF-4, P1): `coverToReact(fieldStillNode({ mode, volume }))`, rendered by a server parent and passed in, so its code never ships to the client. It replaces the CSS poster's bands as the first paint (fountain and posterized). |
className | string | none | |
style | CSSProperties | none |
Tokens#
System tokens (19)
--mk-band-1--mk-band-2--mk-band-3--mk-band-4--mk-border--mk-contrast--mk-dur-field-ease--mk-dur-field-pulse--mk-dur-field-run--mk-dur-field-wake--mk-dur-gl-fade--mk-dur-reink--mk-dur-theme--mk-field-paper--mk-paper--mk-theme--mk-volume--mk-w-hc--mk-w-quiet
Its own properties (3)
--mk-field-band--mk-tile-grain-dark--mk-tile-ht-fringe
Changelog#
Arrived in 0.1.0.
- Ink field: the SVG still (
fieldStillNodein./art, passed toInkFieldasstill) from a TS port ofmk_flow, and the poster on the print kit's shared tiles. Read the whole entry
./ink-field: the WebGL 2 engine with bursts that settle within 5 s, loops only with a mounted motion toggle, pulses, crossfades, the degradation ladder andrenderAt; the gate; the looks;readInks; andInkField, at most two live contexts per page, with its CSS poster and the flat fill. Read the whole entry