Introduction
A ledger, not a portfolio. The style is subtractive. Things were taken out until only the ones doing work were left, and the removal kept going further than most designers are comfortable with.
This page is not linked from anywhere on the site and asks not to be indexed. It reads ../css/styles.css directly, so every value below is the value the portfolio is actually using right now.
The style
Five decisions, and every one of them is a thing taken away rather than added. Any of them alone would read as austerity; together they are the design, and removing one leaves the others looking accidental rather than chosen.
What survives the subtraction is a list, a hairline and one gesture. Everything further down this page is a consequence of keeping only those.
Where this is easy to get wrong. The same discipline fails in three predictable places, all one degree past the line rather than a different mistake each time. Grey text drifts below 4.5:1 and stops being readable in daylight. The one interactive mark gets quietened until nobody can see there is anything to press. And with no size above the body copy, nothing anchors a page. The system answers each once: Ink Muted for text, two legal greys for icons, one display line per page.
Principles
Six, each with a test you can fail. A principle that cannot be failed is decoration. "Be simple" settles no argument at 4pm on a Friday.
Hierarchy is carried by weight and colour, never by scale. This is the hardest rule to keep. Every new page will try to introduce a second size.
Test. Reaching for a new font size means you have not decided what matters. Change the weight or the colour instead.
Structure comes from hairlines and space. No cards, no radii, no shadows, no filled panels. A list reads as a ledger, not a stack of objects.
Test. If a group only holds together inside a container, the spacing is wrong. Fix the spacing; delete the container.
The interface is greyscale so the screenshots can be the only colour. Project images run the full width of their column, unframed and uncropped.
Test. Squint at the page. If anything other than the work catches your eye first, remove it.
No element repeats what is already on screen. No decorative icon beside a label that already says the word. No count restating a list you can see.
Test. Delete it. If nothing is lost, it stays deleted.
A single interaction: a row opens. Marked the same way every time: a chevron, right-aligned, rotating on open. Anything that does not open does not get a chevron.
Test. Without hovering anything, can a stranger tell what is clickable? If the mark is below 3:1, they cannot.
Restraint is a compositional choice, not a licence to drop contrast. Reduce the amount of text before you reduce its contrast.
Test. Every text colour clears 4.5:1 on the paper behind it. Every icon that carries meaning clears 3:1. No exceptions for elegance.
Colour
Six greys and a paper, in two schemes. Each token has exactly one job, written once. The job is the same in both schemes and only the value moves, so nothing below is a second palette. No value appears twice under a different name.
Dark is the same design the other way up. Paper and Ink swap ends and every other grey is the value that holds its light ratio against the new paper, so the ladder reads 9.4, 5.6 and 3.4 either way and no rule about which grey may carry text changes between them. Ink is the one deliberate difference. It eases off pure white, because 300-weight type on near-black blooms.
Both columns are read out of the stylesheet itself, each ratio measured against its own scheme's paper. The device picks which scheme you are in; that one is inked below and the other recedes.
The threshold depends on the job. Text clears 4.5:1, an interface mark clears 3:1, and a surface is not measured against itself.
Selected text is the palette turned over: paper type on ink ground. Without saying so, the one hue the site could ever show would be the browser's selection blue.
Type
One typeface and one reading size. Inter, with system-ui behind it, loaded in weights 300 to 500. The system has no use for anything heavier, so b and strong are brought back to 500 rather than left at the browser's 700.
Three roles at that one size, plus the display line. Weight and grey carry every distinction: nothing is set in capitals, nothing is letter-spaced, and meta that needs to recede goes to Ink Muted rather than to a smaller size.
Space, line and measure
One base unit of 5px and eight steps off it. Every padding, margin and gap is one of these values. Widths, measures and touch targets are sized by what they hold, not by the ramp.
Layout
A page is a stack of bands, and a band is one idea. Nothing else decides page structure. There is no template, no hero, no sidebar that some pages have and others don't.
A band lays out on twelve columns with one gutter. Twelve because it divides by two, three, four and six, which is every split this site has needed. Five spans are legal and no others, so a column is always a share of the page rather than a width somebody picked, and two pages built a year apart still line up.
Below 1100px the columns collapse and a band's children stack in source order, the same width the drawer changes shape at. Write the source in reading order and the phone is already handled.
Pages
The architecture above the bands. Every page on the site is assembled the same way, from the same three things in the same order: the trail, then bands, then nothing. A new page is not designed so much as declared.
Components
The whole inventory, and it should stay close to it. A system this quiet earns its consistency by having almost nothing to be inconsistent about. Every specimen below is the site's own markup and classes.
Carl Ejlers CV
-
Donkey Republic
Bike Rental Platform
-
Hover
The fill changes, nothing moves
-
Open
Chevron rotates, drawer unfolds below
Do and don't
The ways this system breaks. Each right-hand example is a real temptation. Most are what a component library hands you by default.
Motion
Motion is the only part of the system that can explain a change while it is happening, so it is spent on two things. Interaction, where it describes the change the person caused. And the arrival: once per visit, a page develops. The ink settles from the muted grey, the index's terms take their weight with it on the font's variable axis, the hairlines draw left to right, and the portrait and the marks come up from grey. The page never moves while it happens: layout is set from the first frame, and what arrives is ink and line.
Two easing keywords, no custom curves. Things arriving use ease-out; things leaving use ease-in and run shorter, because nobody watches something go. Under prefers-reduced-motion every duration above drops to 0ms. Nothing is removed; it simply arrives already done.
Buttons
Buttons are where a system this quiet is most likely to break, because a button is the one element meant to be louder than its surroundings. So the shape is fixed and only the fill changes: one box, 1.5px border, no radius, label at 16px weight 500.
Icons
Seven glyphs, all descended from the chevron: a 20px box, a 14px live area inset 3px, a 1.5px stroke, round cap and join, no fill. Line ends are round; shapes are not. No rounded rectangles anywhere.
How this stays true
A design system kept in a separate document drifts, because nothing stops it. This one is built so the parts that can drift, can't.