Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
bda23f7
Add email-link capture plumbing: gated action types, pending store, r…
Jul 30, 2026
d0c8afd
Add email capture drawer on a shared bottom-sheet primitive
Jul 30, 2026
8d3173a
Gate logged-out consumer actions into the email capture flow
Jul 30, 2026
72a52fe
Add confirm-email banner and dead-link recovery
Jul 30, 2026
67ed655
Carry gated actions through the social OAuth flow
Jul 30, 2026
aa83bb1
Fall back to getRandomValues for CSRF tokens in insecure contexts
Jul 30, 2026
58a82af
Merge remote-tracking branch 'origin/main' into lightweight-accounts-p1
Aug 5, 2026
ce09eba
Polish mobile drawers and consumer question page spacing
Aug 5, 2026
aba76bf
Add mobile share drawer on a reusable action-grid pattern
Aug 5, 2026
72f6482
Add subscribe-capture flow experiment (PostHog A/B)
Aug 5, 2026
5ef922c
Translate lightweight-accounts copy into all locales
Aug 5, 2026
ee106d4
Address PR review: Turnstile reuse, silent failures, CTA viewport
Aug 5, 2026
0839cc7
Polish capture flow: persistent action-aware toast, optimistic send, …
Aug 7, 2026
9ddc267
Merge remote-tracking branch 'origin/main' into lightweight-accounts-p1
Aug 7, 2026
f061666
Keep the tutorial away from lightweight accounts, fix Enter and terms…
Aug 7, 2026
ca30419
Skip the tutorial for Google sign-ins from the capture drawer too
Aug 7, 2026
fba0152
Drop the onboarding request on logout instead of only hiding it
Aug 7, 2026
3f244df
Merge remote-tracking branch 'origin/main' into lightweight-accounts-p1
Aug 10, 2026
91c3916
Merge branch 'main' into lightweight-accounts-p1
aseckin Aug 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 73 additions & 1 deletion front_end/messages/cs.json
Original file line number Diff line number Diff line change
Expand Up @@ -2401,5 +2401,77 @@
"newsHotnessColCluster": "Klastr",
"newsHotnessColWeight": "Váha",
"newsHotnessColContribution": "Příspěvek",
"feedTileQuestionsRecentlyResolved": "{count, plural, one {# otázka nedávno vyřešena} other {# otázek nedávno vyřešeno}}"
"feedTileQuestionsRecentlyResolved": "{count, plural, one {# otázka nedávno vyřešena} other {# otázek nedávno vyřešeno}}",
"emailCaptureOptionsTitle": "Dostávejte novinky k této otázce.",
"emailCaptureOptionsSubtitle": "Vyberte, o čem chcete být informováni.",
"emailCaptureOptionResolve": "Když se vyřeší",
"emailCaptureOptionForecast": "Změny prognózy",
"emailCaptureOptionDiscussion": "Nová diskuse",
"emailCaptureOptionsContinue": "Pokračovat",
"emailCaptureOptionsCaptionNone": "Pro pokračování vyberte alespoň jednu možnost.",
"emailCaptureSubscribeTitle": "Zadejte svůj e-mail pro sledování této otázky",
"emailCaptureSubscribeBody": "Pošleme vám odkaz k dokončení této akce.",
"emailCaptureVoteTitle": "Uložte svůj hlas",
"emailCaptureVoteBody": "Zadejte svůj e-mail. Pošleme vám odkaz, který uloží váš hlas.",
"emailCaptureVoteBodyRepeat": "Pošleme nový odkaz na {email}. Uloží místo toho tento hlas.",
"emailCaptureVoteCaption": "Odkaz vás přihlásí a uloží váš hlas. Platí jeden den.",
"emailCaptureForecastTitle": "Uložte svou prognózu",
"emailCaptureForecastBody": "Zadejte svůj e-mail. Pošleme vám odkaz, který uloží vaši prognózu.",
"emailCaptureForecastBodyRepeat": "Pošleme nový odkaz na {email}. Uloží místo toho tuto prognózu.",
"emailCaptureForecastCaption": "Odkaz vás přihlásí a uloží vaši prognózu. Platí jeden den.",
"emailCaptureForecastBodyNoDraft": "Zadejte svůj e-mail. Pošleme vám odkaz, který vás přihlásí k prognózování.",
"emailCaptureSignInCaption": "Odkaz vás přihlásí. Platí jeden den.",
"emailCaptureBodyRepeat": "Pošleme nový odkaz na {email}.",
"emailCaptureEmailLabel": "E-mail",
"emailCaptureSend": "Odeslat odkaz",
"emailCaptureSendNew": "Odeslat nový odkaz",
"emailCaptureSending": "Odesílání...",
"emailCaptureTryAgain": "Zkusit znovu",
"emailCaptureFormatError": "To nevypadá jako e-mailová adresa. Zkontrolujte ji a zkuste to znovu.",
"emailCaptureServerError": "Na naší straně došlo k chybě. Váš e-mail nebyl odeslán. Zkuste to znovu.",
"emailCaptureSentTitle": "Zkontrolujte svůj e-mail",
"emailCaptureSentBody": "Poslali jsme odkaz na {email}.",
"emailCaptureSentActionVote": "Klikněte na něj a uložte svůj hlas.",
"emailCaptureSentActionForecast": "Klikněte na něj a uložte svou prognózu.",
"emailCaptureSentActionSubscribeAll": "Klikněte na něj a dostávejte novinky k této otázce.",
"emailCaptureSentActionSignIn": "Klikněte na něj, přihlaste se a vytvořte svou prognózu.",
"emailCaptureSentActionSubscribeOne": "Klikněte na něj a dostávejte novinky, když {a}.",
"emailCaptureSentActionSubscribeTwo": "Klikněte na něj a dostávejte novinky, když {a} nebo {b}.",
"emailCapturePhraseResolve": "se to vyřeší",
"emailCapturePhraseForecast": "se prognóza změní",
"emailCapturePhraseDiscussion": "proběhne nová diskuse",
"emailCaptureSentNote": "Odkaz vás přihlásí a platí jeden den. Můžete jej otevřít na jakémkoli zařízení.",
"emailCaptureSentNoteRepeat": "Tento odkaz nahrazuje ten předchozí. Funguje pouze váš nejnovější odkaz.",
"emailCaptureDone": "Hotovo",
"emailCaptureWrongAddress": "Špatná adresa? Použijte jiný e-mail",
"emailCaptureUseDifferentEmail": "Použít jiný e-mail",
"emailCaptureRecapSentTo": "Odesláno na {email}.",
"emailCaptureRecapActionVote": "Klikněte na odkaz v tomto e-mailu a uložte svůj hlas.",
"emailCaptureRecapActionForecast": "Klikněte na odkaz v tomto e-mailu a uložte svou prognózu.",
"emailCaptureRecapActionSubscribe": "Klikněte na odkaz v tomto e-mailu a zapněte si odběr novinek.",
"emailCaptureResend": "Odeslat e-mail znovu",
"emailCaptureResendIn": "Znovu odeslat za {seconds}s",
"emailCaptureResendFeedback": "Odesláno. Zkontrolujte {email}.",
"emailCaptureGoogle": "Přihlásit se přes Google",
"emailCapturePassword": "Přihlásit se heslem",
"emailCaptureBack": "Zpět",
"emailConfirmBannerText": "Poslali jsme potvrzovací e-mail na <email></email>.",
"emailLinkRequestNew": "Odeslat nový odkaz",
"emailLinkNewSent": "Poslali jsme nový odkaz na {email}.",
"emailLinkNewSentWithAction": "Poslali jsme nový odkaz na {email}. Nese stejnou akci.",
"notifyMeCtaLabel": "Upozornit mě, až se vyřeší",
"notifyMeCtaLabelUpdates": "Upozorňovat mě na novinky",
"notifyMeCtaFollowing": "Sledujete tuto otázku",
"emailCaptureSubscribeBodyRepeat": "Pošleme nový odkaz na {email}. Místo toho zapne tyto novinky.",
"shareOpenedInNewTab": "{target} otevřeno v nové kartě.",
"copiedUrlMessage": "URL byla zkopírována do schránky",
"emailLinkSignedInSubscribe": "Jste přihlášeni a nyní sledujete tuto otázku.",
"emailLinkSignedInVote": "Jste přihlášeni a váš hlas je uložen.",
"emailLinkSignedInForecast": "Jste přihlášeni a vaše prognóza je uložena.",
"emailCaptureSignInTitle": "Přihlásit se pomocí kouzelného odkazu",
"emailCaptureSignInBody": "Zadejte svůj e-mail. Pošleme vám odkaz, který vás přihlásí.",
"emailCaptureSentActionSignInOnly": "Klikněte na něj a přihlaste se.",
"emailCaptureRecapActionSignIn": "Klikněte na odkaz v tomto e-mailu a přihlaste se.",
"loginMagicLink": "Přihlásit se pomocí kouzelného odkazu",
"registrationMagicLink": "Zaregistrovat se pomocí kouzelného odkazu"
}
74 changes: 73 additions & 1 deletion front_end/messages/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -2395,5 +2395,77 @@
"midtermsHubSeatAdvantageTooltip": "{count} seat advantage",
"midtermsHubSeatAdvantageOverTooltip": ">{count} seat advantage",
"midtermsHubProbabilityTooltip": "{value}% probability",
"midtermsHubEvenTooltip": "Even"
"midtermsHubEvenTooltip": "Even",
"emailCaptureOptionsTitle": "Get updates on this question.",
"emailCaptureOptionsSubtitle": "Pick what you want to hear about.",
"emailCaptureOptionResolve": "When it resolves",
"emailCaptureOptionForecast": "Forecast changes",
"emailCaptureOptionDiscussion": "New discussion",
"emailCaptureOptionsContinue": "Continue",
"emailCaptureOptionsCaptionNone": "Pick at least one to continue.",
"emailCaptureSubscribeTitle": "Enter your email to follow this question",
"emailCaptureSubscribeBody": "We'll send you a link to complete this action.",
"emailCaptureVoteTitle": "Save your vote",
"emailCaptureVoteBody": "Enter your email. We'll send a link that saves your vote.",
"emailCaptureVoteBodyRepeat": "We'll send a new link to {email}. It saves this vote instead.",
"emailCaptureVoteCaption": "The link signs you in and saves your vote. It works for a day.",
"emailCaptureForecastTitle": "Save your forecast",
"emailCaptureForecastBody": "Enter your email. We'll send a link that saves your forecast.",
"emailCaptureForecastBodyRepeat": "We'll send a new link to {email}. It saves this forecast instead.",
"emailCaptureForecastCaption": "The link signs you in and saves your forecast. It works for a day.",
"emailCaptureForecastBodyNoDraft": "Enter your email. We'll send a link that signs you in to forecast.",
"emailCaptureSignInCaption": "The link signs you in. It works for a day.",
"emailCaptureBodyRepeat": "We'll send a new link to {email}.",
"emailCaptureEmailLabel": "Email",
"emailCaptureSend": "Send link",
"emailCaptureSendNew": "Send new link",
"emailCaptureSending": "Sending...",
"emailCaptureTryAgain": "Try again",
"emailCaptureFormatError": "That doesn't look like an email address. Check it and try again.",
"emailCaptureServerError": "Something went wrong on our end. Your email was not sent. Try again.",
"emailCaptureSentTitle": "Check your email",
"emailCaptureSentBody": "We sent a link to {email}.",
"emailCaptureSentActionVote": "Click it to save your vote.",
"emailCaptureSentActionForecast": "Click it to save your forecast.",
"emailCaptureSentActionSubscribeAll": "Click it to get updates on this question.",
"emailCaptureSentActionSignIn": "Click it to sign in and make your forecast.",
"emailCaptureSentActionSubscribeOne": "Click it to get updates when {a}.",
"emailCaptureSentActionSubscribeTwo": "Click it to get updates when {a} or {b}.",
"emailCapturePhraseResolve": "this resolves",
"emailCapturePhraseForecast": "the forecast moves",
"emailCapturePhraseDiscussion": "there is new discussion",
"emailCaptureSentNote": "The link signs you in and works for a day. You can open it on any device.",
"emailCaptureSentNoteRepeat": "This link replaces your earlier one. Only your newest link works.",
"emailCaptureDone": "Done",
"emailCaptureWrongAddress": "Wrong address? Use a different email",
"emailCaptureUseDifferentEmail": "Use a different email",
"emailCaptureRecapSentTo": "Sent to {email}.",
"emailCaptureRecapActionVote": "Click the link in that email to save your vote.",
"emailCaptureRecapActionForecast": "Click the link in that email to save your forecast.",
"emailCaptureRecapActionSubscribe": "Click the link in that email to turn on your updates.",
"emailCaptureResend": "Resend email",
"emailCaptureResendIn": "Resend in {seconds}s",
"emailCaptureResendFeedback": "Sent. Check {email}.",
"emailCaptureGoogle": "Sign in with Google",
"emailCapturePassword": "Sign in with password",
"emailCaptureBack": "Back",
"emailConfirmBannerText": "We sent a confirmation email to <email></email>.",
"emailLinkRequestNew": "Send a new link",
"emailLinkNewSent": "We sent a new link to {email}.",
"emailLinkNewSentWithAction": "We sent a new link to {email}. It carries the same action.",
"notifyMeCtaLabel": "Notify me when this resolves",
"notifyMeCtaLabelUpdates": "Notify me of updates",
"notifyMeCtaFollowing": "You're following this question",
"emailCaptureSubscribeBodyRepeat": "We'll send a new link to {email}. It turns on these updates instead.",
"shareOpenedInNewTab": "Opened {target} in a new tab.",
"copiedUrlMessage": "URL is now copied to your clipboard",
"emailLinkSignedInSubscribe": "You're signed in, and you're now following this question.",
"emailLinkSignedInVote": "You're signed in, and your vote is saved.",
"emailLinkSignedInForecast": "You're signed in, and your forecast is saved.",
"emailCaptureSignInTitle": "Sign in with a magic link",
"emailCaptureSignInBody": "Enter your email. We'll send a link that signs you in.",
"emailCaptureSentActionSignInOnly": "Click it to sign in.",
"emailCaptureRecapActionSignIn": "Click the link in that email to sign in.",
"loginMagicLink": "Sign in with a magic link",
"registrationMagicLink": "Sign up with a magic link"
}
74 changes: 73 additions & 1 deletion front_end/messages/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -2401,5 +2401,77 @@
"newsHotnessColCluster": "Clúster",
"newsHotnessColWeight": "Peso",
"newsHotnessColContribution": "Contribución",
"feedTileQuestionsRecentlyResolved": "{count, plural, one {# pregunta resuelta recientemente} other {# preguntas resueltas recientemente}}"
"feedTileQuestionsRecentlyResolved": "{count, plural, one {# pregunta resuelta recientemente} other {# preguntas resueltas recientemente}}",
"emailCaptureOptionsTitle": "Recibe novedades sobre esta pregunta.",
"emailCaptureOptionsSubtitle": "Elige sobre qué quieres recibir avisos.",
"emailCaptureOptionResolve": "Cuando se resuelva",
"emailCaptureOptionForecast": "Cambios en el pronóstico",
"emailCaptureOptionDiscussion": "Nueva discusión",
"emailCaptureOptionsContinue": "Continuar",
"emailCaptureOptionsCaptionNone": "Elige al menos una opción para continuar.",
"emailCaptureSubscribeTitle": "Introduce tu correo para seguir esta pregunta",
"emailCaptureSubscribeBody": "Te enviaremos un enlace para completar esta acción.",
"emailCaptureVoteTitle": "Guarda tu voto",
"emailCaptureVoteBody": "Introduce tu correo. Te enviaremos un enlace que guardará tu voto.",
"emailCaptureVoteBodyRepeat": "Enviaremos un nuevo enlace a {email}. Guardará este voto en su lugar.",
"emailCaptureVoteCaption": "El enlace inicia tu sesión y guarda tu voto. Es válido durante un día.",
"emailCaptureForecastTitle": "Guarda tu pronóstico",
"emailCaptureForecastBody": "Introduce tu correo. Te enviaremos un enlace que guardará tu pronóstico.",
"emailCaptureForecastBodyRepeat": "Enviaremos un nuevo enlace a {email}. Guardará este pronóstico en su lugar.",
"emailCaptureForecastCaption": "El enlace inicia tu sesión y guarda tu pronóstico. Es válido durante un día.",
"emailCaptureForecastBodyNoDraft": "Introduce tu correo. Te enviaremos un enlace para iniciar sesión y pronosticar.",
"emailCaptureSignInCaption": "El enlace inicia tu sesión. Es válido durante un día.",
"emailCaptureBodyRepeat": "Enviaremos un nuevo enlace a {email}.",
"emailCaptureEmailLabel": "Correo electrónico",
"emailCaptureSend": "Enviar enlace",
"emailCaptureSendNew": "Enviar nuevo enlace",
"emailCaptureSending": "Enviando...",
"emailCaptureTryAgain": "Intentar de nuevo",
"emailCaptureFormatError": "Eso no parece una dirección de correo. Revísala e inténtalo de nuevo.",
"emailCaptureServerError": "Algo salió mal por nuestra parte. Tu correo no se envió. Inténtalo de nuevo.",
"emailCaptureSentTitle": "Revisa tu correo",
"emailCaptureSentBody": "Enviamos un enlace a {email}.",
"emailCaptureSentActionVote": "Haz clic en él para guardar tu voto.",
"emailCaptureSentActionForecast": "Haz clic en él para guardar tu pronóstico.",
"emailCaptureSentActionSubscribeAll": "Haz clic en él para recibir novedades sobre esta pregunta.",
"emailCaptureSentActionSignIn": "Haz clic en él para iniciar sesión y hacer tu pronóstico.",
"emailCaptureSentActionSubscribeOne": "Haz clic en él para recibir novedades cuando {a}.",
"emailCaptureSentActionSubscribeTwo": "Haz clic en él para recibir novedades cuando {a} o {b}.",
"emailCapturePhraseResolve": "esto se resuelva",
"emailCapturePhraseForecast": "el pronóstico cambie",
"emailCapturePhraseDiscussion": "haya nueva discusión",
"emailCaptureSentNote": "El enlace inicia tu sesión y es válido durante un día. Puedes abrirlo en cualquier dispositivo.",
"emailCaptureSentNoteRepeat": "Este enlace reemplaza al anterior. Solo funciona tu enlace más reciente.",
"emailCaptureDone": "Listo",
"emailCaptureWrongAddress": "¿Dirección incorrecta? Usa otro correo",
"emailCaptureUseDifferentEmail": "Usa otro correo",
"emailCaptureRecapSentTo": "Enviado a {email}.",
"emailCaptureRecapActionVote": "Haz clic en el enlace de ese correo para guardar tu voto.",
"emailCaptureRecapActionForecast": "Haz clic en el enlace de ese correo para guardar tu pronóstico.",
"emailCaptureRecapActionSubscribe": "Haz clic en el enlace de ese correo para activar tus novedades.",
"emailCaptureResend": "Reenviar correo",
"emailCaptureResendIn": "Reenviar en {seconds}s",
"emailCaptureResendFeedback": "Enviado. Revisa {email}.",
"emailCaptureGoogle": "Iniciar sesión con Google",
"emailCapturePassword": "Iniciar sesión con contraseña",
"emailCaptureBack": "Volver",
"emailConfirmBannerText": "Enviamos un correo de confirmación a <email></email>.",
"emailLinkRequestNew": "Enviar un nuevo enlace",
"emailLinkNewSent": "Enviamos un nuevo enlace a {email}.",
"emailLinkNewSentWithAction": "Enviamos un nuevo enlace a {email}. Conserva la misma acción.",
"notifyMeCtaLabel": "Notifícame cuando se resuelva",
"notifyMeCtaLabelUpdates": "Notifícame las novedades",
"notifyMeCtaFollowing": "Estás siguiendo esta pregunta",
"emailCaptureSubscribeBodyRepeat": "Enviaremos un nuevo enlace a {email}. Activará estas novedades en su lugar.",
"shareOpenedInNewTab": "Se abrió {target} en una pestaña nueva.",
"copiedUrlMessage": "La URL se ha copiado en tu portapapeles",
"emailLinkSignedInSubscribe": "Has iniciado sesión y ahora sigues esta pregunta.",
"emailLinkSignedInVote": "Has iniciado sesión y tu voto está guardado.",
"emailLinkSignedInForecast": "Has iniciado sesión y tu pronóstico está guardado.",
"emailCaptureSignInTitle": "Iniciar sesión con un enlace mágico",
"emailCaptureSignInBody": "Introduce tu correo. Te enviaremos un enlace para iniciar sesión.",
"emailCaptureSentActionSignInOnly": "Haz clic en él para iniciar sesión.",
"emailCaptureRecapActionSignIn": "Haz clic en el enlace de ese correo para iniciar sesión.",
"loginMagicLink": "Iniciar sesión con un enlace mágico",
"registrationMagicLink": "Registrarse con un enlace mágico"
}
Loading
Loading