Skip to content

feat: pin multiple projects with split workspace layout - #13

Merged
justguy merged 1 commit into
mainfrom
feat/2-pin-projects
Apr 15, 2026
Merged

feat: pin multiple projects with split workspace layout#13
justguy merged 1 commit into
mainfrom
feat/2-pin-projects

Conversation

@justguy

@justguy justguy commented Apr 15, 2026

Copy link
Copy Markdown
Owner

Summary

Closes #2.

Projects can now be pinned from the overview drawer. Pinned projects render as side-by-side panes in the workspace; each shows its own header, scratchpad, progress strip, and matrix.

Behaviour

  • Pin toggle in each drawer row: `[PIN]` / `[PINNED]`. Persisted to localStorage (same place as `theme` and `drawerPinned`).
  • No pins → current single-pane view unchanged (renders `activeSlug`).
  • 1 pin → the pane takes 50 % width, as the issue specified.
  • 2+ pins → panes split the workspace evenly (`flex: 1 1 0` each).
  • Minimum pane width 480 px. If total minimum exceeds the viewport, the workspace scrolls horizontally (`overflow-x: auto`).
  • Click a pane to focus it — becomes the new `activeSlug`, so the top-bar `[UNDO]` / `[HISTORY]` / `[DELETE]` target it. Active pane gets an amber underline on its header.
  • Shared across panes: theme, overview drawer, filter input text, status/block filter toggles (counts come from the active pane).
  • Per-pane: scratchpad banner, error banner, progress strip, swimlane × priority matrix, all task interactions (drag, delete, comment edit).

Refactor

Callbacks that previously closed over `activeSlug` now take `slug` as the first argument:

callback before after
`onMove` `onMove({...})` `onMove(slug, {...})`
`onToggleCollapse` `onToggleCollapse(lane, bool)` `onToggleCollapse(slug, lane, bool)`
`onDeleteTask` `onDeleteTask(task)` `onDeleteTask(slug, task)`
`onSaveComment` `onSaveComment(taskId, val)` `onSaveComment(slug, taskId, val)`

`ProjectPane` binds its own slug when passing them to `Matrix`, so nothing internal to the card/cell/matrix tree changed.

Not in this PR

  • Per-pane `[UNDO]` / `[HISTORY]` / `[DELETE]` buttons — header-level actions still operate on the focused pane only. Reasonable follow-up.
  • Drag to reorder panes. Follow-up.
  • Resizable dividers between panes. Follow-up.
  • Per-pane status/block filters. Current behaviour: filters are shared, counts come from the focused pane.

Test plan

  • `npm test` — 63/63 pass
  • `node --check ui/app.js` — syntax clean
  • Hub CLI still boots (`node bin/llm-tracker.js --help`)
  • Manual: no pins → single-pane view unchanged vs. before this PR.
  • Manual: pin one project → pane renders at 50 % workspace width.
  • Manual: pin a second → both split 50/50, scratchpad shown per-pane.
  • Manual: pin three or four → equal split, all readable; six+ → horizontal scroll kicks in.
  • Manual: click an unfocused pane → becomes active (amber underline), top-bar undo/history/delete now target it.
  • Manual: drag a card within a non-focused pane → task moves in the correct project (regression check on the callback refactor).
  • Manual: edit a comment in a non-focused pane → saves against the correct slug.
  • Manual: unpin all → returns to single-pane view on `activeSlug`.
  • Manual: reload browser → pinned set persists.

Projects can now be pinned from the overview drawer. Pinned projects
render as side-by-side panes in the workspace; each shows its own
header, scratchpad, progress strip and matrix.

- New pinnedSlugs state persisted to localStorage alongside theme and
  drawerPinned.
- New [PIN]/[PINNED] toggle in each drawer project row.
- ProjectPane component factored out of App so multiple can coexist;
  onMove / onToggleCollapse / onDeleteTask / onSaveComment now take
  slug as the first arg and each pane binds its own.
- One pin → pane is 50% width (spec); 2+ → flex: 1 1 0 each, equal
  split. min-width 480px forces horizontal scroll on the workspace
  when too many are pinned for the viewport.
- Clicking a pane focuses it (becomes activeSlug); header-level
  UNDO / HISTORY / DELETE operate on the focused pane.
- Active pane marked with an amber border under its header.
- No pins → current single-project view is unchanged.

Closes #2

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@justguy
justguy merged commit 532d2fa into main Apr 15, 2026
6 checks passed
@justguy
justguy deleted the feat/2-pin-projects branch April 15, 2026 04:51
justguy pushed a commit that referenced this pull request Apr 15, 2026
🤖 I have created a release *beep* *boop*
---


##
[0.2.0](llm-tracker-v0.1.1...llm-tracker-v0.2.0)
(2026-04-15)


### Features

* add per-project history with undo-to-revision
([#6](#6))
([1937e0e](1937e0e))
* add per-task comments with hover popover
([#12](#12))
([d74b837](d74b837))
* add per-task reference field (path:line)
([#10](#10))
([6e1bdca](6e1bdca))
* expandable and editable scratchpad per project pane
([#15](#15))
([10a93fd](10a93fd))
* pin multiple projects with split workspace layout
([#13](#13))
([532d2fa](532d2fa))


### Bug Fixes

* make workspace accessible when overview drawer is pinned
([#5](#5))
([742dc7b](742dc7b))


### Documentation

* document the issue to PR to release workflow in README
([#9](#9))
([784bc89](784bc89))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Pin multiple projects with split workspace layout

1 participant