VISUALLIdesign system

Canvas language

The visual grammar of a Visualli map. Every rule carries one tag:

The .visualli terms are used as-is: layer, level, node, connection, container, extension.

The split at a glance

SPEC — file + read-only rendering (open SDK) PRODUCT — the Visualli apps
Layers, levels, layouts; nodes with label, summary, color, position; connections; containers — including everything the AI added with Map it, once it's in the file Live generation: streaming a file while the AI writes it, ThinkingTree
The look: six blob shapes, one per level; depth rings; sizes; labels and fonts; connectors and arrowheads; containers; chromatic immersion Go deeper (the button, the facets panel and the facets extension), Visualize it / Map it as actions
The 8 themes (Light, Dark, Focus, Color-safe, High contrast) with their exact values, plus reduced motion, readable type and larger text Sources: the Sources panel, source chips and the sources extension
Motion: bloom, connector draw, dive in, back out, hover and select, reduced motion Edit mode, the edit operations (applyEdit), undo
Read-only browsing: peek, term cards (semantic-anchors), step inside / back out, depth trail, zoom / pan / fit, touch rules, keyboard Moving ideas and Reset layout (writing position)
Components: VisualMap (read-only), Node, Edge, DepthTrail, CanvasControls, SemanticPeek, SemanticAnchor / AnchorCard, blobPath / drawBlob / RINGS / edgePath, theme tokens Components: GoDeeper, SourcesPanel, EditBanner / SelectionBar / InlineText / SummaryEditor, Composer, ChatTurn, Vault, ComfortPanel, ThinkingTree / TreeMark, ExtensionPanel, export

Principles

  1. Visuals first, text last. A node is a short label (≤ 6 words). Detail lives in a deeper layer or a peek — never on the canvas. SPEC
  2. Depth is spatial. You go into an idea, not to another page. SPEC
  3. Reveal gradually. A layer arrives one idea at a time, center first. SPEC
  4. Only connect what is insightful. A connector exists only when the relationship itself teaches something, and it always has a label. Hierarchy alone (parent → child) is shown by layers, not by lines. SPEC

Node anatomy — SPEC

Part Rule
Outline One of six hand-authored organic blobs (BLOB_SHAPES, drawn with midpoint-quadratic smoothing). All nodes in a layer share one shape; consecutive levels never repeat a shape (shapeForLevel).
Size node-width 200 × node-height 148 at zoom 1; the level-0 center node is 240 wide (size="root").
Fill node.data.color — a topic name (teal … stone) or any CSS color. Absent: topics are assigned round-robin by sibling order.
Outline stroke topic-*-ring, 3px (node-stroke), 4px when selected.
Label node-label (Kalam 700, 22px) in node-ink, centered, ≤ 3 lines then ellipsis. The center node uses node-root. Labels scale inversely with zoom up to 1.3× so they stay legible when zoomed out; hidden below zoom-min.
Depth rings Rings say "there is more inside". Count = number of levels beneath the node, capped at 3. Ring 1 at 1.10× (2px, 50%, −5°), ring 2 at 1.20× (1px, 40%, −10°), ring 3 at 1.30× (3px dashed 6 4, 30%, −15°). A node without rings is a leaf and is not clickable.

Topic colors and themes — SPEC

Eight pastels derived from the logo: topic-teal, -harbor, -iris, -berry, -coral, -amber, -sun, -stone. Siblings get different topics; a child layer may reuse its parent's topic for the idea that continues it. Colors do not encode meaning — no legend, no "red = risk". Meaning belongs in labels, rings and connector style.

Connectors — SPEC

Containers — SPEC

A dashed rounded hull (line-strong, 10 6, radius 48) with its label in note 22px above the top-left corner. style: "none" draws nothing. Containers group; they never create depth.

Layers, levels and layouts

Navigation — SPEC

Understanding: peek, term, go deeper

Every idea can be understood without leaving the map. Step inside moves you through the map; Go deeper explains one thing in depth. They never share a name.

Depth Component What it shows Mouse / keyboard Touch Tag
1 · Peek SemanticPeek The idea's summary (1–2 sentences) with its terms, and Step inside if it has rings Hover or focus the idea → card beside it, never over it First tap → bottom sheet; the idea lifts, others dim, the canvas nudges it above the sheet SPEC
2 · Term SemanticAnchor / AnchorCard One underlined term's definition and Learn more ↗ Hover the term 250ms (stays while hovered, closes 300ms after leaving), or Tab + Enter → card layered over the peek; Escape returns focus Tap the term → the sheet swaps to its definition, ‹ back to the idea SPEC
3 · Go deeper GoDeeper Five facets — What it means · How it works · What it's like · A worked example · What it's not — streamed in, then Visualize it Docked panel on the right (380px); the map makes room, the source idea stays highlighted Sheet up to just below the top bar, ‹ back to the peek PRODUCT

Editing — PRODUCT

Reading is the default; changing a Visualli is a deliberate mode, and only the Visualli apps have it. Edit (pencil + word) in the top toolbar turns it on; Done in the editing bar turns it off. While editing, everything about browsing still works — the trail, stepping inside (from the selection bar), peeks on hover — so people edit any layer as they move through it. A quiet dot grid on the canvas says "you can change this".

One grammar for every construct

  1. Select — click or tap any construct: an idea, a connector, a group (and whatever comes next). It takes a focus outline and its selection bar appears beside it.
  2. Verbs — the selection bar lists that construct's verbs in a fixed order: text (Rename, Summary, Edit label) → structure (Connect, Group, Edit ideas) → navigate (Step inside) → delete (Delete, Ungroup). The order never changes, so a new construct is learned at a glance.
  3. Add — the editing bar's Idea and Group (future constructs join this list); double-click empty canvas adds an idea where you clicked.
  4. Choose… — multi-step verbs (Connect: choose the idea to connect to; Group: choose ideas) put their instruction in the editing bar with Cancel (and Done when needed). The same on mouse, touch and keyboard.
  5. Every change is one op (node.rename, connection.add, container.delete, …) — persisted by the app, undoable with Undo/Redo in the editing bar or ⌘Z / ⇧⌘Z.
Construct Select Text Structure Delete
Idea click / tap Rename (or click it again, double-click, F2) · Summary (in its peek; names any underlined terms the change would drop) Connect · Group · Step inside Delete — ideas with inner layers confirm first ("Its 2 inner layers and 6 ideas will be deleted too. You can undo this.")
Connector click / tap the line Edit label (required — a new connector asks "how are they related?") — Delete
Group click its outline or name Rename Edit ideas (choose…) Ungroup (keeps the ideas)

Choreography

Moment Motion Tag
Layer appears Nodes bloom from 50% of the way to the center: scale .55 → 1, duration-reveal 420ms, ease-bloom, staggered stagger-reveal 70ms in sibling order. Then solid connectors draw from source to target (500ms), dashed ones fade in. SPEC
Hover / select Node lifts 2px; rings turn −2° and grow 1.5% (no overshoot — a nudge, not a wobble); Focus palette dims every other node to 40%. On touch the selected node also takes a 4px outline and others dim to 60%. SPEC
Sheet (touch peek) Slides up from the bottom edge (duration-base, ease-standard), follows the finger while dragged, snaps back unless pulled 80px. The canvas pans the selected idea into view with the same timing. SPEC
Reduced motion / Gradual reveal off Everything appears together with a 120ms fade; dives become cross-fades; sheets fade in 120ms. SPEC
Live generation (the AI is still writing the file) Nodes bloom as their lines arrive; a ThinkingTree sits in the chat dock. Never a spinner over the canvas. PRODUCT
Drag The held idea lifts (scale 1.04, deeper shadow or dark-mode glow) and follows the pointer with no easing; connectors redraw every frame; on drop it settles at once. No snapping grid — placement is personal. PRODUCT

Canvas 2D / SDK notes — SPEC

Use blobPath (SVG) or drawBlob(ctx, shape, rx, ry, cx, cy) (Canvas 2D) — same points, same smoothing. RINGS holds the ring recipe, edgePath / arrowPath the connector geometry. Read colors from the CSS custom properties at draw time (getComputedStyle(document.documentElement).getPropertyValue('--topic-teal')) and redraw on a theme change so all eight themes stay correct. These are exported from @visualli/design-system/spec — the layer the open SDK and the Visualli apps share.