Skip to content

feat: tiling-WM-style pinned relative placement for canvas tiles #634

@srid

Description

@srid

Kolu's canvas today lets you freely place tiles, but there's a recurring UX need for "put this tile next to that other tile, and move it when the other tile moves/resizes/is replaced in focus." Most concrete cases:

Doing this as a per-feature structural binding (e.g. browser-is-a-sub-panel-of-terminal) complects the paired tiles and fights canvas identity. Doing it as a general canvas capability keeps every tile a peer and makes the behavior reusable across terminal, browser, and any future tile type.

Proposal — pinned relative placement

  • A tile can be "pinned" relative to another tile with a direction (right / left / above / below) and a size ratio.
  • When the anchor tile moves, resizes, or gains focus (e.g. maximize), the pinned tile follows.
  • Unpin at any time — the tile reverts to free canvas placement.
  • Pin operations live on the canvas layer, not inside any specific tile's state. Tile types don't need to know about pinning.

Tiling-WM-inspired extensions (post-MVP)

  • Snap-to-grid / snap-to-edges with magnet affordance.
  • Master/stack layout preset (one big tile + column of small ones).
  • Keyboard shortcuts to cycle pin direction (Mod+Shift+L = pin right of active, etc.).
  • Pin groups: a set of tiles that move together.

Non-goals initially

  • Tabbed/stacked layouts (Kolu already has a chrome pill tree for navigation).
  • Full i3/Sway compatibility.
  • Programmatic pin via config file.

Motivating consumer

#633 (browser canvas tile) will be the first adopter. That issue intentionally ships without any placement behavior beyond "free canvas tile," trusting this feature to land generically rather than building a one-off binding between browser tiles and terminals.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions