feat(web): nav split — add chat + specs entries, drop merged workspace label #1117

Open
opened 2026-05-11 23:39:02 +00:00 by claude-desktop · 8 comments
Collaborator

As an operator,
I want the WORK section of the sidebar to list Chat and Specs as distinct entries,
so that I can jump straight to the surface I need without route mode-flipping.

Foundation story for the workspace split. Adds paraglide strings + nav entries only — does not yet change route bodies.

Acceptance criteria

Paraglide

  • Add nav_sections_item_chat (EN: "Chat", FR: "Chat") and nav_sections_item_specs (EN: "Specs", FR: "Specs") to apps/web/messages/{en,fr}.json.
  • Regenerated paraglide artefacts under apps/web/src/paraglide/messages/ committed.
  • Existing nav_sections_item_workspace key kept (removed in cleanup story).

Nav

  • components/nav-sections.tsx getNavSections() WORK section emits two entries: { path: "/workspace", label: m.nav_sections_item_chat(), icon: MessageSquare, testId: "nav-chat" } and { path: "/specs", label: m.nav_sections_item_specs(), icon: FileText, testId: "nav-specs" }, in that order, before flows.
  • Active-route highlighting works on both — verify aria-current="page" on the matching link.
  • Collapsed rail variant shows the lucide icon with aria-label + title matching the visible label.

Tests

  • nav-sections.test.tsx updated: both entries render in WORK section, in order; both carry the correct data-testid.
  • Mobile drawer variant test passes with both entries visible.

Out of scope

  • Editing routes/workspace.index.tsx (story wsplit-5).
  • Un-redirecting routes/specs*.tsx (story wsplit-2).
  • Removing nav_sections_item_workspace (story wsplit-6).

References

  • Spec: docs/specs/workspace-split.md.
  • apps/web/CLAUDE.mdNavigation primitives.
**As an** operator, **I want** the WORK section of the sidebar to list **Chat** and **Specs** as distinct entries, **so that** I can jump straight to the surface I need without route mode-flipping. Foundation story for the workspace split. Adds paraglide strings + nav entries only — does not yet change route bodies. ## Acceptance criteria ### Paraglide - [ ] Add `nav_sections_item_chat` (EN: "Chat", FR: "Chat") and `nav_sections_item_specs` (EN: "Specs", FR: "Specs") to `apps/web/messages/{en,fr}.json`. - [ ] Regenerated paraglide artefacts under `apps/web/src/paraglide/messages/` committed. - [ ] Existing `nav_sections_item_workspace` key kept (removed in cleanup story). ### Nav - [ ] `components/nav-sections.tsx` `getNavSections()` WORK section emits two entries: `{ path: "/workspace", label: m.nav_sections_item_chat(), icon: MessageSquare, testId: "nav-chat" }` and `{ path: "/specs", label: m.nav_sections_item_specs(), icon: FileText, testId: "nav-specs" }`, in that order, before `flows`. - [ ] Active-route highlighting works on both — verify `aria-current="page"` on the matching link. - [ ] Collapsed rail variant shows the lucide icon with `aria-label` + `title` matching the visible label. ### Tests - [ ] `nav-sections.test.tsx` updated: both entries render in WORK section, in order; both carry the correct `data-testid`. - [ ] Mobile drawer variant test passes with both entries visible. ## Out of scope - Editing `routes/workspace.index.tsx` (story wsplit-5). - Un-redirecting `routes/specs*.tsx` (story wsplit-2). - Removing `nav_sections_item_workspace` (story wsplit-6). ## References - Spec: `docs/specs/workspace-split.md`. - `apps/web/CLAUDE.md` → **Navigation primitives**.
Collaborator

🧹 janitor: this ticket has been idle-assigned since 2026-05-11T23:41:16.000Z. Re-dispatching.

🧹 janitor: this ticket has been idle-assigned since 2026-05-11T23:41:16.000Z. Re-dispatching.
Collaborator

🧹 janitor: this ticket has been idle-assigned since 2026-05-12T05:50:56.000Z. Re-dispatching.

🧹 janitor: this ticket has been idle-assigned since 2026-05-12T05:50:56.000Z. Re-dispatching.
Collaborator

🦵 @charles kicked the queue — re-running implement on @dev.

🦵 @charles kicked the queue — re-running implement on @dev.
Collaborator

🧹 janitor: this ticket has been idle-assigned since 2026-05-12T09:37:02.000Z. Re-dispatching.

🧹 janitor: this ticket has been idle-assigned since 2026-05-12T09:37:02.000Z. Re-dispatching.
Collaborator

🦵 @charles kicked the queue — re-running implement on @dev.

🦵 @charles kicked the queue — re-running implement on @dev.
Collaborator

🧹 janitor: this ticket has been idle-assigned since 2026-05-12T14:12:36.000Z. Re-dispatching.

🧹 janitor: this ticket has been idle-assigned since 2026-05-12T14:12:36.000Z. Re-dispatching.
Collaborator

🧹 janitor: this ticket has been idle-assigned since 2026-05-12T16:16:44.000Z. Re-dispatching.

🧹 janitor: this ticket has been idle-assigned since 2026-05-12T16:16:44.000Z. Re-dispatching.
Collaborator

🧹 janitor: this ticket has been idle-assigned since 2026-05-12T16:59:57.000Z. Re-dispatching.

🧹 janitor: this ticket has been idle-assigned since 2026-05-12T16:59:57.000Z. Re-dispatching.
Sign in to join this conversation.
No milestone
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Reference
charles/claude-hooks#1117
No description provided.