Skip to content

feat(frontend): A1-A10 polish bundle — dark variants + sort affordance + a11y + stale copy#244

Merged
dackclup merged 1 commit into
mainfrom
claude/compassionate-goodall-QLh3q
May 25, 2026
Merged

feat(frontend): A1-A10 polish bundle — dark variants + sort affordance + a11y + stale copy#244
dackclup merged 1 commit into
mainfrom
claude/compassionate-goodall-QLh3q

Conversation

@dackclup
Copy link
Copy Markdown
Owner

Summary

10 quick-win design polish items surfaced by the post-#242 frontend-design-reviewer open-scope audit. All single-line or two-line fixes across 6 files. No schema / Python / scoring / valuation / output JSON change. Closes residual gaps that slipped through the LedgerCraft A1-B4 + #242 polish series.

Scope (7 files, ~67 insertions / ~22 deletions)

# File Issue Fix
A1 app/stock/[ticker]/page.tsx (2 h2s) Section headers "Price (1y)" + "Raw fundamentals" missing dark:text-slate-400 Append dark variant
A2 app/stock/[ticker]/page.tsx "← Back to ranking" link missing dark variants Add dark:text-slate-400 dark:hover:text-slate-100
A3 FilterDrawer.tsx MoS chip group missing dark hover state (other 3 groups had it) Add dark:bg-slate-900 dark:text-slate-400 dark:ring-slate-700 dark:hover:bg-slate-800
A4 FairPriceCard.tsx (4 KPI dd) Values rendering visibly weaker than hero-metric pattern Add font-mono font-semibold leading-none
A5 RankingTable.tsx Inactive sortable columns showed empty — no sortability affordance Render subtle glyph in text-slate-300
A6 RankingTable.tsx headerCell() Screen readers can't announce column sort direction Add aria-sort={ascending | descending | none}
A7 FilterDrawer.tsx search input Missing dark focus ring Add dark:focus:border-slate-500 dark:focus:ring-slate-500
A8 FilterDrawer.tsx 4 chips transition (ALL CSS props) → transition-colors (scoped) Match PriceTimePeriodSelector pattern
A9 app/page.tsx + app/stock/[ticker]/page.tsx Stale "Phase 3b" / "Phase 3c" in user-facing copy Strip phase tags, preserve explanatory content
A10 PriceHistoryChart.tsx Recharts tooltip borderRadius: '0.375rem' (6px) — post-A3 inconsistency Change to '0.25rem' (4px)

Out of scope (deferred from audit — need user direction)

  • B1 — Dead fair_price / margin_of_safety_pct keys in SortKey (no UI impact)
  • B2/C1Instrument Serif loaded but unused (~40-60KB) — decide use-on-hero or remove
  • B3/C2 — MoS column on desktop ranking table (8 cols on 1280px tradeoff)
  • C3 — Focus-visible ring system across all 23 interactive buttons (a11y, wider scope)

Lockstep

PHASE_STATUS_INFLIGHT.md side-file entry appended per PR #237 convention. CLAUDE.md / AGENTS.md substance UNCHANGED.

Test plan

  • CI Python (lint + test) green
  • CI Frontend build green
  • Vercel preview deploys cleanly
  • Visual spot-check on preview:
    • Dark mode: h2 section headers + back link + MoS chip hover all render correct
    • Light mode: FairPriceCard KPIs visually match hero-metric weight
    • Sortable column headers show until clicked, then /
    • Screen reader announces sort direction (test with VoiceOver / NVDA)
    • Stale "Phase 3b/3c" copy no longer in user-facing footer

Risk

  • Low — className + attr + copy-text diff only. Each change closes a clear gap; no layout shifts; no behavior changes beyond intended polish.

🤖 https://claude.ai/code/session_01Dk82y7Eswz745NuBQH3CaG


Generated by Claude Code

@vercel
Copy link
Copy Markdown

vercel Bot commented May 25, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
quantrank Ready Ready Preview, Comment May 25, 2026 12:25am

@dackclup dackclup marked this pull request as ready for review May 25, 2026 00:22
…e + a11y + stale copy

10 quick-win design polish items surfaced by the post-#242
frontend-design-reviewer open-scope audit. All single-line or
two-line fixes across 6 files. No schema / Python / scoring /
valuation / output JSON change.

A1  app/stock/[ticker]/page.tsx:190,239 — 2 h2 section headers
    ("Price (1y)" + "Raw fundamentals") gain dark:text-slate-400
    (other h2s on same page already had the pair; these two were
    overlooked)

A2  app/stock/[ticker]/page.tsx:76 — "← Back to ranking" link gains
    dark:text-slate-400 dark:hover:text-slate-100 (sibling not-found
    path already had the dark variants)

A3  FilterDrawer.tsx:238 — Valuation/MoS chips gain
    dark:bg-slate-900 dark:text-slate-400 dark:ring-slate-700
    dark:hover:bg-slate-800 on unselected state (other 3 filter
    groups already had it; this one was missed)

A4  FairPriceCard.tsx:97,106,116,124 — 4 KPI dd values
    (Median fair / Margin of safety / Max ex-outliers / Tangible BVPS)
    gain font-mono font-semibold leading-none. Was reading visibly
    weaker than the hero-metric pattern (ScoreBadge lg + MoSBadge +
    CurrentPriceLine all use font-mono font-semibold).

A5  RankingTable.tsx:243 — inactive sortable columns now render a
    subtle "↕" glyph in text-slate-300/dark:text-slate-700 instead
    of an empty string. Communicates sortability before interaction
    (Bloomberg/Google Finance standard pattern).

A6  RankingTable.tsx headerCell() — aria-sort={ascending | descending
    | none} attribute added to sortable <th> elements. Screen readers
    can now announce column sort direction (WAI-ARIA standard).

A7  FilterDrawer.tsx:146 — search input gains
    dark:focus:border-slate-500 dark:focus:ring-slate-500. Sibling
    input in RankingTable already had the dark focus variants;
    drawer input was inconsistent.

A8  FilterDrawer.tsx 4 chip surfaces — `transition` (transitions
    ALL CSS props) → `transition-colors` (scoped to bg/color/ring).
    Matches PriceTimePeriodSelector pattern; minor but correct.

A9  app/page.tsx:22 + app/stock/[ticker]/page.tsx:291 — stale
    "Phase 3b" / "Phase 3c" references stripped from user-facing
    footer copy. These were internal implementation notes that
    leaked into user-facing text; current schema is 0.10.2-phase4.5e.
    Explanatory content preserved; just the phase tags removed.

A10 PriceHistoryChart.tsx:368 — Recharts tooltip
    borderRadius: '0.375rem' (6px) → '0.25rem' (4px) matching the
    post-A3 4px card-radius normalization. SKILL.md Rule 0 carve-out
    covers the inline JS object pattern; the radius value itself
    can still align with the spec.

Out of scope (deferred from audit)
- B1: dead-sort-key SortKey cleanup (no UI impact today)
- B2/C1: Instrument Serif use-on-hero or remove-import decision
        (design taste call — needs user direction)
- B3/C2: MoS column on desktop ranking table
        (data-density tradeoff — needs user direction)
- C3: focus-visible ring system across all 23 interactive buttons
       (a11y improvement, wider scope)

Lockstep
- PHASE_STATUS_INFLIGHT.md side-file entry appended per PR #237
  convention (CLAUDE.md / AGENTS.md substance UNCHANGED — doc-only
  in-flight entry lives in the side file)
- No schema / Python / scoring / valuation / output JSON change
- className + attr + copy-text diff only; no test changes required
- tsc --noEmit errors in sandbox are env noise (no node_modules);
  CI runs with deps and will validate
@dackclup dackclup force-pushed the claude/compassionate-goodall-QLh3q branch from 403484e to 136877f Compare May 25, 2026 00:24
@dackclup dackclup merged commit a2f9ea8 into main May 25, 2026
3 of 4 checks passed
@dackclup dackclup deleted the claude/compassionate-goodall-QLh3q branch May 25, 2026 00:24
dackclup added a commit that referenced this pull request May 26, 2026
…Craft frontend (#266)

Cuts the v1.3.0-phase4.5e release tag, closing the Phase 4.5e Form-4
insider-clustering ladder (PRs #167+#205+#222+#224+#238) and shipping
the LedgerCraft frontend reskin (A1-A3+B1-B4+animation PRs 1-3+#244
polish+dark-mode tooltip fixes through PR #263) since v1.2.0-phase4.5
(6d414a9, 2026-05-17).

Scope (3 files):
- pyproject.toml — version 0.3.0 → 1.3.0
- docs/release-notes/v1.3.0-phase4.5e.md (NEW) — release body grouped
  by Form-4 cluster / data-quality / defense layer / frontend /
  methodology + agent infra / CI hygiene; ~800 words
- PHASE_STATUS.md — Current state schema 0.10.4 → 0.10.5-phase4.5e,
  defense layer headline 32 → 33 declared flags, production-run
  pointer refreshed to 26423296287

Pre-flight ladder verified by release-captain (opus):
- ruff clean
- pytest 1216 passed (offline)
- schema_check in sync at 0.10.5-phase4.5e
- verify-production-output Section A-G + I-L PASS; Section H 1
  known FAIL (orphan BK.json legacy snapshot, pre-existing)
- frontend build verified via vercel-preview-auditor (sonnet) on
  main HEAD e6013ba — 506/506 routes compiled, types validated,
  runtime clean, 3-route UA probe PASS

Defense scorecard: 7 active vetoes unchanged
(altman_distress / sloan_accruals_top_decile / net_issuance_top_decile
/ non_reliance_filing / beneish_manipulation_veto /
dechow_manipulation_veto / data_quality_input_corruption).
Headline 32 → 33 declared boolean flags
(adds multi_class_aggregate_shares_suspected per PR #264; PR #265
DQIC rename is identifier-shape, not new flag).

Production output: metadata.json reports 0.10.4-phase4.5e from cron
#4 (2026-05-26T01:12); next weekday cron Wed 2026-05-27 22:00 UTC
re-renders at full 0.10.5-phase4.5e semantics. Tag is anchored to
code, not last committed snapshot per release-tag SKILL.md §Gotchas.

CVE baseline 25 → 15 open (0C/6H/7M/2L); all 15 are next@14.x SSR
advisories with zero exploitability on static-export.

Post-merge: tag command + GitHub Release creation require explicit
user authorization per CLAUDE.md §Executing actions with care.

https://claude.ai/code/session_01JwntEE4PNAXSMkZxRA9BB4

Co-authored-by: Claude <noreply@anthropic.com>
dackclup added a commit that referenced this pull request May 26, 2026
…stale INFLIGHT markers (#267)

Phase B (post-tag housekeeping) per the v1.3.0 release plan. Pure
doc-pointer maintenance; no code touched.

Scope (3 files):
- CLAUDE.md §Phase status — Latest release tag pointer bumped
  v1.2.0-phase4.5 (6d414a9) → v1.3.0-phase4.5e (5db3b97);
  prior tag preserved as historical reference
- PHASE_STATUS.md §Current state — same pointer bump + one-line
  description of what the release closes
- PHASE_STATUS_INFLIGHT.md — 11 stale (in flight) header markers
  updated to (merged YYYY-MM-DD, SHA) with PR number prefix; PRs
  drained: #244 / #245 / #246 / #250 / #251 / #252 / #256 / #257 /
  #258 / #263 / #266. Bodies stay in place (full historical record
  preserved); future weekly housekeeping commit moves them between
  sections per PR #237 convention.

Note on tag: v1.3.0-phase4.5e was created locally during the
release session but `git push origin <tag>` failed HTTP 403 from
sandbox (proxy permits branch pushes, not tag-ref pushes). User
runs the tag commit + push from their own machine on the squash-
merge SHA 5db3b97. This PR's pointer bumps reference the tag AS
IF live per release-tag SKILL.md §7 (anchors to commit SHA, not
tag-availability state).

Markdown-only diff; ruff / schema_check / pytest N/A.

PHASE_STATUS_INFLIGHT.md side-file satisfies §Conventions "ship
with every PR" lockstep per PR #237 convention.

https://claude.ai/code/session_01JwntEE4PNAXSMkZxRA9BB4

Co-authored-by: Claude <noreply@anthropic.com>
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