feat(workspace): redesign project workspace with floating chat widget #42

Merged
bvandeusen merged 0 commits from dev into main 2026-04-22 15:11:13 -04:00
bvandeusen commented 2026-04-22 15:10:59 -04:00 (Migrated from git.fabledsword.com)

Summary

Reworks /workspace/:projectId around tasks + notes as the main surface with chat demoted to a bottom-anchored floating widget modeled on the Knowledge view's mini-chat.

Layout

  • Grid collapses from 3 columns (tasks | chat | notes) to 2 columns (tasks 0.85fr | notes 2.15fr).
  • Chat lives in a new WorkspaceChatWidget — bottom-anchored dock, centered within --page-max-width, rounded top corners, --color-bg-secondary, upward shadow. Collapsed = input-only dock. Expanded = full ChatPanel above the input.
  • Header toggles simplified from Tasks | Chat | NotesTasks | Notes.

Chat widget features

  • Pinned per-project conversation (resume/create on mount, delete-if-empty-and-new on unmount — existing workspace behavior, moved into the widget).
  • Restart button: creates a new conversation; old one remains discoverable.
  • History dropdown: lists conversations where rag_project_id === projectId, newest first; click to switch.
  • Auto-expand on send from the collapsed input.
  • Widget owns the SSE streamingToolCalls watcher and emits note-changed / task-changed events; the view listens and reloads the affected panel refs.

Notes panel polish

  • Notes-picker rail widens from 155px → 200px and gets --color-bg-card so it no longer visually merges with the tasks panel.
  • Active-note indicator moved from the left edge to the right edge (pointing toward the editor).
  • Dropped the cascade of horizontal dividers (panel-header, note-title-row, tag-row, tag-suggestions, toolbar-row, link-suggest-strip) so title / tags / toolbar read as a unified field above the body.
  • Note title input: bumped to 1.4rem Fraunces serif with 0.9/1.1rem row padding.

Files

  • New: frontend/src/components/WorkspaceChatWidget.vue
  • Modified: frontend/src/views/WorkspaceView.vue, frontend/src/components/WorkspaceNoteEditor.vue

No backend, chat store, or API changes.

Test plan

  • make typecheck passes
  • make lint passes
  • Open a project workspace → widget appears collapsed at bottom, grid is tasks/notes at 0.85:2.15
  • Expand widget → ChatPanel renders pinned conversation
  • Send a message that creates a note / task → notes panel or tasks panel reloads accordingly
  • Restart ↻ → new conversation; old one appears in ▾ history dropdown and in /chat
  • Collapse, reload page → widget restores collapsed, pinned conversation intact
  • Notes rail visually reads as part of the notes panel (tinted), active-note indicator sits on the right edge
  • Note title reads large and serif; no dividers between title/tags/toolbar/body
## Summary Reworks `/workspace/:projectId` around **tasks + notes as the main surface** with chat demoted to a **bottom-anchored floating widget** modeled on the Knowledge view's mini-chat. ## Layout - Grid collapses from 3 columns (`tasks | chat | notes`) to **2 columns (`tasks 0.85fr | notes 2.15fr`)**. - Chat lives in a new `WorkspaceChatWidget` — bottom-anchored dock, centered within `--page-max-width`, rounded top corners, `--color-bg-secondary`, upward shadow. Collapsed = input-only dock. Expanded = full `ChatPanel` above the input. - Header toggles simplified from `Tasks | Chat | Notes` → `Tasks | Notes`. ## Chat widget features - Pinned per-project conversation (resume/create on mount, delete-if-empty-and-new on unmount — existing workspace behavior, moved into the widget). - **Restart** button: creates a new conversation; old one remains discoverable. - **History dropdown**: lists conversations where `rag_project_id === projectId`, newest first; click to switch. - Auto-expand on send from the collapsed input. - Widget owns the SSE `streamingToolCalls` watcher and emits `note-changed` / `task-changed` events; the view listens and reloads the affected panel refs. ## Notes panel polish - Notes-picker rail widens from 155px → 200px and gets `--color-bg-card` so it no longer visually merges with the tasks panel. - Active-note indicator moved from the left edge to the right edge (pointing toward the editor). - Dropped the cascade of horizontal dividers (`panel-header`, `note-title-row`, `tag-row`, `tag-suggestions`, `toolbar-row`, `link-suggest-strip`) so title / tags / toolbar read as a unified field above the body. - Note title input: bumped to 1.4rem Fraunces serif with 0.9/1.1rem row padding. ## Files - **New:** `frontend/src/components/WorkspaceChatWidget.vue` - **Modified:** `frontend/src/views/WorkspaceView.vue`, `frontend/src/components/WorkspaceNoteEditor.vue` No backend, chat store, or API changes. ## Test plan - [x] `make typecheck` passes - [x] `make lint` passes - [ ] Open a project workspace → widget appears collapsed at bottom, grid is tasks/notes at 0.85:2.15 - [ ] Expand widget → ChatPanel renders pinned conversation - [ ] Send a message that creates a note / task → notes panel or tasks panel reloads accordingly - [ ] Restart ↻ → new conversation; old one appears in ▾ history dropdown and in `/chat` - [ ] Collapse, reload page → widget restores collapsed, pinned conversation intact - [ ] Notes rail visually reads as part of the notes panel (tinted), active-note indicator sits on the right edge - [ ] Note title reads large and serif; no dividers between title/tags/toolbar/body
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: bvandeusen/FabledScribe#42