Align beta, account, labs, notifications, and subscription support pages with website redesign (#30882)

* Move beta, account, labs, and notifications views to website-redesign layout

* Remove outdated Stories

---------

Co-authored-by: Antoine Clausse <antoine.clausse@overleaf.com>
GitOrigin-RevId: e37d30f7ae7487210404e81fbedd31d210fa26ac
This commit is contained in:
Rebeka Dekany
2026-01-21 16:05:38 +01:00
committed by Copybot
parent cd7da983d1
commit dc179a29df
8 changed files with 230 additions and 260 deletions

View File

@@ -1,71 +1,72 @@
extends ../layout-marketing
extends ../layout-website-redesign
include ../_mixins/back_to_btns
block vars
- isWebsiteRedesign = true
block content
main#main-content.content.content-alt
main#main-content.content
.container.beta-opt-in-wrapper
.row
.col-lg-10.offset-lg-1.col-xl-8.offset-xl-2
.card
.card-body
.page-header
h1
| #{translate("sharelatex_beta_program")}
.beta-opt-in
.container-fluid
.row
.col-lg-12
if user.betaProgram
p.text-center
strong #{translate("beta_program_already_participating")}.
p !{translate("thank_you_for_being_part_of_our_beta_program", {}, ['strong'])}.
else
p.text-center
strong #{translate("beta_program_not_participating")}.
p !{translate("beta_program_benefits", {}, ['strong'])}
.page-header
h1
| #{translate("sharelatex_beta_program")}
.beta-opt-in
.container-fluid
.row
.col-lg-12
if user.betaProgram
p.text-center
strong #{translate("beta_program_already_participating")}.
p !{translate("thank_you_for_being_part_of_our_beta_program", {}, ['strong'])}.
else
p.text-center
strong #{translate("beta_program_not_participating")}.
p !{translate("beta_program_benefits", {}, ['strong'])}
p #[strong How it works:]
ul
li
| #{translate("beta_program_badge_description")}&nbsp;
span.beta-badge.badge.bg-beta.bg-beta(
aria-label=translate('beta_feature_badge')
)
span.badge-content β
li !{translate("you_will_be_able_to_contact_us_any_time_to_share_your_feedback", {}, ['strong'])}.
li !{translate("we_may_also_contact_you_from_time_to_time_by_email_with_a_survey", {}, ['strong'])}.
li !{translate("you_can_opt_in_and_out_of_the_program_at_any_time_on_this_page", {}, ['strong'])}.
p !{translate("note_features_under_development", {}, ['strong'])}.
p #[strong How it works:]
ul
li
| #{translate("beta_program_badge_description")}&nbsp;
span.beta-badge.badge.bg-beta.bg-beta(
aria-label=translate('beta_feature_badge')
)
span.badge-content β
li !{translate("you_will_be_able_to_contact_us_any_time_to_share_your_feedback", {}, ['strong'])}.
li !{translate("we_may_also_contact_you_from_time_to_time_by_email_with_a_survey", {}, ['strong'])}.
li !{translate("you_can_opt_in_and_out_of_the_program_at_any_time_on_this_page", {}, ['strong'])}.
p !{translate("note_features_under_development", {}, ['strong'])}.
.row.text-center
.col-lg-12
if user.betaProgram
form(
data-ol-regular-form
method='post'
action='/beta/opt-out'
novalidate
.row.text-center
.col-lg-12
if user.betaProgram
form(
data-ol-regular-form
method='post'
action='/beta/opt-out'
novalidate
)
input(name='_csrf' type='hidden' value=csrfToken)
.form-group
a.btn.btn-primary.btn-lg(
href='https://forms.gle/CFEsmvZQTAwHCd3X9'
target='_blank'
rel='noopener noreferrer'
) #{translate("give_feedback")}
.form-group
button.btn.btn-secondary-info.btn-secondary.btn-sm(
type='submit'
data-ol-disabled-inflight
)
input(name='_csrf' type='hidden' value=csrfToken)
.form-group
a.btn.btn-primary.btn-lg(
href='https://forms.gle/CFEsmvZQTAwHCd3X9'
target='_blank'
rel='noopener noreferrer'
) #{translate("give_feedback")}
.form-group
button.btn.btn-secondary-info.btn-secondary.btn-sm(
type='submit'
data-ol-disabled-inflight
)
span(data-ol-inflight='idle') #{translate("beta_program_opt_out_action")}
span(hidden data-ol-inflight='pending') #{translate("processing")}…
else
form(data-ol-regular-form method='post' action='/beta/opt-in')
input(name='_csrf' type='hidden' value=csrfToken)
.form-group
button.btn.btn-primary(type='submit' data-ol-disabled-inflight)
span(data-ol-inflight='idle') #{translate("beta_program_opt_in_action")}
span(hidden data-ol-inflight='pending') #{translate("joining")}…
.page-separator
+back-to-btns
span(data-ol-inflight='idle') #{translate("beta_program_opt_out_action")}
span(hidden data-ol-inflight='pending') #{translate("processing")}…
else
form(data-ol-regular-form method='post' action='/beta/opt-in')
input(name='_csrf' type='hidden' value=csrfToken)
.form-group
button.btn.btn-primary(type='submit' data-ol-disabled-inflight)
span(data-ol-inflight='idle') #{translate("beta_program_opt_in_action")}
span(hidden data-ol-inflight='pending') #{translate("joining")}…
.page-separator
+back-to-btns

View File

@@ -1,15 +1,14 @@
extends ../layout-marketing
extends ../layout-website-redesign
block vars
- var suppressNavbar = true
- var suppressFooter = true
- metadata.robotsNoindexNofollow = true
- isWebsiteRedesign = true
block content
main#main-content.content.content-alt
main#main-content.content
.container-custom-sm.mx-auto
.card
.card-body
h3 #{translate('your_account_is_suspended')}
p #{translate('sorry_this_account_has_been_suspended')}
p !{translate('please_contact_us_if_you_think_this_is_in_error', {}, [{name: 'a', attrs: {href: `mailto:${settings.adminEmail}`}}])}
h3 #{translate('your_account_is_suspended')}
p #{translate('sorry_this_account_has_been_suspended')}
p !{translate('please_contact_us_if_you_think_this_is_in_error', {}, [{name: 'a', attrs: {href: `mailto:${settings.adminEmail}`}}])}

View File

@@ -1,51 +1,52 @@
extends ../layout-marketing
extends ../layout-website-redesign
include ../_mixins/notification
block vars
- isWebsiteRedesign = true
block content
main#main-content.content.content-alt
main#main-content.content
.container
.row
.col-lg-8.offset-lg-2.col-xl-6.offset-xl-3
.card
.card-body
.page-header(data-ol-hide-on-error-message='confirm-email-wrong-user')
h1 #{translate("confirm_email")}
form(method='POST' action='/logout' id='logoutForm')
input(name='_csrf' type='hidden' value=csrfToken)
input(name='redirect' type='hidden' value=currentUrlWithQueryParams)
form(
name='confirmEmailForm'
data-ol-async-form
data-ol-auto-submit
action='/user/emails/confirm'
method='POST'
id='confirmEmailForm'
)
input(name='_csrf' type='hidden' value=csrfToken)
input(name='token' type='hidden' value=token)
.page-header(data-ol-hide-on-error-message='confirm-email-wrong-user')
h1 #{translate("confirm_email")}
form(method='POST' action='/logout' id='logoutForm')
input(name='_csrf' type='hidden' value=csrfToken)
input(name='redirect' type='hidden' value=currentUrlWithQueryParams)
form(
name='confirmEmailForm'
data-ol-async-form
data-ol-auto-submit
action='/user/emails/confirm'
method='POST'
id='confirmEmailForm'
)
input(name='_csrf' type='hidden' value=csrfToken)
input(name='token' type='hidden' value=token)
div(data-ol-not-sent)
+formMessages
div(data-ol-custom-form-message='confirm-email-wrong-user' hidden)
h1.h3 #{translate("we_cant_confirm_this_email")}
p !{translate("to_confirm_email_address_you_must_be_logged_in_with_the_requesting_account")}
p !{translate("you_are_currently_logged_in_as", {email: getUserEmail()})}
.actions
button.btn-primary.btn.w-100(form='logoutForm') #{translate('log_in_with_a_different_account')}
div(data-ol-not-sent)
+formMessages
div(data-ol-custom-form-message='confirm-email-wrong-user' hidden)
h1.h3 #{translate("we_cant_confirm_this_email")}
p !{translate("to_confirm_email_address_you_must_be_logged_in_with_the_requesting_account")}
p !{translate("you_are_currently_logged_in_as", {email: getUserEmail()})}
.actions
button.btn-primary.btn.w-100(form='logoutForm') #{translate('log_in_with_a_different_account')}
.actions
button.btn-primary.btn.w-100(
type='submit'
data-ol-disabled-inflight
data-ol-hide-on-error-message='confirm-email-wrong-user'
)
span(data-ol-inflight='idle')
| #{translate('confirm')}
span(hidden data-ol-inflight='pending')
span.spinner-border.spinner-border-sm.mx-2(role='status')
.actions
button.btn-primary.btn.w-100(
type='submit'
data-ol-disabled-inflight
data-ol-hide-on-error-message='confirm-email-wrong-user'
)
span(data-ol-inflight='idle')
| #{translate('confirm')}
span(hidden data-ol-inflight='pending')
span.spinner-border.spinner-border-sm.mx-2(role='status')
div(hidden data-ol-sent)
+notification({ariaLive: 'polite', type: 'success', className: 'mb-3', content: translate('thank_you_email_confirmed')})
.text-center
a.btn.btn-primary(href='/user/settings')
| #{translate('go_to_account_settings')}
div(hidden data-ol-sent)
+notification({ariaLive: 'polite', type: 'success', className: 'mb-3', content: translate('thank_you_email_confirmed')})
.text-center
a.btn.btn-primary(href='/user/settings')
| #{translate('go_to_account_settings')}

View File

@@ -1,47 +1,48 @@
extends ../layout-marketing
extends ../layout-website-redesign
include ../_mixins/back_to_btns
block vars
- isWebsiteRedesign = true
block content
main#main-content.content.content-alt
main#main-content.content
.container
.row
.col-lg-10.offset-lg-1.col-xl-8.offset-xl-2
.card
.card-body
.page-header
h1 #{translate("newsletter_info_title")}
.page-header
h1 #{translate("newsletter_info_title")}
p #{translate("newsletter_info_summary")}
p #{translate("newsletter_info_summary")}
- var submitAction
- var submitAction
if subscribed
- submitAction = '/user/newsletter/unsubscribe'
p !{translate("newsletter_info_subscribed", {}, ['strong'])}
else
- submitAction = '/user/newsletter/subscribe'
p !{translate("newsletter_info_unsubscribed", {}, ['strong'])}
form(
name='newsletterForm'
data-ol-async-form
data-ol-reload-on-success
action=submitAction
method='POST'
)
input(name='_csrf' type='hidden' value=csrfToken)
+formMessages
p.actions.text-center
if subscribed
- submitAction = '/user/newsletter/unsubscribe'
p !{translate("newsletter_info_subscribed", {}, ['strong'])}
button.btn-danger.btn(type='submit' data-ol-disabled-inflight)
span(data-ol-inflight='idle') #{translate("unsubscribe")}
span(hidden data-ol-inflight='pending') #{translate("saving")}…
else
- submitAction = '/user/newsletter/subscribe'
p !{translate("newsletter_info_unsubscribed", {}, ['strong'])}
button.btn-primary.btn(type='submit' data-ol-disabled-inflight)
span(data-ol-inflight='idle') #{translate("subscribe")}
span(hidden data-ol-inflight='pending') #{translate("saving")}…
form(
name='newsletterForm'
data-ol-async-form
data-ol-reload-on-success
action=submitAction
method='POST'
)
input(name='_csrf' type='hidden' value=csrfToken)
+formMessages
p.actions.text-center
if subscribed
button.btn-danger.btn(type='submit' data-ol-disabled-inflight)
span(data-ol-inflight='idle') #{translate("unsubscribe")}
span(hidden data-ol-inflight='pending') #{translate("saving")}…
else
button.btn-primary.btn(type='submit' data-ol-disabled-inflight)
span(data-ol-inflight='idle') #{translate("subscribe")}
span(hidden data-ol-inflight='pending') #{translate("saving")}…
if subscribed
p #{translate("newsletter_info_note")}
if subscribed
p #{translate("newsletter_info_note")}
.page-separator
+back-to-btns
.page-separator
+back-to-btns

View File

@@ -1,18 +1,19 @@
extends ../layout-marketing
extends ../layout-website-redesign
block vars
- isWebsiteRedesign = true
block content
main#main-content.content.content-alt
main#main-content.content
.container
.row
.col-lg-6.offset-lg-3.col-xl-4.offset-xl-4
.card
.card-body
.page-header
h1 We're back!
p Overleaf is now running normally.
p
| Please
|
a(href='/login') log in
|
| to continue working on your projects.
.page-header
h1 We're back!
p Overleaf is now running normally.
p
| Please
|
a(href='/login') log in
|
| to continue working on your projects.

View File

@@ -1,7 +1,10 @@
extends ../layout-marketing
extends ../layout-website-redesign
block vars
- isWebsiteRedesign = true
block content
main#main-content.content.content-alt
main#main-content.content
.container
.row
.registration-message
@@ -23,13 +26,11 @@ block content
.row
.col-lg-8.offset-lg-2.col-xl-6.offset-xl-3
.card
.card-body
.page-header
h1 #{translate("register")}
p
| Please contact
|
strong #{settings.adminEmail}
|
| to create an account.
.page-header
h1 #{translate("register")}
p
| Please contact
|
strong #{settings.adminEmail}
|
| to create an account.

View File

@@ -1,66 +1,67 @@
extends ../layout-marketing
extends ../layout-website-redesign
block vars
- isWebsiteRedesign = true
block content
main#main-content.content.content-alt
main#main-content.content
.container
.row
.col-lg-10.offset-lg-1.col-xl-8.offset-xl-2
.card.clear-user-sessions
.card-body
.page-header
h1 #{translate("your_sessions")}
.page-header
h1 #{translate("your_sessions")}
if currentSession.ip_address && currentSession.session_created
h3 #{translate("current_session")}
div
table.table.table-striped
thead
tr
th #{translate("ip_address")}
th #{translate("session_created_at")}
tr
td #{currentSession.ip_address}
td #{moment(currentSession.session_created).utc().format('Do MMM YYYY, h:mm a')} UTC
if currentSession.ip_address && currentSession.session_created
h3 #{translate("current_session")}
div
table.table.table-striped
thead
tr
th #{translate("ip_address")}
th #{translate("session_created_at")}
tr
td #{currentSession.ip_address}
td #{moment(currentSession.session_created).utc().format('Do MMM YYYY, h:mm a')} UTC
h3 #{translate("other_sessions")}
div
p.small
| !{translate("clear_sessions_description")}
h3 #{translate("other_sessions")}
div
p.small
| !{translate("clear_sessions_description")}
form(data-ol-async-form action='/user/sessions/clear' method='POST')
input(name='_csrf' type='hidden' value=csrfToken)
div(data-ol-not-sent)
if sessions.length == 0
p.text-center
| #{translate("no_other_sessions")}
form(data-ol-async-form action='/user/sessions/clear' method='POST')
input(name='_csrf' type='hidden' value=csrfToken)
div(data-ol-not-sent)
if sessions.length == 0
p.text-center
| #{translate("no_other_sessions")}
if sessions.length > 0
table.table.table-striped
thead
tr
th #{translate("ip_address")}
th #{translate("session_created_at")}
each session in sessions
tr
td #{session.ip_address}
td #{moment(session.session_created).utc().format('Do MMM YYYY, h:mm a')} UTC
if sessions.length > 0
table.table.table-striped
thead
tr
th #{translate("ip_address")}
th #{translate("session_created_at")}
each session in sessions
tr
td #{session.ip_address}
td #{moment(session.session_created).utc().format('Do MMM YYYY, h:mm a')} UTC
p.actions
.text-center
button.btn.btn-lg.btn-primary(
type='submit'
data-ol-disable-inflight
)
span(data-ol-inflight='idle') #{translate('clear_sessions')}
span(hidden data-ol-inflight='pending') #{translate("processing")}…
p.actions
.text-center
button.btn.btn-lg.btn-primary(
type='submit'
data-ol-disable-inflight
)
span(data-ol-inflight='idle') #{translate('clear_sessions')}
span(hidden data-ol-inflight='pending') #{translate("processing")}…
div(hidden data-ol-sent)
p.text-center
| #{translate("no_other_sessions")}
div(hidden data-ol-sent)
p.text-center
| #{translate("no_other_sessions")}
p.text-success.text-center
| #{translate('clear_sessions_success')}
.page-separator
.d-flex.gap-3
a.btn.btn-secondary(href='/user/settings') #{translate('back_to_account_settings')}
a.btn.btn-secondary(href='/project') #{translate('back_to_your_projects')}
p.text-success.text-center
| #{translate('clear_sessions_success')}
.page-separator
.d-flex.gap-3
a.btn.btn-secondary(href='/user/settings') #{translate('back_to_account_settings')}
a.btn.btn-secondary(href='/project') #{translate('back_to_your_projects')}

View File

@@ -125,19 +125,6 @@ export const PostGateway = () => (
</>
)
export const AccountSuspended = () => (
<main className="content content-alt" id="main-content">
<div className="container-custom-sm mx-auto">
<div className="card">
<div className="card-body">
<h3>Your account is suspended</h3>
<p>{lorem(6)}</p>
</div>
</div>
</div>
</main>
)
export const Restricted = () => (
<>
<Nav />
@@ -158,28 +145,6 @@ export const Restricted = () => (
</>
)
export const OneTimeLogin = () => (
<>
<Nav />
<main className="content content-alt" id="main-content">
<div className="container">
<div className="row">
<div className="col-lg-6 offset-lg-3 col-xl-4 offset-xl-4">
<div className="card">
<div className="card-body">
<div className="page-header">
<h1>We're back!</h1>
</div>
<p>Overleaf is now running normally.</p>
</div>
</div>
</div>
</div>
</div>
</main>
</>
)
export const Invite = () => (
<main className="content content-alt" id="invite-root">
<OLRow className="row row-spaced">