SDL · Draft 1.0 · February 2026

Shell Design Language

A visual reference for the structural architecture of application interfaces

Region Type Legend

Every region in an SDL diagram uses a consistent colour and border

Chrome
Anchor
Viewport
Panel
Modal Overlay
Anchored Overlay
CHROME outermost container overflow: hidden ANCHOR fixed dimension sidebar, header, footer VIEWPORT flex, owns scroll content lives here PANEL dynamically injected compresses Viewports MODAL OVERLAY floats above layout blocks interaction ANCHORED OVERLAY floats above layout tied to trigger element

Fig 1 — The six region types of the Shell Design Language


Claude Desktop — Annotated

A real application described in SDL terms

Every region is labelled with its SDL type, its name in this application, and its key behaviours. Dashed lines connect regions to their annotations.

ANCHOR HEADER workspace switcher Conversation 1 Conversation 2 Conversation 3 Conversation 4 Conversation 5 Conversation 6 Conversation 7 Conversation 8 Conversation 9 ⟵ body scrolls independently ⟶ ANCHOR FOOTER + Invite Team Members U User Profile ↑ ANCHORED OVERLAY preferred dir: Up Account settings Help & Support Chat Cowork Code CONTROLLER drives Viewport ↓ User message Claude response... ...continues here Another user message A longer Claude response that spans multiple lines of text ...still going Type a message... VIEWPORT — Staged Mode, owned scroll CHROME Chrome — full viewport overflow: hidden ANCHORED OVERLAY drop-up, content-initiated does not shift layout Header zone Body zone Footer zone ANCHOR — SIDEBAR Leading, collapsible Breakpoint: Lift ANCHOR — HEADER Top, fixed height Controller of main Viewport VIEWPORT Staged: Chat/Cowork/Code Owned scroll per stage ANCHOR FOOTER User Profile → Anchored Overlay Invite → Modal Overlay

Fig 2 — Claude Desktop annotated with SDL region types, zone labels, and behaviours


Claude Desktop — With Artifact Panel

Content-initiated Panel injection compresses the main Viewport

When the user writes code or markdown, a Trailing Panel is injected into the layout. Unlike an Overlay, the Panel participates in the layout — it compresses the Viewport horizontally.

sidebar Chat Cowork Code User writes code block... Here's that Python function: def calculate(x, y): return x + y Type a message... ← compressed → PANEL — TRAILING content-initiated · compresses Viewport ▶ Preview def calculate(x, y): return x + y calculate(3, 4) → 7 Viewport — compressed by Panel injection Panel — Trailing, content-initiated trigger Viewport narrows — Panel shares layout space Panel occupies this space

Fig 3 — Panel injection: the Trailing Panel compresses the main Viewport. Compare with Fig 2 where no Panel is present.


Named Compositions

Six common shell patterns built from SDL region types

Workspace
ANCHOR sidebar VIEWPORT linear or staged
Claude, VS Code, Slack, Notion
Workspace + Controller
ANCHOR Tab Tab Tab ctrl VIEWPORT staged mode
Claude (Chat/Cowork/Code tabs)
Master-Detail
VIEWPORT master list VIEWPORT detail view
Email, file browsers, settings
Canvas
ANCHOR — toolbar tools props VIEWPORT spatial / pan+zoom
Figma, Miro, Google Maps
Dashboard
ANCHOR — header VIEWPORT — dashboard scroll widget widget widget widget widget
Analytics, monitoring, home screens
Command
VIEWPORT full screen ANCHORED OVERLAY command palette ⌘K to open...
Linear, Raycast — keyboard-first

Fig 4 — The six named compositions of the SDL


Transitions

How the shell changes — before and after states

COLLAPSE — before ANCHOR 260px VIEWPORT Collapse COLLAPSE — after icons VIEWPORT expands LIFT — after (mobile) VIEWPORT fills Chrome ANCHOR lifted → Overlay drawer behaviour Lift VIEWPORT beneath
INJECT — before VIEWPORT full width Inject INJECT — after VIEWPORT compressed PANEL injected Eject EJECT — after VIEWPORT expands back

Fig 5 — Key transitions: Collapse, Lift (breakpoint response), Inject (Panel appears), Eject (Panel closes)


Spatial Viewport Mode

A camera over a canvas, not a window over a flow

The other three Viewport modes — Linear, Staged, Routed — are variations on the same model: content has a position in a one-dimensional flow and the Viewport moves through it. A Spatial Viewport breaks this entirely. Content exists in a two-dimensional coordinate space. The Viewport is a camera that pans and zooms over that space. This difference is not merely visual — it has structural consequences for navigation, selection, object modelling, and the controller relationships between the Viewport and surrounding regions.

LINEAR window scrolls through flow STAGED Stage A swap on tab select discrete states, one visible ROUTED /dashboard URL drives content full transition on navigate SPATIAL ← object object object object camera camera pans and zooms over 2D space

Fig 12 — The four Viewport modes. Linear, Staged, and Routed are all variations on a one-dimensional content flow. Spatial is fundamentally different: the camera moves over a two-dimensional object space.

CANVAS SHELL — BIDIRECTIONAL CONTROLLER RELATIONSHIPS ACTIVITY BAR drives Viewport tool state → only TOOLBAR ANCHOR 75% ↔ zoom control LAYERS PANEL ▸ Frame 1 ● Circle (selected) ▸ Frame 2 BIDIRECTIONAL drives ↔ driven by Viewport selection SPATIAL VIEWPORT Frame 1 Circle Frame 2 MINIMAP Viewport Fixture PROPERTIES PANEL driven by Viewport selection X 142 Y 88 W 50 Fill driven by selection only → no drives tool state → drives Viewport driven by Viewport bidirectional

Fig 13 — Canvas shell bidirectional controller relationships. Gold arrows: region drives Viewport. Blue arrows: Viewport drives region. Layers Panel has a bidirectional relationship. Properties Panel is driven only. Activity bar drives only. The minimap is a Viewport Fixture — persistent within the Viewport, not a separate region.

SPATIAL OBJECT MODELS FREE-FORM shape text image Miro, whiteboards NODE GRAPH Node A Node B Node C Node-RED, Unreal Blueprint FRAME-BASED Frame 1 Frame 2 Figma, Sketch TILE-BASED Maps, strategy, grid editors

Fig 14 — The four Spatial object models. Free-form: objects anywhere. Node graph: objects connected by edges. Frame-based: objects within named artboards. Tile-based: objects occupy cells in a discrete grid.

Example: Figma

Canvas pattern.

Leading Anchor: activity bar, fixed 48px, drives Viewport tool state → only.

Leading Panel Group, policy: Exclusive, resizable width.
  Contains: Layers Panel (bidirectional controller — drives and is driven by Viewport selection), Assets Panel (user-initiated).

Top Anchor: toolbar, fixed height. Contains: zoom control (bidirectional controller — drives and reflects Viewport camera state).

Main Viewport: Spatial mode.
  Object model: frame-based.
  Selection model: multi + hierarchical.
  Navigation: pan, zoom, fit-to-screen, zoom-to-selection.
  Viewport Fixture: Minimap, bottom-right corner, user-toggleable.

Trailing Panel Group, policy: Exclusive, fixed width 240px.
  Contains: Design Panel, Prototype Panel, Inspect Panel (all driven by Viewport selection only).

Bidirectional controllers: Layers Panel ↔ Viewport selection; zoom control ↔ Viewport camera state.

Chrome corner ownership: Top Anchor owns full width.

Fig 15 — SDL description of Figma. Note the explicit declaration of bidirectional controllers, the Spatial Viewport properties, and the Viewport Fixture.


How Anchors Relate to Each Other

Span determines the root grid. Toggle buttons create cross-Anchor controller relationships.

The SDL previously described Anchors in isolation — their position, dimension, and persistence. But when two Anchors occupy perpendicular axes (a top header and a leading sidebar), they must negotiate who owns the corner between them. And when a button in one Anchor controls the collapse state of another, that cross-region wiring must be named explicitly.

HEADER-DOMINANT Top Anchor full-span · Leading Anchor inset TOP ANCHOR — FULL-SPAN runs edge to edge across entire Chrome LEADING ANCHOR — INSET VIEWPORT ↑ corner owned by Top Anchor ← full Chrome width → SIDEBAR-DOMINANT Leading Anchor full-span · Top Anchor inset LEADING ANCHOR — FULL-SPAN TOP ANCHOR — INSET fills only remaining width VIEWPORT corner owned by Leading Anchor ← full Chrome height → vs CSS Grid differs

Fig 16 — Anchor Span. Left: header-dominant — Top Anchor is full-span, sidebar toggle naturally lives in the header and spans the full width. Right: sidebar-dominant — Leading Anchor is full-span, no natural full-width location for a sidebar toggle in the header.

ANCHOR-TO-ANCHOR CONTROLLER — SIDEBAR TOGGLE PATTERN Expanded state expanded icon Chat Cowork SIDEBAR expanded 260px VIEWPORT A→A controller drives collapse state Collapsed state (after toggle click) icon reflects state Chat Cowork icons only VIEWPORT expands 28px 260px expanded

Fig 17 — Anchor-to-Anchor controller relationship. The toggle button in the Top Anchor drives the collapse state of the Leading Anchor. The button icon reflects current state. The Viewport expands to fill reclaimed space. This cross-region wiring must be explicitly named in the SDL description — it is a common source of implementation bugs when left implicit.

CSS GRID IMPLICATION — WHY ANCHOR SPAN MATTERS STRUCTURALLY Header-dominant Chrome grid header — grid-column: 1 / -1 sidebar viewport grid-template-rows: [header] auto [content] 1fr grid-template-columns: [sidebar] 260px [main] 1fr Sidebar-dominant Chrome grid sidebar — grid-row: 1 / -1 header (inset) viewport grid-template-rows: [header] auto [content] 1fr grid-template-columns: [sidebar] 260px [main] 1fr

Fig 18 — The CSS Grid structure of the Chrome differs based on Anchor Span. In header-dominant, the header uses grid-column: 1 / -1 to span the full width. In sidebar-dominant, the sidebar uses grid-row: 1 / -1 to span the full height. Both use the same two CSS properties but applied to different Anchors — the SDL description tells the developer exactly which to use.

Claude Desktop — Updated SDL Description

Workspace pattern with Controller.
Chrome Anchor Span: Top Anchor full-span, Leading Anchor inset.

Top Anchor: header, fixed height, full-span.
  Contains: sidebar toggle button (Anchor-to-Anchor controller of Leading Anchor collapse state, reflects collapse state visually).
  Contains: tab bar (Controller of main Viewport).

Leading Anchor: sidebar, collapsible, inset (starts below header), breakpoint response: Lift.
  Anchor Header: workspace switcher.
  Anchor Body: conversation list, owned scroll.
  Anchor Footer: User Profile trigger (Anchored Overlay, preferred direction Up), Invite action (Modal Overlay).

Main Viewport: Staged mode, three stages (Chat, Cowork, Code), owned vertical scroll per stage.

Trailing Panel: content-initiated trigger (artifact content type), fixed width, compresses main Viewport on Inject, user-dismissible via Eject.

Fig 19 — Updated Claude Desktop SDL description, now including Anchor Span declarations and the Anchor-to-Anchor controller relationship for the sidebar toggle.


Multiple Simultaneous Panels

Panel Groups, Panel Policy, and Corner Ownership

A single Panel compressing a single Viewport is straightforward. When multiple Panels are active simultaneously — on the same edge or on different edges — three new concepts govern the behaviour: Panel Group, Panel Policy, and Corner Ownership.

EXCLUSIVE POLICY only one Panel open at a time VIEWPORT Panel A Panel A open open Panel B VIEWPORT Panel B Panel A auto-ejected, Panel B takes its place ADDITIVE POLICY multiple Panels compress Viewport simultaneously Panel A VIEWPORT compressed Panel B both Panels compress Viewport from both sides

Fig 7 — Exclusive policy (left): opening Panel B auto-ejects Panel A. Additive policy (right): both Panels are open, Viewport compressed from both sides.

TABBED POLICY fixed footprint regardless of how many Panels are available VIEWPORT Term Output Problems TABBED PANEL GROUP fixed width regardless of tab count Example: VS Code The Explorer, Search, Source Control and Extensions panels form an Exclusive Panel Group on the leading edge. The Terminal, Output, and Problems panels form a Tabbed Panel Group on the bottom edge. Two Panel Groups. Different policies. Corner Ownership required.

Fig 8 — Tabbed policy: multiple Panels share one fixed-size region. The tab bar inside the Panel Group switches which Panel is visible.

CORNER OWNERSHIP when Panel Groups on two axes are simultaneously active CORNER OWNERSHIP vertical group owns corner horizontal group owns corner horizontal (bottom) group owns corner top Anchor Trailing Panel Group stops here ↓ VIEWPORT Bottom Panel Group — owns full width ← corner ownership → ↑ corner owned by bottom group vertical (trailing) group owns corner top Anchor Trailing Panel Group owns corner full height ↕ VIEWPORT Bottom Panel Group — stops here → ↑ corner owned by trailing group

Fig 9 — Corner Ownership. Left: bottom Panel Group owns full width, trailing Panel Group stops above it. Right: trailing Panel Group owns full height, bottom Panel Group fills only the remaining width. This must be specified on the Chrome before building.


Writing an SDL Description

A compact, precise notation for communicating shell architecture

An SDL description should be readable by designers and developers alike. It captures enough structure to begin implementation without visual assets.

Workspace pattern with Controller.

Leading Anchor: sidebar, collapsible, breakpoint response: Lift.
  Anchor Header: workspace switcher.
  Anchor Body: conversation list, owned scroll.
  Anchor Footer: User Profile trigger (Anchored Overlay, preferred direction Up), Invite action (Modal Overlay).

Top Anchor: header, fixed height, Controller of main Viewport.

Main Viewport: Staged mode, three stages (Chat, Cowork, Code), owned vertical scroll per stage.

Trailing Panel: content-initiated trigger (artifact content type), fixed width, compresses main Viewport on Inject, user-dismissible via Eject.

Fig 10 — SDL description of Claude Desktop. A developer reading this has a clear architectural picture before writing a line of code.

Example: VS Code (with Panel Groups)

Canvas pattern.

Leading Anchor: activity bar, fixed 48px.

Leading Panel Group, policy: Exclusive, resizable width.
  Contains: Explorer, Search, Source Control, Extensions (all user-initiated via activity bar).

Top Anchor: tab bar, fixed height.

Main Viewport: Staged mode (open editor tabs), owned scroll.

Bottom Panel Group, policy: Tabbed, resizable height (200–400px).
  Contains: Terminal (user-initiated), Output (state-initiated), Problems (state-initiated).

Chrome corner ownership: Bottom Panel Group owns full width.

Fig 11 — SDL description of VS Code, demonstrating two Panel Groups with different policies and explicit Corner Ownership.