Commit Graph

5 Commits

Author SHA1 Message Date
1ba5d5bb9b docs(plan-2.5): closure — RFC supersession, BACKLOG landing, applyDomAttributes dedupe
Plan 2.5 final phase (P8). Closes the PrimeVue shell-migration workstream.

- RFC-WS-PRIMEVUE-PLAN-2-5: added Supersessions section recording the
  governing-RFC divergences (§4 dark mode `<body>`→`<html>` per AD-2.5-D1;
  §7.4 workspace sub option A reversed to placeholder after visual
  review). Added closure summary (phases, ADs, brand-square recipe,
  suite delta, lessons). Status → COMPLETE.
- BACKLOG: landed 8 items surfaced during Plan 2.5 (MOBILE-SHELL-PARITY,
  WORKSPACE-DROPDOWN-SUB-CONTENT, DENSITY-AWARE-SPACING, TOPBAR-H-VAR-
  DECLARE, CSP-FONT-SRC-LOCKDOWN, AUTO-IMPORTS-V2-SCAN, PNPM-RESOLUTIONS-
  ROOT, SHELLUI-STALE-DATA-THEME-CLEANUP). Marked GRADIENT-BRAND-
  ALIGNMENT as resolved.
- useShellUiStore.toggleDensity: removed redundant applyDomAttributes()
  call (the AppShellV2 watch already covers density changes). Moved the
  DOM-write assertion to AppShellV2 watcher-coverage specs.

Plan 2.5 status: COMPLETE.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 02:23:39 +02:00
59439c924b feat(layout): Plan 2.5 P6 — final shell parity (Fix 7, 9, 10)
Per RFC-WS-PRIMEVUE-PLAN-2-5 §5.6–§5.10. Final code phase of Plan 2.5
before closure docs (P7 tokens, P8 closure).

Changes:
- Fix 9: sidebar full-height. The desktop <aside> now carries
  `h-screen sticky top-0` so it fills the viewport vertically and
  pins to top on body scroll. Without this the aside sized to its
  children's intrinsic heights (~250-400px) and ended mid-viewport
  even though the surrounding grid row stretched to 100vh. With
  h-screen, SidebarNav's `flex-1` claims the remaining column space
  and WorkspaceSwitcher anchors to the true viewport bottom — its
  `border-t` (existing from P5) is now the divider above the
  switcher per crewli-starter. Mobile Drawer untouched (PrimeVue's
  internal pt classes already give it 100% panel height).
- Fix 10: density toggle promoted to the store. New
  useShellUiStore.toggleDensity() flips comfortable ⇔ compact and
  calls applyDomAttributes() synchronously. AppTopbar's local
  toggleDensity wrapper deleted; the button now invokes
  shell.toggleDensity() directly and carries a stable
  data-testid="density-toggle" plus a `title` matching its
  aria-label. Density icons swapped from generic flex-alignment
  glyphs (tabler-layout-distribute-{vertical,horizontal}) to the
  literal density metaphor (tabler-baseline-density-{small,medium}).
  Both new icons verified present in the loaded
  @iconify-json/tabler set. Topbar right-side order
  (search → density → dark → notifications → user) was already
  correct from P5; locked with a new ordering spec.

Verified (no code change):
- Fix 6 (§5.6): dark mode `.dark` on <html> confirmed in
  useShellUiStore.applyDomAttributes (AD-2.5-D1, P3 complete).
  Component-level dark coverage remains a separate backlog item
  (DARKMODE-V2-COVERAGE).
- Fix 8 (§5.8): the ▼ arrow is the Vue DevTools v8.0.2 dev-only
  toggle button injected by the devtools vite plugin, not Crewli
  code — diagnosed, no action.
- Fix 7 (§5.7): non-reproducible at code level. Topbar is
  `sticky top-0` and is a SIBLING flex item of <main> inside the
  shell's flex-col right column; normal flow stacks <main> below
  the topbar at first paint, so the title cannot fall behind a
  sticky topbar in this composition. Documented as no-op; if
  Bert reproduces it after Fix 9 lands, the symptom is something
  else (likely a per-page negative margin or a separate scroll-
  container interaction worth its own ticket).

Density enum corrected against runtime data-density: 'comfortable'
(not 'comfy' — the earlier RFC assumption is wrong; the store has
always typed `'comfortable' | 'compact'`).

Tests:
- +2 useShellUiStore.spec.ts: toggleDensity flips comfortable ⇔
  compact AND writes data-density via applyDomAttributes;
  toggleDensity from compact returns to comfortable on call 2.
- +2 AppTopbar.spec.ts: density button reachable by
  data-testid="density-toggle"; topbar right-side order locked
  via HTML index comparison (search → density → dark → notif →
  user). Existing density-flip specs adapted to spy on
  toggleDensity (the new direct call site).

Suite delta: 554 → 558 (+4). vue-tsc clean. Scoped ESLint clean
(0 errors, pre-existing warnings only).

Manual smoke pending Bert:
  1. Sidebar full-height, switcher pinned to viewport bottom (Fix 9)
  2. Page title clears topbar (Fix 7 — expected no change needed)
  3. Density toggle visible between search and dark with the
     density icon (Fix 10)
  4. Click density toggle → spacing visibly changes, <html
     data-density> flips between comfortable and compact (Fix 10)
  5. Topbar order: search → density → dark → notifications →
     avatar (Fix 10)
  6. Dark mode still toggles (Fix 6 regression)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 23:06:28 +02:00
d0dd45c03a refactor(theme): Plan 2.5 P3 — dark mode class on <html> (AD-2.5-D1 + Fix 6)
Per RFC-WS-PRIMEVUE-PLAN-2-5 §4 AD-2.5-D1 and §5.6 Fix 6. Single class
on <html> drives both PrimeVue darkModeSelector and Tailwind v4
@custom-variant dark — one toggle, two ecosystems react.

Audit findings (pre-change):
- applyDomAttributes was writing BOTH data-theme="dark" AND .dark on
  documentElement. The historic data-theme write is the design-doc §4
  mechanism that AD-2.5-D1 supersedes; the .dark toggle was already
  correct (and is already paired with PrimeVue darkModeSelector: '.dark'
  in plugins/primevue/index.ts:31, verified in P1).
- tailwind.css had NO @custom-variant dark directive — Tailwind v4
  default is `prefers-color-scheme` (OS-controlled), so utility
  `dark:` variants would have ignored the topbar toggle entirely.
- One stray .dark subtree wrapper in AppTopbar.stories.ts:56
  (DarkTheme story) — deliberate Storybook isolation per its comment,
  but in violation of AD-2.5-D1's single-source-of-truth rule.

Changes:
- useShellUiStore.applyDomAttributes(): removed data-theme write,
  kept .dark class toggle on document.documentElement, kept
  data-density (P6 wires density-toggle UI; density is an
  orthogonal axis and unaffected). File-header comment updated to
  cite AD-2.5-D1 + reference the Tailwind & PrimeVue mirror sites.
- assets/styles/tailwind.css: added
  `@custom-variant dark (&:where(.dark, .dark *))` so utility
  `dark:` classes resolve via the same .dark trigger.
- components-v2/layout/AppTopbar.stories.ts: stripped class="dark"
  from the DarkTheme story's render wrapper. Story comment updated
  to flag that visual confirmation now comes via parity-batch
  Playwright (after Plan 2.5 closes), not Storybook autodocs. A
  proper documentElement-mutating decorator is a backlog item.
- stores/__tests__/useShellUiStore.spec.ts: updated the existing
  applyDomAttributes assertion to drop the data-theme expectation
  (the write is gone); added a new `describe('applyDomAttributes
  — dark mode (AD-2.5-D1)', …)` block with 2 specs (class toggle
  reactive, no data-theme attribute written).

Re-grep verification — all three return 0 hits:
- stray .dark in v2 (excluding `dark:` utility prefixes)
- data-theme setAttribute calls in stores/
- [data-theme=…] CSS selectors anywhere

Suite delta: 573 → 575 (+2). vue-tsc clean. Scoped ESLint clean.

Note: darkModeSelector: '.dark' was already set in
plugins/primevue/index.ts:31 (verified in P1 audit) — the config
dimension of AD-2.5-D1 was satisfied before this commit; P3 closes
the store-side, Tailwind-side, and stray-class dimensions.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-20 09:31:30 +02:00
3976c0cf0c feat(gui-v2): add mobileOpen to useShellUiStore
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-16 13:21:22 +02:00
fc9c6ef164 feat(stores): add useShellUiStore for v2 shell UI state
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-16 11:37:13 +02:00