Dialogs
Explore dialogs for confirming an action or editing a value. Each example shows the message, available actions, and how the dialog closes.
This page uses a saved copy of the design system, last changed on . It may differ from the current design source.
Scrim & frame — the shared recipe
Every overlay sits on the same scrim
Modals are the one place the system uses shadow. The recipe: a 50% black scrim (+1px blur) over the app, a frame of --tasty-bg-panel (or --tasty-surface-raised for the palette) with a 1px --tasty-border-strong edge and a soft drop shadow. Click-scrim or Esc dismisses.
The two anchor positions: centered (dialogs, settings) and top-aligned (command palette, ~40px from top). Nothing else.
Scope — a surface-bound popup dims its surface, not the window
A popup that declares surface scope is centered inside one surface, so its scrim covers that surface's rect and nothing else. Dimming the whole window says “the application is blocked” when only one pane is; the sidebar, titlebar, status bar, the divider and the adjacent surface stay at full ink and keep reading as live. Window-scope popups (command palette, settings, plugins, every centered confirm) keep the full-window scrim — the choice follows the popup's declared scope, not its shape.
The alpha does not change: one scrim value, two scopes. And the surface is still a centered, scrim-backed surface, so it keeps shadow-modal — narrowing the scrim does not make it a popover.
Don't read this as an input rule. The scrim marks what the popup belongs to; which input it swallows is the host's existing contract and is unchanged here.
Both split directions, a clamped popup, and a child picker
The boundary has to read in every arrangement. Side-by-side and stacked splits show the divider staying lit between a dimmed and an undimmed surface. In a narrow surface the popup clamps to the rect (it never grows past its surface, and focus is never moved to win space). When a child picker opens from the popup, the scrim is drawn once — the parent shell stays fully painted under the child, which sits above it with its own shadow. Two shells, one scrim, no accumulated darkness.
convert_surface and any other host popup bound to a surface gain this scrim (they have none today); host popups with no target binding stay on the window scrim. Child-lifetime and draft policy are the host's, unchanged by this visual rule.
Agent approval
Approval popup — the mauve gate
Shown when an agent requests a privileged or destructive action. The mauve agent accent in the header and tag makes it unmistakable. Show the exact command, the requesting plugin, the target surface ID, and the permission tags. Three responses: deny / allow once / always.