Rewhaven Auth + Onboarding — Branded First Impression (design spec, 2026-06-20)
Brainstormed + approved 2026-06-20. The entry experience (intro → welcome → auth forms → setup) is the first impression of the app; today it is bare forms. This spec makes it carry the marketing site's calm dusk brand while staying usable, accessible, and reduced-motion-respecting — "lush but calm."
Revisit post-alpha if it needs changing (user's call). This spec is one focused unit of work → its own implementation plan.
Goal
Turn the auth/onboarding from plain forms into a branded, atmospheric first impression that matches rewhaven.com — without compromising legibility, a11y, or the calm/low-stim thesis the rest of the app honors.
Brand anchors (carried from the marketsite)
- Voice (verbatim from
rewhaven-marketsitesrc/brand.ts): 🌙 · tagline "The evening routine, without the evening battle." · "a calm, neurodiversity-affirming way for your family to share the work of home — built on trust, not punishment, and designed to make itself unnecessary." The "doors" beats: a different bet (scaffold not scoreboard) · for your family · free forever. - Visual: a dusk sky — soft aurora glows (warm + cool), a few slowly drifting/twinkling stars, the rooftop skyline with gently glowing windows; Bricolage Grotesque display + Atkinson Hyperlegible body; a warm glow-amber emphasis word in headlines.
- Already in the design system (ported earlier):
DsRooftops,DsConstellation,DsVignette(rooftops / constellation / coins scenes), and theglow/auroraWarm/auroraCool/star/rooftokens. This spec composes those; it does not invent new brand art.
The flow
- First-time: Splash (🌙) → Intro carousel (3 screens) → Welcome → Create account → Setup wizard → Today.
- Returning: Splash → straight to Today if a session exists; else Welcome → Sign in → Today.
- A
seenIntroflag (SharedPrefs, via the existing prefs effect) shows the carousel only once. AneedsSetupsignal (no household yet) routes a fresh account into the wizard before Today.
Screens
1. Intro carousel — full-dusk "A" treatment
Swipeable PageView, Skip top-right, page dots, the three brand beats; each
beat is a DsVignette scene + a Bricolage headline with a glow-emphasis word
- one calm line:
- The promise — rooftops vignette · "The evening routine, without the evening battle." · "A calm way for your family to share the work of home."
- The bet — constellation vignette · "A scaffold, not a scoreboard." · "Built on trust, not punishment — expectations that don't shame, bounties they choose."
- The trust — coins vignette · "Yours, and private." · "Free at the core, forever · Works offline · Photos never leave the phone." → [Get started].
2. Welcome — full-dusk "A" treatment (the hub)
🌙 + the rewhaven wordmark + a warm line ("Welcome home"), composed over the rooftop skyline (glowing windows) with a soft aurora + a few drifting stars. CTAs: [Create your household] (primary teal) + "Already have an account? Sign in." This is where the marketsite's "doors / coming home at dusk" feeling lives.
3. Auth forms — clean-panel "B" treatment
A shared AuthScaffold = a dusk AuthHeroBand on top (aurora + a few
stars + the rooftop silhouette + a Bricolage headline with the glow word) over a
clean solid form panel below. Inputs always sit on the solid surface, so AA
contrast is guaranteed; the atmosphere lives only in the band.
- Sign in — band "Welcome home";
DsEmailField+DsPasswordField+ Sign in + "Forgot password?" + "Create your household". - Sign up — band "Create your household";
DsUsernameField+DsEmailField+DsPasswordField+ confirm-password + Create account + "Sign in". - Forgot password — band "Reset your password";
DsEmailField+ Send reset link → the calm "Check your email" confirmation (no account enumeration).
The forms already built (sign-in/sign-up/forgot) barely change — they are
wrapped in AuthScaffold and gain the band; the field molecules and blocs stay.
4. Setup wizard — atmosphere dials DOWN into the calm app
A WizardScaffold (progress bar + step body + CTA), 3 steps, behind a small
SetupBloc. The atmosphere fades step by step (a hint of aurora at top →
the calm app surface) so the user is gently handed off from the branded entrance
into the quiet daily app.
- Name your home — household-name field + emoji picker →
createHousehold(orsetHouseholdNameif one exists). - Add your first kid — name + kid colour (
kidColor) + emoji →addMember(kind: child). "Skip for now" allowed. - You're home — a soft celebratory finish (🌙 + "You're home" +
"
is ready") → [Go to Today].
Components
New (app-level unless noted):
AuthHeroBand— the reusable dusk backdrop (rooftop + aurora + stars + headline-with-glow). May live indesign_systemif it's brand-generic, or in the app if it carries auth copy; decide during the plan.AuthScaffold— hero band + clean form slot; wraps the existing forms.OnboardingCarousel+ the 3 intro screens.WelcomeScreen.WizardScaffold+ the 3 setup steps.SetupBloc—@JsonSerializable+ Equatable + Status enum +toJson/fromJson(the DevTools serialization contract), wiringcreateHousehold/addMember.- The
seenIntroSharedPrefs flag + theneedsSetuprouting gate.
Reused: DsRooftops, DsConstellation, DsVignette, the identity molecules
(DsEmailField/DsUsernameField/DsPasswordField), DsButton, DsTextField,
DsSection, the existing sign-in/sign-up/forgot forms + their blocs, the
SdkClientProvider + repositories, the SharedPrefs effect, the nav/bloc
observers (page + funnel analytics).
Routing: new anon/ routes (intro, welcome) + the post-auth setup route, the
existing UnauthenticatedGuard/AuthenticatedGuard, plus the seenIntro and
needsSetup gates. auto_route codegen.
Motion
All from the brand, all slow + gentle ("quiet celebration"): aurora drift,
occasional star twinkle, soft rooftop-window glow, and a content "reveal"
rise-in per screen. Carousel = soft swipe; wizard = soft step transition.
Every animation is static under reduced-motion via the existing
MotionTokens.durationOrZero / MediaQuery.disableAnimationsOf path — one code
path, no separate branch.
Accessibility / contrast
- Forms keep inputs on the solid panel → AA contrast guaranteed; the atmosphere is confined to the hero band.
- Full-dusk screens (intro/welcome): the large Bricolage headlines + the warm
glow emphasis word clear AA on the night background; the vignettes are
decorative (
ExcludeSemantics/aria-hidden). - Reduced-motion → static everywhere.
Semantics(identifier: ...)on the key controls (Get started, Create your household, Sign in, the wizard CTAs) so Maestro resolves them (Maestro's Flutter driver matches semantics identifiers, not Keys — established convention).- Proper heading/label semantics; keyboard focus rings (a11y floor, decision 5).
Testing
- Gadfly flow tests for each new flow, across the light/dark/focus trips:
intro carousel (Skip → Welcome; Get started → Welcome), Welcome → Sign up /
Sign in, and the 3-step Setup wizard → Today.
expectedEventstranscripts incl. the page/analytics lines. Goldens (fonts + monochrome emoji already wired). - Unit:
SetupBlocstate transitions (name → add kid → done; skip path; error path) over the in-memory client / mocked repositories. - Maestro: an onboarding e2e flow on the seeded demo (intro → welcome → create account → wizard → Today). Authored; runnable on the emulator/device.
- Atmosphere widgets: static (reduced-motion) goldens for
AuthHeroBandand the intro/welcome compositions.
Scope / sequencing (for the implementation plan)
Build in shippable phases, each tested:
AuthHeroBand+AuthScaffold, restyle the 3 existing forms — the smallest change for the biggest immediate brand lift; the forms already exist.WelcomeScreen+ routing (welcome as the unauthenticated hub).OnboardingCarousel+ theseenIntroflag (the 3 intro beats).SetupWizard+SetupBloc+ post-signupneedsSetuprouting.
Out of scope / deferred
- Post-alpha redesign tweaks (explicitly revisitable per the user).
- The marketsite-Storybook parity (separate cross-repo effort).
- Bundling Noto Color Emoji at runtime (decision 6, separate).
- No layout A/B — the hybrid (full-dusk "A" for intro/welcome, hero-band "B" for forms) is the chosen direction.