Action bar

A pattern, the fourth rung. One or two actions held at the foot of a column. 3 placements on 3 painted screens, which is the threshold exactly, and until 2026-08-08 those three wore three different faces, none of them the one the pattern declared. It is one face now, and a component was deleted to get there. Measured 2026-08-08 in a browser, at 390 and 1280.

3 placements a pattern by one screen 3 faces to 1 1 component deleted 6 buttons

A pattern by one screen, and the count is said out loud

The rule is three screens or more: two is a candidate and stays markup. This clears it exactly, and its own file says so rather than rounding up: it is a pattern by one screen. The shelf and the reason stay on the patterns page.

This page absorbed account on 2026-08-08, which had its own stylesheet, its own row on the molecule shelf and its own page here. Section 3 is why.

THREE PLACEMENTS, THREE FACES, AND THE DECLARED ONE WAS WORN BY NOBODY

facewornpositionsurfaceat 390at 1280
the declared bar0stickythe stonenowhere
.static1, the walletstaticthe stone293x72911x72
.flat2, how-it-works and my-profilestaticnone259x55 and 293x55877x55 and 911x55

Every placement overrode the position the pattern declared, one by saying static and two by saying flat. So position:sticky was a default that had never once applied, and the 17px between 72 and 55 was the surface two of the three took away.

A modifier worn by more placements than the default is not a modifier. Two class names existed to undo one declaration each, and between them they covered every placement in the product. The thing being modified was the thing nobody used.

Why the stone went instead of spreading, and what that cost

The row asked a fair question: either the plate is the face and two screens are wrong, or the flat row is the face and the plate is the variant. What answered it was the shape of the stone rather than the count.

The stone is not decoration, it is what a bar needs when it FLOATS. A ground and a top edge separate it from the content scrolling underneath, and the rule said so itself: border-radius on the top two corners only and a border on the top side only. That is an open-bottomed dock. Nothing in this product docks, so on the wallet it was a dock shape sitting in the middle of a column with its bottom cut off, under a card and above a line of small print.

Spreading it to the other two would have meant redrawing it, because the same open bottom would have been wrong in the same way twice more. A face whose reason has gone is not a variant, it is a leftover.

So the bar is one face: static, no stone, padding above and nothing else. .flat and .static are gone, and with them components/account.css, whose entire content was the stone and the three declarations that removed it again. A component with no face left is not a component with a small stylesheet, it is a name, so the file, its import, its shelf section and its page here went together and the kit moved from 55 pages to 54.

And the cost is named rather than hidden: there is no sticky action bar in the system any more. The day a screen needs one it will be designed rather than inherited, and it will need the stone back with it, because the two were always one decision. A capability nothing used, against a default nobody wore.

The bar

Vault, darkDaylight, light
at 390at 1280
the bar, all three placements259x55 and 293x55877x55 and 911x55
a button in it113 to 156 wide, 47 tall422 to 465 wide, 47 tall

The arrangement is four declarations and one of them is written twice, once for an anchor child and once for a bare one, because the bar has each about as often. The second is a CHILD selector where the first is not: a button nested inside an anchor is not a flex item of this bar, so flex:1 on it would mean nothing.

Eight rules left before the stone did, and they left because they were the button family

Until 2026-08-03 account.css drew the buttons in this bar: the quiet rest, the brass first child, both hovers and both presses. They are in button now, because they were the family: the same control ground, the same 1px hairline, the same primary ink and the same 10 corner that three other one-off button classes each declared separately, plus the one hover the majority already had right.

The markup here is a bare <button> with no class, so the class map could not see the divergence either. A person assembling an action bar was hitting a button rule the button page had never heard of, and there was no reading anywhere in the repository that would have shown it.

That cut declared an exception, and the exception has now dissolved. The rule was: composition comes to the pattern, the page's plate goes to the frame, and the component keeps its own paint. The bar was the one place a third box was needed, because a stone with a hairline and two corners is neither composition nor a page plate. With the stone deleted there is no paint left to except, and one file holds the whole of the bar.

A level is a reading, and this one was taken and then spent

account stood on none of the five anchor screens the kit was rebuilt from, so ui-kit/docs/inventory.md filed it as outside the core, unmeasured and refused to give it a level. That was not laziness: the level formula answers "1" for a component built out of its own class names, and it answers "1" for a component nobody has read at all, so a level printed without a reading is a guess wearing a declaration's clothes.

It was walked on 2026-08-08, declared level 2, and deleted the same day, and both halves came out of the same act. Reading it on rendered screens is what showed it held six buttons; reading it on rendered screens is what showed its own face stood once in the whole product and was a dock shape nowhere near a dock. The reading that gives a component its level is the reading that can take it away.

The rule

A pattern says where things stand and never what they look like. Four declarations, and not one of them is a colour, a face, a border or a surface.

Three screens, counted, and the count is written down. A pattern that clears the threshold by one screen says so, because the day a screen changes it is a candidate again.

A surface belongs to the behaviour that needs it. A stone under a bar is an answer to floating. Take the floating away and the stone is not a style choice left over, it is an answer to a question nobody is asking.

The anti-rule

Never let a pattern declare a default nothing wears. Sticky was overridden by all three placements and read as the intended behaviour to everyone who opened the file.

Never keep a component alive for a face nothing wears. Two rules, one of them the negation of the other, plus a shelf row, a page and an import. The face was the component, so when the face went there was nothing underneath it.

Never let a bar draw a button. Eight rules did, on a bare element with no class, which is the version of the defect no class map can find.

Never print a level for something nobody has rendered. The formula answers 1 for an atom and 1 for an unread file, and the two are indistinguishable in the output.

Where the rest of it is

The shelf: the patterns page. The stylesheet, and now the whole of the bar: components/patterns/action-bar.css. The controls in it: button. Why the stone and the component went: docs/decisions.md, 2026-08-08, backlog 63 closed.