Skip to content

Canvas layouting: tile multiple canvases on one screen (New Column / New Row) #14

Description

@Weegy

Problem

Today the Tier-1 host app renders one canvas at a time — a single surface tree fills the workspace. The multi-canvas workspace (#9) lets users keep several canvases and switch between them, but there is no way to see more than one canvas on the same screen. For comparison-style work (e.g. two SEO reports side by side, a query result next to a chart, a data table beside its detail view) the user has to flip back and forth.

Goal

Add layouting tools so a user can compose multiple canvases into one screen as a resizable grid, with two primitive operations:

  • New Column — split the current workspace (or the focused pane) horizontally and host another canvas to the right.
  • New Row — split vertically and host another canvas below.

Each pane is an independent canvas: its own session, its own live surface stream, its own turns. The result is a tiling grid of canvases the user arranges to taste.

Proposed UX

  • A workspace-level affordance (header/toolbar or a per-pane control) offering New Column / New Row.
  • Adding a pane prompts which canvas to load into it — a new (empty) canvas or one picked from the canvas library (Surface materialised UIs: canvas library / Omadia Graph integration with user assignments #12).
  • Panes are resizable (drag the divider) and closable (closing the last pane returns to the single-canvas view).
  • The active/focused pane is where new turns and beam input are directed; focus is visually indicated.
  • The grid layout (which canvases, their positions and sizes) persists across restarts in the host settings/session store, like the single canvas session does today.

Technical notes

  • The host already owns a per-canvas CanvasSocket (handshake → canvasSessionId → surface stream). A multi-pane workspace = N independent sockets/sessions, one per pane — no protocol change required for v1; it is a host-app composition concern.
  • The renderer needs a workspace grid container above today's single-canvas root (App.tsx / PrimitiveNode render the tree per pane unchanged). A split model (binary splits → Column/Row, or a CSS grid of panes) drives the layout.
  • Layout state: extend the settings/session store with a workspace descriptor (tree of splits → leaf = { canvasSessionId, serverUrl }, plus split ratios).
  • Reuses existing reconnect/handshake/resync per pane; each pane keeps its own revision/seq counters.

Acceptance criteria

  • User can add a canvas to the right (New Column) and below (New Row) of an existing one.
  • Each pane runs an independent canvas (own session, own live turns) with no cross-talk.
  • Panes are resizable and closable; closing the last pane restores the single-canvas view.
  • The active pane receives turns/beam input; focus is visible.
  • The grid layout persists across app restarts.

Related

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions