Organism

Z6, the notices

Node 8.4, the notice stack. 2 instances across 2 screens, and the whole zone was specified in prose and drawn nowhere until stage 07 step 9 read the stage contract as a checklist. Three notices were marked MVP and not one of them existed.

It never covers the pane. Bottom left, --width-toast at 400px, and design principle 5 forbids an overlay that hides the evidence the analyst is deciding on. A notice stack is the component most likely to break that rule, which is why the position is written into the component rather than left to whoever places one.

The cap is one at 360 and three at the desk, and drawing it is what settled that. Measured: three notices took 408 of 760 pixels at 360, so the notice layer covered more of the phone than the case did. Node 8.4 makes the cap a layout decision and the persistence a compliance one, so the cap may differ per width and the persistence may not. The one that stays is the failure, because it is the one that cannot be dismissed; with no failure present the newest stays.

Anatomy

What the bench is standing in. A 300px box with position:relative, which is z45: the split declares that one property so the stack sits inside the console rather than on the viewport. The bench also carries a transform, because at 900px and below Z6 becomes position:fixed, and without a transformed ancestor four copies of this page’s stack would pin themselves to the bottom of your screen instead of to their own bench.

dark, shipped

the console, uncovered

STATUSReconnected. 3 cases replayed. They arrived while the connection was down and are in the list now, in their place.

×

light, the pair

the console, uncovered

STATUSReconnected. 3 cases replayed. They arrived while the connection was down and are in the list now, in their place.

×

Behaviour at width

Below 1280, the system's one point (Width), the stack leaves the console and takes the bottom edge of the viewport: position:fixed, full width, a ground and a top rule of its own, and bottom padding that adds env(safe-area-inset-bottom). There is no z45 box to hang off at that width because the layout is a block, and this is the one place in the product a stack is fixed to the viewport. The cap changes with it, from three to one: three notices took 408 of 760 pixels at 360, so the notice layer covered more of the phone than the case did. The one that stays is the failure, because it is the one that cannot be dismissed, and with no failure present the newest stays. Above the point the stack is absolute inside the split, --width-toast wide, and it never covers the pane.

Variants

AxisValueUsesThe rule
noneno values2Both instances are the same stack. What differs between them is how many notices are in it, and a count is not a variant
positionno values–Prohibited, and this is the one that matters. There is no top right stack and no centred one. Bottom left is the corner furthest from the pane, and a stack that could be moved would eventually be moved onto the evidence
emphasisno values–It belongs to the notice rather than the stack. toast--alert is where the difference between something that finished and something that failed is drawn

When to use it

Once per screen, and only on a screen that has something to say as a result of what the analyst just did. It is not a place to put the state of the screen, and it is not a place to put the state of the connection: those are banner and z2.

Where she meets it. Rarely, and at the worst moments. The alert form exists for one situation, a verdict that did not write, and on a phone at 03:00 it is the only notice she will see: everything else is suppressed underneath it. That is the cap doing its job rather than a notice being lost.

Rule and anti-rule

Do

the evidence, still readable

Bottom left, inside the console, above nothing. The case she is ruling on stays in view while the notice tells her the ruling has not landed.

Do not

the evidence, now covered

The verdict did not write

OK

Never as a modal. That is dialog, and a dialog is for a decision that needs an answer before anything else happens. A failed write needs to be seen and does not need an answer, and a dialog would take the evidence off the screen to say so.

Limits

Rules of composition and context, which no anti-rule can carry: nothing else is the right component to take, and what is wrong is the count or the neighbour. Counted on the grey corpus at stage 09, and every one of them is a function in design/kit/checks/rules.mjs. Full table with sources on Architecture.

States

The stack has none. The toasts inside it carry theirs. What the stack does have is a second rendering, and it is a layout rule rather than a state: narrow the window past 900px and the stack goes from absolute to fixed, and from three notices to one.

dark, shipped

the console, uncovered

STATUSD. Okonkwo has C-4417 open. Nothing is locked, and the log records both if you both file.

×

STATUSReconnected. 3 cases replayed. They are in the list now, in their place.

×

light, the pair

the console, uncovered

STATUSD. Okonkwo has C-4417 open. Nothing is locked, and the log records both if you both file.

×

STATUSReconnected. 3 cases replayed. They are in the list now, in their place.

×

Three notices go in and one comes out, and the CSS does the choosing. .z6:has(.toast--alert) .toast:not(.toast--alert) hides everything that is not the failure; with no failure present, :not(:last-of-type) hides everything but the newest. No script decides which notice survives, which is why the rule cannot drift from the one written in node 8.4.

At 360 it is the one place in the product a stack is fixed to the viewport. There is no z45 box to hang off at that width, because the layout is block. It still never covers the pane, because at 360 there is no pane. The bottom padding carries env(safe-area-inset-bottom), so the last line clears the home indicator rather than sitting under it.

What it reads, and where it stands

RoleSurfaceWhere on the componentDarkLight
--bg-pagefillthe bar behind the stack, and only at 360 where it is fixed
--line-edgeline, exemptthe line above that bar, through --rule-edge
--width-toaststructurethe width of the stack at the desk
--zone-notice-clearstructurewhat z45 ends above so the last row is not underneath the stack

The stack itself paints no ink. Every colour a reader sees in it belongs to toast, which is the component the readout for those values lives on.

Copy this

<div class="z6" aria-label="Notices"> <div class="toast" role="status">…</div> <div class="toast toast--alert" role="alert">…</div> </div> <!-- it goes inside .z45, which is position:relative, and nowhere else -->

Where it stands