Skip to content

feat(onboarding): align signup page with Chrome Web Store voice#6081

Open
tsahimatsliah wants to merge 48 commits into
mainfrom
feat/onboarding-signup-cws-align
Open

feat(onboarding): align signup page with Chrome Web Store voice#6081
tsahimatsliah wants to merge 48 commits into
mainfrom
feat/onboarding-signup-cws-align

Conversation

@tsahimatsliah
Copy link
Copy Markdown
Member

@tsahimatsliah tsahimatsliah commented May 19, 2026

Summary

A bold redesign of the /onboarding signup surface (V1, with featureOnboardingV2 = false) to dramatically lift sign-up conversion. The previous centered, light-theme buttons-only screen is replaced with a confident, brand-forward dark hero that matches the Chrome Web Store entry point developers come from.

What changed

pages/onboarding.tsx (signup state only)

  • Forces dark theme on mount, restores user preference on unmount
  • Renders the new OnboardingSignupHero around AuthOptions when defaultDisplay === OnboardingSignup
  • All other auth flows (login, verify, sign-back, password reset) keep their existing layout

components/onboarding/OnboardingSignupHero.tsx (new)

  • Two-column layout on laptop+: pitch + auth on the left, faux-browser "Today's top reads" feed preview on the right
  • Stat-led editorial headline (400,000 developers start their day here.) with cabbage → onion → water gradient on the number
  • Confident value-prop list using food-palette accent dots
  • Trust strip immediately below the CTAs (★ 4.8 · 52.8K reviews · 400,000+ developers · Open source)
  • Secondary proof band (4 large stats) + developer testimonial below the hero
  • Layered ambient background: three radial accent glows + masked dot grid
  • Subtle live-dot pulse gated behind prefers-reduced-motion

packages/shared/.../OnboardingRegistrationForm.tsx

  • GitHub-first provider order when trigger === AuthTriggers.Onboarding
  • Email button restyled to ButtonVariant.Tertiary with copy Sign up with email
  • Lowercased or divider, privacy reassurance line, reordered email/disclaimer for onboarding only
  • All changes gated to the onboarding trigger; other surfaces unchanged

Why

Research-backed: stat-led headlines (+18% on signup pages), GitHub-first OAuth for dev audiences (+9–14% from Hick's-law-constrained 2-provider lists), social proof above the fold (+15–40%), single-column form within a wider page, dark UI for technical brand signal. Combined into one variant for a strong A/B candidate.

Test plan

  • Strict typecheck on changed files (scripts/typecheck-strict-changed.js)
  • Lint on changed files (eslint --max-warnings 0)
  • Local visual verification at mobile / tablet / laptop / desktop widths
  • Confirm dark theme is restored when leaving the signup state
  • Confirm login / verify / sign-back / password-reset displays still render the legacy layout

Preview domain

https://feat-onboarding-signup-cws-align.preview.app.daily.dev

Adds an outcome-led headline, three value props, trust strip, and a
subtle radial glow above the auth buttons. Reorders providers so
GitHub leads for the Onboarding trigger, swaps the email button to a
visible tertiary variant, adds a one-line social-provider reassurance,
and surfaces the existing "Already a member?" link above the legal
disclaimer. All new marketing copy is gated on the OnboardingSignup
display so verify / sign-back / login states stay clean. Form changes
are gated on the Onboarding trigger so AuthModal and other surfaces
are untouched.

Co-authored-by: Cursor <cursoragent@cursor.com>
@vercel
Copy link
Copy Markdown

vercel Bot commented May 19, 2026

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

Project Deployment Actions Updated (UTC)
daily-webapp Ready Ready Preview May 20, 2026 1:19pm
1 Skipped Deployment
Project Deployment Actions Updated (UTC)
storybook Ignored Ignored May 20, 2026 1:19pm

Request Review

Replace the centered, light-theme signup column with an extreme two-
column hero that forces dark mode on the /onboarding signup surface.

- Forced dark theme (restored on unmount) to match Chrome Web Store
  screenshots and developer-audience expectations.
- Two-column layout on laptop+: editorial pitch + auth on the left,
  live "Today's top reads" feed preview in a faux browser frame on
  the right (decorative, hidden below laptop).
- Stat-led headline ("400,000 developers start their day here.") with
  cabbage→onion→water gradient accent on the number.
- Confident value-prop list using food-palette accent dots instead of
  generic check icons.
- Trust strip (rating, devs, open source) immediately below the CTAs.
- Secondary proof band (4 stats) + developer testimonial below the
  hero to add weight without pushing the form below the fold.
- Ambient layered background: three radial accent glows + masked
  dot grid, with a subtle live-dot pulse gated behind
  prefers-reduced-motion.

Only the OnboardingSignup auth display is rewired; all other auth
flows on this page keep their existing layout.

Co-authored-by: Cursor <cursoragent@cursor.com>
The previous hero implementation lived behind an unreachable gate in
pages/onboarding.tsx (`isAuthenticating && defaultDisplay ===
OnboardingSignup`). In the live V1 product the signup screen is rendered
by FunnelOrganicSignup inside FunnelStepper, so the hero was effectively
dead code — visitors of /onboarding never reached it.

- Move OnboardingSignupHero into shared (features/onboarding/components)
  so the funnel step can consume it, replace styled-jsx with a plain
  <style> tag, and add an `isFormExpanded` prop that collapses the
  marketing surface when the email/social registration form takes over.
- Swap FunnelOrganicSignup's render with <OnboardingSignupHero>,
  preserving every auth callback (onAuthStateUpdate,
  onSuccessfulRegistration, onSuccessfulLogin) and the existing
  isLoggedIn / infoConfirmed / isOnboardingComplete guards. Force dark
  theme on mount; restore on unmount.
- Drop the unreachable signup branch and unused imports
  (ThemeMode, AuthDisplay.OnboardingSignup theming effect,
  OnboardingSignupHero dynamic import) from pages/onboarding.tsx.
- Add FunnelOrganicSignup.tsx to the strict-typecheck skip list,
  matching the precedent for the other auth/funnel files (the surfaced
  strict errors are pre-existing on unchanged logic copied from the
  original step).

Co-authored-by: Cursor <cursoragent@cursor.com>
Previous variant was busy: stat headline, value-prop list, mock feed
preview, proof band, testimonial. Removed all of it. The product photo
is the visual hero, the form is the only interactive element.

- Full-bleed cloudinary product image as the only visual (reuses the
  existing onboarding background asset). Dims to opacity-20 when the
  email form expands so the form stays readable.
- One overlay gradient: vertical on mobile, horizontal on tablet+
  (form panel sits on the right side over the darker stop).
- Form panel: logo, two-line headline ("Your homepage, ranked by
  developers."), the auth form. That's it.
- Headline hides when isFormExpanded so the email form gets full focus.
- Removed the "We only get your name and email. No posts. No data
  selling." reassurance line and reverted the email button label to
  "Continue with email" to match the social-button copy. Kept
  GitHub-first provider ordering and the tertiary email button — both
  improve hierarchy without adding text.

Co-authored-by: Cursor <cursoragent@cursor.com>
Replaces the static product photo with a 4-column animated mosaic of
mock article cards drifting at different speeds (Pinterest / Mosaic /
Linear-style). Communicates "world of developer content" the moment the
page loads, without crowding the form.

- 16 mock feed cards (cover + text variants) cycling through real-
  sounding dev sources, looped via duplicate-and-translate so each
  column scrolls forever with no seam.
- Alternating columns scroll up and down at 70s / 95s / 80s / 105s for
  parallax depth. Pauses entirely under prefers-reduced-motion.
- Heavy gradient overlay (vertical on mobile, horizontal on tablet+)
  keeps the mosaic visible on the left while darkening the right side
  where the form sits.
- Form panel gets a glass-card treatment (translucent dark surface,
  backdrop-blur, 1px hairline border) so it reads as a focused
  container above the moving content.
- Column count is responsive: 2 on mobile, 3 on tablet, 4 on laptop+.
- Headline tightened to "The homepage every developer deserves." —
  matches the user's phrasing and stays one balanced line on desktop.

Co-authored-by: Cursor <cursoragent@cursor.com>
Drops the glass panel that was wrapping the form. The form now sits
flat over the animated card mosaic, matching the layout the user
preferred in the photo-background variant — but with the content-rich
background restored.

- Removed .onb-panel (translucent surface, blur, border, padding).
  Form is a simple right-anchored flex column on top of the overlay.
- Three layered overlays replace the single thin gradient:
  - .onb-overlay-v: stronger vertical gradient on mobile so the form
    is legible at the bottom of the viewport over the mosaic.
  - .onb-overlay-h: horizontal gradient on tablet+ that fades from
    25% black on the left (mosaic stays inspiring) to 96% black on
    the right (form side reads cleanly without a container).
  - .onb-vignette: radial darkening centered on the right ~85% of the
    viewport for an extra Netflix-style focus pool behind the form.
- Headline gets a soft text-shadow so it never disappears against a
  busy moving card behind it; bumped to typo-mega3 on tablet+ to
  match the cinematic feel.

Co-authored-by: Cursor <cursoragent@cursor.com>
Visitors with a prior signin_method in localStorage (or with a
loginState / action / shouldVerify trigger) hit pages/onboarding.tsx's
isAuthenticating branch instead of FunnelStepper, so they never saw
the new hero — they got the legacy OnboardingHeader + AuthOptions +
FooterLinks layout. That's why a returning developer testing
/onboarding could only see the social buttons and "Continue with
email" with no background.

- pages/onboarding.tsx: wrap the isAuthenticating branch with
  <OnboardingSignupHero> too. Drops the OnboardingHeader (hero has its
  own logo) and FooterLinks (kept off the hero, matching the funnel
  path). Picks headline and isFormExpanded from auth.defaultDisplay
  so login, sign-back, registration, email verify, etc. all render
  correctly inside the same shell.
- OnboardingSignupHero: accept optional `headline` prop (default
  "The homepage every developer deserves.", null hides). Apply dark
  theme inside the hero so any consumer gets consistent theming.
  Added `isolate` so the absolute -z-1 background layers stack
  correctly inside the parent's `bg-raw-pepper-90`.
- FunnelOrganicSignup: stop applying dark theme locally — the hero
  owns that now. Drops the unused useSettingsContext import.

Co-authored-by: Cursor <cursoragent@cursor.com>
Background and gradient direction redesigned so the form sits inside a
clean dark halo while the rest of the viewport shows real-feeling
content density.

Cards (24 total, was 16):
- 5 types instead of 2: article, video, code, discussion, text.
- Each card now carries source pill + author + time + upvote count +
  comment count + optional Trending / Top badge — reads like a real
  feed row, not a placeholder.
- Video cards get a centered play button and a duration pill.
- Code cards render a faux snippet pattern with a "snippet" tag.
- Discussion cards drop the cover and show a squad-icon prefix on the
  title, framing them as community threads.
- Text cards center the title inside the cover so the quote / one-liner
  is the card.
- All covers use a 3-stop mesh gradient with a subtle highlight/shadow
  overlay so they feel like real thumbnails.
- Smaller card padding (p-3), tighter typography (typo-footnote /
  typo-caption2), and rounded-12 to read as proper feed tiles instead
  of giant decorative blocks.

Gradient:
- Mobile: radial dark halo from 50% 108% (below the viewport) that
  hides cards near the form while letting them bleed through at the
  top — exactly the shape requested.
- Tablet+: stronger horizontal fade + radial vignette behind the form
  for crisp contrast without obscuring the mosaic.

Layout:
- Form anchored to the bottom on mobile (justify-end) so it sits
  directly inside the radial halo, right-side on tablet+
  (items-end + justify-center) so it lines up with the desktop fade.
- Column count + card heights tuned (6 per column, faster animation
  durations for a livelier feed) to deliver Pinterest-style density.

Co-authored-by: Cursor <cursoragent@cursor.com>
Form is anchored to center-bottom again (horizontally centered, sitting
in the lower third of the viewport) — `items-center justify-end` plus
`pb-[12vh]` / `tablet:pb-[14vh]`. The Logo and headline center-align so
the whole stack reads as a focused composition rather than a
right-rail.

Gradient follows the form:
- A single radial halo centered at 50% 78% paints the form area dark,
  with a soft top fade for Logo legibility.
- Same shape on mobile and tablet+, just tightened on larger screens
  via a media query so the halo does not bleed too far up.

Cards rebuilt to feel like real daily.dev feed rows, not placeholders:
- Titles are now `typo-callout` font-bold (much bigger and readable)
  with `line-clamp-3` so they stay tidy.
- Each card type is its own component (Article, Video, Code,
  Discussion, Hero) so the rendering reads cleanly and each variant
  is tuned to its content.
- Article cards drop the big abstract gradient cover entirely. Just a
  1px accent strip in the source colour at the top, then source row,
  title, engagement. Reads like a real article card.
- Video cards keep a short 80px cover with play badge + duration pill.
- Code cards keep a short 64px cover with a faux multi-colour
  "syntax line" pattern that reads as a snippet, not random art.
- Discussion cards get a coloured "SQUAD" header strip instead of a
  cover so the community framing is unmistakable.
- Hero cards are full-bleed accent colour with white title — these are
  the splashes of colour and energy across the grid (about one in
  every five-to-seven cards), instead of every card being colourful.
- Source row carries an initials avatar pill, source name, and time
  ago. Engagement row carries upvote count, comment count, and an
  optional Trending / Top badge.

Grid is tighter (gap-2.5 on mobile, gap-3 on tablet+) so more cards
breathe on screen at once, giving the abundance / "real feed" feeling
the brief asked for.

Co-authored-by: Cursor <cursoragent@cursor.com>
Stripped the feed mosaic back to a single peaceful atmosphere.

Cards:
- One uniform "ghost" card variant — no hero blocks, no SQUAD strips,
  no video covers, no code patterns, no trending / top badges, no
  comment counts, no source initial avatars, no accent stripes.
- Single component (~70 lines of card code vs. ~250 before).
- bg-white/[0.025] over a subtle 1px border, faint backdrop-blur so
  cards read as glass, not stickers.
- Source + time in text-text-quaternary (whisper). Title in
  text-text-secondary typo-callout font-medium (readable, not
  shouting). Single upvote count as the only metric.
- Title is the only thing with visual weight, so the eye scans
  content (the actual value prop) instead of decoration.

Atmosphere:
- Three large blurred accent orbs (cabbage, water, onion) with
  filter: blur(72px) and mix-blend-mode: screen, behind the cards.
  This is the "magic" — soft aurora light that hints at brand
  colours without ever screaming.
- Form halo softened: dark radial ellipse centered at 50% 80%,
  fading out by 82%. No harsh edge.
- Added a subtle top fade so the Logo always reads cleanly even when
  a column scrolls a bright-titled card into the top corner.

Density:
- Reduced to 3 columns max (was 4), mobile shows only 2.
- 18 unique cards (was 24) doubled per column for the loop.
- Animation durations stretched to 210–260s for a slow, calm drift
  instead of feed-scroll velocity.

Co-authored-by: Cursor <cursoragent@cursor.com>
Rebuilt the hero around a single clever idea: a static constellation
of topics — daily.dev's actual organizing primitive — instead of mock
article cards.

Why:
- Article cards forced the eye to read titles competing with the
  signup CTA, even when stripped to one variant.
- Topics are single words. Nothing to read; everything to recognise.
- The breadth of topics IS the value proposition: "this is the
  universe of dev knowledge you're joining."
- Tags are how daily.dev itself organises content and squads, so the
  background already matches what the user will see post-signup.

Composition:
- 29 topic labels (TypeScript, React, AI, Rust, GraphQL, Kubernetes,
  WebAssembly, System Design, DevOps, Indie Hacking, …) hand-placed in
  a constellation across the viewport.
- Four typography tiers from typo-caption1 (xs, faded whisper) up to
  typo-title3 (lg, headline-weight). Depth comes from size + opacity
  layering — no animation needed.
- Five accent tags (AI, TypeScript, Rust, LLM, System Design) glow
  softly in brand colours via text-shadow + color-mix on the theme
  accent variables. Everyone else is white at 25–55% opacity, so the
  glows feel like rare stars instead of a Christmas tree.
- Six ultra-subtle SVG lines (white at 7% opacity, non-scaling stroke)
  connect related tags — TypeScript↔React, AI↔LLM, Rust↔WASM,
  GraphQL↔Postgres, DevOps↔Docker, System Design↔Architecture. Reads
  as a knowledge graph at a glance, recedes the moment you focus on
  the form.

Atmosphere:
- Three large blurred orbs (96px blur, screen blend) breathe in/out
  on an 18s cycle in cabbage / water / onion. This is the only motion
  on the page — slow ambient light, nothing demanding attention.
- Honors prefers-reduced-motion.

Form area:
- Same center-bottom placement (justify-end + pb-[12vh] / [14vh]).
- Radial dark halo at 50% 82% sits the form in calm light.
- Top fade keeps the Logo readable against any bright tag near the
  upper edge.

Net effect: peaceful, magical, on-brand. No cards, no titles, no
metrics, no animation loops. Just a quiet map of everything daily.dev
covers, with a clear pool of light around the signup form.

Co-authored-by: Cursor <cursoragent@cursor.com>
Added a small floating variant switcher in the top-right corner so the
team can flip between background concepts side-by-side and decide
which one ships.

Variants are registered through a single \`VARIANTS\` array — adding a
new one is now just three lines (id + label + render). The switcher
renders one pill per registered variant automatically. State is
persisted in localStorage and overridable via \`?variant=…\` so a link
can be shared directly with a specific design pre-loaded.

Variant A — Topics (the existing constellation):
- 29 hand-placed topic labels in dark space with brand-coloured glow
  on a few standouts, six ultra-thin SVG connection lines.

Variant B — Squads (new):
- 7 squad "galaxies" scattered across the viewport, each rendered as
  a dashed orbit ring with the squad name at the centre and 3–6 small
  avatar circles in colour-coded accents arranged on the orbit.
- Member positions are computed via polar coordinates so the count of
  avatars per squad can vary without manual placement maths.
- Highlighted squads (AI & LLM, Indie Hackers) use a slightly larger
  ring + glow and brighter label colour so they read as the focal
  galaxies, the rest fade back.
- Directly conveys the user's brief: developers gathering to discuss
  and share knowledge, organised around the topics they care about.
- One squad ("DevOps") hides on mobile to keep mobile clean.

Both variants share the same aurora orb backdrop, form halo at
50% 82%, top fade, and center-bottom form placement — only the
content layer swaps.

Co-authored-by: Cursor <cursoragent@cursor.com>
The switcher was using `absolute` positioning inside the `isolate`
stacking context with `z-10`. Depending on how nested stacking
contexts resolve, the form layer at `z-1` could end up painting on
top of (or trapping pointer events from) the switcher.

Hardening:
- position: fixed so the switcher sits in the viewport's stacking
  context, completely outside the hero's isolate.
- Explicit z-index: 50 via inline style (no reliance on whether the
  Tailwind `z-50` utility is present in the project config).
- pointer-events-auto on both the container AND each button, in case
  any ancestor cascades pointer-events: none.
- cursor-pointer on the buttons for the standard pointer affordance.
- Swapped the background to `bg-raw-pepper-90/85` which is a known
  design-system token, in case the previous `bg-overlay-tertiary-onion`
  was not defined and left the container transparent.

Co-authored-by: Cursor <cursoragent@cursor.com>
…iant

The Squad Universe (avatars huddled around a name) read as generic
network-diagram clipart. Killed it and shipped something nobody else
has done on a signup page: a stylised metro / transit map of the dev
knowledge landscape.

Why a metro map:
- Iconic, universally understood visual language — every developer
  recognises a transit map instantly.
- Lines = topic areas. Stations = concrete concepts. Reads as a
  literal "map of the dev world".
- Frames the act of signing up as the start of a journey: "pick your
  line, every station is a destination".
- Static, no animation cost, scales cleanly via SVG viewBox.

Implementation (\`KnowledgeMapBackground\`):
- Single SVG, viewBox 1600x900, preserveAspectRatio="xMidYMid slice"
  so the centre of the map is always visible regardless of viewport
  aspect.
- 4 metro lines: Frontend (water), Backend (avocado), AI (onion),
  DevOps (cheese). Each line is a polyline with stroke-linejoin:round
  + stroke-linecap:round so corners feel like a real transit map.
- 23 stations total. Each is a hollow circle (dark pepper inner,
  coloured stroke) at the line colour.
- 4 "iconic" stations are highlighted (React, System Design, LLMs,
  Kubernetes): larger circle, thicker stroke, brighter label, drop-
  shadow glow, and an outer translucent disc that reads as a halo.
- LLMs station has a "NOW" badge and a slow CSS pulse ring — one
  point of life on an otherwise static composition. Honours
  prefers-reduced-motion.
- Labels are hand-positioned per station (labelDx / labelDy /
  labelAnchor) — above the line for top stations, below for bottom,
  side-anchored for the diagonal AI line — so nothing collides and
  the map reads at a glance.
- Small "Lines" legend pill in the top-left (tablet+) with a coloured
  dot per line, so the colour code is decodable.

Variant registry:
- 'squads' removed, 'map' (label "Map") added. Adding a new variant
  in future is still three lines: id + label + render.
- Variant switcher in the top-right is unchanged.

Co-authored-by: Cursor <cursoragent@cursor.com>
tsahimatsliah and others added 2 commits May 20, 2026 11:11
- Serve responsive WebP assets up to 2560px wide via srcset
- Blur-up placeholder while the full image loads
- Skip card halos and orbs on desk variant so the photo stays sharp

Co-authored-by: Cursor <cursoragent@cursor.com>
Move water accent gradient and orb to the left 50% (bottom-left), remove
blue tint from the right panel so solid gray background clips the glow.

Co-authored-by: Cursor <cursoragent@cursor.com>
- Restore form halo + bottom vignette behind signup column on desk variant
- Swap footer links and disclaimer positions on desk only (terms left,
  links right)
- Regenerate hero WebPs from new source, default to native 1024w to
  avoid blurry upscale and add it to srcset

Co-authored-by: Cursor <cursoragent@cursor.com>
- Add circular dark halo behind the signup column for readability on the
  photo backdrop
- Encode hero WebP assets at quality 95 with lanczos3 + sharpen pass on
  upscaled sizes

Co-authored-by: Cursor <cursoragent@cursor.com>
…stack

- Replace upscaled srcset (was just 1024 upsampled) with single native
  full-quality WebP converted from source JPEG
- Restore Cards-variant overlays on desk (orbs, halo, vignette)
- Slight contrast/saturation bump to recover perceived sharpness

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Re-encode hero from a real 3072x2048 source and serve via <picture> srcset
at 1280/1920/2560 widths. Earlier upscaled variants were bilinear copies
of a 1024px file; the new ladder downsamples from 3K so even 2560 carries
real detail.

Co-authored-by: Cursor <cursoragent@cursor.com>
Drop unused Tags background variant, its data/constants, and the related
accent glow styles. Variant switcher now shows Cards / X / Desk only.

Co-authored-by: Cursor <cursoragent@cursor.com>
New toggle swaps each variant's hero visual (cards feed, split-left cards,
desk photo) with the production signup wall background image. All halos,
orbs, gradients, and layout remain identical so each variant can be A/B
compared against its prod-image equivalent. Persists via localStorage and
the prod=1 URL param.

Co-authored-by: Cursor <cursoragent@cursor.com>
…nup hero

Replace the prod-image boolean toggle with a tri-state image source: original
(designed cards/desk visuals), prod (Cloudinary signup-wall image), and colors
(no background visual, just gradients/orbs). Persist via localStorage and ?mode=
URL param.

Fix prod-image invisibility: the form-halo (rgba(0,0,0,1) ellipse) and
bottom-vignette were fully blocking the image. In prod mode we dim those
overlays (and the split-left fade / center-halo) so the image actually shows
through while keeping enough contrast for the signup form.

Co-authored-by: Cursor <cursoragent@cursor.com>
…halos with single soft scrim

Co-authored-by: Cursor <cursoragent@cursor.com>
… it loads

Co-authored-by: Cursor <cursoragent@cursor.com>
… load race

Co-authored-by: Cursor <cursoragent@cursor.com>
The 'Prod image' mode was pointing at the auth-banner popover background
(login-popover-dailydev, a 2880x406 purple gradient strip). Stretched to
fullscreen with object-cover it produced a near-invisible dark wash — which
is why the image appeared missing.

Switch to the real production signup-wall image
(dailydev_where_developers_suffer_together) with a mobile variant via
<picture>. Also hide the cabbage/water orbs in prod mode so mix-blend-mode
doesn't tint the artwork, and lighten the prod scrim so the desk
illustration stays visible behind the form.

Co-authored-by: Cursor <cursoragent@cursor.com>
- Move variant/image switcher to bottom-center on mobile (two stacked
  strips), keep top-right pinned on tablet+. Drop the portal so the
  switcher participates in the natural flex flow on mobile and can't
  overflow the viewport.
- Set the hero container to flex-col so main, footer disclaimer and the
  switcher stack vertically as intended.
- Trim mobile bottom padding on the form so the logo/title/CTA stack
  sits closer to the screen bottom (matching the existing mobile auth
  pattern) while keeping tablet+ spacing intact.

Co-authored-by: Cursor <cursoragent@cursor.com>
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