From 84e6ec1f437b1d3a7fb428f16485669f905a224e Mon Sep 17 00:00:00 2001 From: pyr0ball Date: Thu, 19 Mar 2026 07:45:16 -0700 Subject: [PATCH] docs(apply): fix spec review issues (overflow:clip, CSS var, threshold note) --- .../2026-03-19-apply-split-pane-design.md | 123 +++++++++++------- 1 file changed, 78 insertions(+), 45 deletions(-) diff --git a/docs/superpowers/specs/2026-03-19-apply-split-pane-design.md b/docs/superpowers/specs/2026-03-19-apply-split-pane-design.md index bfdc84b..1149e7a 100644 --- a/docs/superpowers/specs/2026-03-19-apply-split-pane-design.md +++ b/docs/superpowers/specs/2026-03-19-apply-split-pane-design.md @@ -15,7 +15,7 @@ Refactor the Apply view for desktop: replace the centered 760px list → full-pa | Decision | Choice | Future option | |---|---|---| -| Split ratio | 28% list / 72% workspace (fixed) | Resizable drag handle (Option C) | +| Split ratio | 28% list / 72% workspace (fixed) | Resizable drag handle | | Panel open animation | Expand from list divider edge (~200ms) | — | | URL routing | Local state only — URL stays at `/apply` | URL-synced selection for deep linking | | List row density | Option A: title + company + score badge, truncated | C (company+score only), D (wrapped/taller) via future layout selector | @@ -24,7 +24,9 @@ Refactor the Apply view for desktop: replace the centered 760px list → full-pa ## Layout -### Desktop (≥ 768px) +### Desktop (≥ 1024px) + +The split pane activates at 1024px — the same breakpoint where the app nav sidebar collapses (`App.vue` `max-width: 1023px`). This ensures the two-column layout never renders without its sidebar, avoiding an uncomfortably narrow list column. ``` ┌──────────────────────────────────────────────────────────────────┐ @@ -38,13 +40,12 @@ Refactor the Apply view for desktop: replace the centered 760px list → full-pa └──────────────────────────────────────────────────────────────────┘ ``` -- App nav sidebar (220px fixed, existing) + split pane fills the remainder -- No job selected → right panel shows a warm empty state: `← Select a job to open the workspace` -- The `max-width: 760px` constraint on `.apply-list` is removed for desktop; it remains (full-width) on mobile +- No job selected → right panel shows a warm empty state: `← Select a job to open the workspace` (desktop-only — the empty state element is conditionally rendered only inside the split layout, not the mobile list) +- The `max-width: 760px` constraint on `.apply-list` is removed for desktop -### Mobile (< 768px) +### Mobile (< 1024px) -No changes. Existing styles, full-width list, `RouterLink` navigation to `/apply/:id`. +No changes. Existing full-width list + `RouterLink` navigation to `/apply/:id`. All existing mobile breakpoint styles are preserved. --- @@ -61,13 +62,18 @@ ApplyWorkspaceView.vue → full page, reads :id from route params ``` ApplyView.vue → split pane (desktop) OR list (mobile) - ├─ [left] NarrowJobList (inline, not a separate component — kept in ApplyView) - └─ [right] ApplyWorkspace.vue (new component, accepts :jobId prop) + ├─ [left] Narrow job list (inline in ApplyView — not a separate component) + └─ [right] ApplyWorkspace.vue (new component, :job-id prop) -ApplyWorkspaceView.vue → unchanged route wrapper; renders +ApplyWorkspaceView.vue → thin wrapper: +ApplyWorkspace.vue → extracted workspace content; accepts jobId: number prop ``` -**Why extract `ApplyWorkspace.vue`?** The workspace is now rendered in two contexts: the split pane (inline) and the existing `/apply/:id` route (for mobile and any future deep-link support). Extracting it as a prop-driven component avoids duplication. +**Why extract `ApplyWorkspace.vue`?** The workspace now renders in two contexts: the split pane (inline, `jobId` from local state) and the existing `/apply/:id` route (for mobile + future deep links). Extracting it as a prop-driven component avoids duplication. + +**`jobId` prop type:** `number`. The wrapper in `ApplyWorkspaceView.vue` does `Number(route.params.id)` before passing it. `ApplyWorkspace.vue` receives a `number` and never touches `route.params` directly. + +**`declare module` augmentation:** The `declare module '@/stores/review'` block in the current `ApplyWorkspaceView.vue` (if present) moves into `ApplyWorkspace.vue`, not the thin wrapper. --- @@ -78,43 +84,73 @@ ApplyWorkspaceView.vue → unchanged route wrapper; renders