Skip to content

feat: public marketing landing page at / - #4

Merged
fadesany merged 11 commits into
mainfrom
feat/landing-page
Aug 12, 2026
Merged

fadesany merged 11 commits into
mainfrom
feat/landing-page

Conversation

@fadesany

@fadesany fadesany commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Public marketing landing page at /

Adds a public marketing landing page in front of the wallet-connect treasury dashboard. The dashboard moves to /app; the new landing page owns /.

Routing

Uses multiple root layouts via Next.js route groups — there is no shared top-level app/layout.tsx:

  • app/(app)/ — the existing dashboard, now served at /app (dark theme, wallet Providers). Only import paths and internal home links changed; behavior is unchanged.
  • app/(marketing)/ — the new landing page at / (its own <html>/<body>, light neo-brutalist theme, no wallet code).

What's on the page

Nav → Hero → Problem → How it works → Proof (on-chain) → Contributors → Footer. One animated element (the approval-threshold meter, honoring prefers-reduced-motion). Copy is grounded in README.md and SECURITY.md.

Constraints honored

  • No new backend dependency. The only dynamic value — the factory contract id — is read from NEXT_PUBLIC_FACTORY_CONTRACT_ID at build/render time (a build-inlined public constant), not a live fetch/RPC/indexer call. Confirmed by the build output: / stays ○ (Static).
  • TypeScript strict, no any. tsc --noEmit clean.
  • Tailwind tokens are additive — the marketing palette/shadows/radii were added under theme.extend; the dashboard never references them.
  • Neo-brutalist system per the visual direction: gold is the only decorative color (fill only, never text on paper), green/red state-only, footer is the sole inverted surface, no gradients.

Accessibility

lang="en"; banner/main/contentinfo landmarks; labeled <nav>s; valid h1→h2→h3 outline; skip-to-content link; visible focus rings on every control (paper-colored on the inverted footer); external-link convention ( + rel="noopener noreferrer" + sr-only "opens in a new tab"); the threshold meter carries meaning in text, never color alone.

Verification

  • npm run typecheck --workspace @charter/web — clean
  • npm run lint --workspace @charter/web — no warnings or errors
  • npm run build --workspace @charter/web — success; / prerendered as static content (1.55 kB, 108 kB First Load JS)

⚠️ Flags — please confirm before merge

These are items I could not verify against the repository. Per the brief, I flagged them here rather than inventing facts:

  1. Docs URL still unverified. DOCS_URL = https://chusdrter.gitbook.io/chusdrter-docs came from the build brief. The docs content now lives in-repo under docs/ (this branch was updated from main, which merged the GitBook docs in docs: add GitBook documentation site #2), and .gitbook.yaml sets root: ./docs — but nothing in the repo records the published GitBook subdomain, so the exact URL in links.ts still can't be confirmed from source. Please confirm it resolves, or point me at the canonical docs URL.
  2. No LICENSE file exists anywhere in the repo. I therefore omitted any license claim from the footer and softened the contributors copy from "open source" to "developed in the open." If Charter is meant to be open source, add a LICENSE and I'll restore the wording + a footer license line.
  3. Treasury figures are third-party and volatile. The Problem section shows $4.8B (Uniswap) / $200M+ (Optimism) / $40M–$200M (Arbitrum). These are not in the repo; they're framed on-card as "Publicly reported DAO treasuries · illustrative" and are not presented as Charter's own data. Kept per direction — please date/source them or swap for a citation.
  4. Factory address shown in the Proof section is whatever NEXT_PUBLIC_FACTORY_CONTRACT_ID the build is configured with; when blank the section says so and points at read-only browse mode (matching the README). Nothing is hard-coded.
  5. Proof meter (5/5) is illustrative — no real default-threshold value is exposed at build time, so the meter stands in as an example and is labeled as such.
  6. Repo/label facts that are verified: github.com/Ch-rter/app + /contract, maintainer @fadesany, the good first issue label, and the README Contributing anchor all check out against README.md.

fadesany and others added 10 commits August 12, 2026 20:57
Add a public marketing landing page at "/" in front of the wallet-connect
treasury dashboard. This commit is the routing scaffold only — no landing
content or design tokens yet; sections follow in later commits.

Routing decision: multiple root layouts via route groups, not a single
shared root layout. The landing page needs a fundamentally different shell
from the dashboard — light neo-brutalist theme, its own display/mono fonts,
its own nav, and no wallet Providers — while the dashboard keeps its dark
theme, SiteHeader, and React Query + wallet Providers. Two route groups,
each with its own root <html>/<body> layout, isolate the two shells cleanly;
a single shared root layout would force conditional chrome and a shared
<body> theme. (The PRD left this open pending the actual repo layout.)

- Delete the top-level app/layout.tsx root layout.
- (app)/ group: the dashboard root layout (moved from the old root layout)
  plus every dashboard route. The org directory moves from "/" to "/app";
  /new and /org/[treasury]/... keep their exact URLs so direct treasury
  links still resolve without detouring through the landing page.
- (marketing)/ group: root layout + landing page owning "/".
- Moved routes switch to the @/ import alias (depth-independent), and the
  in-app "home" links (header wordmark, "All organizations" back links)
  now point at /app.

globals.css stays at app/globals.css, imported by both root layouts. No
dashboard behavior or visual change — it simply lives at /app now.

typecheck + next build pass; routes: / (static landing), /app, /new,
/org/[treasury], /org/[treasury]/requests/[requestId].
Add the soft-rounded neo-brutalist token set the marketing landing page
builds on, scoped so the dashboard renders identically:

- colors: ink becomes CSS-variable-backed (rgb(var(--color-ink, ...))),
  with fallback channels reproducing the exact dashboard hexes; additive
  paper / paper-raised / ledger-gold / signal-green / flag-red.
- borderRadius: card 20px, pill 999px, badge 12px.
- boxShadow: brutal (4px 4px 0) and brutal-pressed (2px 2px 0) hard edges.
- fontFamily: display (Space Grotesk) and body (Inter); mono is reused,
  the marketing root repointing --font-mono at IBM Plex Mono.

The (marketing) root layout loads the three fonts via next/font and
applies .marketing-root, which sets --color-ink and color-scheme: light.
The dashboard sets none of these variables, so its dark theme is
unchanged. typecheck + build:web pass.
A horizontal pill of `total` equal segments with hard 2px ink gaps.
Filled segments carry the ledger-gold fill; a fully-met meter
(filled === total) turns its final segment signal-green with a check.

- animate (hero only) fills left-to-right over ~800ms on mount; under
  prefers-reduced-motion it renders fully filled immediately, no timers.
- Deterministic initial state keeps SSR/hydration in sync (matchMedia is
  read only in the effect).
- The optional label carries the meaning as mono text so state never
  depends on colour; the bar is aria-hidden when a label is present and
  otherwise exposes its own n-of-m aria-label.

Lives under components/marketing/ to stay separate from the dashboard's
dark-theme component set. typecheck + lint pass.
Inverted bg-ink/text-paper footer in mono with product, source, and project link columns. License intentionally omitted (repo has no LICENSE file). Softens contributors intro from 'open source' to 'developed in the open' for the same reason.
First focusable element, sr-only until focused; lets keyboard users bypass the sticky nav. Adds id=main-content on <main>.
@vercel

vercel Bot commented Aug 12, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
app-web Ready Ready Preview Aug 12, 2026 10:02pm

@fadesany
fadesany merged commit a364e52 into main Aug 12, 2026
4 checks passed
@fadesany
fadesany deleted the feat/landing-page branch August 12, 2026 22:10
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