The Graph canvas’s data as a list, for phones (TICKET-078): no columns to pan and nothing to pinch. Summaries first: each layer is a disclosure with its collection, the mode shown, its token count and its worst finding; open, it lists every token with its alias chain and value. A row opens the token in the Detail panel’s bottom sheet.
Layers between hairline rules, like the Lint view’s rule rows: a native details/summary (works without script), at least 52 px tall, the collection as a mono kicker (fg-subtle, uppercase), the mode and its count, then the layer’s findings as marker + word (■ 1 error, Status colours) and a › that turns when open. The playground opens the brand layer at first; a file finding (default mode name) sits under the summary as a button that opens it in the Lint view.
Token rows: the whole row is a button (at least 52 px): the full token name in mono, then its chain (→ Colors.Foundation.Navy.500) and value with a swatch for colours in fg-muted, or why it does not resolve (does not exist, circular) in status-error-text. A row with a finding ends in its marker and word. Missing targets are not rows here; their alias says so.
Selection: the selected row (aria-current) on action-subtle, its text and chain in action-text; the marker and word keep their status colours (TICKET-121). When the selection moves into a closed layer, the layer opens; the component never closes a layer the visitor opened.
Paths break between their segments (Token path); nothing scrolls sideways on a phone.
Motion: a layer opens by growing (::details-content, motion.duration.base), its chevron turns; a selected row tints over fast (a hover at once). At once under reduced motion. See Motion.