diff --git a/app/brave_settings_strings.grdp b/app/brave_settings_strings.grdp
index 747f2b7b5441..8fa7fbb411c4 100644
--- a/app/brave_settings_strings.grdp
+++ b/app/brave_settings_strings.grdp
@@ -25,6 +25,130 @@
Get started
+
+
+
+
+ Sign in or create a Brave account
+
+
+ A Brave account will allow you to easily sync your settings, passwords, bookmarks, etc. across all your devices and access our full range of premium products.
+
+
+ Get started
+
+
+ Manage account
+
+
+
+
+ Get started with your Brave account
+
+
+ A Brave account will allow you to easily sync your settings, passwords, bookmarks, etc. across all your devices and access our full range of premium products.
+
+
+ Create a Brave account
+
+
+ Already have an account? Sign in
+
+
+ For advanced users, we also support self-custody of your Brave account keys for an extra layer of privacy. <a target="_blank" href="$1">Learn more</a>
+
+
+ Use self-custody
+
+
+
+
+ Create your account
+
+
+ A Brave account will allow you to easily sync your settings, passwords, bookmarks, etc. across all your devices and access our full range of premium products.
+
+
+ You can't use @bravealias.com addresses for creating Brave accounts. Please try again with a different domain.
+
+
+ Create a password
+
+
+ Weak
+
+
+ Medium
+
+
+ Strong
+
+
+ Confirm password
+
+
+ Confirm your password
+
+
+ Passwords don't match
+
+
+ Passwords match
+
+
+ I have read and accept the <a target="_blank" href="$1">Terms of service</a> and <a target="_blank" href="$2">Privacy agreement</a>.
+
+
+ Create account
+
+
+
+
+ Sign in to your account
+
+
+ A Brave account will allow you to easily sync your settings, passwords, bookmarks, etc. across all your devices and access our full range of premium products.
+
+
+ Password
+
+
+ Forgot your password?
+
+
+ Sign in
+
+
+
+
+ Forgot your password?
+
+
+ Confirm your Brave account email and we'll email you a link to reset your password. The link will only be valid for 30 minutes.
+
+
+ [Explain that if they reset their password without having an active login, all the user data will be deleted]
+
+
+ Cancel
+
+
+ Reset your password
+
+
+
+
+ Email address
+
+
+ Enter your email address
+
+
+ Enter your password
+
+
+
+
Profile name and icon
diff --git a/browser/resources/settings/BUILD.gn b/browser/resources/settings/BUILD.gn
index 67bbc5e76d88..3313b2991ab7 100644
--- a/browser/resources/settings/BUILD.gn
+++ b/browser/resources/settings/BUILD.gn
@@ -51,6 +51,8 @@ generate_grd("build_grd") {
"brave_sync_page/start_icon.svg",
"images/cookies_banner.svg",
"images/cookies_banner_dark.svg",
+ "images/full_brave_brand.svg",
+ "images/full_brave_brand_dark.svg",
"images/permissions_banner.svg",
"images/permissions_banner_dark.svg",
"images/safe_browsing_banner.svg",
@@ -79,5 +81,6 @@ preprocess_if_expr("preprocess") {
out_folder =
"$root_gen_dir/chrome/browser/resources/settings/$preprocess_folder"
- in_files = brave_settings_local_ts_files + brave_settings_local_html_files
+ in_files = brave_settings_local_ts_files + brave_settings_local_html_files +
+ brave_settings_local_css_files
}
diff --git a/browser/resources/settings/getting_started_page/brave_account_browser_proxy.ts b/browser/resources/settings/getting_started_page/brave_account_browser_proxy.ts
new file mode 100644
index 000000000000..03cb7bf45500
--- /dev/null
+++ b/browser/resources/settings/getting_started_page/brave_account_browser_proxy.ts
@@ -0,0 +1,22 @@
+/* Copyright (c) 2024 The Brave Authors. All rights reserved.
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+import { sendWithPromise } from '//resources/js/cr.js'
+
+export interface BraveAccountBrowserProxy {
+ getPasswordStrength(password: string): Promise
+}
+
+export class BraveAccountBrowserProxyImpl implements BraveAccountBrowserProxy {
+ getPasswordStrength (password: string) {
+ return sendWithPromise('getPasswordStrength', password)
+ }
+
+ static getInstance() {
+ return instance || (instance = new BraveAccountBrowserProxyImpl())
+ }
+}
+
+let instance: BraveAccountBrowserProxy | null = null
diff --git a/browser/resources/settings/getting_started_page/brave_account_common.css b/browser/resources/settings/getting_started_page/brave_account_common.css
new file mode 100644
index 000000000000..7157a459953e
--- /dev/null
+++ b/browser/resources/settings/getting_started_page/brave_account_common.css
@@ -0,0 +1,26 @@
+/* Copyright (c) 2024 The Brave Authors. All rights reserved.
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+/* #css_wrapper_metadata_start
+ * #type=style-lit
+ * #css_wrapper_metadata_end */
+
+.label {
+ color: var(--leo-color-text-primary);
+ font: var(--leo-font-small-semibold);
+ margin: 0px 0px 0px var(--leo-spacing-s);
+}
+
+.label.error {
+ color: var(--leo-color-systemfeedback-error-text);
+}
+
+leo-input {
+ --leo-control-border-color: var(--leo-color-divider-strong);
+}
+
+leo-input:not(:focus):has(> .error) {
+ --leo-control-border-color: var(--leo-color-systemfeedback-error-icon);
+}
diff --git a/browser/resources/settings/getting_started_page/brave_account_common.ts b/browser/resources/settings/getting_started_page/brave_account_common.ts
new file mode 100644
index 000000000000..b7ef3dff7171
--- /dev/null
+++ b/browser/resources/settings/getting_started_page/brave_account_common.ts
@@ -0,0 +1,40 @@
+/* Copyright (c) 2024 The Brave Authors. All rights reserved.
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+export function onEyeIconClicked(event: Event) {
+ event.preventDefault()
+ let type = 'password'
+ const target = event.target as Element
+ target.setAttribute('name',
+ target.getAttribute('name') === 'eye-off'
+ ? (type = 'text', 'eye-on')
+ : 'eye-off')
+ target.parentElement!.setAttribute('type', type)
+}
+
+export function isEmailValid(input: string) {
+ if (!input) {
+ // input is falsy
+ return false
+ }
+
+ if (!/^[\x20-\x7F]+$/.test(input)) {
+ // input contains characters outside printable ASCII
+ return false
+ }
+
+ const index = input.lastIndexOf('@')
+ if (index === -1) {
+ // there's no @ sign in input
+ return false
+ }
+
+ if (index === 0 || index === input.length - 1) {
+ // there are no characters either before or after the last @ sign
+ return false
+ }
+
+ return true
+}
diff --git a/browser/resources/settings/getting_started_page/brave_account_create_dialog.css b/browser/resources/settings/getting_started_page/brave_account_create_dialog.css
new file mode 100644
index 000000000000..2d6cb8175b2a
--- /dev/null
+++ b/browser/resources/settings/getting_started_page/brave_account_create_dialog.css
@@ -0,0 +1,68 @@
+/* Copyright (c) 2024 The Brave Authors. All rights reserved.
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+/* #css_wrapper_metadata_start
+ * #type=style-lit
+ * #scheme=relative
+ * #import=./brave_account_common.css.js
+ * #include=brave-account-common
+ * #css_wrapper_metadata_end */
+
+.dropdown {
+ height: var(--height);
+ margin: calc(-1 * var(--height)) var(--leo-spacing-s) 0px var(--leo-spacing-s);
+ position: relative;
+ transition: all 750ms;
+ z-index: -1;
+}
+
+.dropdown.visible {
+ margin-top: var(--leo-spacing-s);
+}
+
+#brave-alias-dropdown {
+ --height: 36px;
+ --leo-icon-size: var(--leo-icon-xs);
+ display: flex;
+ font: var(--leo-font-small-regular);
+ gap: var(--leo-spacing-s);
+}
+
+#password-dropdown {
+ --height: 18px;
+ display: flex;
+}
+
+#password-confirmation-dropdown {
+ --height: 18px;
+ --leo-icon-size: var(--leo-icon-xs);
+ align-items: center;
+ display: flex;
+ font: var(--leo-font-small-regular);
+ gap: var(--leo-spacing-s);
+}
+
+leo-icon[name=check-circle-filled] {
+ --leo-icon-color: var(--leo-color-text-interactive);
+}
+
+leo-icon[name=check-circle-filled] + div {
+ color: var(--leo-color-text-interactive);
+}
+
+leo-icon[name=warning-triangle-filled] {
+ --leo-icon-color: var(--leo-color-systemfeedback-error-icon);
+}
+
+leo-icon[name=warning-triangle-filled] + div {
+ color: var(--leo-color-systemfeedback-error-text);
+}
+
+leo-checkbox a {
+ color: var(--leo-color-text-interactive);
+ font: var(--leo-font-default-link);
+ text-decoration-skip-ink: none;
+ text-underline-offset: 2.8px;
+}
diff --git a/browser/resources/settings/getting_started_page/brave_account_create_dialog.html.ts b/browser/resources/settings/getting_started_page/brave_account_create_dialog.html.ts
new file mode 100644
index 000000000000..8c48d248a44a
--- /dev/null
+++ b/browser/resources/settings/getting_started_page/brave_account_create_dialog.html.ts
@@ -0,0 +1,93 @@
+/* Copyright (c) 2024 The Brave Authors. All rights reserved.
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+import { html } from '//resources/lit/v3_0/lit.rollup.js'
+
+import { onEyeIconClicked } from './brave_account_common.js'
+import { SettingsBraveAccountCreateDialogElement } from './brave_account_create_dialog.js'
+
+export function getHtml(this: SettingsBraveAccountCreateDialogElement) {
+ return html`
+
+
+
+
+ `
+}
diff --git a/browser/resources/settings/getting_started_page/brave_account_dialog.ts b/browser/resources/settings/getting_started_page/brave_account_dialog.ts
new file mode 100644
index 000000000000..efe9d7d244a2
--- /dev/null
+++ b/browser/resources/settings/getting_started_page/brave_account_dialog.ts
@@ -0,0 +1,55 @@
+/* Copyright (c) 2024 The Brave Authors. All rights reserved.
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+import { CrDialogElement } from '//resources/cr_elements/cr_dialog/cr_dialog.js'
+import { CrLitElement } from '//resources/lit/v3_0/lit.rollup.js'
+
+import { getCss } from './brave_account_dialog.css.js'
+import { getHtml } from './brave_account_dialog.html.js'
+
+export interface SettingsBraveAccountDialogElement {
+ $: {
+ dialog: CrDialogElement,
+ }
+}
+
+export class SettingsBraveAccountDialogElement extends CrLitElement {
+ static get is() {
+ return 'settings-brave-account-dialog'
+ }
+
+ static override get styles() {
+ return getCss()
+ }
+
+ override render() {
+ return getHtml.bind(this)()
+ }
+
+ static override get properties() {
+ return {
+ alertMessage: { type: String },
+ dialogDescription: { type: String },
+ dialogTitle: { type: String },
+ horizontalButtons: { type: Boolean },
+ showBackButton: { type: Boolean },
+ }
+ }
+
+ protected alertMessage: string = ''
+ protected dialogDescription: string
+ protected dialogTitle: string
+ protected horizontalButtons: boolean
+ protected showBackButton: boolean
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ 'settings-brave-account-dialog': SettingsBraveAccountDialogElement
+ }
+}
+
+customElements.define(
+ SettingsBraveAccountDialogElement.is, SettingsBraveAccountDialogElement)
diff --git a/browser/resources/settings/getting_started_page/brave_account_entry_dialog.css b/browser/resources/settings/getting_started_page/brave_account_entry_dialog.css
new file mode 100644
index 000000000000..760c52e7bbe4
--- /dev/null
+++ b/browser/resources/settings/getting_started_page/brave_account_entry_dialog.css
@@ -0,0 +1,30 @@
+/* Copyright (c) 2024 The Brave Authors. All rights reserved.
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+/* #css_wrapper_metadata_start
+ * #type=style-lit
+ * #css_wrapper_metadata_end */
+
+[slot=footer] {
+ align-items: center;
+ display: flex;
+ gap: var(--leo-spacing-xl);
+ padding: var(--leo-spacing-2xl);
+}
+
+.footer-text {
+ color: var(--leo-color-text-tertiary);
+ font: var(--leo-font-small-regular);
+}
+
+.footer-text a {
+ color: var(--leo-color-text-secondary);
+ font: var(--leo-font-small-link);
+ text-underline-offset: 2.5px;
+}
+
+leo-button {
+ flex: none;
+}
diff --git a/browser/resources/settings/getting_started_page/brave_account_entry_dialog.html.ts b/browser/resources/settings/getting_started_page/brave_account_entry_dialog.html.ts
new file mode 100644
index 000000000000..2d72e8e42527
--- /dev/null
+++ b/browser/resources/settings/getting_started_page/brave_account_entry_dialog.html.ts
@@ -0,0 +1,37 @@
+/* Copyright (c) 2024 The Brave Authors. All rights reserved.
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+import { html } from '//resources/lit/v3_0/lit.rollup.js'
+
+import './brave_account_dialog.js'
+import { SettingsBraveAccountEntryDialogElement } from './brave_account_entry_dialog.js'
+
+export function getHtml(this: SettingsBraveAccountEntryDialogElement) {
+ return html`
+
+
+
+ `
+}
diff --git a/browser/resources/settings/getting_started_page/brave_account_entry_dialog.ts b/browser/resources/settings/getting_started_page/brave_account_entry_dialog.ts
new file mode 100644
index 000000000000..9de8bc1d95ae
--- /dev/null
+++ b/browser/resources/settings/getting_started_page/brave_account_entry_dialog.ts
@@ -0,0 +1,35 @@
+/* Copyright (c) 2024 The Brave Authors. All rights reserved.
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+import { CrLitElement } from '//resources/lit/v3_0/lit.rollup.js'
+
+import { getCss } from './brave_account_entry_dialog.css.js'
+import { getHtml } from './brave_account_entry_dialog.html.js'
+
+export class SettingsBraveAccountEntryDialogElement extends CrLitElement {
+ static get is() {
+ return 'settings-brave-account-entry-dialog'
+ }
+
+ static override get styles() {
+ return getCss()
+ }
+
+ override render() {
+ return getHtml.bind(this)()
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ 'settings-brave-account-entry-dialog':
+ SettingsBraveAccountEntryDialogElement
+ }
+}
+
+customElements.define(
+ SettingsBraveAccountEntryDialogElement.is,
+ SettingsBraveAccountEntryDialogElement
+)
diff --git a/browser/resources/settings/getting_started_page/brave_account_forgot_password_dialog.css b/browser/resources/settings/getting_started_page/brave_account_forgot_password_dialog.css
new file mode 100644
index 000000000000..2a133210d894
--- /dev/null
+++ b/browser/resources/settings/getting_started_page/brave_account_forgot_password_dialog.css
@@ -0,0 +1,15 @@
+/* Copyright (c) 2024 The Brave Authors. All rights reserved.
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+/* #css_wrapper_metadata_start
+ * #type=style-lit
+ * #scheme=relative
+ * #import=./brave_account_common.css.js
+ * #include=brave-account-common
+ * #css_wrapper_metadata_end */
+
+leo-button {
+ flex: none;
+}
diff --git a/browser/resources/settings/getting_started_page/brave_account_forgot_password_dialog.html.ts b/browser/resources/settings/getting_started_page/brave_account_forgot_password_dialog.html.ts
new file mode 100644
index 000000000000..84d623f9a180
--- /dev/null
+++ b/browser/resources/settings/getting_started_page/brave_account_forgot_password_dialog.html.ts
@@ -0,0 +1,40 @@
+/* Copyright (c) 2024 The Brave Authors. All rights reserved.
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+import { html } from '//resources/lit/v3_0/lit.rollup.js'
+
+import './brave_account_dialog.js'
+import { SettingsBraveAccountForgotPasswordDialogElement } from './brave_account_forgot_password_dialog.js'
+
+export function getHtml(this: SettingsBraveAccountForgotPasswordDialogElement) {
+ return html`
+
+