Skip to content

Add public landing page + waitlist experience (landing/) - #30

Closed
arena-ai-coding-agent[bot] wants to merge 1 commit into
mainfrom
arena/01a069b4-materialscope
Closed

arena-ai-coding-agent[bot] wants to merge 1 commit into
mainfrom
arena/01a069b4-materialscope

Conversation

@arena-ai-coding-agent

Copy link
Copy Markdown

Summary

Adds a production-quality public landing page + waitlist experience for MaterialScope as a self-contained landing/ package. No product architecture changes — the only shared-file touches are housekeeping (.gitignore, pyproject.toml package list, one README pointer).

  • Static site (landing/web/): zero-dependency HTML/CSS/vanilla JS built on the Dash app's own design tokens (dash_app/assets/style.css) — IBM Plex Sans/Mono, warm neutrals, sand accent, light/dark via html[data-theme] with no-flash bootstrap. Fonts self-hosted (OFL license bundled) instead of the Google CDN.
  • Honest hero visual: the interactive plot panel renders real sample traces generated from sample_data/ by python -m landing.gen_traces (XRD / DSC / TGA / DTA / FTIR / Raman). Axes, units, and peak/step annotations (e.g. 43.64° 2θ · d = 2.072 Å, endothermic peak · 255 °C) are computed from the data — nothing fabricated. Crosshair readout, technique tabs, and sparkline cards all drive the same panel.
  • Waitlist API (landing/server.py, FastAPI, same create_app + python -m conventions as backend/): POST /api/waitlist (pydantic contract, email validation, idempotent duplicates, honeypot, 6/min/IP sliding-window rate limit) backed by an append-only JSONL store (landing/store.py, gitignored — submissions never enter the repo). Since the product has no user database, WaitlistStore.join(email, role) -> "joined" | "already" is the single documented seam to swap in a real DB/CRM; the HTTP contract stays stable.
  • No-JS fallback: the form degrades to POST /api/waitlist/form, which renders a minimal server-side result page.
  • Copy reflects the repository's actual story (vendor-independent multimodal workbench; import → review → analyze → compare → export; four audiences from the product's About page; keeps the "does not replace expert validation" notice). No fake counters, testimonials, or invented features.

Motion & performance

Staggered entrance, scroll-triggered reveals, trace draw-on, damped pointer parallax, navbar condense — transform/opacity only, fully disabled under prefers-reduced-motion. Page payload ≈ 165 KB. Accessibility: semantic landmarks, labelled form fields with role=status feedback, visible focus rings, mobile sheet nav, 16px inputs (no iOS zoom).

Validation

  • pytest tests/test_landing_waitlist.py — 17 tests: join/duplicate/invalid/honeypot/rate-limit, store reload + dedupe, form-encoded fallback, static serving, health.
  • ruff check . --output-format concise — clean repo-wide (new-file contract in ruff.toml respected).
  • 32-check jsdom smoke harness against the live server: tabs, modality cards, theme toggle, mobile sheet, form validation/submit/success/error paths, reduced-motion, missing-traces fallback. (Sandbox blocks browser downloads, so pixel review was done via the live preview + static audit rather than screenshots.)

Run

python -m landing.server --port 8090   # http://127.0.0.1:8090

Files

  • landing/ — new self-contained package (server, store, generator, static site, README)
  • tests/test_landing_waitlist.py — waitlist service contract tests
  • pyproject.toml — include landing* + package-data; .gitignore — ignore landing/data/; README.md — one pointer section

- Self-contained FastAPI site in landing/: static page + POST /api/waitlist
  with JSONL-backed dedup store, honeypot, per-IP rate limit; no-JS form
  fallback at /api/waitlist/form. Zero product coupling; pydantic contract
  mirrors backend/ conventions.
- Landing visuals render real sample traces (DSC/TGA/DTA/FTIR/Raman/XRD)
  generated from sample_data/ via landing/gen_traces.py — peak/step
  annotations are computed from the data, nothing is fabricated.
- Design reuses the Dash app tokens (IBM Plex, warm neutrals, sand accent,
  light/dark via html[data-theme]); fonts self-hosted (OFL, bundled).
- Motion: staggered entrance reveals, scroll-triggered reveals, trace
  draw-on, hero parallax — all transform/opacity, prefers-reduced-motion
  honored throughout.
- Tests (17) + ruff-clean under the repo lint contract; waitlist data
  gitignored.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
@vercel

vercel Bot commented Sep 4, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated
material-scope Ready Ready Preview Sep 4, 2026 12:22am UTC

@utkuvibing utkuvibing closed this Sep 4, 2026
@utkuvibing
utkuvibing deleted the arena/01a069b4-materialscope branch September 4, 2026 11:26
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