Skip to content

Feat/frontend redesign - #1490

Merged
hman38705 merged 8 commits into
mainfrom
feat/frontend-redesign
Sep 8, 2026
Merged

Feat/frontend redesign#1490
hman38705 merged 8 commits into
mainfrom
feat/frontend-redesign

Conversation

@hman38705

Copy link
Copy Markdown
Contributor

Description

Type of Change

  • Bug fix
  • New feature
  • Refactor / code cleanup
  • Documentation update
  • CI / tooling change
  • Breaking change

Testing Done

Bundle Size

Chunk Before After
vendor.js
main*.js
pages/_app*.js

Checklist

  • Tests pass locally
  • Documentation updated (if applicable)
  • No breaking changes, or breaking changes are documented above
  • If you added or changed an API endpoint, regenerated the OpenAPI spec and committed the result:
    cd services/api && cargo run --bin generate-openapi > openapi.yaml
    git add openapi.yaml && git commit -m "chore: regenerate openapi.yaml"
  • If you changed system architecture (new service, database, external dependency, or network boundary), updated docs/architecture.md
  • Bundle size checked (if frontend changes)

Related Issues

Closes #

hman38705 and others added 8 commits September 8, 2026 11:49
Adds ui.css for the hover/focus-visible/active states the ui/ primitives'
classNames (ui-btn, ui-card, ui-field, ...) already emitted but no CSS
ever defined. Adds a generic Badge primitive and refactors
MarketStatusBadge onto it instead of its own bespoke pill CSS. Adds a
ui/ barrel export.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016f3phkChoqfM1Ui1VzUQk9
AppShell's header/nav had no CSS at all (fully inline-styled) and no
narrow-viewport handling, unlike every other section of the app; it's
the persistent chrome for Markets/Statistics/Create/account/tx pages so
this was the single biggest responsive gap. Also give the statistics
category/volume tables horizontal scroll below 640px, matching the
pattern admin's tables already use.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016f3phkChoqfM1Ui1VzUQk9
…ages

Bet history was completely unstyled (bare table, no CSS at all).
GDPR delete/export and newsletter-unsubscribe used large inline style
objects with token values but no hover/focus-visible states and no
responsive handling. Converted all four to page-scoped CSS files with
classNames only — no JSX structure, logic, or aria attribute changes.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016f3phkChoqfM1Ui1VzUQk9
The landing nav-menu collapsed to display:none below 860px with no way
to reopen it - Features/How It Works/About/Contact were unreachable on
mobile except by scrolling. Adds a hamburger toggle (aria-expanded,
Escape-to-close, 44px touch target) that turns the menu into a
dropdown panel, and updates e2e/mobile.spec.ts (which had pre-written,
feature-detected tests waiting for exactly this - issue #12) to
exercise the real open-menu-then-navigate flow instead of skipping.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016f3phkChoqfM1Ui1VzUQk9
…from generic-AI-SaaS look

The cinematic dark/gold-purple pass (gradient-clip headlines, ambient
glow blobs, glassmorphism pills, gradient CTA buttons) read as a
generic AI-generated SaaS template rather than a professional trading
product. Reworks the foundation instead:

- tokens.css: sharper radii (was 8/14/22px, now 4/6/10px), a new
  --font-mono (self-hosted JetBrains Mono) for tabular numeric data,
  shadow-glow-* reduced from big ambient halos to flat 1px rings,
  --grad-brand and --surface-glass removed (no longer used anywhere).
- Landing hero rebuilt as two columns: copy/CTAs left, a new
  LiveMarketsTicker (real fetched market data, not decoration) right.
  Gradient-clip headline/eyebrow/CTA/step-number treatments replaced
  with solid color + flat borders across landing.css, Statistics.css,
  admin.css, and markets/create/page.css.
- Flattened remaining --surface-glass usage (markets, statistics,
  bets, VolumeChart, ExportButton, AssetBadge) to solid --surface.

Fixed two things the ticker's new mount-time fetch broke: a crash
when a test's global.fetch mock returns a non-array shape (defensive
Array.isArray guard), and several LandingPage tests whose fetch-count
or mockResolvedValueOnce assumptions didn't anticipate a second
concurrent fetch call - stubbed api.getFeaturedMarkets alongside the
existing getStatistics stub, matching that file's own established
pattern for exactly this class of problem.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016f3phkChoqfM1Ui1VzUQk9
…ng them

app's CSP sends style-src 'self' with no unsafe-inline and no nonce, so
AppShell's inline style props on header/logo/nav/main/footer were being
silently dropped by the browser instead of applied. Moved them into
ui.css classes. Also scope landing.css's header/footer selectors to
.landing-page so they stop leaking into AppShell's chrome on every
other route.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T9ph1fy2XQ3wQwtDYzyNZ8
admin.css's sticky header kept the blur(12px) glass treatment the
trading-terminal pivot (bfe4ae3) already removed from AppShell's
header, and TransactionStatusView's card still had a decorative
diagonal surface gradient. Neither was caught by that pass. Flatten
both to match the rest of the app.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T9ph1fy2XQ3wQwtDYzyNZ8
The app's CSP (style-src 'self', no unsafe-inline, no style nonce)
silently drops any inline style="" attribute. Beyond AppShell (fixed
separately), this affected the entire ui/ design-system primitives
(Button, Card, Modal, Select, TextInput, Textarea), their live
admin/Form.tsx and admin/Modal.tsx duplicates, all five admin pages,
the admin auth-gate form, ErrorBoundary's action buttons, and
OutcomeList's (dead/unused) probability bar.

- ui.css: resting styles for the ui/ primitives moved from inline
  style props to classNames, plus a small fixed utility layer
  (u-flex/u-gap-*/u-text-*/u-color-*/u-grid-2/...) standing in for the
  one-off flex/spacing/color wrappers that used to litter admin pages.
- admin.css: same treatment for admin/Form.tsx's Form/FormField/Input/
  Textarea/Select/Button/StatusAlert and admin/Modal.tsx, plus the
  admin header brand/exit-link and the AdminAuthGate form (previously
  had zero CSS at all - rendered as bare unstyled HTML).
- Each of the 5 admin pages (audit, blockchain replay, content,
  email analytics, email preview) gets its own page-scoped CSS file
  for styling that isn't reusable elsewhere.
- OutcomeList: dropped the inline custom-property (also CSP-blocked
  and unconsumed by any CSS rule) in favor of static classes; added
  the label/odds styling it never had.
- ErrorBoundary: action-button row moved to accessibility.css.

Verified via build + full test suite (12 pre-existing failures,
unrelated to these files, reproduce identically on the prior commit)
and Playwright screenshots of all five admin pages plus the auth gate.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T9ph1fy2XQ3wQwtDYzyNZ8
@hman38705
hman38705 merged commit a3f96de into main Sep 8, 2026
4 of 50 checks passed
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.

1 participant