Tripbooks design system / lab 15 / the overlay layer

Lab 15 / four surfaces, one idea

Say what will happen, before it happens.

Overlays are where a design system usually goes soft. Four things get built that look alike, nobody can say which is which, and within a year there is a fifth. So this lab settles the boundary first and the appearance second.

All four share the principle already running through the platform. The command bar echoes its parse. The form counts its outstanding conditions. The gate states its headroom. An overlay does the same: it shows the consequence of the decision while the decision is still reversible. A dialog shows what will change, a confirm shows what will be lost, a toast shows what happened and offers the way back.

01 / the boundary

Four questions, in order. The first yes wins.

SurfaceThe questionBehaviourExamples
ToastHas it already happened?no block · 5s · undoPayment recorded, item issued, view saved, export started, row archived.
ConfirmIs it irreversible?blocks · names the lossCancel a booking, archive a customer, revoke a credit release, delete a draft.
DialogIs it one decision?blocks · 520pxRecord a payment, clear an undercut, request a release, add a reminder, grant access.
SheetIs it editing part of what is behind it?no block · 436px · from the rightBilling identity, an address, a bank account, a contact, a licence.
The test that keeps them apart

A dialog blocks because it asks a question with consequences, and answering it while scrolling something else is how a wrong number gets entered. A sheet does not block because the record behind it is the reference material: somebody editing a billing address is reading the rest of the profile while they do it. If a surface would be better if you could still see what is behind it, it is a sheet. If it would be worse, it is a dialog.

And a fifth that already exists

Popovers, from Lab 05: the filter, views and columns menus. They are anchored to their trigger, dismiss on any outside click, and never carry a decision with money in it. Nothing new here, but naming them stops somebody reaching for a dialog to hold a tick list.

02 / dialog

It shows what it is about to do to the gate.

Recording a payment is the most common money action on the platform, and until now the person doing it had to know the gate arithmetic in their head. The consequence band recomputes live as the amount changes, so the decision is made looking at its own result.

Record a payment

BKG-7QP2K4M9 · Marchetti Group
AmountUSD 40,000.00
Received on20 Aug 2026
MethodBank transfer
IntoNorthline Travel LLC · Operating USD · ****4417
Allocate toOldest firstDepositPick lines
What this does
Headroom $1,600.00 $41,600.00 Gate opens
The next item costs $18,900.00, so it can issue after this.
Invoice INV-2026-118 moves to partially paid, $36,300.00 still due on 01 Sep.
Cancel Record payment
Three things in that band that are not decoration

The hatched green segment is the payment being added, drawn on the same meter the booking page shows, so it is the same picture in both places. The struck-through $1,600.00 is the value that is about to stop being true, which is the cheapest possible way to say "this is a change and here is what it was". And the sentence about the next item is the only one a person actually needs, because "can I issue the flight now" is the reason they are recording the payment at all.

03 / sheet

The record stays readable behind it.

436 pixels, from the right, at the panel duration of 180ms. It never dims the page, because dimming would defeat the reason it is a sheet. It edits one section and it says which section in its title, so a sheet is never a second form page in disguise.

Still readable
Marchetti Group
CCN-1055 · Corporate · Italy
Billing currency · USD
Credit terms · 30 days
Outstanding · $76,300.00
Tax registration · IT04729310968

Billing identity

CCN-1055
Registered name
Marchetti Group S.p.A.
This appears on every invoice. It must match the tax registration.
Legal form
S.p.A.
Country
Italy
Tax registration
IT04729310968
Italian VAT, 11 digits after the country code. Checked for format only.
Billing currency
USD
Locked, this account has invoices raised.
Credit terms
30 days
Invoice email
finance@marchettigroup.it
Discard Save billing identity
Why the currency is locked and says so in the sheet

The field is dashed and dimmed with its reason underneath, using the disabled treatment from Lab 08 rather than a new one. A sheet is where a person discovers what they may not change, and the discovery has to happen in the sheet rather than after pressing save, because a save that fails on a rule nobody mentioned is the most annoying event in software.

04 / confirm

It shows the loss, computed, before the word yes.

A confirm is not a dialog with a scary colour. It is the surface for something that cannot be undone, and its job is to replace the word "sure?" with an arithmetic. Cancelling this booking costs a real number, and the person clicking should see that number rather than be asked to be brave.

Cancel this booking

BKG-7QP2K4M9
Six items are already issued. Cancelling applies each supplier's policy as it stands today, raises a credit note, and cannot be reversed. The booking becomes history.
Sold to the customer$196,300.00
Supplier penalties, six issued items−$71,420.00
Agency cancellation fee, per your terms−$4,000.00
Confirmed waivers, Park Hyatt Kyoto+$9,160.00
Refund to the customer$129,880.00
Already paid by the customer$120,000.00
Customer still owes$9,880.00
Type BKG-7QP2K4M9 to confirm
BKG-7QP2K4M9|
Keep the booking Cancel booking and raise the credit note
Typing the reference is reserved, and this is the whole list

Cancel a booking, archive a customer with live trips, revoke a credit release, and delete a tenant. Four actions. Everywhere else a confirm is one button, because typing a reference for something recoverable trains people to type references without reading, which destroys the protection on the four that need it.

The destructive button is red and it is the only red button on the platform

Every other primary action is solid ink. Red is spent here and on the exposure tick and on a margin below its floor, and nowhere else, so the three times it appears it still means something.

05 / toast

What happened, and the way back.

Bottom left, above the pager, clear of the primary action which lives top right and clear of the right rail. Five seconds, one line, and an Undo whenever an undo genuinely exists. When it does not, the toast says what to do instead rather than offering a button that lies.

Done, and reversible

the register, still usable behind it
Payment recorded. $40,000.00 into Operating USD. BKG-7QP2K4M9 Undo

Done, and not reversible, so it does not pretend

the booking, still usable behind it
4 tickets issued. Vouchers released to the travel pack. ITM-2K9DQ4XW View

Failed, so it stays until dismissed

nothing changed
The supplier refused the release. The fare was repriced at $41,220.00 while the request was open. Review the drift

The laws

O1Four surfaces, and the first yes wins

Already happened is a toast, irreversible is a confirm, one decision is a dialog, editing a section behind it is a sheet. A fifth surface is a design failure, not a new requirement.

O2Every overlay states its consequence

A dialog shows what will change, computed live. A confirm shows what will be lost, in money. A toast shows what happened and where. None of them asks a person to guess.

O3A sheet never dims the page

The record behind it is why it is a sheet. Dimming it turns a sheet into a badly placed dialog.

O4Undo only when undo exists

An Undo button that opens a support ticket is worse than no button. Where the action cannot be reversed the toast offers the place to look instead.

O5A failure toast does not expire

Success fades after five seconds because the change is visible on the page behind it. A failure has nothing behind it to see, so it waits to be read and dismissed.

O6Escape always closes, and nothing closes on an outside click except a popover

A half-typed payment amount must survive a stray click on the page behind it. Popovers are the exception because they hold no input worth losing.

Two, then the marketplace composer

Both are about how much friction is right.

  1. Typing the reference on four actions only. Cancel a booking, archive a customer with live trips, revoke a credit release, delete a tenant. If the list grows the protection weakens, because people learn to type references without reading. If you want a fifth, tell me which and I would want to drop one.
  2. Five seconds on a success toast, and never on a failure. Five is long enough to read one line and short enough not to sit in the way. The alternative some teams prefer is that everything waits to be dismissed, which is safer and, on a screen somebody uses for nine hours, considerably more annoying.