Add public landing page + waitlist experience (landing/) - #30
Closed
arena-ai-coding-agent[bot] wants to merge 1 commit into
Closed
arena-ai-coding-agent[bot] wants to merge 1 commit into
arena-ai-coding-agent[bot] wants to merge 1 commit into
Conversation
- 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>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.tomlpackage list, one README pointer).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 viahtml[data-theme]with no-flash bootstrap. Fonts self-hosted (OFL license bundled) instead of the Google CDN.sample_data/bypython -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.landing/server.py, FastAPI, samecreate_app+python -mconventions asbackend/):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.POST /api/waitlist/form, which renders a minimal server-side result page.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 withrole=statusfeedback, 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 inruff.tomlrespected).Run
python -m landing.server --port 8090 # http://127.0.0.1:8090Files
landing/— new self-contained package (server, store, generator, static site, README)tests/test_landing_waitlist.py— waitlist service contract testspyproject.toml— includelanding*+ package-data;.gitignore— ignorelanding/data/;README.md— one pointer section