feat(onboarding): panel signup wall variant - #6376
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
capJavert
left a comment
There was a problem hiding this comment.
The panel variant still has an accessibility blocker before merge: the QR card is the only app-install destination, but the SVG is aria-hidden and there is no link a keyboard or screen-reader user can follow. Please add an accessible smart-link fallback (it can be visually hidden if needed) and cover it with a test. The real-device QR scan noted in the PR should also be completed before final approval.
e35b0d0 to
ceff7d8
Compare
|
@capJavert good catch — fixed in ceff7d8. The card is now an anchor to the same smart link ( Two details worth calling out:
Test coverage in On the real-device scan: still outstanding and I can't do it from here. I've verified the encoding round-trips to an identical matrix and that the smart link resolves correctly per platform (iPhone UA → Also rebased onto latest |
capJavert
left a comment
There was a problem hiding this comment.
Reviewed by AI.
One blocking accessibility finding remains. CI is green, and I independently verified that the baked QR payload decodes to https://r.daily.dev/get.
Adds a `panel` background to the signup wall (FunnelStepType.HeroLanding): the form in a left column with the marketing landing page's hero artwork framed in the right one. Stacks below `laptop`, where the artwork takes the top of the screen and dissolves into the page background. Selected by Freyja config via the step's `background` parameter, so the default (`cards`) is unchanged. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A short desktop window (1440x700 is a common laptop size) matched the max-height query and inherited phone-sized type in the two-column layout. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The QR was the only route to the app stores, and it is decorative markup (aria-hidden) that only helps someone holding a phone. The card is now an anchor to the same smart link, named by its destination, so keyboard and screen-reader users have the same route. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
WCAG 2.5.3 Label in Name: the accessible name replaced the visible "Scan to get the app" caption instead of containing it, so a voice-control user could not activate the link by speaking the words on screen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
5126a2d to
f4ac07b
Compare
|
@capJavert the blocking WCAG 2.5.3 finding is fixed in f4ac07b — details in the inline thread. Short version: the accessible name now leads with the visible caption verbatim ( All checks green, branch is up to date with Two things still open, neither blocking from my side:
|
The legal row was hidden below laptop, which dropped the Terms of Service and Privacy Policy disclosure on phones and tablets even though the form is submittable there. The disclaimer now renders at every breakpoint; only the general footer links stay desktop-only. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
@capJavert the legal-row finding is fixed in d34e30b — details in the inline thread.
Both of your findings are now closed: The tests for both are structural rather than presence-based, since jsdom doesn't evaluate media queries — a All checks green. The only thing still outstanding is the real-device QR scan through the centre logo badge. |
…er walls The cards and desk walls render neither FooterLinks nor SignupDisclaimer below tablet: their isMobile branch omits both. Reveal the disclosure from tablet up so the panel matches what ships today instead of becoming the only wall with a phone-width disclosure. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Correction on the legal-row fix — details in the inline thread. I checked the premise against the shipping
My first fix overcorrected and would have made The phone gap is pre-existing and product-wide. It's a legal question rather than a layout one and fixing it only here would leave All checks green. |
capJavert
left a comment
There was a problem hiding this comment.
Reviewed by AI.
Approved through AI review.
@tsahimatsliah please verify the QR code on a real device in production after merge, including that it remains scannable through the center logo badge.
The legal row supplied that spacing while it rendered at every breakpoint. Gating it at tablet left the login link flush against the viewport edge on phones, with nothing under it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
How to run this as a 50/50 experimentShort version: there is no GrowthBook flag for this variant today, so there is no key you can set in the GrowthBook UI to turn it on. Documenting both routes so we can pick one deliberately. Why there is no flagThe signup wall is a funnel step served by the API, not a client-gated component:
So Option A — split in Freyja (works today, no code change)Two funnel variants, identical apart from the
Traffic allocation is configured on the funnel in Freyja. Nothing in this repo needs to change, and the default stays Preview a specific funnel before allocating traffic — Note Open question for whoever owns the API: does Option B — add a GrowthBook flag (needs a code change; not in this PR)If we want the split owned in GrowthBook rather than Freyja, the precedent already exists in this file — // packages/shared/src/lib/featureManagement.ts
export const signupWallPanelFeature = new Feature('signup_wall_panel', false);GrowthBook config for a 50/50:
This is maybe 15 lines: the flag, a Which one?Option A is zero-risk and available now. Option B is worth it if we want the allocation, targeting and results to live alongside our other experiments in GrowthBook rather than in funnel config. Happy to implement Option B on this PR if that's the direction — say the word and I'll add it behind a |
Adds a
panelbackground to the signup wall (FunnelStepType.HeroLanding): the form sits in a left column with the marketing landing page's hero artwork framed in the right one.Selected by Freyja config via the step's
backgroundparameter — the default (cards) is untouched, so nothing changes until the parameter is set.Rolling this out
There is no GrowthBook flag for this variant. The hero is a funnel step served by the API, and
FunnelHeroLanding/OnboardingSignupHero/FunnelSteppercontain no feature-flag calls —background: 'panel'can only arrive from the funnel JSON. The only GrowthBook flag on/onboardingisswipe_onboarding, which gates the EditTags step and is unrelated.To run a 50/50, define two funnel variants in Freyja that differ only in the
heroLandingstep:heroLanding.parametersbackground, or{ "background": "cards" }{ "background": "panel" }Preview a specific funnel before allocating traffic with
/onboarding?id=<funnelId>&version=<version>— both params are forwarded straight to the boot call. Note/onboardingredirects to/on localhost, so this needs a deployed environment.If we would rather own the split in GrowthBook than in Freyja, that is a small code change following the
swipe_onboardingprecedent — see this comment for the exact shape. Not included here.Layout
Desktop (
laptop+) — two columns. Form left, artwork right in a rounded frame with an "ambilight": a blurred, over-saturated copy of the artwork behind the frame, so the panel casts its own colour onto the page. A glass QR card floats bottom-right of the frame.Stacked (below
laptop) — the artwork takes the top of the screen and dissolves into the page background; the form is bottom-anchored underneath, matching the spacing of the existing cards/desk walls. The signup disclosure appears fromtabletup and the footer links fromlaptopup, which is where the cards/desk walls put theirs.Compact phones — a second tier keyed on viewport height (
max-height: 759px, bounded to belowlaptop), because height is the axis under pressure: a 375×812 phone gets the roomy treatment, a 375×667 one does not. The artwork drops 50dvh → 32dvh and the type/gaps tighten with it.Notes for review
https://r.daily.dev/get, daily.dev's smart link, so the destination is reachable by pointer, keyboard and voice control, not only by scanning. Its accessible name leads with the visible caption verbatim (Scan to get the app — daily.dev for iOS or Android) per WCAG 2.5.3, and the caption is a single shared constant so the two can't drift apart.OnboardingRegistrationForm:tertiarySignupButtonClasshardcoded!text-whiteon a button sitting on the page background, making its label invisible in light mode. Now!text-text-primary. This affects every onboarding signup surface, not just this variant.splitSignupStylealready existed and was fully plumbed but nothing switched it on. This variant enables it, which gives "Sign up with GitHub/Google" + "Create account". Its unused full-width "Sign in" button is removed in favour of the standardMemberAlreadylink.onb-*class hooks inheroStyles.tsare set fromOnboardingRegistrationForm(onb-split-cta,onb-split-login). They are inert wherever the hero's CSS is not present; both ends are commented.Tests
Responsive visibility can't be asserted through jsdom, which does not evaluate media queries — an element hidden by a
hiddenclass is still in the DOM. The specs therefore assert structurally: nohiddenancestor between the disclosure and the root, and conversely that the footer links do have one. Both were confirmed to fail when the fix is reverted.Known gaps
OnboardingSignupHero'sisMobilebranch (belowtablet, 656px) renders neitherFooterLinksnorSignupDisclaimer, so the shippingcardswall shows no "By continuing, you agree to…" on a phone today — measured: 0 DOM matches at 390px, present at 700px. This variant matches that behaviour rather than diverging from it. The gap is real and pre-existing; fixing it belongs in its own change covering all three walls, since fixing it only here would leavecards/deskinconsistent.className.onboardingSignupis dead across the auth stack:OnboardingRegistrationFormdeclares it andAuthOptionsInnerforwards it, but the component never destructuresclassName, so it has never applied for anyone passing it. Left alone here as out of scope.Storybook
Components/Onboarding/Steps/FunnelHeroLanding→Panel, plusComponents/Onboarding/Signup wall comparison, which renders the currentCards/Deskwalls next toPanelin real iframes at Mobile / MobileSmall / Tablet / Desktop sizes. Iframes rather than scaled divs because breakpoints come from the viewport in both CSS anduseViewSize.🤖 Generated with Claude Code
Preview domain
https://claude-signup-wall-panel.preview.app.daily.dev