About this site

Two experiments with one rule: no JavaScript. A garden of outfits for one document, and a cabinet of things CSS isn’t supposed to do.

The garden, and where the idea came from

In 2003 Dave Shea started the CSS Zen Garden: one HTML file, and anyone could send in a stylesheet for it. It showed a generation of designers that the markup and the look could be separated, and that the look could be almost anything. It is still up, and still worth an afternoon.

This garden borrows the idea and nothing else. The document is our own, the Slopwright’s workshop manual; none of the Zen Garden’s HTML, words, ids or designs are used. All 34 outfits were designed by machine, for the Slopwright, and say so.

Ten of the outfits are places rather than page styles: the manual staged in a theatre whose curtains open as you scroll, a dive through the sardine tin, a lift through the Backrooms, a corridor, a pop-up book, a workbench in 3D, a day passing at the window. They use scroll-driven animations, view timelines, 3D transforms and animated @property values, all behind @supports: where a browser lacks one, the scene stands still in a finished state, and the text reads the same. Everything that moves stops when you ask for reduced motion. Moving from one outfit to another is a cross-document view transition where the browser has them; elsewhere it is an ordinary page load. The table below says which browsers did what when we checked.

Every outfit lives at its own address, /t/<name>/. Those pages are written by a build script from one source file, and are identical byte for byte except for the one <link rel="stylesheet">. The site’s check proves it on every run, along with no sideways scrolling on a phone and measured text contrast for every outfit. Try them on switches outfits in a frame, with links that target it.

Is CSS Turing complete?

Not on its own, and the honest answer takes three sentences.

Rule 110 is Turing complete. It is a one-dimensional cellular automaton: a row of cells, each on or off, where each cell’s next state depends only on itself and its two neighbours. Matthew Cook proved that, given an infinite row and a suitable repeating background pattern, it can simulate any computation.

HTML and CSS can compute one step of it. With checkboxes for cells and :has() for the rule, CSS works out which cells of the next row should be on. Our Rule 110 does exactly that, and the check compares every generation with a reference computed in JavaScript, inside the test only. A well-known earlier demonstration, by Eli Fox-Epstein, built Rule 110 from HTML and CSS; this one is our own build of the idea.

But CSS doesn’t loop. A selector can’t make a checkbox checked. Someone has to press a key or click for every cell that turns on, so a person (or a keyboard) is the clock. And the row here is sixteen cells wide, not infinite, so strictly it is a finite machine, like every real computer. So: CSS plus HTML plus a patient human is Turing complete in the same sense Rule 110 is. CSS alone computes one step and waits.

Browser support

Some exhibits use features that are new. Each one is behind @supports with a fallback that still works, or says plainly that it doesn’t. The second column is your browser, worked out by CSS as you read this. The third is what the site’s check found in real browsers on 2026-10-14.

FeatureThis browserCheckedWithout itUsed by
:checked + ~YesNoChromium 149: yes
Firefox 141: yes
Nothing to fall back from; every browser has had it for years.Tabs, from radio buttons, Noughts and crosses, A slideshow that plays itself, The lamp, drawn, Rule 110
:targetYesNoChromium 149: yes
Firefox 141: yes
Universal.A modal with no script, The stockroom maze
:has()YesNoChromium 149: yes
Firefox 141: yes
Without :has() it can’t work; the page says so instead of half-working.Tooltips that know where they are, The big light, A form that tells you off, politely, Keeping score, A four-bit adder, Noughts and crosses, The stockroom maze, A slideshow that plays itself, Lamplight (outfit)
<details name>CSS can’t test thisChromium 149: yes
Firefox 141: yes
The drawers still open and close; more than one can be open at once.One drawer at a time
popoverYesNoChromium 149: yes
Firefox 141: yes
The :target version below works everywhere.A modal with no script
anchor positioningYesNoChromium 149: yes
Firefox 141: no
The tip sits above the whole passage, positioned the old way, instead of beside its word.Tooltips that know where they are
scroll-snapYesNoChromium 149: yes
Firefox 141: yes
Universal.A carousel on rails
::scroll-markerYesNoChromium 149: yes
Firefox 141: no
Plain links to each slide do the same job.A carousel on rails
scroll-driven animationsYesNoChromium 149: yes
Firefox 141: no
No bar; a line says it isn’t available. Nothing else depends on it.Reading progress, Into the tin (outfit), Going down (outfit), The long corridor (outfit), Canopy (outfit)
@propertyCSS can’t test thisChromium 149: yes
Firefox 141: yes
Typed values can’t animate: the hands jump instead of turning, and the numbers don’t count.Reading progress, A clock that can’t tell the time, Into the tin (outfit), A day at the bench (outfit), Weather in a teacup (outfit)
:user-invalidYesNoChromium 149: yes
Firefox 141: yes
Errors show only when you send the form, from the browser’s own validation.A form that tells you off, politely
CSS countersYesNoChromium 149: yes
Firefox 141: yes
Universal.A form that tells you off, politely, Keeping score, A four-bit adder, A clock that can’t tell the time, Going down (outfit)
3D transformsYesNoChromium 149: yes
Firefox 141: yes
Universal.Depth, On the bench (outfit), The long corridor (outfit), Pop-up book (outfit)
container queriesYesNoChromium 149: yes
Firefox 141: yes
The layout follows the window instead of its box.Outfits
view() timelinesYesNoChromium 149: yes
Firefox 141: no
The scene starts in its finished state (curtains open, pages up) and stays there.Curtain up (outfit), Pop-up book (outfit)
cross-document view transitionsCSS can’t test thisChromium 149: yes
Firefox 141: no
Going from one outfit to the next is an ordinary page load, with no animation.Curtain up (outfit), Into the tin (outfit), Going down (outfit), On the bench (outfit), The long corridor (outfit), Pop-up book (outfit), A day at the bench (outfit), Lamplight (outfit), Canopy (outfit), Weather in a teacup (outfit)
conic and radial gradientsYesNoChromium 149: yes
Firefox 141: yes
Universal.The lamp, drawn, Lamplight (outfit), Canopy (outfit), Weather in a teacup (outfit)

Who made it

A machine, for the Slopwright, like everything else on slopped.site. The rule of no JavaScript is checked, not promised: every exhibit is tested with JavaScript switched off, and the build refuses any page with a script or an inline handler. The one page that isn’t this site’s own is the not-found page, which every slopped.site shares and which does run a little script.

Without a script, some things are out of reach: this site can’t be installed as an app, can’t remember your choices between pages, and the outfit switcher can’t tell which outfit its frame is showing.

Slop at the top