Skip to content

Workspace redesign: Slate/Graphite design system from the design handoff (D-027)#62

Merged
HouseofTyrell merged 13 commits into
mainfrom
claude/vibrant-clarke-hjoghi
Jun 13, 2026
Merged

Workspace redesign: Slate/Graphite design system from the design handoff (D-027)#62
HouseofTyrell merged 13 commits into
mainfrom
claude/vibrant-clarke-hjoghi

Conversation

@HouseofTyrell

Copy link
Copy Markdown
Owner

Implements D-027 — the Workspace redesign from the owner's claude.ai/design handoff bundle. The design delivered one reworked information architecture in three skins; per the owner's "pick the best one and build it," this builds the unified token system with Slate (cool light fintech) as light mode and Graphite (dark terminal density) as dark mode, driven by the existing theme toggle. Bond (the serif private-bank outlier, no dark counterpart) was not built. Scope is the Workspace tab only — Classic and Meeting Mode are byte-identical.

The findability spine

The design chat's target was the owner's complaint: "has all the data I want but takes a long time to find what you're looking for." The four mechanisms, all functional (not decorative):

  • Context top bar — brand, an editable scenario name (persisted), live setup chips (MFJ · CA, collateral incl. split/total-budget modes, strategy, QFAF), and a real ⌘K command palette: rail groups (keyword-indexed), sub-views, and actions; selecting a group expands it, scrolls to it, and focuses its first input. The rail's "Find a setting…" box filters/highlights groups.
  • Collapsible rail groups that show their set values when closed — "Client · MFJ · California · $3.0M income" — scan the whole setup without opening eight panels. Bodies collapse via CSS so existing tests/a11y queries kept their semantics.
  • One consolidated Flags tray replacing the wall of stacked yellow notes: 13 conditional, severity-tagged flags (exit-covered positive; state/conformity/basis/split-conflict/QFAF-sizing/NOL-expiry warnings; event/reserve/step-up/gross/deleverage/horizon notes) with severity dots, a computed one-line peek, and expand-on-demand. The disclosure footer and QFAF-treatment draft are retained verbatim.
  • Scannable results — accent-barred 4-up metric strip, tidy result cards, income-required chips with the peak emphasized, an expandable plain-English summary (default open), and rates compressed to one inline strip.

Fidelity & engineering notes

  • Every figure renders from the live engine — the mock's numbers were placeholders.
  • All existing features verified working: scenario pinning strip (D-026), split allocation, per-year events editor + presets, exports, Meeting Mode enter/exit, QP gate.
  • Typography per the design: Hanken Grotesk UI + IBM Plex Mono numerals in Graphite, bundled via @fontsource so the single-file distributable stays self-contained (dist +232 KB).
  • Inside .wx, app-level CSS aliases re-point at the wx tokens so embedded components (ResultsTable, charts, pin strip) harmonize in both themes without touching their stylesheets.

Verification

403/403 tests (+6: palette filtering, rail filter, flag conditionality, scenario-name persistence; all 397 pre-existing tests pass unmodified) · build/lint/format green · 24 Playwright screenshots in both themes compared against the design boards · ⌘K jump, group collapse, flags tray, pin, split, and Meeting Mode all exercised live.

https://claude.ai/code/session_01DFTAg2R8JQKCtW8LPzMgct


Generated by Claude Code

claude added 13 commits June 12, 2026 21:41
Decomposition by benefit type (must sum to headline), bounded meeting
rail what-if presets, before/after chip + real pinning, sandboxed MM
with keep-changes prompt.

https://claude.ai/code/session_01DFTAg2R8JQKCtW8LPzMgct
…rade mechanics (D-022)

- "How we get to $X" strip re-decomposed by benefit type (ordinary /
  NOL usage / capital-loss, less gains & costs when nonzero) using the
  same per-year identity the engine uses for taxSavings — sums to the
  headline by construction, with whole-dollar reconciliation so the
  displayed cards add exactly; printed page 1 uses the same component
- CountUp animates once on mount, then debounced prev->new (never
  replays from $0 mid-meeting); hero uses shared fmtCurrency ($15K,
  not $0.02M) from the same source as the narrative
- Mechanics level branches for EDI mode (harvest -> CF reserve ->
  contingent shelter; no more "Establish QFAF $0") and gains a
  collapsible "For your CPA" card: 475(f) ordinary-character basis,
  461(l) cap with the client's actual binding numbers, wash-sale
  assumption incl. 0% case, state caveat; print-expanded on page 3
- Dead-tail explanation by the chart when QFAF duration < projection;
  reinvestment card no longer prints advisor self-instructions
- App nav hidden while MM is mounted; year focus defaults to Year 1;
  no "-$1" axis ticks; MM totals row no longer white-on-white (global
  tfoot rule untouched); step-up strip/disclosure raised to 14px; dead
  Pin button removed pending D-024 wiring
- Print pagination verified still exactly 3 sheets (QFAF + EDI) via
  headless PDF; 7 new tests (377 total)

https://claude.ai/code/session_01DFTAg2R8JQKCtW8LPzMgct
…emory (D-023/D-024/D-025)

- New MeetingSession wrapper (workspace host): snapshots inputs +
  settings + events at entry; the meeting runs on a local copy through
  the same calculate/calculateWithOverrides pipeline (shared
  buildActiveOverrides/computeScenarioRates helpers prove one engine).
  Dirty exit prompts "Keep the changes made during the meeting?" with
  Discard as the default - no silent mutation of the working scenario
- "Client questions" rail group (off by default per D-002): retirement
  income step-down (year + new income -> per-year overrides), LT gain
  event (D-012 semantics), market growth toggle + return slider,
  financing fees toggle - five of the seven mock-meeting interruptions
  now answerable without leaving the meeting
- Comparison memory: auto "Was X -> Now Y" chip under the hero
  (re-baselines on dismissal; reserve delta in EDI mode) plus real
  single-slot scenario pinning with a frozen ghost row, unpin, and a
  "Compared with pinned scenario" line on the printed page 1; dead
  onPinScenario/canPin/collateralOnlyResults props removed
- Classic-tab host compiles and gains chip+pin; sandbox/preset parity
  there left as a future slice (noted in DECISIONS.md)
- Print pagination re-verified at exactly 3 sheets (QFAF + EDI, pin
  set, preset active); 12 new tests (389 total); full meeting flow
  browser-verified 14/14

https://claude.ai/code/session_01DFTAg2R8JQKCtW8LPzMgct
MM sliced results to projectionYears — a rule written before D-019 —
so extension years (and any setting > the old 20-cap select) were cut
from the meeting view and its total could disagree with the Workspace
headline. Now all engine years render (hero equals
summary.totalTaxSavings), the range label gains "extended to use
carryforwards" when an extension exists, the rail select goes to 40
years (and includes any non-listed value set in the Workspace), and
the printed page 2 tightens its zoom for long tables — pagination
verified at exactly 3 sheets for 10/20/40-year projections.

https://claude.ai/code/session_01DFTAg2R8JQKCtW8LPzMgct
Owner twice failed to find the Year-by-Year table and Charts behind
the old low-contrast text buttons. Segmented-control styling: filled
active pill, hover state, grouped background.

https://claude.ai/code/session_01DFTAg2R8JQKCtW8LPzMgct
…faces

workspace.css was written against CSS variables that were never
defined (--text-primary, --border-color, --input-bg, --section-bg,
...), so both themes silently used the hardcoded light fallbacks -
fine in light mode, dark-on-dark text and white islands in dark mode.

- index.css :root now defines the missing aliases against the real
  theme variables (re-resolving automatically in dark), plus
  --section-bg/--hover-bg dark values in both the [data-theme] and
  prefers-color-scheme blocks; fixes pre-existing dangling
  var(--danger)/var(--positive) references too
- Scenario Analysis table: dark rules for bull/base/bear/expected
  columns (the cream "expected" band was invisible in dark)
- workspace.css accents -> var(--primary)/var(--success); dark
  treatment for amber .ws-note callouts
- Meeting Mode confirmed untouched (fixed boardroom palette) and
  enters/exits cleanly from a dark-themed app

Every fixed surface re-screenshotted dark + light (light is
pixel-equivalent to before); 389/389 tests, build/lint/format green.

https://claude.ai/code/session_01DFTAg2R8JQKCtW8LPzMgct
- Pin scenario from the Workspace Actions group via the same
  usePinnedScenario localStorage slot Classic uses (shared pin across
  tabs, survives reloads, 4-pin cap honored). Compact "Pinned vs
  current" strip under the metric strip: Total Savings, Loss Reserve /
  Income-to-Utilize, Year 1, Net If Liquidated, Final Wealth as
  pinned -> current with signed deltas; re-pin and unpin. Pinned-side
  exit metrics derive only from the frozen snapshot so they cannot
  drift with live inputs. Separate from Meeting Mode's meeting-local
  pin (D-024)
- Split allocation in the rail's Strategy group (expandable, off by
  default): core/overlay selectors + amounts with derived total line;
  single strategy/collateral inputs hide per resolveAllocation
  convention. Total-budget mode is incompatible (solver targets
  collateralAmount, ignored in split mode) so split forces collateral
  mode with a note; D-016 conflict warning surfaces in the rail when
  deleveraging is also on. Narratives use the combined display name;
  ResultsTable falls back to uniform sub-period breakdown in split
  mode (Classic parity)
- No engine/type/CSV changes - UI wiring onto existing paths only;
  8 new tests incl. engine-equivalence for split mode and pin-freeze
  under input changes (397 total); browser-verified light + dark

https://claude.ai/code/session_01DFTAg2R8JQKCtW8LPzMgct
Owner handed off a claude.ai/design bundle (three directions, one IA
focused on findability) and delegated the pick: Slate tokens become
the light theme and Graphite the dark theme on the existing toggle;
Bond is not built. Scope: Workspace tab only; all figures render from
the live engine; the single-file distributable stays self-contained.

https://claude.ai/code/session_01DFTAg2R8JQKCtW8LPzMgct
…off (D-027)

Implements the claude.ai/design handoff bundle: one reworked
information architecture in two skins driven by the existing theme
toggle - Slate (cool light fintech) as light mode, Graphite (dark
terminal density, IBM Plex Mono numerals) as dark mode. Bond not
built per D-027. Workspace tab only; Classic and Meeting Mode
byte-identical.

Findability spine (the design's target: "all the data I want but
takes too long to find"):
- Context top bar: brand, editable scenario name (localStorage),
  live setup chips (filing/state, collateral incl. split/total
  modes, strategy, QFAF), and a REAL Cmd/Ctrl+K command palette -
  rail groups (keyword-indexed), sub-views, and actions; selecting
  a group expands, scrolls, and focuses its first input. Rail
  "Find a setting" filter highlights/dims groups
- Collapsible rail groups that show their set values when closed
  ("MFJ - California - $3.0M income"; "On - 5 yrs - Dynamic");
  bodies collapse via CSS so tests and a11y queries keep semantics
- Consolidated flags tray replacing stacked notes: 13 conditional
  flags (exit-covered positive, state/conformity/basis/split/QFAF
  sizing/NOL-expiry warnings, event/reserve/step-up/gross/delever/
  horizon notes) with severity dots, computed peek line, expand on
  demand. Disclosure footer and QFAF-treatment draft retained
- Scannable results: accent-barred 4-up metric strip, result cards,
  income-required chips with peak emphasis, expandable plain-English
  summary (default open), inline rates strip

All figures render from the live engine (mock numbers were
placeholders). Pin strip, split allocation, events editor, exports,
Meeting Mode all functional. Fonts bundled via @fontsource
(dist +232 KB, self-contained). App-level CSS aliases re-pointed at
wx tokens inside .wx so embedded components (ResultsTable, charts)
harmonize without touching their stylesheets.

6 new tests (403 total: palette filter, rail filter, flags
conditionality, scenario name persistence); all 397 pre-existing
tests pass unmodified. Browser-verified in both themes; 24
screenshots against the design boards.

https://claude.ai/code/session_01DFTAg2R8JQKCtW8LPzMgct
@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying enhanceddirectindexingcalc with  Cloudflare Pages  Cloudflare Pages

Latest commit: 934a1f0
Status: ✅  Deploy successful!
Preview URL: https://8f5e07f8.enhanceddirectindexingcalc.pages.dev
Branch Preview URL: https://claude-vibrant-clarke-hjoghi.enhanceddirectindexingcalc.pages.dev

View logs

@HouseofTyrell HouseofTyrell merged commit fb31a6b into main Jun 13, 2026
2 checks passed
HouseofTyrell pushed a commit that referenced this pull request Jun 13, 2026
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.

2 participants