aerulion / Nyx

Rev 01 / Monochrome

Night, the primordial ground

Nyx

Two inks. Two angles. One mark.

The design language behind aerulion.net. Everything here is derived from one mark, an equilateral triangle with a 30/60 bolt cut. Nothing in it is here to decorate, so nothing in it has a reason to sit off the grid.

Back to the site

The name

01 / 14

Night, and what is drawn on it.

The system is named for the ground it is built on, not for anything it puts there. Every part of it carries that name and one plain noun, so a thing can be asked for by the name it is filed under.

Nyx is the Greek night, not dusk, not shadow, and not a mood. She is primordial: the ground that was there before anything was drawn on it, and the thing everything else is drawn out of. That is the exact relationship this system has with its two inks. In Hesiod she arrives near the beginning and most of what follows is her descendant, which is the other half of the fit: everything here is derived from one figure.

#000 is not a dark theme and not a background colour. It is the ground: the untouched surface, the state of every pixel nobody has claimed. #fff is not a colour either. It is the only thing that exists on that ground, and a figure is either drawn or it is not.

That is also why there are no greys. A grey is a half-drawn figure, a thing caught between existing and not, and this system has no vocabulary for that. Where a field needs to recede it thins until it is gone, so the ink stays absolute and the night stays absolute, and the whole hierarchy is built out of how much of the ground is still showing.

Nyx MarkThe logo
The triangle, the tail and the bolt cut. Drawn, inked, or mid-unfold: three states of one figure, never three figures.
Nyx RuleThe hairline
One weight at 1px, doing the work a box, a card or a background would do elsewhere.
Nyx CutThe 30° bevel
Taken off a panel top-left and bottom-right, with the drop always the run times tan 30°.
Nyx LatticeThe 60° field
The triangular grid that reads the live page, bends around what it finds, and thins rather than fades.
Nyx PlateThe crop
Four rules pinned inside the viewport with an opaque margin behind them, so the page reads as a printed plate.
Nyx GaugeThe readout
The tick riding the right rule with the current station beside it, reporting position as an instrument would.
Nyx CurtainThe transition
The ground closing over a route and lifting again on a 30° edge, so a page is never seen arriving. It doubles as the intro on the first visit of a session.
Nyx GlyphThe icon
A figure drawn on the lattice at hairline weight, in the same five directions the mark uses and never in any other.
Nyx ScaleThe ramp
Two interleaved octaves of spacing, and the module of clear space that every lockup is measured with.

Lineage

02 / 14

Descended, not invented.

Five older traditions are doing most of the work here. Each is taken in part, and the part that was left out is the more useful half of the description.

A design system that calls itself new is usually one nobody has read against its ancestors. A triangle, a hairline, a grid and a readout were not invented here; every one of them was settled long before this page. What is particular here is only which of them were kept, and how far the keeping was pushed.

So the names below are not badges, and not one of them is claimed whole. Each entry says what was taken and what was refused, because a system is described as much by the neighbour it declined to become as by the one it resembles.

The technical plateDirect
Crop marks, construction lines, dimension ticks and instrumentation readouts come straight from engineering drawing and the printed sheet, and they do the job here they already did there: report how a thing was made instead of dressing it. The departure is how lines are told apart. A drawing grades them by thickness, object heavy and hidden dashed and centre thin. This one grades them by dash pattern and leaves the weight alone.
BauhausThe method, not the palette
Deriving an entire vocabulary from one geometric primitive is the Bauhaus habit, and the mark is exactly that: an equilateral triangle, with every other measure solved off it rather than chosen beside it. The colour is not taken. The primaries that school is remembered for have nowhere to go in a monochrome system, so the debt is to how it built and never to how it looked.
The Swiss schoolThe attitude, not the grid
Objectivity, asymmetry, and typography doing the organising that ornament does elsewhere: all Swiss, all kept. The grid is not. That school’s signature is a modular multi-column field, and this page runs one column and ranks its blocks by measure instead. Nor are the faces. Swiss neutrality wanted a grotesque that disappears, and none of these four is trying to.
Industrial designThe family, not the object
A catalogue of products can be recognised as one family without any two of them being alike, because the radii, the grids and the controls are shared and only the job changes. That is the ambition here: the mark, the cut, the lattice and the glyphs are not four decisions, they are one vocabulary applied four times. What does not carry over is the restraint the discipline is admired for. A product recedes so that its use can come forward, and a plate like this one is not trying to recede.
BrutalismOne principle
Béton brut left the structure visible and called that the finish. That single idea transfers: a hairline here is not a border drawn around a panel, it is the panel, and there is no surface behind it to hide. Nothing else comes with it. Brutalism is heavy, raw and unfinished; this is thin, exact and finished. Web brutalism, which borrowed the name for a deliberate crudeness, is further away still.

The rules

03 / 14

Six laws, no exceptions.

These are the whole identity. If a change breaks one of them it is not a variation, it is a different system, and it belongs somewhere else.

  1. I

    Two inks

    Exactly #000 and #fff. No greys, no tints, no alpha on text. Hierarchy comes from size, position and density, never from dimming.

  2. II

    Thirty / sixty

    Both angles are taken from the mark. Panels bevel at 30°, the lattice is a 60° triangular grid, and there is no third angle anywhere in the system.

  3. III

    No spin

    An in-plane rotation is off-grid for all but six frames of its cycle, so nothing here sweeps through one. Where a figure has to change orientation it snaps between on-axis positions, or it turns in four dimensions and is projected back.

  4. IV

    Hairline law

    A 1px rule does the work a box, a card or a background would do elsewhere. Fills belong to the mark, to a primary button, and to the inverted state of a control under hover, focus or selection. Nothing else gets a surface.

  5. V

    Instrumentation

    Small uppercase mono readouts frame each block, the way a print registration mark or a telemetry panel would. A readout always names something true.

  6. VI

    Density, not dimming

    Where a field recedes it thins. The lattice dithers vertices and segments in and out so it never renders a grey pixel. That is law I restated for anything generative.

Ground and ink

04 / 14

The palette is complete.

Two things exist here: the ground, and what has been drawn on it. There is no accent, no secondary and no tint ramp. A warning reads as a warning because of what it says and where it sits, not because it turned a colour.

Ground

#000000

The page, every panel, and the ground behind the mark. Never softened to a near-black. A near-black reads as a night with something lit behind it.

Ink

#FFFFFF

Every rule, every glyph, every fill. Never dimmed to carry hierarchy. That is what size and position are for.

The only permitted inversion is a solid white field carrying black type: a primary button, any control under hover or focus, and selected text. The only alpha in the system lives inside the unfold, on the shells it passes through, and it is spent on depth rather than hierarchy, never on text, a rule or an edge. The lattice, the one thing here that recedes, holds a flat #fff and thins instead. 21 : 1 is the contrast ratio that falls out of all of that.

The parts

05 / 14

Thirty and sixty, everywhere.

Both angles come off the mark. Every named part below is one of them applied to a different job, which is why the system holds together without a style guide policing it.

30 / 60 / 120 / 150
The four axes
30°
The cut
60°
The lattice
The cut30°
The bevel taken off a panel, top-left and bottom-right. The vertical drop is always the horizontal run times tan 30°, so the angle can never drift.
The lattice60°
A triangular grid on a 40px cell that reads the live page and bends around whatever it finds. It runs everywhere and is only drawn where someone is looking.
The four axes30 / 60 / 120 / 150
Every edge of the mark classifies onto one of these. They are the only directions any line in the system is allowed to take.
The hairline1px
Rules, borders, crop marks, the gauge tick. One weight, never thickened for emphasis. A heavier line is a different idea, not a louder one.
Tokens
TokenValueGoverns
--tan-300.5773502692The one constant every bevel is derived from
--cut-xclamp(26px, 2.6vw, 52px)Horizontal run of the cut
--cut-y--cut-x × --tan-30Vertical drop of the cut, never set by hand
--hairline1pxEvery rule, border and registration mark
CELL / ROW40px / 40 · sin 60°Lattice pitch
RADIUS / PULL420px / 26pxPointer reach, and how far a vertex may travel
BAND34pxClearance the lattice keeps from anything it finds

The mark

06 / 14

Nothing in it was chosen twice.

The mark is drawn in four moves, and after the first two there is almost nothing left to decide. Every angle it ends up with was already implied by the triangle it started as.

60°
01 / Triangle
30°
02 / Tail
√3 : 2
03 / Frame
15 EDGES
04 / Bolt
  1. 01

    The triangle

    Start with an equilateral triangle, apex up, side S. Its base angles are already 60°, so the first two edges of the mark are on-axis before anything else is decided.

  2. 02

    The tail

    Drop one vertex on the centre axis, exactly one third of the triangle’s height below its base. That single choice forces the two lower edges to 30°. The tail angle is not picked, it falls out.

  3. 03

    The frame

    The result is 0.75 triangle and 0.25 tail, so the height is S × 2 ÷ √3 and the box is exactly √3 : 2, width to height. The base line always sits at three quarters of the height.

  4. 04

    The bolt

    A lightning cut is taken through the body, every edge of it running along one of the four boundary edges offset inward by a whole number of bands. The finished outline has no angle, and no width, the triangle did not already imply.

The lines the cut turns on

The bolt is not drawn freehand inside the silhouette. Each of the four boundary edges is offset inward by whole multiples of one band width, and every edge of the finished outline runs along one of those twelve lines. That is what makes each stroke and each cut come out the same width, and it is what leaves the mark with no measurement in it that was taken by eye.

w
One band

The width every stroke and every cut in the mark is held to.

Twelve lines

Four families of three, one family square to each boundary edge.

The walk

Fifteen edges, each one running along a line from that set.

The bandw
One width, measured square off an edge. Every filled stroke in the mark is exactly this wide, and so is every cut between them, which is the whole reason the figure reads as one continuous ribbon rather than a drawing of one.
The families4 × 3
Each of the four boundary edges is offset inward by one, two and three bands. Twelve lines, and the outline is allowed to turn on those and on nothing else. Offset zero is the boundary itself.
The constraintX = (3 + 2√3) w
Two corners of the cut sit on the axis of symmetry, at 2w and 4w below the apex, where the lines one and two bands inside the triangle meet. Asking the third line to pass through the lower one leaves a single ratio between the side and the band. It is solved, not chosen.
What followsExact
At a side of 24 every vertex is a whole number plus a whole multiple of √3. The side has to be a multiple of six for that: the apex needs the two, the band needs the three.
Line set
EdgeAxisBands inMeasured from
e0150°0Tail, right
e160°1Apex, right
e2150°2Tail, right
e330°2Tail, left
e4120°2Apex, left
e5150°3Tail, right
e660°1Apex, right
e7120°1Apex, left
e830°1Tail, left
e9150°1Tail, right
e1060°2Apex, right
e11150°0Tail, right
e1230°0Tail, left
e13120°0Apex, left
e1460°0Apex, right

Every edge, on an axis

The finished outline has fifteen edges, and every one of them is exactly on an axis: the outline is not fitted to the grid, it is solved on it, from a single side length. The counts below are not balanced, and were never meant to be: the bolt cuts the tail’s lower-right edge in two, which is why 150° carries five.

30°
3
The tail’s lower-left edge, and the bolt’s two shallowest runs
60°
4
The triangle’s right edge, and three edges of the bolt
120°
3
The triangle’s left edge, the bolt’s longest inner run, and one return
150°
5
The tail’s lower-right edge, cut in two by the bolt, and three counter-runs
Inked / primary

The resting state, and the answer wherever a single static mark is needed.

Drawn / quiet

For large sizes and calm surfaces, and the first beat of every intro.

Cropped / 84%

Inside a circular crop the mark is held to 84% of the radius, so the unfold never touches the edge.

The unfold

The outline is classified into the four lattice directions, lifted into four dimensions, rotated there, and projected back down. That is why the mark can turn without ever spinning in the plane, and why every silhouette it passes through on the way is still built from 30° and 60° edges. Two arcs travelling the same way close a full turn, so a loop built that way has no seam.

Geometry
MeasureValueNote
Outline edges15Every one exactly on an axis, by construction rather than by fitting
Triangle sideX = 24The one number chosen; every other measure falls out of it
BandX (2√3 − 3) / 3One width for every stroke and every cut; 3.712813 at a side of 24
Bounding box√3 : 2Width is the triangle side, height is that times 1.1547
Perimeter2(1 + √3) XThe length the draw traces; 131.1384 at a side of 24
Base line0.75 HWhere the equilateral triangle closes and the tail begins
Tail drop0.25 HOne third of the triangle height, which is what makes it 30°
Module0.25 HThe tail drop, reused as the unit of clear space
Axis corners2w / 4wTwo corners of the cut sit on the centre line, which is what pins the band
Minimum sizes
ContextMinimumState
Favicon, chat avatar16 pxInked only
Profile avatar, app icon64 pxInked; the unfold from 128 px up
Drawn outline96 pxBelow this the hairline breaks up
Print12 mmInked, solid black or solid white

Spacing

07 / 14

One ramp, one module.

Distance in this system comes from two places and nowhere else: a spacing ramp that doubles every second step, and a module of clear space read straight off the mark.

The ramp

Steps alternate × 1.5 and × 1.333, which means the scale doubles every second stop. It is two interleaved octaves, 4 / 8 / 16 / 32 / 64 / 128 and 6 / 12 / 24 / 48 / 96, so any two adjacent steps are far enough apart to read as a decision. The bottom two stops exist because the ramp used to start at 8px, and everything finer than that had to invent a value: forty-two of them had, by the time anyone counted. The rules below are drawn at their true length.

--spacing-3xs
4 / 0.25rem
—
--spacing-2xs
6 / 0.375rem
× 1.5
--spacing-xs
8 / 0.5rem
× 1.333
--spacing-sm
12 / 0.75rem
× 1.5
--spacing-md
16 / 1rem
× 1.333
--spacing-lg
24 / 1.5rem
× 1.5
--spacing-xl
32 / 2rem
× 1.333
--spacing-2xl
48 / 3rem
× 1.5
--spacing-3xl
64 / 4rem
× 1.333
--spacing-4xl
96 / 6rem
× 1.5
--spacing-5xl
128 / 8rem
× 1.333

The travelling ramp

Almost no gap on this site is fixed. A flow step doubles, which is exactly two stops of the ramp, so both of its ends land on the ramp too: it holds the lower stop below 640px, grows across the band, and reaches the upper one at 1280px. Because the ramp is geometric and the band is the same for every step, the vw coefficients come out as the ramp over again: 1.875, 2.5, 3.75, 5, 7.5. Each rule below is drawn at the width its step is resolving to right now, so narrowing this window walks them down their span.

--flow-lg
12 → 24
A gap inside a row
--flow-xl
16 → 32
The plate gutter, and most padding
--flow-2xl
24 → 48
Between the cells of a grid
--flow-3xl
32 → 64
Between the columns of a section header
--flow-4xl
48 → 96
Above the first block on a page
M = H / 4
The module

One quarter of the mark’s height, the same drop the tail makes below the triangle’s base.

M
Clear space

One module on all four sides, measured off the mark’s own box, holding nothing but ground.

aerulionM
The lockup

One module from the mark to the first letter, and one module of ground around the pair.

The mark aloneM on all four sides
M is one quarter of the mark’s height, the same distance the tail drops below the base, so the rule can be read straight off the figure without a ruler.
Mark and wordmarkM between, M around
The gap from the mark to the first letter is one module, and the lockup then keeps a full module clear on every side of its combined box.
The wordmark aloneHalf its cap height
Without the mark there is no tail to measure, so the module becomes half the cap height of the setting, the nearest equivalent the letterforms offer.
Inside a circular crop84% of the radius
An avatar is cropped by the client, not by this system. The mark is held inside 84% of the crop radius so the unfold never touches the edge.

The plate

08 / 14

Rank runs backwards to measure.

There is one column, cropped by four rules pinned inside the viewport. Everything in that column is ranked by how short its line is: the title is the narrowest thing on the page and the small print is the widest.

The measure ladder

Five measures, and a block takes the one its rank calls for rather than the one its container happens to offer. A longer line is a quieter line, so the ladder does the work a second type size would do elsewhere. The rules below are drawn in proportion to the longest of them.

Section title
15 ch
Display, uppercase
Lede
52 ch
Under a title
Note
54 ch
Captions, part notes
Rule
68 ch
A law, a step
Prose
72 ch
Running copy

Where the plate changes its mind

Six widths, and no more. They are written as literals because a media query cannot read a custom property, which is the one place in this system a number is allowed to be loose in the stylesheet, so they are listed here instead. Nothing else may invent a seventh.

1799px
The gauge readout folds away; the tick keeps riding the rule
1100px
The hero and the timeline give up their widest arrangement
900px
Two-column blocks become one; the section header stacks
768px
Tracking tightens, the cut shortens, titles take their small clamp
640px
The gauge leaves; four-across becomes two
560px
Prose stops justifying; the last grids collapse
The column1600px
One column, centred, and no second one. Nothing on the page is positioned against anything else, so the reading order and the visual order can never come apart.
The gutterFluid
The only ground between the crop rules and the column. It scales with the viewport so the plate keeps its proportion rather than its pixel margin.
The cropFrame
Four rules pinned inside the viewport with an opaque margin behind them, so the page reads as a plate and nothing scrolls past the edge.
The bleedOpaque
A black margin painted behind the crop rules, so content is cut at the edge instead of fading out. It is the one element told to sit out of the lattice index rather than deflect it.
The railHeader
Eyebrow, hairline, count: the three-part rule that opens every section. The count is the station the gauge reports, so the page and the instrument always agree.
The gaugeReadout
A tick riding the right rule with the current station beside it. It reports scroll position as an instrument would, not as a progress bar.
The section line220px
A short rule closing each lede. It draws itself left to right on reveal, and it is the only decoration in the system that carries no information.
The stack8rem / 4rem
Sections are separated by the top of the ramp and their inner blocks by two steps down, so the gap between two sections can never be mistaken for a gap inside one.
Layers
TokenValueGoverns
--layer-field0The lattice, under everything it deflects around
--layer-page1The column and the footer
--layer-raised2A rail lifted clear of the panel it sits on
--layer-plate40The crop rules, the bleed and the gauge
--layer-entry60The skip link, which has to clear the plate
--layer-curtain90The routing curtain, over all of it
Plate
TokenValueGoverns
--plate-width1600pxThe widest the column is allowed to run
--plate-gutter--flow-xlGround held between the crop rules and the column
--plate-insetclamp(0.5rem, 1vw, 1.15rem)How far the plate sits inside the viewport
--gauge-insetclamp(3rem, 7vh, 5rem)Where the gauge starts and stops on the right rule

Filed under the same name

A name is only worth having if the code answers to it. Every part above is filed in the source under the name it carries here, so a thing can be found by the word used to ask for it. If a part cannot be named in this table, that is the first sign it does not belong to the system.

Filing
PartComponent or classModuleAttribute or token
Nyx MarkMark, MorphingMarkmark-geometry, mark-hull, morphing-markdata-morphing-mark
Nyx Rule——--hairline
Nyx Cut.panel-cut—--cut-x, --cut-y, --tan-30
Nyx LatticeLatticeFieldlattice-field, lattice-obstacles, distance-fielddata-collide
Nyx PlatePlate—--plate-width, --plate-gutter, --plate-inset
Nyx Gauge.gaugegaugedata-station
Nyx CurtainCurtaincurtaindata-curtain
Nyx GlyphGlyphglyphsGLYPH_BOX, GLYPH_CELL
Nyx Scale——--spacing-*, --flow-*

Icons

09 / 14

A glyph the field could have drawn.

An icon is not a second vocabulary bolted on beside the first. It is drawn on the lattice, at hairline weight, in the five directions this system already has. If a subject will not go on that grid, it does not get an icon.

48 / CELL 4
The grid
15 EDGES
On the grid
12 EDGES
A second glyph

The set

Seven so far, and the list grows only when something on the page needs one. Every arrowhead opens 30° each side of its shaft; the descent runs at 30° because that is the direction a block already travels when it reveals. There is no down arrow, because a vertical is not one of the five directions.

east
A link that leaves this page for another
west
The return to where the reader came from
descend
Down the page, on the same 30° the reveal travels
external
A link that opens somewhere this system does not control
copy
A value the reader can take, on the click-to-copy handles
check
The confirmation after taking one
node
A point on the lattice; a marker with nowhere else to go
The box48 units
Every glyph is drawn inside the same band, 4 to 44 across and 6.6795 to 41.3205 down, which is the bounding box of a lattice hexagon of radius 20. Two glyphs set side by side therefore share a top line and a bottom line without being told to.
The grid4 / 4 · sin 60°
The lattice again, at a tenth of the band. The band is ten cells across and ten rows down, and every corner of every glyph is one of its vertices, so a glyph is a thing the field could have drawn itself.
The directions0 / 30 / 60 / 120 / 150
The four axes plus the horizontal the plate already uses. There is no vertical: the mark has none either, and a glyph is drawn from the same vocabulary or it is not drawn.
The weight1px, non-scaling
A glyph at 200px carries the same line as one at 24px. Stroke width is pinned to the device, not to the box, so the hairline law survives scaling.
No fillOutline only
A glyph is an outline. The mark is the one figure in this system allowed to be solid, and an icon that fills itself starts competing with it.
No curveFive directions
No arc, no radius, no round terminal. If a subject cannot be built from five straight directions it is the wrong subject. That is a constraint on what gets drawn, not a licence to bend one.

Type

10 / 14

Four faces, one job each.

A face never takes another’s job. Headings are not set in Tektur, and a label is always mono, always uppercase, always tracked open.

Tektur

--font-family-accent

Wordmark

aerulion

700, set tight and always lowercase. Never used for headings or copy.

Chakra Petch

--font-family-display

Headings

Performance-focused plugins

600, uppercase, tracked slightly open. Also carries statistics and sub-heads.

Space Grotesk

--font-family

Copy

Professional Java development for custom Minecraft systems and long-term server architecture.

400 at 1rem, line height 1.6, measure held between 52 and 72 characters by rank.

IBM Plex Mono

--font-family-mono

Instrumentation

Node / 001 / Status / Active

400 at 0.6875rem, uppercase, tracked 0.2em. Tabular figures, so a rolling readout never reflows.

The scale

Eight fixed steps. Seven of them are the conventional text ladder, 11 and then even pixels from 12 to 24. The eighth is that ladder taken up one turn of the ramp, 24 × 1.5, for a statistic. Nothing larger is fixed: a heading is clamped against the viewport instead, so a title keeps its measure rather than its point size.

Scale
TokenValueGoverns
--label-size0.6875remEvery instrumentation label, at every size
--font-size-xs0.75remCode set in a table cell
--font-size-sm0.875remNotes, captions, table bodies
--font-size-base1remRunning copy
--font-size-lg1.125remA lede, at the top of its clamp
--font-size-xl1.25remA sub-head in the display face
--font-size-2xl1.5remThe standfirst
--font-size-3xl2.25remA statistic; the 2xl taken up one ramp turn (× 1.5)
--label-tracking0.2emTracking on every label; 0.16em below 768px

Motion

11 / 14

Motion is construction.

Things draw themselves, ink themselves and deflect. Nothing eases in from nowhere, nothing bounces, and the system has to be complete with all of it switched off.

Durations
TokenValueGoverns
--dur-xs250msA control inverting under hover, focus or selection
--dur-sm375msA stroke fading out from under the ink it was tracing
--dur-md500msThe curtain covering and lifting; a node arriving
--dur-lg750msA block revealing; a rule drawing itself across
--dur-xl1000msA figure tracing its own outline; the intro hold
The draw--ease-draw
A figure arrives as a stroke tracing its own outline. Nothing fades in from nowhere.
The ink sweep--ease-draw
A solid edge rises through the outline and fills it. The stroke is clipped to wherever the ink is not, so there is no rim and no gap.
The unfold4D rotation, projected
The mark is lifted into four dimensions along its four axes, turned there, and projected back, so it can rotate without ever spinning in the plane.
The curtain500ms hold / 500ms lift
A route waits behind the ground, then the ground lifts on a 30° edge. The first visit of a session gets the same figure as an intro; sessionStorage sees to it that no later visit does.
The roll950ms settle / 140ms stagger
A numeric readout lands digit by digit, each one scrambling through the ten glyphs until its own settle time. Only digits move; the slash between them never does.
The tick7s / steps(1)
The node marking the present on the timeline turns 60° and back, stepped rather than swept, so the square it draws is only ever square to the plate or on the lattice.
The invert--transition-base
A control under hover, focus or selection swaps its two inks. It is a state change and not a movement, so it takes the only linear timing in the system.
The reveal--ease-settle
One --reveal-shift of travel as a block enters. Under reduced motion it resolves instantly and the lattice never mounts at all.

Access

12 / 14

It has to work switched off.

Nothing here is a concession. Two inks is the highest contrast a screen can render, one column is a reading order that cannot come apart, and motion that is construction is motion nothing depends on. The system pays for its access by being what it is.

Contrast21 : 1
Law I is the accessibility story restated. #fff on #000 is the highest contrast a screen can render, and because nothing is ever dimmed to carry hierarchy, every glyph on the page has it.
Focus2px / 3px offset
The one place a rule is allowed to double. At 1px a focus ring would be indistinguishable from a border, so it is drawn at 2px and held 3px clear of whatever it is on.
Reduced motionEverything off
The lattice never mounts, the curtain never covers, readouts do not roll, and reveals resolve where they stand. Nothing in the system is only legible once it has moved.
No scriptDead man’s switch
A class is set before paint so reveal targets start hidden, and a 4s timeout takes it off again if a module fails to load. A page that never runs its JavaScript is still the finished page.
FiguresLabelled or hidden
Every construction drawing is an image with a sentence describing what it shows. Anything that carries no information (the lattice, the crop, the curtain) is hidden from the tree and never focusable.
EntrySkip link
The first focusable element on every page, set in the same mono label as everything else rather than smuggled in as a different language.

Misuse

13 / 14

12 ways out.

Each of these breaks a law, and each is the shortcut that gets reached for first. None of them are variations: a surface that does any of them is a surface in a different design language, and it should be given a different name.

  1. 01

    Not a grey

    A dimmed white is a half-drawn figure, and the system has no vocabulary for one. Where something must recede, thin it, space it further out, or take it away.

  2. 02

    Not a third angle

    45° is not a rounding of 30°. The only right angle in the system is where two rules of the plate meet; every other edge is 30, 60, 120 or 150.

  3. 03

    Not a spin

    Nothing sweeps through an in-plane rotation. If a figure has to change orientation it snaps between two on-axis ones, or it rotates its four-axis lift and projects back down, which is the whole reason the unfold exists.

  4. 04

    Not a thicker rule

    1px, at every size and every distance. A heavier line is a different idea, not a louder one. The focus ring is the single exception, and only because it has to be told apart from a border.

  5. 05

    Not a fill

    Surfaces belong to the mark, to a primary button, and to a control inverted under hover or focus. A card, a chip, a callout or a tinted panel is a different design language.

  6. 06

    Not a recolour

    Not for a season, not for a partner, not to mark a state. There is no palette to extend, and a coloured mark is not this mark.

  7. 07

    Not a stretch

    The box is √3 : 2 and it does not negotiate. Scale it, crop it, invert it. Never set its width and its height independently.

  8. 08

    Not a ring or a radius

    A circular crop belongs to the client, not to the mark. The mark is never given a ring, a backing panel, a shadow, a glow or a corner radius of its own.

  9. 09

    Not a wireframe at rest

    The shells the unfold passes through are frames of an animation, not a variant of the mark. A static mark is inked, or it is drawn as one closed outline.

  10. 10

    Not a stock icon

    A glyph pulled from an icon set arrives filled, curved and off-axis, and breaks three laws before it is even placed. Two of them sat on this site for a year. Draw it on the lattice or do without it.

  11. 11

    Not a capital A

    The wordmark is aerulion: lowercase, Tektur 700, set tight. Never title-cased, never letterspaced apart, never outlined, and never set in one of the other three faces.

  12. 12

    Not a photograph behind it

    The ground is #000, not “dark”. If the surface underneath is an image, a texture or a gradient, the mark does not go on it.

Applications

14 / 14

Off the site, same rules.

Every surface here is cropped by something the system does not control. One rule carries all of them: let every hairline bleed off an edge, so no crop can sever a frame.

Profile banner

600 × 240

A wide black banner: the lattice field on the left, the aerulion wordmark set large on the right
  • One word, set large. A client renders a banner small enough that anything else stops being readable.
  • The lattice warps around the wordmark and opens where the avatar lands.
  • Nothing is framed, so no crop can sever a corner, and type stays inside the middle 77% of the height.

Avatar

128 / 256 / 512

The mark unfolding through its four lattice axes, square, on black
  • Inked at rest. The wireframe is a passage through the unfold, never a resting state.
  • No ring and no rounded edge. A circular crop belongs to the client, not to the mark.
  • Held inside 84% of the crop radius so the unfold never clips.

Lockscreen

1290 × 2796

A phone wallpaper: the mark inked on black, its four outer edges carried on downward and off the sides of the screen
  • The mark inked, and nothing else drawn. No wordmark and no address, a wallpaper rather than an advert.
  • Its four outer edges are carried on past the figure and off the plate. The mark sets the angles; the ground only shows where they go, which is the whole system in one move.
  • They run downward alone, so the clock, the widget row and the two controls all sit on untouched ground. Every ray leaves by an edge, so the crop the phone applies can never sever a frame.

Desktop

1920 → 6016

A desktop wallpaper: the mark inked at the centre, its four outer edges carried on across the full width and off every side
  • The same move as the lockscreen, opened both ways. With no clock to keep clear the rays run in both directions, and the two shallow ones cross almost the whole width.
  • Everything is a share of the plate rather than a pixel count, so a 1080p screen and a Pro Display XDR get the same drawing rather than the same file scaled.
  • Six sizes, and the two MacBook Pro displays are drawn at their own 3456 × 2234 and 3024 × 1964 rather than cropped out of a 16 : 9 sheet.