diff --git a/packages/browser-wallet/CHANGELOG.md b/packages/browser-wallet/CHANGELOG.md index ea5ae337f..f3787ae50 100644 --- a/packages/browser-wallet/CHANGELOG.md +++ b/packages/browser-wallet/CHANGELOG.md @@ -3,6 +3,7 @@ ## Unreleased - Updated texts across the wallet to be FCA legally compliant +- Updated onboarding flow, focusing on streamlining the user experience from landing screens to account setup. ### Fixed diff --git a/packages/browser-wallet/src/assets/images/graphic-landing-3.png b/packages/browser-wallet/src/assets/images/graphic-landing-3.png new file mode 100644 index 000000000..4224f1296 Binary files /dev/null and b/packages/browser-wallet/src/assets/images/graphic-landing-3.png differ diff --git a/packages/browser-wallet/src/assets/images/graphic-landing-4.png b/packages/browser-wallet/src/assets/images/graphic-landing-4.png new file mode 100644 index 000000000..577292d66 Binary files /dev/null and b/packages/browser-wallet/src/assets/images/graphic-landing-4.png differ diff --git a/packages/browser-wallet/src/assets/images/onboarding-bg.png b/packages/browser-wallet/src/assets/images/onboarding-bg.png deleted file mode 100644 index 76e59dca6..000000000 Binary files a/packages/browser-wallet/src/assets/images/onboarding-bg.png and /dev/null differ diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/arrow-down.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/arrow-down.svg new file mode 100644 index 000000000..25844067f --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/arrow-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/arrow-left.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/arrow-left.svg new file mode 100644 index 000000000..bd61b8cfc --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/arrow-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/arrow-right.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/arrow-right.svg new file mode 100644 index 000000000..c1cb3ae20 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/arrow-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/arrow-up.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/arrow-up.svg new file mode 100644 index 000000000..aa62c324c --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/arrow-up.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/backspace-delete.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/backspace-delete.svg new file mode 100644 index 000000000..63705c6bb --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/backspace-delete.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/caret-up-down.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/caret-up-down.svg new file mode 100644 index 000000000..5ae0e65a4 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/caret-up-down.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/chevron-down.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/chevron-down.svg new file mode 100644 index 000000000..704f39c72 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/chevron-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/chevron-left.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/chevron-left.svg new file mode 100644 index 000000000..4291f39d3 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/chevron-right.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/chevron-right.svg new file mode 100644 index 000000000..8cd13f101 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/chevron-up.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/chevron-up.svg new file mode 100644 index 000000000..1bac362b0 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/chevron-up.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/fullscreen-maximize.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/fullscreen-maximize.svg new file mode 100644 index 000000000..17a48498c --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/fullscreen-maximize.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/fullscreen-minimize.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/fullscreen-minimize.svg new file mode 100644 index 000000000..0b27e4cb4 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/fullscreen-minimize.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/up-down-transfer.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/up-down-transfer.svg new file mode 100644 index 000000000..ac7228b0b --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Arrows/up-down-transfer.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Custom/concordium-full-logo.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Custom/concordium-full-logo.svg new file mode 100644 index 000000000..e6e41b0e2 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Custom/concordium-full-logo.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Custom/concordium-glyph-only.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Custom/concordium-glyph-only.svg new file mode 100644 index 000000000..a124ea528 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Custom/concordium-glyph-only.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Custom/graphic-landing-3.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Custom/graphic-landing-3.svg new file mode 100644 index 000000000..ce47eca10 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Custom/graphic-landing-3.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Custom/graphic-landing-4.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Custom/graphic-landing-4.svg new file mode 100644 index 000000000..f22a71536 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Custom/graphic-landing-4.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Custom/indicator-horisontal-s.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Custom/indicator-horisontal-s.svg new file mode 100644 index 000000000..27c3ddeb2 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Custom/indicator-horisontal-s.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/account-keys-lock.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/account-keys-lock.svg new file mode 100644 index 000000000..f65d60388 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/account-keys-lock.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/barcode-qr-scaner.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/barcode-qr-scaner.svg new file mode 100644 index 000000000..5115126ee --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/barcode-qr-scaner.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/book.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/book.svg new file mode 100644 index 000000000..4072e5b61 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/book.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/brush-design.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/brush-design.svg new file mode 100644 index 000000000..6bea26bd5 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/brush-design.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/check-done.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/check-done.svg new file mode 100644 index 000000000..575afe812 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/check-done.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/circled-check-done.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/circled-check-done.svg new file mode 100644 index 000000000..03e2708ef --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/circled-check-done.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/circled-info-tootlip.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/circled-info-tootlip.svg new file mode 100644 index 000000000..ceb7867f9 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/circled-info-tootlip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/circled-question-mark.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/circled-question-mark.svg new file mode 100644 index 000000000..a8b34c841 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/circled-question-mark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/circled-warning-exclamation.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/circled-warning-exclamation.svg new file mode 100644 index 000000000..f37826c0c --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/circled-warning-exclamation.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/circled-x-block-deny.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/circled-x-block-deny.svg new file mode 100644 index 000000000..533cb2524 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/circled-x-block-deny.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/circled-x-cross-close.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/circled-x-cross-close.svg new file mode 100644 index 000000000..bf108b5a5 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/circled-x-cross-close.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/clock-activity-history-time.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/clock-activity-history-time.svg new file mode 100644 index 000000000..190ec80bb --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/clock-activity-history-time.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/coin-crypto-cis-2.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/coin-crypto-cis-2.svg new file mode 100644 index 000000000..bc2e63a37 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/coin-crypto-cis-2.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/copy-duplicate.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/copy-duplicate.svg new file mode 100644 index 000000000..6195a3bb8 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/copy-duplicate.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/credit-card.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/credit-card.svg new file mode 100644 index 000000000..9caaefece --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/credit-card.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/development-version-brackets.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/development-version-brackets.svg new file mode 100644 index 000000000..00f0234a3 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/development-version-brackets.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/export-download.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/export-download.svg new file mode 100644 index 000000000..39f470a56 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/export-download.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/external-link.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/external-link.svg new file mode 100644 index 000000000..04aaa114b --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/external-link.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/eye-closed-show.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/eye-closed-show.svg new file mode 100644 index 000000000..05f98c2fe --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/eye-closed-show.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/eye-open-hide.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/eye-open-hide.svg new file mode 100644 index 000000000..5287deae0 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/eye-open-hide.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/filter-funnel.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/filter-funnel.svg new file mode 100644 index 000000000..4822032a0 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/filter-funnel.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/globe-world.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/globe-world.svg new file mode 100644 index 000000000..fab79d097 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/globe-world.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/id-identity-scan.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/id-identity-scan.svg new file mode 100644 index 000000000..d32e75ec9 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/id-identity-scan.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/incognito-private.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/incognito-private.svg new file mode 100644 index 000000000..ccda0abda --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/incognito-private.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/laptop-computer-notebook.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/laptop-computer-notebook.svg new file mode 100644 index 000000000..a597fb124 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/laptop-computer-notebook.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/ledger-device-hardware-wallet.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/ledger-device-hardware-wallet.svg new file mode 100644 index 000000000..a1d2fca43 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/ledger-device-hardware-wallet.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/memo-note-text-content.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/memo-note-text-content.svg new file mode 100644 index 000000000..6bc101b59 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/memo-note-text-content.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/mobile-phone.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/mobile-phone.svg new file mode 100644 index 000000000..1ad790d4c --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/mobile-phone.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/objects-modals-cubes.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/objects-modals-cubes.svg new file mode 100644 index 000000000..b2555b76c --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/objects-modals-cubes.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/pencil-edit-write.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/pencil-edit-write.svg new file mode 100644 index 000000000..f0e7cb5fd --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/pencil-edit-write.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/percentage-earn-staking.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/percentage-earn-staking.svg new file mode 100644 index 000000000..4da7b8561 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/percentage-earn-staking.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/placeholder.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/placeholder.svg new file mode 100644 index 000000000..7003ffa3a --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/placeholder.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/plus-add-buy.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/plus-add-buy.svg new file mode 100644 index 000000000..6a5503800 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/plus-add-buy.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/restore-seed-phrase.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/restore-seed-phrase.svg new file mode 100644 index 000000000..c1623d4fa --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/restore-seed-phrase.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/scan-barcode-camera.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/scan-barcode-camera.svg new file mode 100644 index 000000000..2ff98e756 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/scan-barcode-camera.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/schedule- release-time.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/schedule- release-time.svg new file mode 100644 index 000000000..56b363873 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/schedule- release-time.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/search-magnifier.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/search-magnifier.svg new file mode 100644 index 000000000..87eae173a --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/search-magnifier.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/settings-gear-cog.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/settings-gear-cog.svg new file mode 100644 index 000000000..46a7d7f36 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/settings-gear-cog.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/settings-sliders.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/settings-sliders.svg new file mode 100644 index 000000000..58965e308 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/settings-sliders.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/shape-star.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/shape-star.svg new file mode 100644 index 000000000..d8f9748a6 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/shape-star.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/share.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/share.svg new file mode 100644 index 000000000..0695104d4 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/share.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/shield-square-crypto.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/shield-square-crypto.svg new file mode 100644 index 000000000..917bc5692 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/shield-square-crypto.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/speed-odometer-fast.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/speed-odometer-fast.svg new file mode 100644 index 000000000..e5b153980 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/speed-odometer-fast.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/text-content-metadata.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/text-content-metadata.svg new file mode 100644 index 000000000..69801593b --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/text-content-metadata.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/wallet-coin.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/wallet-coin.svg new file mode 100644 index 000000000..ccb178f52 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/wallet-coin.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/Interface/x-cross-close.svg b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/x-cross-close.svg new file mode 100644 index 000000000..5610b14fb --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/Interface/x-cross-close.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/clock-activity-history-time.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/clock-activity-history-time.svg new file mode 100644 index 000000000..190ec80bb --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/clock-activity-history-time.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-chart-pie-analytics.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-chart-pie-analytics.svg new file mode 100644 index 000000000..c06ed05c0 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-chart-pie-analytics.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-cloud-backup-seed-phrase.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-cloud-backup-seed-phrase.svg new file mode 100644 index 000000000..1a4b1703b --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-cloud-backup-seed-phrase.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-contacts-address-book.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-contacts-address-book.svg new file mode 100644 index 000000000..fedb82fab --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-contacts-address-book.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-identities-badge.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-identities-badge.svg new file mode 100644 index 000000000..bc21164f6 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-identities-badge.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-nft-block.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-nft-block.svg new file mode 100644 index 000000000..07d74bedb --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-nft-block.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-notifications-bell.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-notifications-bell.svg new file mode 100644 index 000000000..c03e7f9a9 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-notifications-bell.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-password-lock.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-password-lock.svg new file mode 100644 index 000000000..83ebdbf75 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-password-lock.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-restore-reload.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-restore-reload.svg new file mode 100644 index 000000000..aed91504e --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-restore-reload.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-shredder-erase-data.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-shredder-erase-data.svg new file mode 100644 index 000000000..63faa6a0a --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-shredder-erase-data.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-trash-can-garbage-delete.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-trash-can-garbage-delete.svg new file mode 100644 index 000000000..2f4a4e7f9 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-trash-can-garbage-delete.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-wallets-wallet-1.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-wallets-wallet-1.svg new file mode 100644 index 000000000..0c0750531 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-wallets-wallet-1.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-wallets-wallet.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-wallets-wallet.svg new file mode 100644 index 000000000..0c0750531 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/menu-wallets-wallet.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-blocks-menu-button.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-blocks-menu-button.svg new file mode 100644 index 000000000..14dd1794b --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-blocks-menu-button.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-clock-activity-history-time.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-clock-activity-history-time.svg new file mode 100644 index 000000000..9173e0d10 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-clock-activity-history-time.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-discover-compass-active.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-discover-compass-active.svg new file mode 100644 index 000000000..63ef77e41 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-discover-compass-active.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-discover-compass-default.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-discover-compass-default.svg new file mode 100644 index 000000000..214d0a4c0 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-discover-compass-default.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-dots-menu-button.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-dots-menu-button.svg new file mode 100644 index 000000000..5c86554ad --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-dots-menu-button.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-hamburger-menu-lines.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-hamburger-menu-lines.svg new file mode 100644 index 000000000..100cf6c2e --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-hamburger-menu-lines.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-home-house-active.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-home-house-active.svg new file mode 100644 index 000000000..6271ff269 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-home-house-active.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-home-house-default.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-home-house-default.svg new file mode 100644 index 000000000..3a4e17a8a --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-home-house-default.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-percentage-earn-staking.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-percentage-earn-staking.svg new file mode 100644 index 000000000..fb1b9d227 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-percentage-earn-staking.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-plus-add-buy-1.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-plus-add-buy-1.svg new file mode 100644 index 000000000..83010cfe7 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-plus-add-buy-1.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-plus-add-buy.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-plus-add-buy.svg new file mode 100644 index 000000000..1a264d321 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-plus-add-buy.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-wallet-settings-gear-cog-active.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-wallet-settings-gear-cog-active.svg new file mode 100644 index 000000000..72933cf9d --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-wallet-settings-gear-cog-active.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-wallet-settings-gear-cog-default.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-wallet-settings-gear-cog-default.svg new file mode 100644 index 000000000..882de99b3 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-wallet-settings-gear-cog-default.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-wallets-wallet.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-wallets-wallet.svg new file mode 100644 index 000000000..85fcb189c --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/navigation-wallets-wallet.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/percentage-earn-staking.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/percentage-earn-staking.svg new file mode 100644 index 000000000..4da7b8561 --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/percentage-earn-staking.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/unlink-break-disconnect.svg b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/unlink-break-disconnect.svg new file mode 100644 index 000000000..603648ceb --- /dev/null +++ b/packages/browser-wallet/src/assets/svgX/UiKit/MenuNavigation/unlink-break-disconnect.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/packages/browser-wallet/src/assets/svgX/close.svg b/packages/browser-wallet/src/assets/svgX/close.svg index 979efd223..fe00551d0 100644 --- a/packages/browser-wallet/src/assets/svgX/close.svg +++ b/packages/browser-wallet/src/assets/svgX/close.svg @@ -1,3 +1,3 @@ - + diff --git a/packages/browser-wallet/src/assets/svgX/dots-nine.svg b/packages/browser-wallet/src/assets/svgX/dots-nine.svg deleted file mode 100644 index 2c4899470..000000000 --- a/packages/browser-wallet/src/assets/svgX/dots-nine.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/packages/browser-wallet/src/popup/popupX/constants/routes.ts b/packages/browser-wallet/src/popup/popupX/constants/routes.ts index c9288be93..6d55e07f6 100644 --- a/packages/browser-wallet/src/popup/popupX/constants/routes.ts +++ b/packages/browser-wallet/src/popup/popupX/constants/routes.ts @@ -28,79 +28,60 @@ export const relativeRoutes = { hideMenu: true, hideConnection: true, }, - setupPassword: { - path: 'setupPassword', + welcome: { + path: 'welcome', config: { hideBackArrow: true, backTitle: '', hideMenu: true, hideConnection: true, }, - createOrRestore: { - path: 'createOrRestore', + setupPassword: { + path: 'setupPassword', config: { - hideBackArrow: true, - backTitle: '', + backTitle: i18n.t('x:header.navButton.back'), hideMenu: true, hideConnection: true, }, - selectNetwork: { - path: 'selectNetwork', + createOrRestore: { + path: 'createOrRestore', config: { - hideBackArrow: false, - backTitle: '', + backTitle: i18n.t('x:header.navButton.back'), hideMenu: true, hideConnection: true, }, - custom: { - path: 'custom', - config: { - backTitle: '', - hideMenu: true, - hideConnection: true, - }, - }, - }, - restoreWallet: { - path: 'restoreWallet', - config: { - hideBackArrow: false, - backTitle: '', - hideMenu: true, - hideConnection: true, - }, - }, - generateSeedPhrase: { - path: 'generateSeedPhrase', - config: { - hideBackArrow: false, - backTitle: '', - hideMenu: true, - hideConnection: true, - }, - confirmSeedPhrase: { - path: 'confirmSeedPhrase', + selectNetwork: { + path: 'selectNetwork', config: { hideBackArrow: false, - backTitle: '', + backTitle: i18n.t('x:header.navButton.back'), hideMenu: true, hideConnection: true, }, - idIntro: { - path: 'idIntro', + custom: { + path: 'custom', config: { backTitle: '', hideMenu: true, hideConnection: true, }, - requestIdentity: { - path: 'requestIdentity', - config: { - backTitle: '', - hideMenu: true, - hideConnection: true, - }, - }, + }, + }, + restoreWallet: { + path: 'restoreWallet', + config: { + hideBackArrow: false, + backTitle: i18n.t('x:header.navButton.back'), + hideMenu: true, + hideConnection: true, + }, + }, + requestIdentity: { + path: 'requestIdentity', + config: { + backTitle: i18n.t('x:header.navButton.back'), + hideMenu: true, + hideConnection: true, }, }, }, @@ -187,6 +168,7 @@ export const relativeRoutes = { externalFlow: { path: 'external-flow', config: { + backTitle: i18n.t('x:header.navButton.back'), hideMenu: true, }, }, @@ -242,6 +224,14 @@ export const relativeRoutes = { backTitle: '', }, }, + saveSeedPhrase: { + path: 'saveSeedPhrase', + config: { + backTitle: i18n.t('x:header.navButton.back'), + hideMenu: true, + hideConnection: true, + }, + }, passcode: { path: 'passcode', }, diff --git a/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/Header/Header.scss b/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/Header/Header.scss index 702dbdd91..2b3887a58 100644 --- a/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/Header/Header.scss +++ b/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/Header/Header.scss @@ -13,10 +13,10 @@ .fade-menu-bg { position: absolute; top: 0; - margin: rem(90px) auto 0 auto; + margin: rem(94px) auto 0 auto; width: 100%; max-width: rem(1328px); - height: calc(100% - rem(90px)); + height: calc(100% - rem(94px)); z-index: 1; backdrop-filter: blur(10px); background: rgba($color-black, 0.9); @@ -30,20 +30,18 @@ display: flex; justify-content: space-between; gap: rem(4px); - padding: rem(4px); + padding: $semantic-padding-xs; align-items: center; } &__bottom { display: flex; justify-content: space-between; - padding: rem(20px) rem(24px); + padding: $semantic-padding-l $semantic-padding-xl; } &__fullscreen { display: flex; - width: 0; - flex: 1 1 0px; &_button { display: flex; @@ -51,11 +49,21 @@ justify-content: space-between; height: 100%; width: 100%; - padding: rem(4px) rem(6px); border: unset; - border-radius: 2px; - background: $gradient-header-button-bg; cursor: pointer; + border-radius: $semantic-radius-s; + + @include button-sizes( + ($semantic-padding-s $semantic-padding-m), + $font-set-label-s-medium, + $semantic-label-s-scale, + $semantic-gap-xs + ); + @include button-color-states( + ($semantic-content-secondary, transparent, $semantic-border-accent-tertiary), + ($semantic-content-secondary-hover, transparent, $semantic-border-accent-tertiary), + ($semantic-content-secondary-pressed, $semantic-surface-accent-tertiary, transparent) + ); .tablet & { padding: rem(12px); @@ -67,80 +75,48 @@ &__connection { display: flex; - flex: 1 1 0px; + flex-direction: column; align-items: center; white-space: nowrap; - width: 0; - height: rem(24px); - padding: rem(1px); + height: rem(32px); box-sizing: border-box; position: relative; - border-radius: 2px; - background: $gradient-header-button-bg; + border-radius: $semantic-radius-s; + margin-left: auto; - .tablet & { - background: unset; - display: none; + @include button-sizes(($semantic-padding-s), $font-set-label-s-medium, $semantic-label-m-line-height, 2px); + @include element-variant($semantic-content-secondary, transparent, $semantic-border-accent-tertiary); + + &.hidden { + visibility: hidden; } &_info { - display: flex; - align-items: center; - justify-content: space-between; - width: 100%; - height: 100%; - border-radius: 2px; - padding: 0 rem(6px) 0 rem(8px); - background-color: $color-black; - - .tablet & { - background: unset; - } - - .info-icon { - margin-top: rem(1px); - cursor: pointer; - - .tooltip-x_text.top { - top: rem(24px); - left: rem(-187px); - text-wrap: auto; - width: rem(205px); - - &::after { - left: 91%; - } - } - } - & .connection_status { display: flex; - align-items: center; + justify-content: center; + + svg { + width: rem(6px); + height: rem(2px); + } &.waiting { - circle { - fill: $color-orange-info; + svg path { + fill: $semantic-content-warning-primary; } } &.connected { - max-width: 90%; - - circle { - fill: $color-green-success; - } - - .capture__main_small { - color: $color-white; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; + svg path { + fill: $semantic-content-success-primary; } } + } - .capture__main_small { - padding: 0 rem(10px) rem(2px) rem(6px); - } + .tablet & { + background: unset; + display: none; } } } @@ -152,15 +128,28 @@ visibility: hidden; } - .button__icon.transparent { - &:hover:not(:disabled) { - opacity: 1; + .button__icon { + background-color: transparent; + padding: $semantic-padding-xs; + border-radius: $semantic-radius-s; + + &:hover { + background-color: $semantic-surface-tertiary-hover; + } + + &:active { + background-color: $semantic-surface-tertiary-pressed; + } + + svg { + width: rem(20px); + height: rem(20px); } } } &__menu-tiles { - padding: rem(14px) rem(24px) rem(24px) rem(24px); + padding: rem(10px) rem(24px) rem(24px) rem(24px); .tablet & { margin-top: rem(72px); diff --git a/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/Header/components/Connection.tsx b/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/Header/components/Connection.tsx index 22e6e8a32..b414d4cea 100644 --- a/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/Header/components/Connection.tsx +++ b/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/Header/components/Connection.tsx @@ -1,16 +1,13 @@ import React, { useEffect, useState } from 'react'; -import Info from '@assets/svgX/info.svg'; -import Dot from '@assets/svgX/dot.svg'; +import Globe from '@assets/svgX/UiKit/Interface/globe-world.svg'; +import Indicator from '@assets/svgX/UiKit/Custom/indicator-horisontal-s.svg'; import { useAtomValue } from 'jotai'; import { storedAllowlistAtom } from '@popup/store/account'; import { useCurrentOpenTabUrl } from '@popup/shared/utils/tabs'; import { useSelectedCredential } from '@popup/shared/utils/account-helpers'; -import { useTranslation } from 'react-i18next'; import clsx from 'clsx'; import { Location, useLocation } from 'react-router-dom'; import { relativeRoutes } from '@popup/popupX/constants/routes'; -import Text from '@popup/popupX/shared/Text'; -import Tooltip from '@popup/popupX/shared/Tooltip'; type Props = { hideConnection?: boolean; @@ -25,7 +22,6 @@ interface ConnectionLocation extends Location { } export default function Connection({ hideConnection }: Props) { - const { t } = useTranslation('x', { keyPrefix: 'header.connection' }); const [isAccountConnectedToSite, setAccountConnectedToSite] = useState(); const allowlist = useAtomValue(storedAllowlistAtom); const { pathname, state } = useLocation() as ConnectionLocation; @@ -33,10 +29,7 @@ export default function Connection({ hideConnection }: Props) { const url = state?.payload?.url ? new URL(state.payload.url).origin : currentOpenTabUrl; const selectedCred = useSelectedCredential(); const accountAddress = selectedCred?.address; - const hostname = url ? new URL(url).hostname : ''; const waitingForConnection = pathname.includes(relativeRoutes.prompt.connectionRequest.path); - const connectionText = - (waitingForConnection && t('waiting')) || (isAccountConnectedToSite && hostname) || t('siteNotConnected'); useEffect(() => { if (accountAddress && !allowlist.loading && url) { @@ -45,22 +38,18 @@ export default function Connection({ hideConnection }: Props) { } }, [accountAddress, allowlist, url]); - if (hideConnection) return null; return ( -
+
+ - - {connectionText} + - - -
); diff --git a/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/Header/components/Fullscreen.tsx b/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/Header/components/Fullscreen.tsx index e2c4c173f..efb97ac82 100644 --- a/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/Header/components/Fullscreen.tsx +++ b/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/Header/components/Fullscreen.tsx @@ -1,10 +1,11 @@ import React from 'react'; import { useLocation } from 'react-router-dom'; import { isFullscreenWindow } from '@popup/shared/window-helpers'; -import ArrowsOut from '@assets/svgX/arrows-out-simple.svg'; +import ArrowsOut from '@assets/svgX/UiKit/Arrows/fullscreen-maximize.svg'; import { popupMessageHandler } from '@popup/shared/message-handler'; import { InternalMessageType } from '@messaging'; import { useTranslation } from 'react-i18next'; +import Text from '@popup/popupX/shared/Text'; export default function Fullscreen() { const { t } = useTranslation('x', { keyPrefix: 'header.fullscreen' }); @@ -26,7 +27,7 @@ export default function Fullscreen() { return (
diff --git a/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/Header/components/MenuButton.tsx b/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/Header/components/MenuButton.tsx index 2e0dde054..6a6a1bbf2 100644 --- a/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/Header/components/MenuButton.tsx +++ b/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/Header/components/MenuButton.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import DotsNine from '@assets/svgX/dots-nine.svg'; -import Close from '@assets/svgX/close.svg'; +import DotsNine from '@assets/svgX/UiKit/MenuNavigation/navigation-dots-menu-button.svg'; +import Close from '@assets/svgX/UiKit/Interface/x-cross-close.svg'; import clsx from 'clsx'; import Button from '@popup/popupX/shared/Button'; @@ -14,7 +14,6 @@ export default function MenuButton({ setMenuOpen, menuOpen, hideMenu }: Props) { return (
: } onClick={() => { setMenuOpen(!menuOpen); diff --git a/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/Header/components/NavButton.tsx b/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/Header/components/NavButton.tsx index cac4f7691..f2e0cecb1 100644 --- a/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/Header/components/NavButton.tsx +++ b/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/Header/components/NavButton.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { useLocation, useNavigate } from 'react-router-dom'; import clsx from 'clsx'; -import ArrowsLeft from '@assets/svgX/arrow-left.svg'; +import ArrowLeft from '@assets/svgX/UiKit/Arrows/arrow-left.svg'; import Button from '@popup/popupX/shared/Button'; import { useTranslation } from 'react-i18next'; import { absoluteRoutes } from '@popup/popupX/constants/routes'; @@ -39,7 +39,7 @@ export default function NavButton({ hideBackArrow, backTitle, navBackSteps }: Na } }} > - + {title}
diff --git a/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/Header/i18n/en.ts b/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/Header/i18n/en.ts index 2f5521fd2..831e59687 100644 --- a/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/Header/i18n/en.ts +++ b/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/Header/i18n/en.ts @@ -20,16 +20,9 @@ const t = { sortDesc: 'Sort Z-A', searchBy: 'Search by name', }, - connection: { - siteNotConnected: 'No website connected', - waiting: 'Waiting', - tooltip: { - title: 'Connect dApps', - text: 'You can connect you wallet to a\ndApp. An active connection will be\nshown here.', - }, - }, navButton: { toMain: 'To main page', + back: 'Back', }, fullscreen: { fullscreen: 'Fullscreen' }, }; diff --git a/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/MainLayout.scss b/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/MainLayout.scss index 8020afeb0..f0f716aa5 100644 --- a/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/MainLayout.scss +++ b/packages/browser-wallet/src/popup/popupX/page-layouts/MainLayout/MainLayout.scss @@ -17,7 +17,7 @@ .float-section { position: absolute; - margin-top: rem(-48px); + margin-top: rem(-40px); .header { &__nav { @@ -33,8 +33,18 @@ background: unset; cursor: pointer; + svg { + width: $semantic-label-m-line-height; + height: $semantic-label-m-line-height; + + path { + fill: $semantic-content-primary; + } + } + .text__main_medium { margin-left: rem(12px); + color: $semantic-content-accent-tertiary; } } } diff --git a/packages/browser-wallet/src/popup/popupX/pages/Accounts/Accounts.tsx b/packages/browser-wallet/src/popup/popupX/pages/Accounts/Accounts.tsx index 466269abe..edb2b82dd 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/Accounts/Accounts.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/Accounts/Accounts.tsx @@ -1,6 +1,6 @@ import React, { useCallback, useMemo, useState } from 'react'; -import Plus from '@assets/svgX/plus.svg'; -import Arrows from '@assets/svgX/arrows-down-up.svg'; +import Plus from '@assets/svgX/UiKit/Interface/plus-add-buy.svg'; +import Arrows from '@assets/svgX/UiKit/Arrows/up-down-transfer.svg'; import Pencil from '@assets/svgX/pencil-simple.svg'; import Checkmark from '@assets/svgX/checkmark.svg'; import Close from '@assets/svgX/close.svg'; diff --git a/packages/browser-wallet/src/popup/popupX/pages/CreateAccount/CreateAccountConfirm.tsx b/packages/browser-wallet/src/popup/popupX/pages/CreateAccount/CreateAccountConfirm.tsx index 38522d74d..01bdfcf25 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/CreateAccount/CreateAccountConfirm.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/CreateAccount/CreateAccountConfirm.tsx @@ -23,7 +23,7 @@ import { absoluteRoutes } from '@popup/popupX/constants/routes'; /** * Hook providing function for sending credential deployments. */ -function useSendCredentialDeployment() { +export function useSendCredentialDeployment() { const providers = useAtomValue(identityProvidersAtom); const credentials = useAtomValue(credentialsAtom); const network = useAtomValue(networkConfigurationAtom); diff --git a/packages/browser-wallet/src/popup/popupX/pages/EarningRewards/Validator/SelfSuspend/SelfSuspend.tsx b/packages/browser-wallet/src/popup/popupX/pages/EarningRewards/Validator/SelfSuspend/SelfSuspend.tsx index 32b3d259d..94eff73ec 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/EarningRewards/Validator/SelfSuspend/SelfSuspend.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/EarningRewards/Validator/SelfSuspend/SelfSuspend.tsx @@ -32,7 +32,7 @@ export default function SelfSuspend() { nav(absoluteRoutes.settings.earn.validator.submit.path, { state: SUSPEND_STATE })} /> diff --git a/packages/browser-wallet/src/popup/popupX/pages/IdCards/IdCards.tsx b/packages/browser-wallet/src/popup/popupX/pages/IdCards/IdCards.tsx index 0d4633fa2..a8575020a 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/IdCards/IdCards.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/IdCards/IdCards.tsx @@ -3,7 +3,7 @@ import { useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { useAtom } from 'jotai'; -import Plus from '@assets/svgX/plus.svg'; +import Plus from '@assets/svgX/UiKit/Interface/plus-add-buy.svg'; import Button from '@popup/popupX/shared/Button'; import Page from '@popup/popupX/shared/Page'; import { identitiesAtom } from '@popup/store/identity'; diff --git a/packages/browser-wallet/src/popup/popupX/pages/IdIssuance/Failed.tsx b/packages/browser-wallet/src/popup/popupX/pages/IdIssuance/Failed.tsx index 39bad57e8..c9c72f8a6 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/IdIssuance/Failed.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/IdIssuance/Failed.tsx @@ -25,7 +25,7 @@ export default function IdIssuanceFailed() { }, [state.backState]); return ( - + {state.message} diff --git a/packages/browser-wallet/src/popup/popupX/pages/IdIssuance/IdCardsInfo.tsx b/packages/browser-wallet/src/popup/popupX/pages/IdIssuance/IdCardsInfo.tsx new file mode 100644 index 000000000..7bfc66e3f --- /dev/null +++ b/packages/browser-wallet/src/popup/popupX/pages/IdIssuance/IdCardsInfo.tsx @@ -0,0 +1,29 @@ +import React from 'react'; +import { useTranslation } from 'react-i18next'; +import Page from '@popup/popupX/shared/Page'; +import Text from '@popup/popupX/shared/Text'; +import FullscreenNotice from '@popup/popupX/shared/FullscreenNotice'; +import { useLocation } from 'react-router-dom'; + +export default function IdCardsInfo() { + const { t } = useTranslation('x', { keyPrefix: 'idIssuance.idCardsInfo' }); + + return ( + + + + {t('idDescription')} + + + ); +} + +export function IdCardsInfoNotice({ ...props }: { open: boolean; onClose: () => void }) { + const { pathname } = useLocation(); + const isAtOnboarding = pathname.includes('onboarding'); + return ( + + + + ); +} diff --git a/packages/browser-wallet/src/popup/popupX/pages/IdIssuance/IdIssuance.scss b/packages/browser-wallet/src/popup/popupX/pages/IdIssuance/IdIssuance.scss index 57381c515..561ba70e5 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/IdIssuance/IdIssuance.scss +++ b/packages/browser-wallet/src/popup/popupX/pages/IdIssuance/IdIssuance.scss @@ -1,27 +1,58 @@ .id-issuance { + &__providers-container { + margin-top: $semantic-gap-xl; + } + &__issuer-btn { display: flex; - color: $color-white; align-items: center; - padding: rem(16px); - gap: rem(16px); + padding: $semantic-padding-m $semantic-padding-l $semantic-padding-m $semantic-padding-m; + gap: $semantic-gap-s; border: unset; border-radius: rem(12px); - background: $color-transaction-bg; width: 100%; + @include surface-states-tertiary; + &:not(:first-child) { - margin-top: rem(8px); + margin-top: rem(4px); + } + + .text__main { + color: $semantic-content-primary; + font-weight: $t-font-weight-medium; + line-height: $semantic-label-l-line-height; } .identity-provider-icon { - width: rem(64px); - height: rem(32px); + width: rem(40px); + height: rem(40px); object-position: center; object-fit: contain; - background: $color-white; - border-radius: rem(4px); - padding: rem(4px); + background: $semantic-surface-primary; + border-radius: $semantic-radius-rounded; } + + svg { + width: rem(24px); + height: rem(24px); + margin-left: auto; + + path { + fill: $semantic-content-primary-a40; + } + } + } + + .redirect-info { + text-align: center; + margin-top: $semantic-gap-l; + padding: 0 $semantic-padding-xl; + } +} + +.id-issuance-failed { + .heading_medium { + color: $semantic-content-error-primary; } } diff --git a/packages/browser-wallet/src/popup/popupX/pages/IdIssuance/IdIssuance.tsx b/packages/browser-wallet/src/popup/popupX/pages/IdIssuance/IdIssuance.tsx index 71ac10396..a6236c67b 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/IdIssuance/IdIssuance.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/IdIssuance/IdIssuance.tsx @@ -1,4 +1,4 @@ -import { useAtom, useAtomValue } from 'jotai'; +import { useAtom, useAtomValue, useSetAtom } from 'jotai'; import React, { useCallback, useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useNavigate } from 'react-router-dom'; @@ -8,13 +8,16 @@ import Button from '@popup/popupX/shared/Button'; import Page from '@popup/popupX/shared/Page'; import Text from '@popup/popupX/shared/Text'; import IdentityProviderIcon from '@popup/shared/IdentityProviderIcon'; +import ExternalLink from '@assets/svgX/UiKit/Interface/external-link.svg'; +import CircleInfo from '@assets/svgX/UiKit/Interface/circled-info-tootlip.svg'; import { getIdentityProviders } from '@popup/shared/utils/wallet-proxy'; import { identitiesAtom, identityProvidersAtom, pendingIdentityAtom } from '@popup/store/identity'; -import { grpcClientAtom, networkConfigurationAtom } from '@popup/store/settings'; +import { grpcClientAtom, hasBeenOnBoardedAtom, networkConfigurationAtom } from '@popup/store/settings'; import { CreationStatus, IdentityProvider, SessionPendingIdentity } from '@shared/storage/types'; import { getGlobal } from '@shared/utils/network-helpers'; import { logErrorMessage } from '@shared/utils/log-helpers'; +import { IdCardsInfoNotice } from './IdCardsInfo'; import { IdIssuanceExternalFlowLocationState } from './util'; export default function IdIssuance() { @@ -26,6 +29,8 @@ export default function IdIssuance() { const nav = useNavigate(); const [buttonDisabled, setButtonDisabled] = useState(false); const [pendingIdentity, setPendingIdentity] = useAtom(pendingIdentityAtom); + const [showIdInfo, setShowIdInfo] = useState(false); + const setHasBeenOnboarded = useSetAtom(hasBeenOnBoardedAtom); useEffect(() => { // TODO: only load once per session? @@ -37,6 +42,9 @@ export default function IdIssuance() { const startIssuance = useCallback( async (provider: IdentityProvider) => { + // Component was reused at onboarding. Needs to set value here. + setHasBeenOnboarded(true); + setButtonDisabled(true); try { if (!network) { @@ -75,33 +83,47 @@ export default function IdIssuance() { ); return ( - - - {pendingIdentity !== undefined ? ( - {t('descriptionOngoing')} - ) : ( - {t('description')} - )} - {pendingIdentity === undefined && ( -
- {providers.map((p) => ( - startIssuance(p)} - > - - {p.metadata.display ?? p.ipInfo.ipDescription.name} - - ))} -
- )} - {pendingIdentity !== undefined && ( - - setPendingIdentity(undefined)} /> - - )} -
+ <> + setShowIdInfo(false)} /> + + + } + onClick={() => { + setShowIdInfo(true); + }} + /> + + {pendingIdentity !== undefined ? ( + {t('descriptionOngoing')} + ) : ( + {t('description')} + )} + {pendingIdentity === undefined && ( + <> +
+ {providers.map((p) => ( + startIssuance(p)} + > + + {p.metadata.display ?? p.ipInfo.ipDescription.name} + + + ))} +
+ {t('redirectInfo')} + + )} + {pendingIdentity !== undefined && ( + + setPendingIdentity(undefined)} /> + + )} +
+ ); } diff --git a/packages/browser-wallet/src/popup/popupX/pages/IdIssuance/Submitted.tsx b/packages/browser-wallet/src/popup/popupX/pages/IdIssuance/Submitted.tsx index 17fa85649..9a835142f 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/IdIssuance/Submitted.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/IdIssuance/Submitted.tsx @@ -1,21 +1,53 @@ import React from 'react'; import { useTranslation } from 'react-i18next'; -import { useAtomValue } from 'jotai'; +import { useSetAtom, useAtomValue } from 'jotai'; import Button from '@popup/popupX/shared/Button'; import { ConfirmedIdCard, RejectedIdCard, PendingIdCard } from '@popup/popupX/shared/IdCard'; import Page from '@popup/popupX/shared/Page'; import Text from '@popup/popupX/shared/Text'; import { identitiesAtomWithLoading } from '@popup/store/identity'; -import { CreationStatus } from '@shared/storage/types'; +import { CreationStatus, Identity } from '@shared/storage/types'; import { absoluteRoutes } from '@popup/popupX/constants/routes'; import { isSpawnedWindow } from '@popup/shared/window-helpers'; import { useNavigate } from 'react-router-dom'; +import { useSendCredentialDeployment } from '@popup/popupX/pages/CreateAccount/CreateAccountConfirm'; +import { creatingCredentialRequestAtom } from '@popup/store/account'; + +function useSubmitAccountDeployment() { + const nav = useNavigate(); + const deployment = useSendCredentialDeployment(); + const setCreatingRequest = useSetAtom(creatingCredentialRequestAtom); + return (identity: Identity) => { + if (identity === undefined || identity.status !== CreationStatus.Confirmed) { + throw new Error(`Invalid identity: ${identity}`); + } else { + setCreatingRequest(true); + return deployment + .sendCredentialDeployment(identity) + .catch(() => {}) + .then(() => { + nav(absoluteRoutes.home.path); + }) + .finally(() => { + setCreatingRequest(false); + }); + } + }; +} export default function IdIssuanceSubmitted() { const { t } = useTranslation('x', { keyPrefix: 'idIssuance.submitted' }); + const creatingCredentialRequest = useAtomValue(creatingCredentialRequestAtom); const { loading, value: identities } = useAtomValue(identitiesAtomWithLoading); + const identity = identities.slice(-1)[0]; + const nav = useNavigate(); + const onCreateAccount = useSubmitAccountDeployment(); + + if (loading) { + return null; + } const handleDone = () => { if (isSpawnedWindow) { @@ -25,11 +57,9 @@ export default function IdIssuanceSubmitted() { } }; - if (loading) { - return null; - } - - const identity = identities.slice(-1)[0]; + const handleCreateAccount = () => { + onCreateAccount(identity).then(() => {}); + }; return ( @@ -38,10 +68,20 @@ export default function IdIssuanceSubmitted() {
{identity.status === CreationStatus.Pending && } {identity.status === CreationStatus.Rejected && } - {identity.status === CreationStatus.Confirmed && } + {identity.status === CreationStatus.Confirmed && ( + + )}
- + {identity.status === CreationStatus.Confirmed ? ( + + ) : ( + + )}
); diff --git a/packages/browser-wallet/src/popup/popupX/pages/IdIssuance/i18n/en.ts b/packages/browser-wallet/src/popup/popupX/pages/IdIssuance/i18n/en.ts index e05858fd1..99d4e949f 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/IdIssuance/i18n/en.ts +++ b/packages/browser-wallet/src/popup/popupX/pages/IdIssuance/i18n/en.ts @@ -1,10 +1,11 @@ const en = { idIssuer: { - title: 'Request an identity', + title: 'Request an Identity', description: - 'The ID Documents (e.g. Passport pictures) that are used for the ID verification, are held exclusively by our trusted, third-party identity providers in their own off-chain records.\n\nChoose one of the identity providers below to request a Concordium Identity and create an account.', + 'A Concordium ID is required for you to create a Concordium account. Create your secure identification through one of our trusted external providers.', descriptionOngoing: 'An identity issuance process is ongoing in the browser. Please follow the steps to complete the process for the identity provider.\n\nIf you wish to abort the flow, or try again, press "Reset" below.', + redirectInfo: 'You will be redirected after choosing an identity provider.', buttonContinue: 'Request Identity', buttonReset: 'Reset', }, @@ -24,11 +25,17 @@ const en = { description: 'Your request has been submitted to the identity provider. It may take a little while for them to confirm your identity.\n\nOnce your identity has been verified, you will be able to open an account with it.', buttonContinue: 'Done', + buttonCreateAccount: 'Create Concordium Account', }, aborted: { message: 'The identity request was aborted. If you did not abort the process, please try again, or contact support.', }, + idCardsInfo: { + ids: 'Concordium ID', + idDescription: + 'As the only blockchain, Concordium enables you to verify your real-world identity while remaining private on chain.\n\nEvery user in the Concordium ecosystem has been verified by an identity provider (IDP) - a trusted third-party entity that is responsible for validating the real-world identity of users.\n\nThe IDP does not track your wallet or on-chain activities; they only handle the verification process.\n\nAfter a your identity is verified, the identity provider issues a cryptographic identity object to you that is linked to your account and can be used to prove your identity to others without revealing sensitive personal information.\n\nOnly in the case of a legal requirement, an authorized entity (like a regulator) can request the IDP to disclose a user’s real-world identity.', + }, }; export default en; diff --git a/packages/browser-wallet/src/popup/popupX/pages/MainPage/MainPage.scss b/packages/browser-wallet/src/popup/popupX/pages/MainPage/MainPage.scss index afcc23b95..b7418f6d5 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/MainPage/MainPage.scss +++ b/packages/browser-wallet/src/popup/popupX/pages/MainPage/MainPage.scss @@ -13,6 +13,8 @@ } .main-page-x { + gap: $semantic-gap-xl; + &.rejected-account { .heading_medium { color: $color-red-attention; @@ -38,15 +40,15 @@ .info-icon { height: rem(12px); - margin: rem(8px) 0 0 rem(8px); + margin-left: rem(2px); cursor: pointer; .tooltip-x_text.top { - top: rem(24px); - left: rem(-194px); + top: rem(26px); + left: rem(-189px); &::after { - left: 90%; + left: calc(100% - #{rem(32px)}); } } } @@ -55,18 +57,44 @@ .heading_large { font-family: $t-font-family-ibm; } + + .available-balance.text__main_regular { + font-family: $t-font-family-ibm; + line-height: $semantic-label-s-line-height; + color: $semantic-content-accent-tertiary; + } } &__pending { display: flex; + gap: $semantic-gap-s; align-items: center; - padding: rem(12px) rem(16px); - margin: rem(26px) 0 rem(10px) 0; - border-radius: rem(12px); - background-color: $color-transaction-bg; + padding: $semantic-padding-m $semantic-padding-l $semantic-padding-m $semantic-padding-m; + border-radius: $semantic-radius-m; + background-color: transparent; + outline: 1px solid $semantic-border-tertiary; + + .pending-icon { + display: flex; + padding: rem(10px); + border-radius: $semantic-radius-rounded; + background-color: $semantic-surface-primary-a10; + + svg { + width: rem(20px); + height: rem(20px); + animation: unset; + + path { + fill: $semantic-content-warning-primary; + } + } + } .text__main { - color: $color-orange-info; + font-weight: $t-font-weight-medium; + line-height: $semantic-label-l-line-height; + color: $semantic-content-primary; } svg { @@ -76,7 +104,7 @@ animation: pulsate 4s linear infinite; circle { - fill: $color-orange-info; + fill: $semantic-content-warning-primary; } } } @@ -85,16 +113,7 @@ display: flex; align-items: stretch; width: 100%; - gap: rem(6px); - margin-top: rem(16px); - - .send svg { - transform: rotate(-90deg); - } - - .receive svg { - transform: rotate(90deg); - } + gap: rem(4px); .suspend::before { content: ''; @@ -109,7 +128,6 @@ } &__tokens { - margin-top: rem(24px); overflow: auto; &::-webkit-scrollbar { @@ -125,23 +143,24 @@ &_item { display: flex; align-items: center; - padding: rem(12px) rem(14px) rem(12px) rem(12px); + padding: $semantic-padding-m; border: unset; - border-radius: rem(12px); - background: $color-transaction-bg; + border-radius: $semantic-radius-m; cursor: pointer; + @include surface-states-tertiary; + .token-icon { display: flex; - padding: rem(10px); + padding: $semantic-padding-s; margin-right: rem(10px); - border-radius: rem(8px); - background: $color-main-bg; + border-radius: $semantic-radius-s; + background: $semantic-surface-primary-a10; svg, img { - width: rem(20px); - height: rem(20px); + width: rem(24px); + height: rem(24px); } } @@ -159,37 +178,60 @@ align-items: center; .capture__main_small { - color: rgba($color-mineral-3, 0.5); + line-height: $semantic-label-s-line-height; + color: $semantic-content-accent-secondary; + } + + .token-status { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: rem(4px); + + .token-plt { + display: flex; + gap: rem(4px); + align-items: center; + + .capture__main_small { + font-weight: $t-font-weight-medium; + } + + svg { + margin: unset; + } + } } } .label__main { - color: $color-white; + font-size: $semantic-label-l-scale; + line-height: $semantic-label-l-line-height; + color: $semantic-content-primary; } .balance-rate { display: flex; flex-direction: column; - gap: rem(8px); + gap: rem(4px); margin-left: auto; } svg { margin-left: rem(8px); - opacity: 0.5; - width: rem(16px); - height: rem(16px); + width: rem(12px); + height: rem(12px); path { - fill: $color-mineral-3; + fill: $semantic-content-accent-secondary; } } } } - .button__icon { - align-self: flex-start; - margin-top: rem(24px); + .button__ui-kit_tertiary { + align-self: center; + margin-top: rem(12px); } } } @@ -227,3 +269,105 @@ } } } + +.container__cta { + display: flex; + position: relative; + border-radius: $semantic-radius-m; + outline: 1px solid $semantic-border-tertiary; + outline-offset: -1px; + + &:hover { + background-color: $semantic-surface-tertiary-hover; + outline-color: $semantic-border-tertiary-hover; + } + + &:active { + background-color: $semantic-surface-tertiary-pressed; + outline-color: $semantic-border-tertiary-pressed; + } + + .button__homepage-cta { + @include base-button; + + display: flex; + align-items: center; + padding: $semantic-padding-m rem(44px) $semantic-padding-m $semantic-padding-m; + gap: $semantic-gap-s; + background: transparent; + border: unset; + border-radius: $semantic-radius-m; + + .icon-container { + display: flex; + padding: rem(10px); + border-radius: $semantic-radius-rounded; + background-color: $semantic-surface-primary-a10; + + svg { + width: rem(20px); + height: rem(20px); + } + } + + .text-container { + display: flex; + flex-direction: column; + align-items: flex-start; + text-align: left; + gap: $semantic-gap-xs; + + .text__main_medium { + font-size: $semantic-label-l-scale; + line-height: $semantic-label-l-line-height; + color: $semantic-content-primary; + } + + .capture__main_small { + font-size: $semantic-label-s-scale; + line-height: $semantic-label-s-line-height; + color: $semantic-content-secondary; + } + } + } + + .cancel-button { + @include base-button; + + display: flex; + position: absolute; + right: $semantic-gap-l; + top: 50%; + transform: translateY(-50%); + border: unset; + padding: unset; + background-color: transparent; + margin: unset; + + svg { + width: rem(20px); + height: rem(20px); + + path { + fill: $semantic-content-primary-a40; + } + } + } +} + +.cta_modal { + gap: $semantic-gap-s; + + .text__main { + color: $semantic-content-inverse-primary; + line-height: rem(22px); + letter-spacing: $heading-heading-l-letter-spacing; + } + + .text__main_regular { + color: $semantic-content-inverse-primary; + line-height: rem(19px); + white-space: break-spaces; + margin-bottom: rem(22px); + } +} diff --git a/packages/browser-wallet/src/popup/popupX/pages/MainPage/MainPage.tsx b/packages/browser-wallet/src/popup/popupX/pages/MainPage/MainPage.tsx index a009e0826..c10b1d90b 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/MainPage/MainPage.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/MainPage/MainPage.tsx @@ -1,4 +1,4 @@ -import React, { ReactNode, useMemo } from 'react'; +import React, { ReactNode, useMemo, useState } from 'react'; import { generatePath, useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { useAtom, useAtomValue } from 'jotai'; @@ -16,20 +16,29 @@ import { displayCcdAsEur, formatTokenAmount } from '@popup/popupX/shared/utils/h import Page from '@popup/popupX/shared/Page'; import Text from '@popup/popupX/shared/Text'; import Button from '@popup/popupX/shared/Button'; +import { ButtonProps } from '@popup/popupX/shared/Button/Button'; import { withSelectedCredential } from '@popup/popupX/shared/utils/hoc'; import { PLT } from '@shared/constants/token'; +import ArrowUp from '@assets/svgX/UiKit/Arrows/arrow-up.svg'; +import ArrowDown from '@assets/svgX/UiKit/Arrows/arrow-down.svg'; import Arrow from '@assets/svgX/arrow-right.svg'; -import Clock from '@assets/svgX/clock.svg'; -import Plus from '@assets/svgX/plus.svg'; -import ConcordiumLogo from '@assets/svgX/concordium-logo.svg'; -import Percent from '@assets/svgX/percent.svg'; -import Gear from '@assets/svgX/gear.svg'; +import Clock from '@assets/svgX/UiKit/MenuNavigation/clock-activity-history-time.svg'; +import Plus from '@assets/svgX/UiKit/Interface/plus-add-buy.svg'; +import ConcordiumLogo from '@assets/svgX/UiKit/Custom/concordium-glyph-only.svg'; +import Percent from '@assets/svgX/UiKit/Interface/percentage-earn-staking.svg'; +import Gear from '@assets/svgX/UiKit/Interface/settings-gear-cog.svg'; +import Shield from '@assets/svgX/UiKit/Interface/shield-square-crypto.svg'; +import RestoreSeed from '@assets/svgX/UiKit/Interface/restore-seed-phrase.svg'; +import WalletCoin from '@assets/svgX/UiKit/Interface/wallet-coin.svg'; import Dot from '@assets/svgX/dot.svg'; import Info from '@assets/svgX/info.svg'; import Pause from '@assets/svgX/pause.svg'; +import Close from '@assets/svgX/UiKit/Interface/circled-x-cross-close.svg'; import Tooltip from '@popup/popupX/shared/Tooltip'; import { credentialsAtom, credentialsAtomWithLoading, selectedAccountAtom } from '@popup/store/account'; +import { hasBeenSavedSeedAtom } from '@popup/store/settings'; import { SuspendedStatus, useSuspendedStatus } from '@popup/popupX/shared/utils/pool-status-helpers'; +import Modal from '@popup/popupX/shared/Modal'; /** Hook loading every fungible token added to the account. */ function useAccountFungibleTokens(account: WalletCredential) { @@ -86,9 +95,9 @@ function Balance({ credential }: { credential: WalletCredential }) {
{accountInfo.accountAmount.microCcdAmount !== accountInfo.accountAvailableBalance.microCcdAmount && ( - - {ccdAvailableBalance} {t('atDisposal')} - + + {ccdAvailableBalance} {t('available')} + )} ); @@ -100,10 +109,21 @@ type TokenItemProps = { balance: string | ReactNode; balanceBase?: bigint; staked?: boolean; + isPlt?: boolean; microCcdPerEur?: Ratio; onClick: () => void; }; -function TokenItem({ thumbnail, symbol, balance, balanceBase, staked, microCcdPerEur, onClick }: TokenItemProps) { +function TokenItem({ + thumbnail, + symbol, + isPlt, + balance, + balanceBase, + staked, + microCcdPerEur, + onClick, +}: TokenItemProps) { + const { t } = useTranslation('x', { keyPrefix: 'mainPage' }); const isNoExchange = microCcdPerEur === undefined || balanceBase === undefined; return ( @@ -112,8 +132,18 @@ function TokenItem({ thumbnail, symbol, balance, balanceBase, staked, microCcdPe
- {symbol} - {staked && } +
+
+ {symbol} + {staked && } +
+ {isPlt && ( +
+ + {t('plt')} +
+ )} +
{balance} {isNoExchange ? null : ( @@ -191,6 +221,74 @@ function SuspendedEarnInfo() { ); } +function HomepageCta({ + icon, + title, + description, + className, + onClick, + onCancel, + ...props +}: { icon: ReactNode; title: string; description: string; onCancel: () => void } & ButtonProps) { + return ( +
+ +
{icon}
+
+ {title} + {description} +
+
+ +
+ ); +} + +function MainPageCta() { + const { t } = useTranslation('x', { keyPrefix: 'mainPage' }); + const nav = useNavigate(); + const [showPrompt, setShowPrompt] = useState(false); + const [hasBeenSavedSeed, setHasBeenSavedSeed] = useAtom(hasBeenSavedSeedAtom); + const navToSaveSeedPhrase = () => nav(absoluteRoutes.settings.saveSeedPhrase.path); + + if (hasBeenSavedSeed) return null; + + return ( + <> + setShowPrompt(false)}> + {t('cta.modal.sure')} + {t('cta.modal.recommendBackup')} + { + setHasBeenSavedSeed(true); + setShowPrompt(false); + }} + /> + { + setShowPrompt(false); + navToSaveSeedPhrase(); + }} + /> + + } + title={t('cta.backup')} + description={t('cta.keepSafe')} + onClick={navToSaveSeedPhrase} + onCancel={() => setShowPrompt(true)} + /> + + ); +} + type MainPageConfirmedAccountProps = { credential: ConfirmedCredential }; function MainPageConfirmedAccount({ credential }: MainPageConfirmedAccountProps) { @@ -227,10 +325,11 @@ function MainPageConfirmedAccount({ credential }: MainPageConfirmedAccountProps) return ( +
} label={t('buy')} onClick={navToBuy} className="buy" /> - } label={t('receive')} onClick={navToReceive} className="receive" /> - } label={t('send')} onClick={navToSend} className="send" /> + } label={t('receive')} onClick={navToReceive} className="receive" /> + } label={t('send')} onClick={navToSend} className="send" /> } label={t('stake')} @@ -260,6 +359,7 @@ function MainPageConfirmedAccount({ credential }: MainPageConfirmedAccountProps) key={`${token.contractIndex}.${token.id}`} thumbnail={token.metadata.thumbnail?.url || ''} symbol={token.metadata.symbol || ''} + isPlt={token.contractIndex === PLT} balance={ ))} - } label={t('manageTokenList')} /> + } label={t('manageTokenList')} />
@@ -284,18 +384,26 @@ function MainPagePendingAccount() { return (
- - 0.00 CCD - +
+ + 0.00 CCD + + + + +
+
+ +
{t('pendingSubText')}
} label={t('buy')} disabled className="buy" /> - } label={t('receive')} disabled className="receive" /> - } label={t('send')} disabled className="send" /> + } label={t('receive')} disabled className="receive" /> + } label={t('send')} disabled className="send" /> } label={t('stake')} disabled /> } label={t('activity')} disabled />
@@ -308,7 +416,7 @@ function MainPagePendingAccount() { balance={mainPageCcdDisplay(0n)} balanceBase={0n} /> - } label={t('manageTokenList')} /> + } label={t('manageTokenList')} />
diff --git a/packages/browser-wallet/src/popup/popupX/pages/MainPage/i18n/en.ts b/packages/browser-wallet/src/popup/popupX/pages/MainPage/i18n/en.ts index 4d4379e68..eede139db 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/MainPage/i18n/en.ts +++ b/packages/browser-wallet/src/popup/popupX/pages/MainPage/i18n/en.ts @@ -6,8 +6,8 @@ const t = { activity: 'Activity', manageTokenList: 'Manage Tokens', pendingAccount: 'Creating account', - pendingSubText: 'Ready within a few minutes', - atDisposal: 'CCD at disposal', + pendingSubText: 'Account Creation in Progress', + available: 'CCD available', tooltip: { title: 'Total CCD balance', text: 'This balance shows your total CCD in\nthis account. It does not include any\nother tokens.', @@ -19,6 +19,18 @@ const t = { validationSuspended: 'Your validation has been suspended', validationIsPrimedForSuspension: 'Your validation is primed for suspension', validatorSuspended: 'Your validator has been suspended', + plt: 'PLT', + cta: { + backup: 'Backup Your Wallet', + keepSafe: 'Keep your account safe by making a copy of your wallet seed phrase', + modal: { + sure: 'Are you sure you want to hide this reminder?', + recommendBackup: + 'We highly recommend that you make a secure backup of your unique wallet seed phrase. You will not be able to restore your wallet without your seed phrase.\n\nAlternatively, you can find it later in the wallet settings', + hide: 'Hide anyway', + backup: 'Backup Your Seed Phrase', + }, + }, }; export default t; diff --git a/packages/browser-wallet/src/popup/popupX/pages/ManageTokens/AddToken.tsx b/packages/browser-wallet/src/popup/popupX/pages/ManageTokens/AddToken.tsx index 77c482834..d17843932 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/ManageTokens/AddToken.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/ManageTokens/AddToken.tsx @@ -344,7 +344,7 @@ function AddToken({ account }: { account: string }) { {(loading || (isLoading && !haveTokens)) && } {!!haveTokens && hasMore && ( { updateTokens({ type: 'next' }); diff --git a/packages/browser-wallet/src/popup/popupX/pages/Onboarding/ConfirmSeedPhrase.tsx b/packages/browser-wallet/src/popup/popupX/pages/Onboarding/ConfirmSeedPhrase.tsx deleted file mode 100644 index 8e0db6418..000000000 --- a/packages/browser-wallet/src/popup/popupX/pages/Onboarding/ConfirmSeedPhrase.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import { useNavigate } from 'react-router-dom'; -import { absoluteRoutes } from '@popup/popupX/constants/routes'; -import { useAtomValue, useSetAtom } from 'jotai'; -import Form from '@popup/popupX/shared/Form'; -import { SubmitHandler, Validate } from 'react-hook-form'; -import { useTranslation } from 'react-i18next'; -import { decrypt } from '@shared/utils/crypto'; -import { - encryptedSeedPhraseAtom, - hasBeenOnBoardedAtom, - sessionOnboardingLocationAtom, - sessionPasscodeAtom, -} from '@popup/store/settings'; -import SeedPhrase from '@popup/popupX/shared/Form/SeedPhrase'; -import Page from '@popup/popupX/shared/Page'; -import Text from '@popup/popupX/shared/Text'; -import Button from '@popup/popupX/shared/Button'; - -type FormValues = { - seedPhraseInput: string; -}; - -export default function ConfirmSeedPhrase() { - const navigate = useNavigate(); - const { t } = useTranslation('x', { keyPrefix: 'onboarding.confirmSeedPhrase' }); - const sessionPasscode = useAtomValue(sessionPasscodeAtom); - const passcode = sessionPasscode.value; - const encryptedSeedPhrase = useAtomValue(encryptedSeedPhraseAtom); - const [seedPhrase, setSeedPhrase] = useState(); - const setOnboardingLocation = useSetAtom(sessionOnboardingLocationAtom); - const setHasBeenOnboarded = useSetAtom(hasBeenOnBoardedAtom); - - useEffect(() => { - if (!encryptedSeedPhrase.loading && encryptedSeedPhrase.value && passcode) { - decrypt(encryptedSeedPhrase.value, passcode).then(setSeedPhrase); - } - }, [encryptedSeedPhrase.loading, encryptedSeedPhrase.value, passcode]); - - if (!passcode || encryptedSeedPhrase.loading || !encryptedSeedPhrase.value) { - // This page should not be shown without the passcode or encrypted seed phrase in state. - return null; - } - - const handleSubmit: SubmitHandler = () => { - const idIntro = - absoluteRoutes.onboarding.setupPassword.createOrRestore.generateSeedPhrase.confirmSeedPhrase.idIntro.path; - setOnboardingLocation(idIntro); - setHasBeenOnboarded(true); - navigate(idIntro); - }; - - function validateSeedPhrase(): Validate { - return (seedPhraseValue) => (seedPhraseValue !== seedPhrase ? t('validate') : undefined); - } - - return ( - - - - {t('enterSeed')} - id="confirm-seed-form" onSubmit={handleSubmit}> - {(f) => ( - - )} - - - - - - - ); -} diff --git a/packages/browser-wallet/src/popup/popupX/pages/Onboarding/CreateOrRestore.tsx b/packages/browser-wallet/src/popup/popupX/pages/Onboarding/CreateOrRestore.tsx index 2c0943fdf..6896e66cb 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/Onboarding/CreateOrRestore.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/Onboarding/CreateOrRestore.tsx @@ -1,35 +1,104 @@ -import React from 'react'; +import React, { ReactNode } from 'react'; import { useNavigate } from 'react-router-dom'; -import { useAtom } from 'jotai'; -import { networkConfigurationAtom } from '@popup/store/settings'; +import { useAtom, useAtomValue, useSetAtom } from 'jotai'; +import clsx from 'clsx'; +import { useTranslation } from 'react-i18next'; +import { + encryptedSeedPhraseAtom, + hasBeenSavedSeedAtom, + networkConfigurationAtom, + sessionOnboardingLocationAtom, + sessionPasscodeAtom, +} from '@popup/store/settings'; import Page from '@popup/popupX/shared/Page'; import Button from '@popup/popupX/shared/Button'; -import { useTranslation } from 'react-i18next'; +import { ButtonProps } from '@popup/popupX/shared/Button/Button'; import Text from '@popup/popupX/shared/Text'; +import WalletCoin from '@assets/svgX/UiKit/Interface/wallet-coin.svg'; +import RestoreSeed from '@assets/svgX/UiKit/Interface/restore-seed-phrase.svg'; import { absoluteRoutes } from '@popup/popupX/constants/routes'; +import { generateMnemonic } from '@scure/bip39'; +import { wordlist } from '@scure/bip39/wordlists/english'; +import { encrypt } from '@shared/utils/crypto'; + +function OnboardingOption({ + icon, + title, + description, + className, + ...props +}: { icon: ReactNode; title: string; description: string } & ButtonProps) { + return ( + +
{icon}
+
+ {title} + {description} +
+
+ ); +} export default function CreateOrRestore() { const { t } = useTranslation('x', { keyPrefix: 'onboarding.createOrRestore' }); const [{ name }] = useAtom(networkConfigurationAtom); + const setHasBeenSavedSeed = useSetAtom(hasBeenSavedSeedAtom); + const setOnboardingLocation = useSetAtom(sessionOnboardingLocationAtom); + const setEncryptedSeedPhrase = useSetAtom(encryptedSeedPhraseAtom); + const sessionPasscode = useAtomValue(sessionPasscodeAtom); + const passcode = sessionPasscode.value; + const nav = useNavigate(); - const navToRestore = () => nav(absoluteRoutes.onboarding.setupPassword.createOrRestore.restoreWallet.path); - const navToCreate = () => nav(absoluteRoutes.onboarding.setupPassword.createOrRestore.generateSeedPhrase.path); - const navToSelectNetwork = () => nav(absoluteRoutes.onboarding.setupPassword.createOrRestore.selectNetwork.path); + const pathToRestore = absoluteRoutes.onboarding.welcome.setupPassword.createOrRestore.restoreWallet.path; + const navToRestore = () => nav(pathToRestore); + const pathToCreate = absoluteRoutes.onboarding.welcome.setupPassword.createOrRestore.requestIdentity.path; + const navToCreate = () => nav(pathToCreate); + const navToSelectNetwork = () => + nav(absoluteRoutes.onboarding.welcome.setupPassword.createOrRestore.selectNetwork.path); + + const onCreate = () => { + // Check only for password. Because user can nav back to password and change it. + // In this case Seed Phrase should be recreated and encrypted with new password + if (passcode) { + const newSeedPhrase = generateMnemonic(wordlist, 256); + encrypt(newSeedPhrase, passcode).then((newEncryptedSeedPhrase) => { + setEncryptedSeedPhrase(newEncryptedSeedPhrase).then(() => { + setOnboardingLocation(pathToCreate); + setHasBeenSavedSeed(false).then(() => { + navToCreate(); + }); + }); + }); + } + }; + const onRestore = () => { + setOnboardingLocation(pathToRestore); + navToRestore(); + }; return ( - - {name} - + {t('optionsInfo')} + } + onClick={onCreate} + /> +
+ {t('or')} +
+ } + onClick={onRestore} + />
- - - -
); } diff --git a/packages/browser-wallet/src/popup/popupX/pages/Onboarding/GenerateSeedPhrase.tsx b/packages/browser-wallet/src/popup/popupX/pages/Onboarding/GenerateSeedPhrase.tsx deleted file mode 100644 index ab5b314fd..000000000 --- a/packages/browser-wallet/src/popup/popupX/pages/Onboarding/GenerateSeedPhrase.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import { useLocation, useNavigate } from 'react-router-dom'; -import { generateMnemonic } from '@scure/bip39'; -import { wordlist } from '@scure/bip39/wordlists/english'; -import { absoluteRoutes } from '@popup/popupX/constants/routes'; -import { useAtom, useAtomValue, useSetAtom } from 'jotai'; -import { useTranslation } from 'react-i18next'; -import { encryptedSeedPhraseAtom, sessionOnboardingLocationAtom, sessionPasscodeAtom } from '@popup/store/settings'; -import { decrypt, encrypt } from '@shared/utils/crypto'; -import Page from '@popup/popupX/shared/Page'; -import Text from '@popup/popupX/shared/Text'; -import Button from '@popup/popupX/shared/Button'; -import { SeedPhrase } from '@popup/popupX/shared/Form/SeedPhrase'; - -export default function GenerateSeedPhrase() { - const navigate = useNavigate(); - const location = useLocation(); - const { t } = useTranslation('x', { keyPrefix: 'onboarding.generateSeedPhrase' }); - const [seedPhrase, setSeedPhrase] = useState(); - const [encryptedSeedPhrase, setEncryptedSeedPhrase] = useAtom(encryptedSeedPhraseAtom); - const setOnboardingLocation = useSetAtom(sessionOnboardingLocationAtom); - const sessionPasscode = useAtomValue(sessionPasscodeAtom); - const passcode = sessionPasscode.value; - - useEffect(() => { - if (!encryptedSeedPhrase.loading && encryptedSeedPhrase.value === undefined && passcode) { - const newSeedPhrase = generateMnemonic(wordlist, 256); - encrypt(newSeedPhrase, passcode).then((newEncryptedSeedPhrase) => { - setEncryptedSeedPhrase(newEncryptedSeedPhrase); - setSeedPhrase(newSeedPhrase); - setOnboardingLocation(location.pathname); - }); - } - }, [encryptedSeedPhrase.loading, encryptedSeedPhrase.value, passcode]); - - useEffect(() => { - if (!seedPhrase && !encryptedSeedPhrase.loading && encryptedSeedPhrase.value && passcode) { - decrypt(encryptedSeedPhrase.value, passcode).then(setSeedPhrase); - } - }, [seedPhrase, encryptedSeedPhrase.loading, encryptedSeedPhrase.value, passcode]); - - return ( - - - - {t('writeDown')} - {seedPhrase && ( - - )} - - - - navigate( - absoluteRoutes.onboarding.setupPassword.createOrRestore.generateSeedPhrase.confirmSeedPhrase - .path - ) - } - /> - - - ); -} diff --git a/packages/browser-wallet/src/popup/popupX/pages/Onboarding/IdCardsInfo.tsx b/packages/browser-wallet/src/popup/popupX/pages/Onboarding/IdCardsInfo.tsx deleted file mode 100644 index dff9d5172..000000000 --- a/packages/browser-wallet/src/popup/popupX/pages/Onboarding/IdCardsInfo.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import React from 'react'; -import Button from '@popup/popupX/shared/Button'; -import { useNavigate } from 'react-router-dom'; -import { absoluteRoutes } from '@popup/popupX/constants/routes'; -import { useTranslation } from 'react-i18next'; -import Page from '@popup/popupX/shared/Page'; -import Text from '@popup/popupX/shared/Text'; - -export default function IdCardsInfo() { - const { t } = useTranslation('x', { keyPrefix: 'onboarding.idCardsInfo' }); - const nav = useNavigate(); - const navToNext = () => - nav( - absoluteRoutes.onboarding.setupPassword.createOrRestore.generateSeedPhrase.confirmSeedPhrase.idIntro - .requestIdentity.path - ); - return ( - - - - {t('idDescription')} - - - navToNext()} /> - - - ); -} diff --git a/packages/browser-wallet/src/popup/popupX/pages/Onboarding/Intro.tsx b/packages/browser-wallet/src/popup/popupX/pages/Onboarding/Intro.tsx new file mode 100644 index 000000000..da7e9fc52 --- /dev/null +++ b/packages/browser-wallet/src/popup/popupX/pages/Onboarding/Intro.tsx @@ -0,0 +1,53 @@ +import React, { useEffect } from 'react'; +import { useSetAtom } from 'jotai'; +import { networkConfigurationAtom, sessionOnboardingLocationAtom, uiStyleAtom } from '@popup/store/settings'; +import { mainnet } from '@shared/constants/networkConfiguration'; +import Button from '@popup/popupX/shared/Button'; +import { useNavigate } from 'react-router-dom'; +import { absoluteRoutes } from '@popup/popupX/constants/routes'; +import { useTranslation } from 'react-i18next'; +import Text from '@popup/popupX/shared/Text'; +import Page from '@popup/popupX/shared/Page'; +import { UiStyle } from '@shared/storage/types'; +import FullLogo from '@assets/svgX/UiKit/Custom/concordium-full-logo.svg'; +import LandingImg from '@assets/svgX/UiKit/Custom/graphic-landing-3.svg'; + +export default function Intro() { + const { t } = useTranslation('x', { keyPrefix: 'onboarding.intro' }); + const setOnboardingLocation = useSetAtom(sessionOnboardingLocationAtom); + const setCurrentNetworkConfiguration = useSetAtom(networkConfigurationAtom); + const setUiStyle = useSetAtom(uiStyleAtom); + const nav = useNavigate(); + const navToWelcome = () => { + const pathToWelcome = absoluteRoutes.onboarding.welcome.path; + setUiStyle(UiStyle.WalletX); + setOnboardingLocation(pathToWelcome); + return nav(pathToWelcome); + }; + + useEffect(() => { + // needed for proper network handling during onboarding + // otherwise failing with error 'Indexed storage should not be accessed before setting the network' + setCurrentNetworkConfiguration(mainnet); + }, []); + + return ( + + + + {t('smartMoney')} + + {t('dataRules')} + {t('verify')} + + + { + navToWelcome(); + }} + /> + + + ); +} diff --git a/packages/browser-wallet/src/popup/popupX/pages/Onboarding/Onboarding.scss b/packages/browser-wallet/src/popup/popupX/pages/Onboarding/Onboarding.scss index 866e73fce..11d61d82a 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/Onboarding/Onboarding.scss +++ b/packages/browser-wallet/src/popup/popupX/pages/Onboarding/Onboarding.scss @@ -1,76 +1,178 @@ -.welcome { +.intro { + .page__main { + align-items: center; + } + + .full-logo { + position: absolute; + margin-top: rem(-48px); + } + + .text__main_medium { + position: absolute; + margin-top: rem(-12px); + color: $semantic-content-secondary; + } + + .landing-img { + margin-top: rem(28px); + } + .heading_medium { margin-top: rem(26px); - margin-bottom: rem(44px); + font-size: $semantic-heading-m-scale; + line-height: rem(25px); + color: $semantic-content-primary; } - &__description { - display: flex; - margin-bottom: rem(24px); + .text__main_regular { + margin-top: rem(8px); + color: $semantic-content-accent-secondary; + } +} - &_icon { - margin-right: rem(2px); - } +.welcome { + .page__main { + align-items: center; + margin-left: rem(-8px); + margin-right: rem(-8px); + } - &_text { - display: flex; - flex-direction: column; - margin-left: rem(16px); - gap: rem(4px); + .full-logo { + position: absolute; + margin-top: rem(-48px); + } - .text__main { - font-weight: $t-font-weight-semi-bold; - } - } + .text__main_medium { + position: absolute; + margin-top: rem(-12px); + color: $semantic-content-secondary; } - &__footer { - margin: rem(8px) auto 0 auto; + .landing-img { + margin-top: rem(28px); } - .page__footer { - margin-bottom: rem(-16px); + .heading_medium { + margin-top: rem(26px); + font-size: $semantic-heading-m-scale; + line-height: rem(25px); + color: $semantic-content-primary; } -} -.setup-password { - .concordium-logo-white { - width: 208px; - height: 40px; - background-image: url('../assets/images/concordium-logo-white.png'); - background-size: contain; + .text__main_regular { + margin-top: rem(8px); + color: $semantic-content-accent-secondary; } + .capture__main_small { + margin-top: rem(20px); + color: $semantic-content-secondary; + } +} + +.setup-password { &__title { display: flex; - flex-direction: column; - align-items: center; - text-align: center; - .heading_medium { - margin-top: rem(39px); - margin-bottom: rem(24px); + .text__main_regular { + font-size: $semantic-label-s-scale; } } &__form { display: flex; flex-direction: column; - gap: rem(4px); + gap: rem(8px); height: 100%; - margin-top: rem(64px); + margin-top: rem(24px); } } .create-or-restore { - .capture__main_small.external-link { + .page__main { + gap: rem(24px); + } + + .button__ui-kit_tertiary { position: absolute; - top: rem(58px); + top: rem(61px); right: rem(24px); - color: $color-mineral-2; + } + + .split-separator { + display: flex; + align-items: center; + width: 100%; + max-width: rem(191px); + margin: auto; + + .capture__main_small { + color: $semantic-content-secondary; + line-height: $semantic-label-s-line-height; + } + + &::before, + &::after { + content: ''; + flex: 1; + border-bottom: 1px solid $semantic-content-secondary; + border-radius: $semantic-radius-rounded; + margin: 0 $semantic-gap-l; + } + } + + .button__onboarding-option { + @include base-button; + + display: flex; + align-items: center; + gap: $semantic-gap-l; + border: unset; + border-radius: $semantic-radius-m; + padding: $semantic-padding-l; + background-color: $semantic-surface-primary; + + .icon-container { + width: rem(40px); + height: rem(40px); + border-radius: $semantic-radius-s; + padding: $semantic-padding-s; + background-color: $semantic-surface-inverse-primary-a10; + + svg { + width: rem(24px); + height: rem(24px); + + path { + fill: $semantic-content-inverse-accent-tertiary; + } + } + } + + .text-container { + display: flex; + flex-direction: column; + align-items: flex-start; + + .text__main_medium { + color: $semantic-content-inverse-primary; + } + + .capture__main_small { + text-align: left; + color: $semantic-content-secondary; + } + } &:hover { - color: $color-white; + background-color: $semantic-surface-primary-hover; + } + + &:active { + background-color: $semantic-surface-primary-pressed; + outline: 1px solid $semantic-border-tertiary-pressed; + outline-offset: -1px; } } } @@ -92,35 +194,6 @@ } } -.request-identity { - &__provider { - margin-top: rem(28px); - - &_option { - display: flex; - align-items: center; - padding: rem(16px); - margin-bottom: rem(8px); - border-radius: rem(12px); - background-color: rgba($color-grey-3, 0.3); - - .provider { - &__name { - margin-left: rem(16px); - } - - &__icon { - display: flex; - - svg { - border-radius: rem(5px); - } - } - } - } - } -} - .onboarding-container { display: flex; flex-direction: column; diff --git a/packages/browser-wallet/src/popup/popupX/pages/Onboarding/RestoreWallet.tsx b/packages/browser-wallet/src/popup/popupX/pages/Onboarding/RestoreWallet.tsx index a5254dacd..d1e8d917e 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/Onboarding/RestoreWallet.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/Onboarding/RestoreWallet.tsx @@ -7,7 +7,7 @@ import Text from '@popup/popupX/shared/Text'; import SeedPhrase from '@popup/popupX/shared/Form/SeedPhrase'; import Form from '@popup/popupX/shared/Form'; import { useSetAtom } from 'jotai'; -import { encryptedSeedPhraseAtom, hasBeenOnBoardedAtom } from '@popup/store/settings'; +import { encryptedSeedPhraseAtom, hasBeenOnBoardedAtom, hasBeenSavedSeedAtom } from '@popup/store/settings'; import { usePasscodeInSetup } from '@popup/pages/Setup/passcode-helper'; import { Validate } from 'react-hook-form'; import { encrypt } from '@shared/utils/crypto'; @@ -31,6 +31,7 @@ export default function RestoreWallet() { const nav = useNavigate(); const setEncryptedSeedPhrase = useSetAtom(encryptedSeedPhraseAtom); const setHasBeenOnboarded = useSetAtom(hasBeenOnBoardedAtom); + const setHasBeenSavedSeed = useSetAtom(hasBeenSavedSeedAtom); const form = useForm(); const passcode = usePasscodeInSetup(); @@ -42,6 +43,7 @@ export default function RestoreWallet() { const handleSubmit = async ({ seedPhraseInput }: FormValues) => { const encryptedSeedPhrase = await encrypt(seedPhraseInput, passcode); await setEncryptedSeedPhrase(encryptedSeedPhrase); + await setHasBeenSavedSeed(true); setHasBeenOnboarded(true).then(() => { const chooseNetworkPathRecovering = absoluteRoutes.settings.restore.main.path; nav(chooseNetworkPathRecovering); diff --git a/packages/browser-wallet/src/popup/popupX/pages/Onboarding/SelectNetwork.tsx b/packages/browser-wallet/src/popup/popupX/pages/Onboarding/SelectNetwork.tsx index c8f01c949..a14715074 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/Onboarding/SelectNetwork.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/Onboarding/SelectNetwork.tsx @@ -17,7 +17,8 @@ function useNetworks() { const nav = useNavigate(); const [currentNetworkConfiguration, setCurrentNetworkConfiguration] = useAtom(networkConfigurationAtom); const [customnet] = useAtom(customNetworkConfigurationAtom); - const navToCustom = () => nav(relativeRoutes.onboarding.setupPassword.createOrRestore.selectNetwork.custom.path); + const navToCustom = () => + nav(relativeRoutes.onboarding.welcome.setupPassword.createOrRestore.selectNetwork.custom.path); const networks = [mainnet, testnet]; if (isDevelopmentBuild()) { diff --git a/packages/browser-wallet/src/popup/popupX/pages/Onboarding/SetupPassword.tsx b/packages/browser-wallet/src/popup/popupX/pages/Onboarding/SetupPassword.tsx index 6108cdb78..36adf15cb 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/Onboarding/SetupPassword.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/Onboarding/SetupPassword.tsx @@ -11,7 +11,7 @@ import { useAtom, useSetAtom } from 'jotai'; import { passcodeAtom } from '@popup/state'; import { useForm } from '@popup/shared/Form'; import { SubmitHandler, Validate } from 'react-hook-form'; -import { encryptedSeedPhraseAtom, sessionPasscodeAtom } from '@popup/store/settings'; +import { encryptedSeedPhraseAtom, sessionOnboardingLocationAtom, sessionPasscodeAtom } from '@popup/store/settings'; type FormValues = { passcode: string; @@ -21,18 +21,20 @@ type FormValues = { export default function SetupPassword() { const { t } = useTranslation('x', { keyPrefix: 'onboarding.setupPassword' }); const nav = useNavigate(); - const navToNext = () => nav(absoluteRoutes.onboarding.setupPassword.createOrRestore.path); + const setOnboardingLocation = useSetAtom(sessionOnboardingLocationAtom); const setPasscode = useSetAtom(passcodeAtom); const setPasscodeInSession = useSetAtom(sessionPasscodeAtom); const [, setEncryptedSeedPhrase] = useAtom(encryptedSeedPhraseAtom); - const form = useForm(); + const form = useForm({ mode: 'onChange' }); const passcode = form.watch('passcode'); const handleSubmit: SubmitHandler = (vs) => { + const pathToCreateOrRestore = absoluteRoutes.onboarding.welcome.setupPassword.createOrRestore.path; setPasscode(vs.passcode); setPasscodeInSession(vs.passcode); setEncryptedSeedPhrase(undefined); - navToNext(); + setOnboardingLocation(pathToCreateOrRestore); + nav(pathToCreateOrRestore); }; const passcodesAreEqual: Validate = useCallback( @@ -48,10 +50,9 @@ export default function SetupPassword() { return ( +
- - {t('setPassword')} {t('firstStep')}
- {}} /> + ); diff --git a/packages/browser-wallet/src/popup/popupX/pages/Onboarding/Welcome.tsx b/packages/browser-wallet/src/popup/popupX/pages/Onboarding/Welcome.tsx index 83098ca60..bfa707693 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/Onboarding/Welcome.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/Onboarding/Welcome.tsx @@ -1,10 +1,7 @@ -import React, { ReactNode, useEffect } from 'react'; -import { useAtom } from 'jotai'; -import { acceptedTermsAtom, networkConfigurationAtom, uiStyleAtom } from '@popup/store/settings'; -import { mainnet } from '@shared/constants/networkConfiguration'; -import Shield from '@assets/svgX/crypto-currency-square-shield.svg'; -import Assets from '@assets/svgX/crypto-currency-assets.svg'; -import Possibilities from '@assets/svgX/crypto-currency-possibilities.svg'; +import React from 'react'; +import { useAtom, useSetAtom } from 'jotai'; +import { acceptedTermsAtom, sessionOnboardingLocationAtom } from '@popup/store/settings'; +import ArrowRight from '@assets/svgX/UiKit/Arrows/arrow-right.svg'; import Button from '@popup/popupX/shared/Button'; import { useNavigate } from 'react-router-dom'; import { absoluteRoutes } from '@popup/popupX/constants/routes'; @@ -15,27 +12,13 @@ import Text from '@popup/popupX/shared/Text'; import Page from '@popup/popupX/shared/Page'; import { useAsyncMemo } from 'wallet-common-helpers'; import { getTermsAndConditionsConfig } from '@shared/utils/network-helpers'; -import { UiStyle } from '@shared/storage/types'; - -const bg = document.getElementsByClassName('bg').item(0); - -function Description({ icon, title, description }: { icon: ReactNode; title: string; description: string }) { - return ( -
-
{icon}
-
- {title} - {description} -
-
- ); -} +import FullLogo from '@assets/svgX/UiKit/Custom/concordium-full-logo.svg'; +import LandingImg from '@assets/svgX/UiKit/Custom/graphic-landing-4.svg'; export default function Welcome() { const { t } = useTranslation('x', { keyPrefix: 'onboarding.welcome' }); - const [, setCurrentNetworkConfiguration] = useAtom(networkConfigurationAtom); + const setOnboardingLocation = useSetAtom(sessionOnboardingLocationAtom); const [{ value: acceptedTerms }, setAcceptedTerms] = useAtom(acceptedTermsAtom); - const [, setUiStyle] = useAtom(uiStyleAtom); const config = useAsyncMemo(getTermsAndConditionsConfig, undefined, []); const nav = useNavigate(); const navToPassword = () => { @@ -43,41 +26,32 @@ export default function Welcome() { // If we didn't find a version, put in an empty version setAcceptedTerms({ accepted: true, version: version || '', url: config?.url }); - setUiStyle(UiStyle.WalletX); - - return nav(absoluteRoutes.onboarding.setupPassword.path); + const pathToPassword = absoluteRoutes.onboarding.welcome.setupPassword.path; + setOnboardingLocation(pathToPassword); + return nav(pathToPassword); }; - useEffect(() => { - bg?.classList.add('welcome-page'); - - // needed for proper network handling during onboarding - // otherwise failing with error 'Indexed storage should not be accessed before setting the network' - setCurrentNetworkConfiguration(mainnet); - }, []); - return ( - - } title={t('safeSecure')} description={t('trusted')} /> - } title={t('easyManage')} description={t('spendAssets')} /> - } title={t('unlimited')} description={t('transactionInvest')} /> + + {t('smartMoney')} + + {t('speed')} + {t('fastPayments')} + + {t('proceeding')} + {t('termsAndConditions')} + } onClick={() => { - bg?.classList.remove('welcome-page'); navToPassword(); }} /> -
- - {t('proceeding')} - {t('termsAndConditions')} - -
); diff --git a/packages/browser-wallet/src/popup/popupX/pages/Onboarding/i18n/en.ts b/packages/browser-wallet/src/popup/popupX/pages/Onboarding/i18n/en.ts index ffde10b50..db07a0d58 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/Onboarding/i18n/en.ts +++ b/packages/browser-wallet/src/popup/popupX/pages/Onboarding/i18n/en.ts @@ -1,32 +1,37 @@ const t = { + intro: { + smartMoney: 'Smart Money Starts Here', + continue: 'Continue', + dataRules: 'Your Data. Your Rules.', + verify: 'Verify your access, without exposing your identity.', + }, welcome: { - welcomeTo: 'Welcome to Concordium', - safeSecure: 'Safe and Secure', - trusted: 'Trusted by thousands, CryptoX is a secure wallet making the Concordium blockchain accessible to all', - easyManage: 'Easily manage digital assets', - spendAssets: 'Store, spend and send digital assets like tokens, crypto, unique collectibles', - unlimited: 'Unlimited possibilities', - transactionInvest: 'With CryptoX you can make transactions to invest, stake, sell, play games and more!', + smartMoney: 'Smart Money Starts Here', + speed: 'Speed Matters', + fastPayments: 'Make payments faster and cheaper using stablecoins.', start: 'Get started', proceeding: 'By proceeding, you agree with ', termsAndConditions: 'Terms & Conditions', }, setupPassword: { setPassword: 'Setup Passcode', - firstStep: 'The first step is to set up a passcode.\nPlease enter one below.', + firstStep: 'The first step is to set up a passcode. Please enter one below.', enterPasscode: 'Enter Passcode', - enterPasscodeAgain: 'Enter Passcode Again', + enterPasscodeAgain: 'Repeat Passcode', passcodeRequired: 'A passcode must be entered', passcodeMismatch: 'Passcode does not match', passcodeMinLength: 'Passcode must be at least 6 characters', continue: 'Continue', }, createOrRestore: { - createOrRestore: 'Create or restore', + createOrRestore: 'Create or Restore Account', optionsInfo: 'You have the option to create a new wallet or restore an existing one. How do you want to proceed?', - create: 'Create', - restore: 'Restore', + or: 'or', + walletAccount: 'Concordium Wallet Account', + walletAccountDescription: 'Write your seed phrase down in order to keep your wallet account safe', + restore: 'Restore With a Seed Phrase', + restoreDescription: 'Use your saved seed phrase to recover your existing accounts', }, selectNetwork: { networkSettings: 'Network settings', @@ -52,12 +57,6 @@ const t = { validate: 'Invalid secret recovery phrase', continue: 'Continue', }, - idCardsInfo: { - ids: 'ConcordiumID', - idDescription: - 'As the only blockchain, Concordium enables you to verify your real-world identity while remaining private on chain.\n\nEvery user in the Concordium ecosystem has been verified by an identity provider (IDP) - a trusted third-party entity that is responsible for validating the real-world identity of users.\n\nThe IDP does not track your wallet or on-chain activities; they only handle the verification process.\n\nAfter a your identity is verified, the identity provider issues a cryptographic identity object to you that is linked to your account and can be used to prove your identity to others without revealing sensitive personal information.\n\nOnly in the case of a legal requirement, an authorized entity (like a regulator) can request the IDP to disclose a user’s real-world identity.', - request: 'Request Identity', - }, requestIdentity: { requestId: 'Request identity', request: 'Request Identity', diff --git a/packages/browser-wallet/src/popup/popupX/pages/Onboarding/index.ts b/packages/browser-wallet/src/popup/popupX/pages/Onboarding/index.ts index 8f90e743f..ebed122e1 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/Onboarding/index.ts +++ b/packages/browser-wallet/src/popup/popupX/pages/Onboarding/index.ts @@ -1,8 +1,6 @@ +export { default as Intro } from './Intro'; export { default as Welcome } from './Welcome'; export { default as SetupPassword } from './SetupPassword'; export { default as CreateOrRestore } from './CreateOrRestore'; export { default as SelectNetwork } from './SelectNetwork'; export { default as RestoreWallet } from './RestoreWallet'; -export { default as GenerateSeedPhrase } from './GenerateSeedPhrase'; -export { default as ConfirmSeedPhrase } from './ConfirmSeedPhrase'; -export { default as IdCardsInfo } from './IdCardsInfo'; diff --git a/packages/browser-wallet/src/popup/popupX/pages/SeedPhrase/SaveSeedPhrase.tsx b/packages/browser-wallet/src/popup/popupX/pages/SeedPhrase/SaveSeedPhrase.tsx new file mode 100644 index 000000000..ad383edb9 --- /dev/null +++ b/packages/browser-wallet/src/popup/popupX/pages/SeedPhrase/SaveSeedPhrase.tsx @@ -0,0 +1,65 @@ +import React from 'react'; +import Button from '@popup/popupX/shared/Button'; +import { useTranslation } from 'react-i18next'; +import { useNavigate } from 'react-router-dom'; +import Page from '@popup/popupX/shared/Page'; +import Text from '@popup/popupX/shared/Text'; +import Card from '@popup/popupX/shared/Card'; +import Copy from '@assets/svgX/UiKit/Interface/copy-duplicate.svg'; +import { useAsyncMemo } from 'wallet-common-helpers'; +import { decrypt } from '@shared/utils/crypto'; +import { useAtomValue, useSetAtom } from 'jotai'; +import { encryptedSeedPhraseAtom, hasBeenSavedSeedAtom, sessionPasscodeAtom } from '@popup/store/settings'; +import { absoluteRoutes } from '@popup/popupX/constants/routes'; +import { useCopyToClipboard } from '@popup/popupX/shared/utils/hooks'; + +function SaveSeedPhrase() { + const { t } = useTranslation('x', { keyPrefix: 'seedPhrase' }); + const nav = useNavigate(); + const passcode = useAtomValue(sessionPasscodeAtom); + const encryptedSeed = useAtomValue(encryptedSeedPhraseAtom); + const setHasBeenSavedSeed = useSetAtom(hasBeenSavedSeedAtom); + const copyToClipboard = useCopyToClipboard(); + + const navToHome = () => nav(absoluteRoutes.home.path); + + const onConfirmSave = () => { + setHasBeenSavedSeed(true).then(() => navToHome()); + }; + + const seedPhrase = useAsyncMemo( + async () => { + if (encryptedSeed.loading || passcode.loading) { + return undefined; + } + if (encryptedSeed.value && passcode.value) { + return decrypt(encryptedSeed.value, passcode.value); + } + throw new Error('SeedPhrase should not be retrieved without unlocking the wallet.'); + }, + undefined, + [encryptedSeed.loading, passcode.loading] + ); + + if (!seedPhrase) return null; + + return ( + + + + {t('secureSeedPhraseDescription')} + + {seedPhrase.split(' ').map((word) => ( + {word} + ))} + + } label={t('copy')} onClick={() => copyToClipboard(seedPhrase)} /> + + + + + + ); +} + +export default SaveSeedPhrase; diff --git a/packages/browser-wallet/src/popup/popupX/pages/SeedPhrase/SeedPhrase.scss b/packages/browser-wallet/src/popup/popupX/pages/SeedPhrase/SeedPhrase.scss index 7dba7dff6..50585bcdf 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/SeedPhrase/SeedPhrase.scss +++ b/packages/browser-wallet/src/popup/popupX/pages/SeedPhrase/SeedPhrase.scss @@ -13,7 +13,51 @@ } } - .button__icon { - margin-top: rem(24px); + .button__ui-kit_tertiary { + align-self: center; + margin-top: rem(12px); + } +} + +.seed-phrase-x.save-seed-phrase { + .card-x.grey { + counter-reset: wordCount; + outline: #ebf0f00d solid rem(1px); + outline-offset: -1px; + border-radius: rem(12px); + border: unset; + background-color: #141a1a; + gap: 4px; + justify-content: center; + padding: rem(16px); + + .label__regular { + counter-increment: wordCount; + display: flex; + align-items: baseline; + background-color: #1b2323; + outline: #ebf0f00d solid rem(1px); + outline-offset: -1px; + border-radius: rem(8px); + padding: rem(4px) rem(6px) rem(4px) rem(4px); + font-weight: $t-font-weight-regular; + font-size: $semantic-label-m-scale; + line-height: 20px; + color: #ccd5d5; + margin: unset; + + &::before { + content: counter(wordCount); + display: flex; + justify-content: center; + width: rem(16px); + margin-right: rem(4px); + font-family: $t-font-family-ibm; + font-weight: $t-font-weight-light; + font-size: 12px; + line-height: $semantic-label-m-line-height; + color: #2b6168; + } + } } } diff --git a/packages/browser-wallet/src/popup/popupX/pages/SeedPhrase/SeedPhrase.tsx b/packages/browser-wallet/src/popup/popupX/pages/SeedPhrase/SeedPhrase.tsx index 79739970d..2b8b3c52d 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/SeedPhrase/SeedPhrase.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/SeedPhrase/SeedPhrase.tsx @@ -5,7 +5,7 @@ import i18n from '@popup/shell/i18n'; import Page from '@popup/popupX/shared/Page'; import Text from '@popup/popupX/shared/Text'; import Card from '@popup/popupX/shared/Card'; -import Copy from '@assets/svgX/copy.svg'; +import Copy from '@assets/svgX/UiKit/Interface/copy-duplicate.svg'; import { useAsyncMemo } from 'wallet-common-helpers'; import { decrypt } from '@shared/utils/crypto'; import { useAtomValue } from 'jotai'; @@ -42,10 +42,10 @@ function SeedPhrase() { {t('seedPhraseDescription')} {seedPhrase.split(' ').map((word) => ( - {word} + {word} ))} - } label={t('copy')} onClick={() => copyToClipboard(seedPhrase)} /> + } label={t('copy')} onClick={() => copyToClipboard(seedPhrase)} /> ); diff --git a/packages/browser-wallet/src/popup/popupX/pages/SeedPhrase/i18n/en.ts b/packages/browser-wallet/src/popup/popupX/pages/SeedPhrase/i18n/en.ts index ef44dfb92..70bc9a62c 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/SeedPhrase/i18n/en.ts +++ b/packages/browser-wallet/src/popup/popupX/pages/SeedPhrase/i18n/en.ts @@ -2,9 +2,13 @@ const t = { seedPhrase: 'Your seed phrase', seedPhraseDescription: 'Your seed phrase is the access key to all the funds in your wallet. If you forget it you will lose access to your wallet(s). Keep it somewhere safe.', - copy: 'Copy seed phrase', + copy: 'Copy To Clipboard', passwordDescription: 'Please enter your passcode to show the seed phrase.', showSeedPhrase: 'Show secret recovery phrase', + secureSeedPhrase: 'Secure Your Seed Phrase', + secureSeedPhraseDescription: + 'Your seed phrase is the access key to your wallet. If you lose it, you will lose access to all your funds. Make sure to store it in a secure place.', + haveSavedSeedPhrase: 'I have securely saved my seed phrase', }; export default t; diff --git a/packages/browser-wallet/src/popup/popupX/pages/SeedPhrase/index.ts b/packages/browser-wallet/src/popup/popupX/pages/SeedPhrase/index.ts index 12e0b6625..c91478a94 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/SeedPhrase/index.ts +++ b/packages/browser-wallet/src/popup/popupX/pages/SeedPhrase/index.ts @@ -1 +1,2 @@ export { default } from './SeedPhrase'; +export { default as SaveSeedPhrase } from './SaveSeedPhrase'; diff --git a/packages/browser-wallet/src/popup/popupX/pages/SendFunds/Confirm.tsx b/packages/browser-wallet/src/popup/popupX/pages/SendFunds/Confirm.tsx index 13350f1d3..cde31dccd 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/SendFunds/Confirm.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/SendFunds/Confirm.tsx @@ -205,12 +205,7 @@ export default function SendFundsConfirm({ values, fee, sender }: Props) { - + ); diff --git a/packages/browser-wallet/src/popup/popupX/pages/SendFunds/SendFunds.scss b/packages/browser-wallet/src/popup/popupX/pages/SendFunds/SendFunds.scss index 9f1fb7af2..48a5ab06c 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/SendFunds/SendFunds.scss +++ b/packages/browser-wallet/src/popup/popupX/pages/SendFunds/SendFunds.scss @@ -23,7 +23,6 @@ .send-funds-scroll-wrapper { overflow-y: scroll; - margin-bottom: rem(2px); animation: border-on-scroll linear; animation-timeline: scroll(self); width: calc(100% + rem(48px)); @@ -40,7 +39,6 @@ bottom: rem(32px); padding-top: rem(16px); width: 100%; - background-color: $color-bg; } .send-funds-confirm { diff --git a/packages/browser-wallet/src/popup/popupX/pages/SendFunds/SendFunds.tsx b/packages/browser-wallet/src/popup/popupX/pages/SendFunds/SendFunds.tsx index f72051301..9b4906454 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/SendFunds/SendFunds.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/SendFunds/SendFunds.tsx @@ -175,7 +175,6 @@ function SendFunds({ address }: SendFundsProps) { diff --git a/packages/browser-wallet/src/popup/popupX/pages/SubmittedTransaction/SubmittedTransaction.tsx b/packages/browser-wallet/src/popup/popupX/pages/SubmittedTransaction/SubmittedTransaction.tsx index 3c17a2055..d2d9e67aa 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/SubmittedTransaction/SubmittedTransaction.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/SubmittedTransaction/SubmittedTransaction.tsx @@ -325,11 +325,7 @@ export default function SubmittedTransaction() { /> )} - nav(absoluteRoutes.home.path)} - label={t('continue')} - /> + nav(absoluteRoutes.home.path)} label={t('continue')} /> ); diff --git a/packages/browser-wallet/src/popup/popupX/pages/TokenDetails/TokenDetails.scss b/packages/browser-wallet/src/popup/popupX/pages/TokenDetails/TokenDetails.scss index 8efa4eed7..97f17c508 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/TokenDetails/TokenDetails.scss +++ b/packages/browser-wallet/src/popup/popupX/pages/TokenDetails/TokenDetails.scss @@ -35,14 +35,6 @@ width: 100%; gap: rem(4px); margin-top: rem(12px); - - .send svg { - transform: rotate(-90deg); - } - - .receive svg { - transform: rotate(90deg); - } } &__token { diff --git a/packages/browser-wallet/src/popup/popupX/pages/TokenDetails/TokenDetails.tsx b/packages/browser-wallet/src/popup/popupX/pages/TokenDetails/TokenDetails.tsx index ba857937f..8cd3a5042 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/TokenDetails/TokenDetails.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/TokenDetails/TokenDetails.tsx @@ -15,8 +15,9 @@ import { addThousandSeparators, integerToFractional, pipe } from 'wallet-common- import { getMetadataDecimals, trunctateSymbol } from '@shared/utils/token-helpers'; import { useUpdateAtom } from 'jotai/utils'; import { WalletCredential } from '@shared/storage/types'; -import Arrow from '@assets/svgX/arrow-right.svg'; -import Clock from '@assets/svgX/clock.svg'; +import ArrowUp from '@assets/svgX/UiKit/Arrows/arrow-up.svg'; +import ArrowDown from '@assets/svgX/UiKit/Arrows/arrow-down.svg'; +import Clock from '@assets/svgX/UiKit/MenuNavigation/clock-activity-history-time.svg'; import Notebook from '@assets/svgX/notebook.svg'; import Eye from '@assets/svgX/eye-slash.svg'; import Cis2 from '@assets/svgX/coin-crypto-cis-2.svg'; @@ -66,12 +67,17 @@ function TokenDetails({ credential }: { credential: WalletCredential }) {
} + icon={} label={t('receive')} onClick={() => navToReceive()} className="receive" /> - } label={t('send')} onClick={() => navToSend()} className="send" /> + } + label={t('send')} + onClick={() => navToSend()} + className="send" + /> } label={t('activity')} onClick={() => navToTransactionLog()} />
diff --git a/packages/browser-wallet/src/popup/popupX/pages/TokenDetails/TokenDetailsCcd.tsx b/packages/browser-wallet/src/popup/popupX/pages/TokenDetails/TokenDetailsCcd.tsx index 28e33e169..af2ebed35 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/TokenDetails/TokenDetailsCcd.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/TokenDetails/TokenDetailsCcd.tsx @@ -11,11 +11,12 @@ import { useAccountInfo } from '@popup/shared/AccountInfoListenerContext'; import { displayAsCcd, getPublicAccountAmounts, PublicAccountAmounts } from 'wallet-common-helpers'; import { WalletCredential } from '@shared/storage/types'; import { withSelectedCredential } from '@popup/popupX/shared/utils/hoc'; -import Arrow from '@assets/svgX/arrow-right.svg'; -import Clock from '@assets/svgX/clock.svg'; -import Percent from '@assets/svgX/percent.svg'; -import Plus from '@assets/svgX/plus.svg'; -import ConcordiumLogo from '@assets/svgX/concordium-logo.svg'; +import ArrowUp from '@assets/svgX/UiKit/Arrows/arrow-up.svg'; +import ArrowDown from '@assets/svgX/UiKit/Arrows/arrow-down.svg'; +import Clock from '@assets/svgX/UiKit/MenuNavigation/clock-activity-history-time.svg'; +import Plus from '@assets/svgX/UiKit/Interface/plus-add-buy.svg'; +import Percent from '@assets/svgX/UiKit/Interface/percentage-earn-staking.svg'; +import ConcordiumLogo from '@assets/svgX/UiKit/Custom/concordium-glyph-only.svg'; import { TokenPickerVariant } from '@popup/popupX/shared/Form/TokenAmount/View'; import { displayCcdAsEur } from '@popup/popupX/shared/utils/helpers'; import { useBlockChainParameters } from '@popup/shared/BlockChainParametersProvider'; @@ -124,13 +125,8 @@ function TokenDetailsCcd({ credential }: { credential: WalletCredential }) { )}
} label={t('buy')} onClick={navToBuy} className="buy" /> - } - label={t('receive')} - onClick={() => navToReceive()} - className="receive" - /> - } label={t('send')} onClick={() => navToSend()} className="send" /> + } label={t('receive')} onClick={() => navToReceive()} /> + } label={t('send')} onClick={() => navToSend()} /> } label={t('stake')} onClick={() => navToEarn()} /> } label={t('activity')} onClick={() => navToTransactionLog()} />
diff --git a/packages/browser-wallet/src/popup/popupX/pages/TokenDetails/TokenDetailsPlt.tsx b/packages/browser-wallet/src/popup/popupX/pages/TokenDetails/TokenDetailsPlt.tsx index 24f656356..ee6e83ed4 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/TokenDetails/TokenDetailsPlt.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/TokenDetails/TokenDetailsPlt.tsx @@ -16,7 +16,8 @@ import { useAtomValue } from 'jotai'; import { addThousandSeparators, integerToFractional, pipe } from 'wallet-common-helpers'; import { trunctateSymbol } from '@shared/utils/token-helpers'; import { WalletCredential } from '@shared/storage/types'; -import Arrow from '@assets/svgX/arrow-right.svg'; +import ArrowUp from '@assets/svgX/UiKit/Arrows/arrow-up.svg'; +import ArrowDown from '@assets/svgX/UiKit/Arrows/arrow-down.svg'; import Shield from '@assets/svgX/shield-square-crypto.svg'; import Stop from '@assets/svgX/circled-x-block-deny.svg'; import Check from '@assets/svgX/circled-check-done.svg'; @@ -139,17 +140,15 @@ function TokenDetails({ credential }: { credential: WalletCredential }) {
} + icon={} label={t('receive')} onClick={() => navToReceive()} - className="receive" disabled={getIsDisabled(status)} /> } + icon={} label={t('send')} onClick={() => navToSend()} - className="send" disabled={getIsDisabled(status)} />
diff --git a/packages/browser-wallet/src/popup/popupX/pages/prompts/AddTokens/AddTokens.tsx b/packages/browser-wallet/src/popup/popupX/pages/prompts/AddTokens/AddTokens.tsx index 3811d2147..744366c8e 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/prompts/AddTokens/AddTokens.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/prompts/AddTokens/AddTokens.tsx @@ -266,7 +266,7 @@ export default function AddTokens({ respond }: Props) { {allExisting || ( <> - respond([]))} /> + respond([]))} /> diff --git a/packages/browser-wallet/src/popup/popupX/pages/prompts/ConnectAccount/ConnectAccount.tsx b/packages/browser-wallet/src/popup/popupX/pages/prompts/ConnectAccount/ConnectAccount.tsx index f9b4ada6d..0f832c6fa 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/prompts/ConnectAccount/ConnectAccount.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/prompts/ConnectAccount/ConnectAccount.tsx @@ -150,7 +150,7 @@ export default function ConnectAccount({ onAllow, onReject }: Props) {
- + - + - + diff --git a/packages/browser-wallet/src/popup/popupX/pages/prompts/SendTransaction/SendTransaction.tsx b/packages/browser-wallet/src/popup/popupX/pages/prompts/SendTransaction/SendTransaction.tsx index 7e93feec5..e2f36fe87 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/prompts/SendTransaction/SendTransaction.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/prompts/SendTransaction/SendTransaction.tsx @@ -185,7 +185,7 @@ export default function SendTransaction({ onSubmit, onReject }: Props) { - + diff --git a/packages/browser-wallet/src/popup/popupX/pages/prompts/SignCis3Message/SignCis3Message.tsx b/packages/browser-wallet/src/popup/popupX/pages/prompts/SignCis3Message/SignCis3Message.tsx index 60da6e618..8a4def36c 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/prompts/SignCis3Message/SignCis3Message.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/prompts/SignCis3Message/SignCis3Message.tsx @@ -154,7 +154,7 @@ export default function SignCis3Message({ onSubmit, onReject }: Props) { - + { diff --git a/packages/browser-wallet/src/popup/popupX/pages/prompts/SignMessage/SignMessage.tsx b/packages/browser-wallet/src/popup/popupX/pages/prompts/SignMessage/SignMessage.tsx index 9e3487fbd..75e4d16d6 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/prompts/SignMessage/SignMessage.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/prompts/SignMessage/SignMessage.tsx @@ -71,7 +71,7 @@ export default function SignMessage({ onSubmit, onReject }: Props) { - + { diff --git a/packages/browser-wallet/src/popup/popupX/pages/prompts/VerifiablePresentationRequest/VerifiablePresentationRequest.tsx b/packages/browser-wallet/src/popup/popupX/pages/prompts/VerifiablePresentationRequest/VerifiablePresentationRequest.tsx index 590c2a5a1..6502bdd76 100644 --- a/packages/browser-wallet/src/popup/popupX/pages/prompts/VerifiablePresentationRequest/VerifiablePresentationRequest.tsx +++ b/packages/browser-wallet/src/popup/popupX/pages/prompts/VerifiablePresentationRequest/VerifiablePresentationRequest.tsx @@ -157,7 +157,7 @@ function DisplayNotProvable({ )} - + ); @@ -337,14 +337,14 @@ export default function VerifiablePresentationRequest({ onReject, onSubmit }: Pr ))} withClose(onReject)()} label={t('reject')} /> {currentStatementIndex > 0 && ( setCurrentStatementIndex(currentStatementIndex - 1)} label={t('back')} diff --git a/packages/browser-wallet/src/popup/popupX/shared/Button/Button.scss b/packages/browser-wallet/src/popup/popupX/shared/Button/Button.scss index 980e075db..23539252a 100644 --- a/packages/browser-wallet/src/popup/popupX/shared/Button/Button.scss +++ b/packages/browser-wallet/src/popup/popupX/shared/Button/Button.scss @@ -1,12 +1,16 @@ +@mixin base-button { + cursor: pointer; + font-family: $t-font-family-satoshi; + + &:focus-visible { + outline: 1px solid $color-white; + outline-offset: -1px; + } +} + .button { &__base { - cursor: pointer; - font-family: $t-font-family-satoshi; - - &:focus-visible { - outline: 1px solid $color-white; - outline-offset: -1px; - } + @include base-button; } &__main { @@ -67,13 +71,23 @@ display: flex; align-items: center; justify-content: center; - padding: rem(8px); - border-radius: rem(4px); + padding: $semantic-padding-s; + border-radius: $semantic-radius-s; border: unset; cursor: pointer; - background-color: $color-main-bg; + background-color: $semantic-surface-tertiary; @include transition(background-color); + &:hover { + background-color: $semantic-surface-tertiary-hover; + } + + &:active { + background-color: $semantic-surface-tertiary-pressed; + outline: 1px solid $semantic-border-tertiary-pressed; + outline-offset: -1px; + } + &.text { display: flex; align-items: center; @@ -93,25 +107,27 @@ display: flex; flex-direction: column; align-items: center; - gap: rem(8px); + gap: $semantic-gap-s; flex: 1; - padding: rem(14px) rem(0); - border-radius: rem(12px); - background-color: $color-transaction-bg; + padding: rem(15.5px) rem(0); + border-radius: $semantic-radius-m; .capture__additional_small { - color: $color-white; + line-height: $semantic-label-s-line-height; + color: $semantic-content-primary; } svg { - width: rem(24px); - height: rem(24px); + width: rem(18px); + height: rem(18px); path { - fill: $color-mineral-2; + fill: $semantic-content-accent-secondary; } } + @include surface-states-tertiary; + &:disabled { background-color: $semantic-surface-primary-disabled; @@ -140,12 +156,176 @@ &:hover:not(:disabled) { border-color: unset; - background-color: $color-main-bg-hover; } svg { - width: auto; - height: auto; + width: rem(16px); + height: rem(16px); + + path { + fill: $semantic-content-primary; + } + } + } +} + +.button__ui-kit { + @include base-button; + + display: flex; + align-items: center; + justify-content: center; + border-radius: $semantic-radius-rounded; + + &_primary { + @include button-color-states( + ($semantic-content-inverse-primary, $semantic-surface-primary), + ($semantic-content-inverse-primary, $semantic-surface-primary-hover), + ($semantic-content-inverse-primary, $semantic-surface-primary-pressed), + ($semantic-content-primary-disabled, $semantic-surface-primary-disabled) + ); + + &.inverse { + @include button-color-states( + ($semantic-content-primary, $semantic-surface-inverse-primary), + ($semantic-content-primary, $semantic-surface-inverse-primary-hover), + ($semantic-content-primary, $semantic-surface-inverse-primary-pressed), + ($semantic-content-inverse-disabled, $semantic-surface-inverse-primary-disabled) + ); + } + } + + &_secondary { + @include button-color-states( + ($semantic-content-primary, $semantic-surface-secondary), + ($semantic-content-primary, $semantic-surface-secondary-hover), + ($semantic-content-primary, $semantic-surface-secondary-pressed), + ($semantic-content-primary-disabled, $semantic-surface-secondary-disabled) + ); + + &.inverse { + @include button-color-states( + ($semantic-content-inverse-primary, $semantic-surface-inverse-secondary), + ($semantic-content-inverse-primary, $semantic-surface-inverse-secondary-hover), + ($semantic-content-inverse-primary, $semantic-surface-inverse-secondary-pressed), + ($semantic-content-inverse-disabled, $semantic-surface-inverse-primary-disabled) + ); + } + } + + &_tertiary { + @include button-color-states( + ($semantic-content-secondary, transparent, $semantic-border-tertiary), + ($semantic-content-primary, $semantic-surface-tertiary-hover), + ($semantic-content-primary, $semantic-surface-tertiary-pressed, $semantic-border-tertiary-pressed), + ($semantic-content-primary-disabled, transparent, $semantic-border-primary-disabled) + ); + + &.inverse { + @include button-color-states( + ($semantic-content-inverse-secondary, transparent, $semantic-border-inverse-tertiary), + ($semantic-content-inverse-primary, $semantic-surface-tertiary-hover), + ( + $semantic-content-inverse-primary, + $semantic-surface-tertiary-pressed, + $semantic-border-tertiary-pressed + ), + ($semantic-content-inverse-disabled, transparent, $semantic-border-inverse-disabled) + ); } } + + &_large { + @include button-sizes( + ($semantic-padding-l $semantic-padding-xl), + ( + $t-font-weight-medium, + $semantic-label-m-scale, + $semantic-label-m-line-height, + $semantic-label-s-letter-spacing + ), + $semantic-label-m-line-height, + $semantic-gap-s, + 100% + ); + } + + &_medium { + @include button-sizes( + ($semantic-padding-s $semantic-padding-m), + ( + $t-font-weight-medium, + $semantic-label-m-scale, + $semantic-label-m-line-height, + $semantic-label-s-letter-spacing + ), + $semantic-label-m-line-height, + $semantic-gap-s + ); + } + + &_small { + @include button-sizes( + ($semantic-padding-xs $semantic-padding-s), + ( + $t-font-weight-medium, + $semantic-label-s-scale, + $semantic-label-s-line-height, + $semantic-label-s-letter-spacing + ), + $semantic-label-xs-line-height, + $semantic-gap-xs + ); + } +} + +.button__embedded { + @include base-button; + + display: flex; + align-items: center; + justify-content: center; + padding: $semantic-padding-s; + + &_dark { + @include button-color-states( + ($semantic-content-inverse-primary, transparent, $semantic-border-inverse-primary-a10), + ( + $semantic-content-inverse-primary, + $semantic-surface-inverse-tertiary-hover, + $semantic-border-inverse-tertiary-hover + ), + ( + $semantic-content-inverse-primary, + $semantic-surface-inverse-tertiary-pressed, + $semantic-border-inverse-tertiary-pressed + ), + ( + $semantic-content-inverse-primary, + $semantic-surface-inverse-tertiary-selected, + $semantic-border-inverse-tertiary-selected + ) + ); + } + + &_light { + @include button-color-states( + ($semantic-content-primary, transparent, $semantic-border-primary-a10), + ($semantic-content-primary, $semantic-surface-tertiary-hover, $semantic-border-tertiary-hover), + ($semantic-content-primary, $semantic-surface-tertiary-pressed, $semantic-border-tertiary-pressed), + ($semantic-content-primary, $semantic-surface-tertiary-selected, $semantic-border-tertiary-selected) + ); + } + + &_medium { + @include icon-sizes($semantic-gap-l); + + border-radius: $semantic-radius-xs; + } + + &_small { + @include icon-sizes($semantic-gap-s); + + border-radius: rem(4px); + } } diff --git a/packages/browser-wallet/src/popup/popupX/shared/Button/Button.tsx b/packages/browser-wallet/src/popup/popupX/shared/Button/Button.tsx index 9a2d16b13..c74ed54f4 100644 --- a/packages/browser-wallet/src/popup/popupX/shared/Button/Button.tsx +++ b/packages/browser-wallet/src/popup/popupX/shared/Button/Button.tsx @@ -25,14 +25,38 @@ export function ButtonBase({ return ; } -function ButtonMain({ label, className, ...props }: { label: string } & ButtonProps) { +type UiKitProps = { + label: string; + iconLeft?: ReactNode; + iconRight?: ReactNode; + variant?: 'primary' | 'secondary' | 'tertiary'; + size?: 'large' | 'medium' | 'small'; + inverse?: boolean; +} & ButtonProps; + +function ButtonUiKit({ label, iconLeft, iconRight, variant, size, inverse, className, ...props }: UiKitProps) { return ( - - {label} + + {iconLeft} + {label} + {iconRight} ); } +function ButtonMain({ ...props }: UiKitProps) { + return ; +} + function ButtonSecondary({ label, icon, className, ...props }: { label: string; icon?: ReactNode } & ButtonProps) { return ( @@ -42,6 +66,10 @@ function ButtonSecondary({ label, icon, className, ...props }: { label: string; ); } +function ButtonTertiary({ size = 'medium', ...props }: UiKitProps) { + return ; +} + function ButtonIcon({ icon, className, ...props }: { icon: ReactNode } & ButtonProps) { return ( @@ -83,14 +111,37 @@ function ButtonIconTile({ icon, label, className, ...props }: { icon: ReactNode; ); } +function ButtonEmbedded({ + icon, + className, + variant = 'dark', + size = 'small', + ...props +}: { + icon: ReactNode; + variant?: 'dark' | 'light'; + size?: 'small' | 'medium'; +} & ButtonProps) { + return ( + + {icon} + + ); +} + const Button = { Base: ButtonBase, Main: ButtonMain, Secondary: ButtonSecondary, + Tertiary: ButtonTertiary, Icon: ButtonIcon, IconText: ButtonIconText, Text: ButtonText, IconTile: ButtonIconTile, + Embedded: ButtonEmbedded, }; export default Button; diff --git a/packages/browser-wallet/src/popup/popupX/shared/Card/Card.scss b/packages/browser-wallet/src/popup/popupX/shared/Card/Card.scss index 25888bd11..52fb59bcf 100644 --- a/packages/browser-wallet/src/popup/popupX/shared/Card/Card.scss +++ b/packages/browser-wallet/src/popup/popupX/shared/Card/Card.scss @@ -5,7 +5,7 @@ padding: rem(16px) rem(20px); &.gradient { - background: $gradient-card-bg; + background: $modal-gradient-bg; } &.grey { diff --git a/packages/browser-wallet/src/popup/popupX/shared/Form/Form.scss b/packages/browser-wallet/src/popup/popupX/shared/Form/Form.scss index 452d105a6..cfedb3573 100644 --- a/packages/browser-wallet/src/popup/popupX/shared/Form/Form.scss +++ b/packages/browser-wallet/src/popup/popupX/shared/Form/Form.scss @@ -19,15 +19,16 @@ } &__field { - background-color: $color-input-bg; - color: $color-white; - height: rem(56px); - border: rem(1px) solid $color-input-border; - border-radius: rem(12px); - padding: rem(28px) rem(14px) rem(12px); + background-color: $semantic-surface-tertiary; + height: rem(58px); + border: rem(1px) solid $semantic-surface-tertiary; + border-radius: $semantic-radius-m; + padding: rem(26px) rem(11px) rem(11px); width: 100%; outline: none; - font-size: rem(14px); + font-size: $semantic-body-m-scale; + font-weight: $t-font-weight-regular; + color: $semantic-content-primary; /* override base style, remove after release */ transform: unset; @@ -35,9 +36,30 @@ /* override base style, remove after release */ @include transition(border-color); + &::placeholder { + font-family: $t-font-family-satoshi; + font-weight: $t-font-weight-regular; + font-size: $semantic-body-m-scale; + color: $semantic-content-primary-a40; + } + + &:hover { + background-color: $semantic-surface-tertiary-hover; + border-color: $semantic-border-tertiary-hover; + } + &:focus { - background-color: $color-grey-3; - border-color: $color-mineral-2; + background-color: $semantic-surface-tertiary-pressed; + border-color: $semantic-border-tertiary-selected; + } + + &:disabled { + background-color: $semantic-surface-primary-disabled; + border-color: $semantic-surface-primary-disabled; + + &::placeholder { + color: $semantic-content-primary-disabled; + } } // Hide the buttons to increment/decrement @@ -101,11 +123,18 @@ } &__label { + pointer-events: none; position: absolute; - left: rem(14px); + left: rem(12px); top: rem(8px); - color: $color-mineral-3; - opacity: 0.5; + color: $semantic-content-secondary; + font-size: $semantic-label-s-scale; + line-height: $semantic-label-s-line-height; + font-weight: $t-font-weight-medium; + + &.disabled { + color: $semantic-content-primary-disabled; + } } &__seed-phrase-x { @@ -157,10 +186,31 @@ &__error { left: unset; - font-size: rem(8px); - margin-top: rem(4px); + font-weight: $t-font-weight-regular; + font-size: $semantic-body-m-scale; + margin-top: rem(6px); white-space: break-spaces; } + + &__note { + display: flex; + align-items: center; + gap: rem(6px); + font-weight: $t-font-weight-regular; + font-size: $semantic-body-m-scale; + color: $semantic-content-accent-secondary; + margin-top: rem(6px); + left: unset; + + svg { + width: $semantic-label-s-scale; + height: $semantic-label-s-scale; + + path { + fill: $semantic-content-accent-secondary; + } + } + } } .form-inline-input { @@ -202,8 +252,8 @@ &__reveal { position: absolute; - top: rem(16px); - right: rem(20px); + top: rem(19px); + right: rem(16px); background-color: transparent; border: none; cursor: pointer; @@ -213,12 +263,23 @@ transform: unset; svg { + width: rem(20px); + height: rem(20px); + g, path { - fill: $color-mineral-2; + fill: $semantic-content-secondary; } } } + + .form-input__note { + color: $semantic-content-warning-primary; + + svg path { + fill: $semantic-content-warning-primary; + } + } } .form-search { @@ -353,7 +414,7 @@ $handle-size: rem(20px); display: flex; align-items: center; gap: rem(6px); - margin-top: rem(8px); + margin-top: rem(6px); color: $color-red-attention !important; svg path { diff --git a/packages/browser-wallet/src/popup/popupX/shared/Form/Input/Input.tsx b/packages/browser-wallet/src/popup/popupX/shared/Form/Input/Input.tsx index b5afa01ef..28572fe8b 100644 --- a/packages/browser-wallet/src/popup/popupX/shared/Form/Input/Input.tsx +++ b/packages/browser-wallet/src/popup/popupX/shared/Form/Input/Input.tsx @@ -27,7 +27,7 @@ type Props = Pick< * Use as a normal \. Should NOT be used for checkbox or radio. */ export const Input = forwardRef( - ({ error, className, type = 'text', label, note, valid, readOnly, ...props }, ref) => { + ({ error, className, type = 'text', label, note, valid, readOnly, disabled, ...props }, ref) => { return (