feat(landing): rebuild landing page into GMX's nine-section structure (GF3-002) - #616
Merged
Conversation
- Add LiquiditySection component to display liquidity stats and pool cards. - Remove Markets and Nav components as part of the redesign. - Introduce NewsletterForm for email subscriptions. - Create PoolCard for displaying individual pool information. - Add ProgramCards for showcasing trading and developer programs. - Implement Quarter and RoadmapSection for displaying project milestones. - Add SocialSection with a newsletter form and social stats. - Create SocialSlider for displaying community testimonials. - Introduce SponsorsSection to highlight ecosystem partners. - Remove Stats and Ticker components as they are no longer needed. - Add useLandingStats hook for managing landing page statistics. - Implement utility functions for formatting numbers and currencies. - Update global CSS with new styles for landing page components.
|
@0xMegie is attempting to deploy a commit to the Ijai's projects Team on Vercel. A member of the Team first needs to authorize it. |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Contributor
|
The FAQ implementation doesn't appear to match the accessibility notes in the PR description. |
6 tasks
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.
Closes #510
Rebuilds
/section-by-section to mirror GMX's Home page, consuming the themetokens GF3-001 landed. Structure only — placeholder copy and visuals throughout,
all marked
TODO(GF3-003)so the finishing work is greppable.Spec:
docs/gf_3/002_landing_page.md· Theme:docs/gf_3/001_theme_update.mdGMX reference:
gmx-io/gmx-interface@e27759a,landing/src/pages/Home/What changed
apps/web/src/ui/landing/*is replaced wholesale. The oldhero/stats/features/markets/how-it-works/infrastructure/final-cta/footer set is
gone; nine components now compose from
apps/web/src/routes/index.tsxin GMX'sorder:
HeaderMenubtn-landing"Open app" →/tradeHeroSectionFeatureGridrounded-20cards,lg:grid-cols-3 lg:grid-rows-3, onebg-blue-400, one col-span-2 CTALaunchSectionLiquiditySection#F4F5F9) — live total + pool cards with hover liftSponsorsSectionProgramCardsFaqSectionRoadmapSectionSocialSectionThere is no separate footer component —
SocialSectionends with the footerlink row, matching GMX.
Design tokens
packages/ui/src/styles/globals.cssgains landing-scoped additions only —nothing existing was modified:
--radius-8/12/20— the app-wide--radiusis0by design (sharp corners);the landing look needs a rounded scale, so these are namespaced rather than
touching
--radius-sm/md/lg/xl.--text-12/14/16/18/24/28/30— sizes the spec calls for that the app scaledidn't need yet.
--animate-title-in/outkeyframes for the hero word rotation.--color-gmx-sponsors-border/--color-gmx-card-shadow— replacing twohexes the spec had inline, so
check:tokensstays clean.Accessibility
@workspace/ui/components/accordion, which alreadyimplements GMX's exact
grid-rows: 0fr → 1frexpand (no JS measurement) andbrings
aria-controls/aria-labelledby/role="region"/ focus rings.tabIndex={0}withrole="group"+aria-labelanda visible focus outline — it was pointer-only otherwise, since a scroll
container is only arrow-key scrollable once focused.
role="dialog"+aria-modal, locks body scroll, and trapsTab within the panel (Escape-to-close was already inherited from
useMobileMenu).Bug fixed along the way
The header wrapped
SiteLogo— which renders its own<a href="/">— in asecond anchor. Nested
<a>is invalid HTML and it was failing hydration forthe whole landing route, discarding the SSR tree and re-rendering on the
client. Console errors on
/went from three to zero. Also swappedButton render={<Link/>}for a styledLink, since "Open app" navigates andBase UI warns that the pattern strips native button semantics.
Testing
Full gate passing:
bun lint,bun typecheck,bun run check:tokens,bun run test,bun run test:coverage,bun run build.Visual-regression baselines for
/regenerated (4 files: dark/light ×desktop/mobile). Two new e2e specs:
e2e/landing-responsive.spec.ts— 768px and 1440px, the widths acceptancenames that
design-system-visual.spec.tsdidn't cover, scoped to/so noother route's baselines change. Each width gets a screenshot baseline plus a
hard "no horizontal overflow" assertion.
e2e/landing-a11y-check.spec.ts— asserts the three keyboard/focus criteriaabove rather than leaving them to manual review.
11/11 landing e2e tests pass across three consecutive runs.
design-system-visual.spec.tsnow installs a pausedpage.clockinbeforeEach. Playwright'sanimations: "disabled"freezes CSS animations butnot JS timers, so the hero's rotation interval could advance mid-screenshot and
flake;
reducedMotion: "reduce"doesn't help because this Chrome Headless Shellbuild reflects it in neither
matchMedia()nor CSS@media(verified directly).Reviewer notes — deliberate deviations
AnimatePresenceexplicitly. The repo has zero JS animation dependencies, sothis is CSS keyframes (
y: 98→0→−98, 0.25s ease-in-out, 2.5s cycle) driven bya React interval. Visually equivalent; not a line-for-line port of
AnimatedTitle.tsx. Happy to add the dependency if spec fidelity wins.-permanently.useLandingStatsreturns all-null — SO4 hasno aggregate stats endpoint, and
usePoolsDatais still a static stub. The"no layout shift when values arrive" criterion is therefore unverifiable
today; the stat values reserve no explicit width yet.
"- in liquidity"while loading. Faithful toGMX's own loading state, but it reads like a bug in an 80px display heading.
href="#". Real URLs weren't sourced;the newsletter form has a placeholder handler and no endpoint.
Items 2–4 are arguably GF3-003 territory but are called out so they aren't a
surprise in review.
Out of scope (GF3-003)
Final copy, real partner/tweet content, recreated image assets, and pixel-perfect
parity polish. 15
TODO(GF3-003)markers mark every placeholder.