diff --git a/docs/implementation.md b/docs/implementation.md index cb3be75..c7a539c 100644 --- a/docs/implementation.md +++ b/docs/implementation.md @@ -238,3 +238,21 @@ tests were needed. The PR is not merged. unmerged. Task and PR have frontend label, tech owner and SXCHNGE project. Browser demo walkthrough also completed exchange and payout, confirming source currency handoffs and exact fee/debit/receipt values on the result screen. + +### Workspace copy cleanup — follow-up to #28 + +At the user's request, removed repeated demo/preview banners from the workspace, +transaction forms, auth, email confirmation, identity and limits. Confirmation +and result copy now uses ordinary product wording in EN/RU; the mobile wordmark +remains without the extra note. Removed unused localization entries and duplicate +email-state copy. Existing journey measurement, simulation flags, service behavior, +funds explanations and recovery controls are unchanged. Development constraints +belong in this record and package README, not repeated throughout the product UI. + +Delivery continues in [PR #29](https://git.sendico.io/tech/sxchnge/pulls/29) on +`workspace-28`. This copy change does not connect real authentication, email, +payment, support or backoffice services. +Validation: all 115 frontend tests, app analysis, app Dart formatting, web build +and diff checks pass. Updated existing copy expectations; telemetry tests still +verify simulated events never count as real business success. No new click events +were needed for this presentation-only cleanup. diff --git a/frontend/app/lib/auth/form.dart b/frontend/app/lib/auth/form.dart index 38c8a49..9445146 100644 --- a/frontend/app/lib/auth/form.dart +++ b/frontend/app/lib/auth/form.dart @@ -133,11 +133,6 @@ class _AuthFormState extends State { ), ), ), - const SizedBox(height: 16), - Text( - l.earlyPreview, - style: text.bodySmall!.copyWith(color: colors.onSurfaceVariant), - ), const SizedBox(height: 24), Text( _signUp ? l.signupHeading : l.loginHeading, diff --git a/frontend/app/lib/generated/i18n/app_localizations.dart b/frontend/app/lib/generated/i18n/app_localizations.dart index bd91178..d16fb13 100644 --- a/frontend/app/lib/generated/i18n/app_localizations.dart +++ b/frontend/app/lib/generated/i18n/app_localizations.dart @@ -221,13 +221,13 @@ abstract class AppLocalizations { /// No description provided for @loginPreview. /// /// In en, this message translates to: - /// **'Demo login completed. No real session was created. Your credentials have not been sent or saved.'** + /// **'You’re signed in.'** String get loginPreview; /// No description provided for @signupPreview. /// /// In en, this message translates to: - /// **'Demo sign-up completed. No real account was created. Your credentials have not been sent or saved.'** + /// **'Your account is ready.'** String get signupPreview; /// No description provided for @alreadyMember. @@ -254,12 +254,6 @@ abstract class AppLocalizations { /// **'Create an account'** String get createAnAccount; - /// No description provided for @earlyPreview. - /// - /// In en, this message translates to: - /// **'EARLY PREVIEW · Login and sign-up are not live yet.'** - String get earlyPreview; - /// No description provided for @brandEyebrow. /// /// In en, this message translates to: @@ -476,16 +470,10 @@ abstract class AppLocalizations { /// **'No email? Check your spam folder or request another below.'** String get verificationHint; - /// No description provided for @verificationDemo. - /// - /// In en, this message translates to: - /// **'DEMO · No real email is sent and no account is verified.'** - String get verificationDemo; - /// No description provided for @verificationDemoLink. /// /// In en, this message translates to: - /// **'Open demo confirmation link'** + /// **'Continue to confirmation'** String get verificationDemoLink; /// No description provided for @verificationStep. @@ -494,30 +482,6 @@ abstract class AppLocalizations { /// **'CONFIRM YOUR EMAIL'** String get verificationStep; - /// No description provided for @demoSentHeading. - /// - /// In en, this message translates to: - /// **'Demo email prepared.'** - String get demoSentHeading; - - /// No description provided for @demoSentBody. - /// - /// In en, this message translates to: - /// **'No email was sent. Use the demo confirmation below to preview the next step.'** - String get demoSentBody; - - /// No description provided for @demoVerifiedHeading. - /// - /// In en, this message translates to: - /// **'Demo verification\ncomplete.'** - String get demoVerifiedHeading; - - /// No description provided for @demoVerifiedBody. - /// - /// In en, this message translates to: - /// **'You’ve previewed email confirmation. No account was verified. Return to login to explore the demo.'** - String get demoVerifiedBody; - /// No description provided for @verificationRecipient. /// /// In en, this message translates to: @@ -530,12 +494,6 @@ abstract class AppLocalizations { /// **'Change email'** String get verificationChangeEmail; - /// No description provided for @demoResend. - /// - /// In en, this message translates to: - /// **'Prepare demo email again'** - String get demoResend; - /// No description provided for @kycTitle. /// /// In en, this message translates to: @@ -548,12 +506,6 @@ abstract class AppLocalizations { /// **'Your account, at your pace. Verify your identity when you need higher limits.'** String get kycIntro; - /// No description provided for @kycDemo. - /// - /// In en, this message translates to: - /// **'DEMO · Use sample images only. Photos stay in memory, are never uploaded, and disappear when you leave or reload. Review decisions are simulated.'** - String get kycDemo; - /// No description provided for @kycUnverified. /// /// In en, this message translates to: @@ -665,7 +617,7 @@ abstract class AppLocalizations { /// No description provided for @kycSupportBody. /// /// In en, this message translates to: - /// **'Support is not connected in this preview. In the live app, you will be able to request a review here without submitting documents again.'** + /// **'Support is currently unavailable. Please try again later.'** String get kycSupportBody; /// No description provided for @kycBasic. @@ -686,12 +638,6 @@ abstract class AppLocalizations { /// **'Your limits'** String get kycLimits; - /// No description provided for @kycLimitsDemo. - /// - /// In en, this message translates to: - /// **'Illustrative limits from the demo service. These are not a live offer.'** - String get kycLimitsDemo; - /// No description provided for @kycDay. /// /// In en, this message translates to: @@ -815,7 +761,7 @@ abstract class AppLocalizations { /// No description provided for @kycClose. /// /// In en, this message translates to: - /// **'Back to account preview'** + /// **'Back to account'** String get kycClose; /// No description provided for @kycReviewHelp. @@ -836,12 +782,6 @@ abstract class AppLocalizations { /// **'Submit for review'** String get kycSubmit; - /// No description provided for @kycSubmitDemo. - /// - /// In en, this message translates to: - /// **'Simulate submission'** - String get kycSubmitDemo; - /// No description provided for @kycWorking. /// /// In en, this message translates to: @@ -941,7 +881,7 @@ abstract class AppLocalizations { /// No description provided for @kycDemoControls. /// /// In en, this message translates to: - /// **'Demo: simulate a backoffice decision'** + /// **'Review scenarios'** String get kycDemoControls; /// No description provided for @kycDemoApprove. @@ -1112,12 +1052,6 @@ abstract class AppLocalizations { /// **'Refresh'** String get wRefresh; - /// No description provided for @wDemo. - /// - /// In en, this message translates to: - /// **'Demo workspace · No real money moves.'** - String get wDemo; - /// No description provided for @wSource. /// /// In en, this message translates to: @@ -1151,7 +1085,7 @@ abstract class AppLocalizations { /// No description provided for @wRecipientHint. /// /// In en, this message translates to: - /// **'Sample recipient — demo only'** + /// **'Recipient name or reference'** String get wRecipientHint; /// No description provided for @wReview. @@ -1223,7 +1157,7 @@ abstract class AppLocalizations { /// No description provided for @wConfirm. /// /// In en, this message translates to: - /// **'Confirm demo transaction'** + /// **'Confirm transaction'** String get wConfirm; /// No description provided for @wEdit. @@ -1310,18 +1244,6 @@ abstract class AppLocalizations { /// **'The transaction did not complete. The amount and fee are available in your account again.'** String get wFailedOutgoing; - /// No description provided for @wDemoMethod. - /// - /// In en, this message translates to: - /// **'Demo transfer'** - String get wDemoMethod; - - /// No description provided for @wDemoMethodHelp. - /// - /// In en, this message translates to: - /// **'Try the flow with sample data. No bank or payment provider is contacted.'** - String get wDemoMethodHelp; - /// No description provided for @wUnavailable. /// /// In en, this message translates to: @@ -1463,7 +1385,7 @@ abstract class AppLocalizations { /// No description provided for @wLanguageSaved. /// /// In en, this message translates to: - /// **'Saved to your demo account.'** + /// **'Saved to your account.'** String get wLanguageSaved; /// No description provided for @wLanguageFailed. @@ -1487,7 +1409,7 @@ abstract class AppLocalizations { /// No description provided for @wSecurityBody. /// /// In en, this message translates to: - /// **'Live sessions, password changes and two-step verification are not connected in this demo.'** + /// **'Password and security settings are not available yet.'** String get wSecurityBody; /// No description provided for @wIdentity. diff --git a/frontend/app/lib/generated/i18n/app_localizations_en.dart b/frontend/app/lib/generated/i18n/app_localizations_en.dart index 1a374e7..e0774a2 100644 --- a/frontend/app/lib/generated/i18n/app_localizations_en.dart +++ b/frontend/app/lib/generated/i18n/app_localizations_en.dart @@ -70,12 +70,10 @@ class AppLocalizationsEn extends AppLocalizations { String get letsGo => 'Let’s go'; @override - String get loginPreview => - 'Demo login completed. No real session was created. Your credentials have not been sent or saved.'; + String get loginPreview => 'You’re signed in.'; @override - String get signupPreview => - 'Demo sign-up completed. No real account was created. Your credentials have not been sent or saved.'; + String get signupPreview => 'Your account is ready.'; @override String get alreadyMember => 'Already part of sxchnge?'; @@ -89,10 +87,6 @@ class AppLocalizationsEn extends AppLocalizations { @override String get createAnAccount => 'Create an account'; - @override - String get earlyPreview => - 'EARLY PREVIEW · Login and sign-up are not live yet.'; - @override String get brandEyebrow => 'A LITTLE CHANGE. A BIG NEXT STEP.'; @@ -211,38 +205,17 @@ class AppLocalizationsEn extends AppLocalizations { 'No email? Check your spam folder or request another below.'; @override - String get verificationDemo => - 'DEMO · No real email is sent and no account is verified.'; - - @override - String get verificationDemoLink => 'Open demo confirmation link'; + String get verificationDemoLink => 'Continue to confirmation'; @override String get verificationStep => 'CONFIRM YOUR EMAIL'; - @override - String get demoSentHeading => 'Demo email prepared.'; - - @override - String get demoSentBody => - 'No email was sent. Use the demo confirmation below to preview the next step.'; - - @override - String get demoVerifiedHeading => 'Demo verification\ncomplete.'; - - @override - String get demoVerifiedBody => - 'You’ve previewed email confirmation. No account was verified. Return to login to explore the demo.'; - @override String get verificationRecipient => 'Recipient'; @override String get verificationChangeEmail => 'Change email'; - @override - String get demoResend => 'Prepare demo email again'; - @override String get kycTitle => 'Verification & limits'; @@ -250,10 +223,6 @@ class AppLocalizationsEn extends AppLocalizations { String get kycIntro => 'Your account, at your pace. Verify your identity when you need higher limits.'; - @override - String get kycDemo => - 'DEMO · Use sample images only. Photos stay in memory, are never uploaded, and disappear when you leave or reload. Review decisions are simulated.'; - @override String get kycUnverified => 'Not verified'; @@ -319,7 +288,7 @@ class AppLocalizationsEn extends AppLocalizations { @override String get kycSupportBody => - 'Support is not connected in this preview. In the live app, you will be able to request a review here without submitting documents again.'; + 'Support is currently unavailable. Please try again later.'; @override String get kycBasic => 'Basic'; @@ -330,10 +299,6 @@ class AppLocalizationsEn extends AppLocalizations { @override String get kycLimits => 'Your limits'; - @override - String get kycLimitsDemo => - 'Illustrative limits from the demo service. These are not a live offer.'; - @override String get kycDay => 'Daily volume'; @@ -400,7 +365,7 @@ class AppLocalizationsEn extends AppLocalizations { String get kycSkip => 'Keep basic limits'; @override - String get kycClose => 'Back to account preview'; + String get kycClose => 'Back to account'; @override String get kycReviewHelp => @@ -412,9 +377,6 @@ class AppLocalizationsEn extends AppLocalizations { @override String get kycSubmit => 'Submit for review'; - @override - String get kycSubmitDemo => 'Simulate submission'; - @override String get kycWorking => 'Processing… Please keep this page open.'; @@ -476,7 +438,7 @@ class AppLocalizationsEn extends AppLocalizations { 'Your review status has changed. Refresh it before continuing.'; @override - String get kycDemoControls => 'Demo: simulate a backoffice decision'; + String get kycDemoControls => 'Review scenarios'; @override String get kycDemoApprove => 'Approve'; @@ -566,9 +528,6 @@ class AppLocalizationsEn extends AppLocalizations { @override String get wRefresh => 'Refresh'; - @override - String get wDemo => 'Demo workspace · No real money moves.'; - @override String get wSource => 'From account'; @@ -585,7 +544,7 @@ class AppLocalizationsEn extends AppLocalizations { String get wRecipient => 'Recipient'; @override - String get wRecipientHint => 'Sample recipient — demo only'; + String get wRecipientHint => 'Recipient name or reference'; @override String get wReview => 'Review'; @@ -623,7 +582,7 @@ class AppLocalizationsEn extends AppLocalizations { String get wNewQuote => 'Refresh quote'; @override - String get wConfirm => 'Confirm demo transaction'; + String get wConfirm => 'Confirm transaction'; @override String get wEdit => 'Edit details'; @@ -675,13 +634,6 @@ class AppLocalizationsEn extends AppLocalizations { String get wFailedOutgoing => 'The transaction did not complete. The amount and fee are available in your account again.'; - @override - String get wDemoMethod => 'Demo transfer'; - - @override - String get wDemoMethodHelp => - 'Try the flow with sample data. No bank or payment provider is contacted.'; - @override String get wUnavailable => 'Could not refresh. The displayed information may be out of date. Try again.'; @@ -762,7 +714,7 @@ class AppLocalizationsEn extends AppLocalizations { String get wLanguageHelp => 'Used throughout your account.'; @override - String get wLanguageSaved => 'Saved to your demo account.'; + String get wLanguageSaved => 'Saved to your account.'; @override String get wLanguageFailed => @@ -777,7 +729,7 @@ class AppLocalizationsEn extends AppLocalizations { @override String get wSecurityBody => - 'Live sessions, password changes and two-step verification are not connected in this demo.'; + 'Password and security settings are not available yet.'; @override String get wIdentity => 'Identity verification'; diff --git a/frontend/app/lib/generated/i18n/app_localizations_ru.dart b/frontend/app/lib/generated/i18n/app_localizations_ru.dart index 2f62fe0..817f49c 100644 --- a/frontend/app/lib/generated/i18n/app_localizations_ru.dart +++ b/frontend/app/lib/generated/i18n/app_localizations_ru.dart @@ -70,12 +70,10 @@ class AppLocalizationsRu extends AppLocalizations { String get letsGo => 'Продолжить'; @override - String get loginPreview => - 'Демонстрационный вход выполнен. Реальная сессия не создана. Учётные данные не отправлены и не сохранены.'; + String get loginPreview => 'Вы вошли в аккаунт.'; @override - String get signupPreview => - 'Демонстрационная регистрация выполнена. Реальный аккаунт не создан. Учётные данные не отправлены и не сохранены.'; + String get signupPreview => 'Ваш аккаунт готов.'; @override String get alreadyMember => 'Уже есть аккаунт sxchnge?'; @@ -89,10 +87,6 @@ class AppLocalizationsRu extends AppLocalizations { @override String get createAnAccount => 'Зарегистрироваться'; - @override - String get earlyPreview => - 'ПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ · Вход и регистрация пока недоступны.'; - @override String get brandEyebrow => 'МАЛЕНЬКАЯ ПЕРЕМЕНА. БОЛЬШОЙ ШАГ.'; @@ -212,38 +206,17 @@ class AppLocalizationsRu extends AppLocalizations { 'Нет письма? Проверьте папку «Спам» или запросите новое ниже.'; @override - String get verificationDemo => - 'ДЕМО · Письмо не отправляется, реальный аккаунт не подтверждается.'; - - @override - String get verificationDemoLink => 'Открыть демоссылку подтверждения'; + String get verificationDemoLink => 'Перейти к подтверждению'; @override String get verificationStep => 'ПОДТВЕРДИТЕ ПОЧТУ'; - @override - String get demoSentHeading => 'Демописьмо готово.'; - - @override - String get demoSentBody => - 'Письмо не отправлено. Используйте демоссылку ниже, чтобы посмотреть следующий шаг.'; - - @override - String get demoVerifiedHeading => 'Демоподтверждение\nзавершено.'; - - @override - String get demoVerifiedBody => - 'Вы посмотрели подтверждение почты. Реальный аккаунт не подтверждён. Вернитесь ко входу, чтобы продолжить знакомство с демоверсией.'; - @override String get verificationRecipient => 'Получатель'; @override String get verificationChangeEmail => 'Изменить почту'; - @override - String get demoResend => 'Подготовить демописьмо ещё раз'; - @override String get kycTitle => 'Верификация и лимиты'; @@ -251,10 +224,6 @@ class AppLocalizationsRu extends AppLocalizations { String get kycIntro => 'Ваш аккаунт — ваш темп. Подтвердите личность, когда понадобятся более высокие лимиты.'; - @override - String get kycDemo => - 'ДЕМО · Используйте только тестовые изображения. Фото хранятся в памяти, не отправляются и удаляются при выходе или перезагрузке. Решения проверки имитируются.'; - @override String get kycUnverified => 'Личность не подтверждена'; @@ -319,8 +288,7 @@ class AppLocalizationsRu extends AppLocalizations { String get kycSupport => 'Обратиться в поддержку'; @override - String get kycSupportBody => - 'В демоверсии поддержка не подключена. В рабочем приложении здесь можно будет запросить пересмотр без повторной отправки документов.'; + String get kycSupportBody => 'Поддержка сейчас недоступна. Попробуйте позже.'; @override String get kycBasic => 'Базовый'; @@ -331,10 +299,6 @@ class AppLocalizationsRu extends AppLocalizations { @override String get kycLimits => 'Ваши лимиты'; - @override - String get kycLimitsDemo => - 'Пример лимитов из демосервиса. Это не действующее предложение.'; - @override String get kycDay => 'Объём за день'; @@ -401,7 +365,7 @@ class AppLocalizationsRu extends AppLocalizations { String get kycSkip => 'Оставить базовые лимиты'; @override - String get kycClose => 'К демоаккаунту'; + String get kycClose => 'К аккаунту'; @override String get kycReviewHelp => @@ -413,9 +377,6 @@ class AppLocalizationsRu extends AppLocalizations { @override String get kycSubmit => 'Отправить на проверку'; - @override - String get kycSubmitDemo => 'Имитировать отправку'; - @override String get kycWorking => 'Обработка… Не закрывайте страницу.'; @@ -477,7 +438,7 @@ class AppLocalizationsRu extends AppLocalizations { 'Статус проверки изменился. Обновите его, прежде чем продолжить.'; @override - String get kycDemoControls => 'Демо: имитация решения сотрудника'; + String get kycDemoControls => 'Сценарии проверки'; @override String get kycDemoApprove => 'Одобрить'; @@ -567,9 +528,6 @@ class AppLocalizationsRu extends AppLocalizations { @override String get wRefresh => 'Обновить'; - @override - String get wDemo => 'Демонстрация · Реальные деньги не переводятся.'; - @override String get wSource => 'Со счёта'; @@ -586,7 +544,7 @@ class AppLocalizationsRu extends AppLocalizations { String get wRecipient => 'Получатель'; @override - String get wRecipientHint => 'Тестовый получатель — только демо'; + String get wRecipientHint => 'Имя или реквизиты получателя'; @override String get wReview => 'Проверить'; @@ -624,7 +582,7 @@ class AppLocalizationsRu extends AppLocalizations { String get wNewQuote => 'Обновить расчёт'; @override - String get wConfirm => 'Подтвердить тестовую операцию'; + String get wConfirm => 'Подтвердить операцию'; @override String get wEdit => 'Изменить данные'; @@ -675,13 +633,6 @@ class AppLocalizationsRu extends AppLocalizations { String get wFailedOutgoing => 'Операция не выполнена. Сумма и комиссия снова доступны на вашем счёте.'; - @override - String get wDemoMethod => 'Тестовый перевод'; - - @override - String get wDemoMethodHelp => - 'Попробуйте сценарий с тестовыми данными. Банки и платёжные системы не подключены.'; - @override String get wUnavailable => 'Не удалось обновить данные. Информация может быть устаревшей. Повторите попытку.'; @@ -760,7 +711,7 @@ class AppLocalizationsRu extends AppLocalizations { String get wLanguageHelp => 'Используется во всём аккаунте.'; @override - String get wLanguageSaved => 'Сохранено в тестовом аккаунте.'; + String get wLanguageSaved => 'Сохранено в аккаунте.'; @override String get wLanguageFailed => @@ -775,7 +726,7 @@ class AppLocalizationsRu extends AppLocalizations { @override String get wSecurityBody => - 'В этой демонстрации не подключены рабочие сессии, смена пароля и двухэтапная проверка.'; + 'Настройки пароля и безопасности пока недоступны.'; @override String get wIdentity => 'Подтверждение личности'; diff --git a/frontend/app/lib/kyc/form.dart b/frontend/app/lib/kyc/form.dart index f22a25e..e482f2d 100644 --- a/frontend/app/lib/kyc/form.dart +++ b/frontend/app/lib/kyc/form.dart @@ -77,7 +77,7 @@ class IdentityForm extends StatelessWidget { FilledButton( key: const ValueKey('kyc-submit'), onPressed: p.canSubmit ? p.submit : null, - child: Text(p.isDemo ? l.kycSubmitDemo : l.kycSubmit), + child: Text(l.kycSubmit), ), if (p.step > 0) TextButton(onPressed: p.busy ? null : p.back, child: Text(l.kycBack)), diff --git a/frontend/app/lib/kyc/limits.dart b/frontend/app/lib/kyc/limits.dart index 8dd8122..54551c4 100644 --- a/frontend/app/lib/kyc/limits.dart +++ b/frontend/app/lib/kyc/limits.dart @@ -47,8 +47,6 @@ class LimitsPanel extends StatelessWidget { data.tier == AccountTier.basic ? l.kycBasic : l.kycVerifiedTier, style: t.textTheme.titleLarge, ), - if (data.simulated) - Text(l.kycLimitsDemo, style: t.textTheme.bodySmall), const SizedBox(height: 12), if (data.rows.isEmpty) Text(l.kycLimitsEmpty), for (final row in data.rows) ...[ diff --git a/frontend/app/lib/kyc/page.dart b/frontend/app/lib/kyc/page.dart index ad80c9b..ac8efed 100644 --- a/frontend/app/lib/kyc/page.dart +++ b/frontend/app/lib/kyc/page.dart @@ -149,21 +149,6 @@ class IdentityPageState extends State { ), const SizedBox(height: 12), Text(l.kycIntro, style: t.textTheme.bodyLarge), - const SizedBox(height: 20), - if (p.isDemo) - Container( - padding: const EdgeInsets.all(16), - decoration: BoxDecoration( - color: t.colorScheme.tertiaryContainer, - borderRadius: BorderRadius.circular(16), - ), - child: Text( - l.kycDemo, - style: TextStyle( - color: t.colorScheme.onTertiaryContainer, - ), - ), - ), const SizedBox(height: 24), if (p.busy) ...[ const LinearProgressIndicator(), diff --git a/frontend/app/lib/l10n/en.arb b/frontend/app/lib/l10n/en.arb index 53efba6..0fd2e77 100644 --- a/frontend/app/lib/l10n/en.arb +++ b/frontend/app/lib/l10n/en.arb @@ -20,13 +20,12 @@ "hideConfirmation": "Hide confirmation", "createAccount": "Create account", "letsGo": "Let’s go", - "loginPreview": "Demo login completed. No real session was created. Your credentials have not been sent or saved.", - "signupPreview": "Demo sign-up completed. No real account was created. Your credentials have not been sent or saved.", + "loginPreview": "You’re signed in.", + "signupPreview": "Your account is ready.", "alreadyMember": "Already part of sxchnge?", "newHere": "New around here?", "loginInstead": "Log in instead", "createAnAccount": "Create an account", - "earlyPreview": "EARLY PREVIEW · Login and sign-up are not live yet.", "brandEyebrow": "A LITTLE CHANGE. A BIG NEXT STEP.", "brandHeading": "Good moves.\nStart here.", "brandIntro": "A fresh way forward.\nMake it yours with sxchnge.", @@ -63,19 +62,12 @@ "verificationRetry": "Retry verification", "verificationBack": "Back to login", "verificationHint": "No email? Check your spam folder or request another below.", - "verificationDemo": "DEMO · No real email is sent and no account is verified.", - "verificationDemoLink": "Open demo confirmation link", + "verificationDemoLink": "Continue to confirmation", "verificationStep": "CONFIRM YOUR EMAIL", - "demoSentHeading": "Demo email prepared.", - "demoSentBody": "No email was sent. Use the demo confirmation below to preview the next step.", - "demoVerifiedHeading": "Demo verification\ncomplete.", - "demoVerifiedBody": "You’ve previewed email confirmation. No account was verified. Return to login to explore the demo.", "verificationRecipient": "Recipient", "verificationChangeEmail": "Change email", - "demoResend": "Prepare demo email again", "kycTitle": "Verification & limits", "kycIntro": "Your account, at your pace. Verify your identity when you need higher limits.", - "kycDemo": "DEMO · Use sample images only. Photos stay in memory, are never uploaded, and disappear when you leave or reload. Review decisions are simulated.", "kycUnverified": "Not verified", "kycPending": "In review", "kycApproved": "Identity verified", @@ -94,11 +86,10 @@ "kycResubmit": "Replace photos", "kycRefresh": "Refresh status & limits", "kycSupport": "Contact support", - "kycSupportBody": "Support is not connected in this preview. In the live app, you will be able to request a review here without submitting documents again.", + "kycSupportBody": "Support is currently unavailable. Please try again later.", "kycBasic": "Basic", "kycVerifiedTier": "Verified", "kycLimits": "Your limits", - "kycLimitsDemo": "Illustrative limits from the demo service. These are not a live offer.", "kycDay": "Daily volume", "kycMonth": "Monthly volume", "kycCurrent": "Current cap", @@ -119,11 +110,10 @@ "kycNext": "Continue", "kycBack": "Back", "kycSkip": "Keep basic limits", - "kycClose": "Back to account preview", + "kycClose": "Back to account", "kycReviewHelp": "Check that both photos are readable and show the same passport. A staff member will review them; submission does not immediately raise your limits.", "kycConfirm": "These photos show me and my own valid passport.", "kycSubmit": "Submit for review", - "kycSubmitDemo": "Simulate submission", "kycWorking": "Processing… Please keep this page open.", "kycDiscardTitle": "Discard these photos?", "kycDiscardBody": "Your draft is only in memory. Leaving will remove the selected photos; you can start again later.", @@ -140,7 +130,7 @@ "kycErrorSession": "Your session has expired. Return to login, then check your verification status.", "kycErrorRate": "Too many requests. Wait a moment before trying again.", "kycErrorConflict": "Your review status has changed. Refresh it before continuing.", - "kycDemoControls": "Demo: simulate a backoffice decision", + "kycDemoControls": "Review scenarios", "kycDemoApprove": "Approve", "kycDemoCorrect": "Request clearer passport", "kycDemoSelfie": "Request clearer selfie", @@ -169,13 +159,12 @@ "wEmptyActivity": "Your next move starts here. Your transactions will appear below.", "wEmptyAccounts": "Your accounts are not ready yet. Try refreshing.", "wRefresh": "Refresh", - "wDemo": "Demo workspace · No real money moves.", "wSource": "From account", "wDestination": "To account", "wReceiveAccount": "Receiving account", "wAmount": "Amount", "wRecipient": "Recipient", - "wRecipientHint": "Sample recipient — demo only", + "wRecipientHint": "Recipient name or reference", "wReview": "Review", "wReviewTitle": "One last look.", "wFee": "Fee", @@ -187,7 +176,7 @@ "wQuoteNotice": "These terms are valid for 60 seconds. Confirm them before continuing.", "wExpired": "This quote expired. Refresh it and review the new terms.", "wNewQuote": "Refresh quote", - "wConfirm": "Confirm demo transaction", + "wConfirm": "Confirm transaction", "wEdit": "Edit details", "wClose": "Close", "wWorking": "Working on it…", @@ -202,8 +191,6 @@ "wCompletePayout": "Your payout is complete. The amount and fee have been deducted from your account.", "wFailedTopUp": "The top-up did not complete. No money was added to your account.", "wFailedOutgoing": "The transaction did not complete. The amount and fee are available in your account again.", - "wDemoMethod": "Demo transfer", - "wDemoMethodHelp": "Try the flow with sample data. No bank or payment provider is contacted.", "wUnavailable": "Could not refresh. The displayed information may be out of date. Try again.", "wInvalidAmount": "Enter an amount greater than zero, using the currency’s decimal precision.", "wInsufficient": "Not enough available money for this amount and fee. Top up or enter a smaller amount.", @@ -227,11 +214,11 @@ "wPreferences": "Make it yours.", "wLanguage": "Account language", "wLanguageHelp": "Used throughout your account.", - "wLanguageSaved": "Saved to your demo account.", + "wLanguageSaved": "Saved to your account.", "wLanguageFailed": "Changed for this session, but not saved to your account. Retry below.", "wProfileError": "Account preferences could not be loaded. Try again.", "wSecurity": "Security", - "wSecurityBody": "Live sessions, password changes and two-step verification are not connected in this demo.", + "wSecurityBody": "Password and security settings are not available yet.", "wIdentity": "Identity verification", "wIdentityHelp": "Optional verification for higher limits.", "wBackLogin": "Back to login", diff --git a/frontend/app/lib/l10n/ru.arb b/frontend/app/lib/l10n/ru.arb index d1a19e3..448a3a2 100644 --- a/frontend/app/lib/l10n/ru.arb +++ b/frontend/app/lib/l10n/ru.arb @@ -20,13 +20,12 @@ "hideConfirmation": "Скрыть повтор пароля", "createAccount": "Создать аккаунт", "letsGo": "Продолжить", - "loginPreview": "Демонстрационный вход выполнен. Реальная сессия не создана. Учётные данные не отправлены и не сохранены.", - "signupPreview": "Демонстрационная регистрация выполнена. Реальный аккаунт не создан. Учётные данные не отправлены и не сохранены.", + "loginPreview": "Вы вошли в аккаунт.", + "signupPreview": "Ваш аккаунт готов.", "alreadyMember": "Уже есть аккаунт sxchnge?", "newHere": "Впервые здесь?", "loginInstead": "Войти в аккаунт", "createAnAccount": "Зарегистрироваться", - "earlyPreview": "ПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ · Вход и регистрация пока недоступны.", "brandEyebrow": "МАЛЕНЬКАЯ ПЕРЕМЕНА. БОЛЬШОЙ ШАГ.", "brandHeading": "Всё начинается\nс перемен.", "brandIntro": "Новый путь вперёд.\nОткройте его вместе со sxchnge.", @@ -63,19 +62,12 @@ "verificationRetry": "Повторить подтверждение", "verificationBack": "Вернуться ко входу", "verificationHint": "Нет письма? Проверьте папку «Спам» или запросите новое ниже.", - "verificationDemo": "ДЕМО · Письмо не отправляется, реальный аккаунт не подтверждается.", - "verificationDemoLink": "Открыть демоссылку подтверждения", + "verificationDemoLink": "Перейти к подтверждению", "verificationStep": "ПОДТВЕРДИТЕ ПОЧТУ", - "demoSentHeading": "Демописьмо готово.", - "demoSentBody": "Письмо не отправлено. Используйте демоссылку ниже, чтобы посмотреть следующий шаг.", - "demoVerifiedHeading": "Демоподтверждение\nзавершено.", - "demoVerifiedBody": "Вы посмотрели подтверждение почты. Реальный аккаунт не подтверждён. Вернитесь ко входу, чтобы продолжить знакомство с демоверсией.", "verificationRecipient": "Получатель", "verificationChangeEmail": "Изменить почту", - "demoResend": "Подготовить демописьмо ещё раз", "kycTitle": "Верификация и лимиты", "kycIntro": "Ваш аккаунт — ваш темп. Подтвердите личность, когда понадобятся более высокие лимиты.", - "kycDemo": "ДЕМО · Используйте только тестовые изображения. Фото хранятся в памяти, не отправляются и удаляются при выходе или перезагрузке. Решения проверки имитируются.", "kycUnverified": "Личность не подтверждена", "kycPending": "На проверке", "kycApproved": "Личность подтверждена", @@ -94,11 +86,10 @@ "kycResubmit": "Заменить фото", "kycRefresh": "Обновить статус и лимиты", "kycSupport": "Обратиться в поддержку", - "kycSupportBody": "В демоверсии поддержка не подключена. В рабочем приложении здесь можно будет запросить пересмотр без повторной отправки документов.", + "kycSupportBody": "Поддержка сейчас недоступна. Попробуйте позже.", "kycBasic": "Базовый", "kycVerifiedTier": "Подтверждённый", "kycLimits": "Ваши лимиты", - "kycLimitsDemo": "Пример лимитов из демосервиса. Это не действующее предложение.", "kycDay": "Объём за день", "kycMonth": "Объём за месяц", "kycCurrent": "Текущий лимит", @@ -119,11 +110,10 @@ "kycNext": "Продолжить", "kycBack": "Назад", "kycSkip": "Оставить базовые лимиты", - "kycClose": "К демоаккаунту", + "kycClose": "К аккаунту", "kycReviewHelp": "Убедитесь, что оба фото читаемы и на них один паспорт. Их проверит сотрудник. Отправка не повышает лимиты сразу.", "kycConfirm": "На фото я и мой действующий паспорт.", "kycSubmit": "Отправить на проверку", - "kycSubmitDemo": "Имитировать отправку", "kycWorking": "Обработка… Не закрывайте страницу.", "kycDiscardTitle": "Удалить выбранные фото?", "kycDiscardBody": "Черновик хранится только в памяти. При выходе выбранные фото будут удалены. Позже можно начать заново.", @@ -140,7 +130,7 @@ "kycErrorSession": "Сессия истекла. Войдите снова и проверьте статус верификации.", "kycErrorRate": "Слишком много запросов. Немного подождите и повторите попытку.", "kycErrorConflict": "Статус проверки изменился. Обновите его, прежде чем продолжить.", - "kycDemoControls": "Демо: имитация решения сотрудника", + "kycDemoControls": "Сценарии проверки", "kycDemoApprove": "Одобрить", "kycDemoCorrect": "Запросить чёткое фото паспорта", "kycDemoSelfie": "Запросить чёткое селфи", @@ -169,13 +159,12 @@ "wEmptyActivity": "Ваш следующий шаг начинается здесь. Здесь появятся ваши операции.", "wEmptyAccounts": "Ваши счета ещё не готовы. Попробуйте обновить страницу.", "wRefresh": "Обновить", - "wDemo": "Демонстрация · Реальные деньги не переводятся.", "wSource": "Со счёта", "wDestination": "На счёт", "wReceiveAccount": "Счёт для зачисления", "wAmount": "Сумма", "wRecipient": "Получатель", - "wRecipientHint": "Тестовый получатель — только демо", + "wRecipientHint": "Имя или реквизиты получателя", "wReview": "Проверить", "wReviewTitle": "Проверьте детали.", "wFee": "Комиссия", @@ -187,7 +176,7 @@ "wQuoteNotice": "Эти условия действуют 60 секунд. Подтвердите их, прежде чем продолжить.", "wExpired": "Срок действия расчёта истёк. Обновите его и проверьте новые условия.", "wNewQuote": "Обновить расчёт", - "wConfirm": "Подтвердить тестовую операцию", + "wConfirm": "Подтвердить операцию", "wEdit": "Изменить данные", "wClose": "Закрыть", "wWorking": "Обрабатываем…", @@ -202,8 +191,6 @@ "wCompletePayout": "Вывод завершён. Сумма и комиссия списаны с вашего счёта.", "wFailedTopUp": "Пополнение не выполнено. На счёт ничего не зачислено.", "wFailedOutgoing": "Операция не выполнена. Сумма и комиссия снова доступны на вашем счёте.", - "wDemoMethod": "Тестовый перевод", - "wDemoMethodHelp": "Попробуйте сценарий с тестовыми данными. Банки и платёжные системы не подключены.", "wUnavailable": "Не удалось обновить данные. Информация может быть устаревшей. Повторите попытку.", "wInvalidAmount": "Введите сумму больше нуля с допустимым для валюты числом знаков после запятой.", "wInsufficient": "Для этой суммы и комиссии недостаточно доступных средств. Пополните счёт или уменьшите сумму.", @@ -227,11 +214,11 @@ "wPreferences": "Настройте под себя.", "wLanguage": "Язык аккаунта", "wLanguageHelp": "Используется во всём аккаунте.", - "wLanguageSaved": "Сохранено в тестовом аккаунте.", + "wLanguageSaved": "Сохранено в аккаунте.", "wLanguageFailed": "Изменено для текущей сессии, но не сохранено в аккаунте. Повторите попытку ниже.", "wProfileError": "Не удалось загрузить настройки аккаунта. Повторите попытку.", "wSecurity": "Безопасность", - "wSecurityBody": "В этой демонстрации не подключены рабочие сессии, смена пароля и двухэтапная проверка.", + "wSecurityBody": "Настройки пароля и безопасности пока недоступны.", "wIdentity": "Подтверждение личности", "wIdentityHelp": "Необязательная проверка для повышения лимитов.", "wBackLogin": "Вернуться ко входу", diff --git a/frontend/app/lib/verification/page.dart b/frontend/app/lib/verification/page.dart index 4663552..d5eb2e2 100644 --- a/frontend/app/lib/verification/page.dart +++ b/frontend/app/lib/verification/page.dart @@ -127,11 +127,10 @@ class _VerificationPageState extends State { !_lastWasSend && widget.token != null; final title = switch (status) { - VerificationStatus.sent => demo ? l.demoSentHeading : l.checkInbox, + VerificationStatus.sent => l.checkInbox, VerificationStatus.sending => l.verificationSending, VerificationStatus.checking => l.verificationChecking, - VerificationStatus.verified => - demo ? l.demoVerifiedHeading : l.verificationVerified, + VerificationStatus.verified => l.verificationVerified, VerificationStatus.expired => l.verificationExpired, VerificationStatus.invalid => l.verificationInvalid, VerificationStatus.error => l.verificationInternal, @@ -141,9 +140,8 @@ class _VerificationPageState extends State { : l.verificationRequest, }; final body = switch (status) { - VerificationStatus.sent => demo ? l.demoSentBody : l.verificationSent, - VerificationStatus.verified => - demo ? l.demoVerifiedBody : l.verificationVerifiedBody, + VerificationStatus.sent => l.verificationSent, + VerificationStatus.verified => l.verificationVerifiedBody, VerificationStatus.expired => l.verificationExpiredBody, VerificationStatus.invalid => l.verificationInvalidBody, VerificationStatus.error => l.verificationInternalBody, @@ -200,13 +198,6 @@ class _VerificationPageState extends State { color: colors.primary, ), ), - if (demo) ...[ - const SizedBox(height: 12), - Text( - l.verificationDemo, - style: theme.textTheme.bodyMedium, - ), - ], const SizedBox(height: 12), Semantics( liveRegion: true, @@ -258,7 +249,7 @@ class _VerificationPageState extends State { key: const ValueKey('verification-resend'), onPressed: _send, child: Text( - demo ? l.demoResend : l.verificationResend, + l.verificationResend, textAlign: TextAlign.center, ), ), diff --git a/frontend/app/lib/workspace/shell.dart b/frontend/app/lib/workspace/shell.dart index 9c9292b..940e64f 100644 --- a/frontend/app/lib/workspace/shell.dart +++ b/frontend/app/lib/workspace/shell.dart @@ -63,18 +63,14 @@ class _WorkspaceShellState extends State { final wide = MediaQuery.sizeOf(context).width >= 900; final content = Column( children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 12), - child: Column( - crossAxisAlignment: wide - ? CrossAxisAlignment.end - : CrossAxisAlignment.start, - children: [ - if (!wide) ...[const BrandWordmark(), const SizedBox(height: 8)], - Text(l.wDemo, style: t.textTheme.bodySmall), - ], + if (!wide) + const Padding( + padding: EdgeInsets.symmetric(horizontal: 24, vertical: 12), + child: Align( + alignment: Alignment.centerLeft, + child: BrandWordmark(), + ), ), - ), Expanded(child: widget.child), ], ); diff --git a/frontend/app/lib/workspace/transfer.dart b/frontend/app/lib/workspace/transfer.dart index b4fd263..2268b48 100644 --- a/frontend/app/lib/workspace/transfer.dart +++ b/frontend/app/lib/workspace/transfer.dart @@ -138,8 +138,6 @@ class TransferPageState extends State { ], ), const SizedBox(height: 20), - Text(l.wDemoMethodHelp, style: t.textTheme.bodySmall), - const SizedBox(height: 24), Focus( key: _content, focusNode: _focus, diff --git a/frontend/app/test/routing_test.dart b/frontend/app/test/routing_test.dart index 5d8ed39..6d8d645 100644 --- a/frontend/app/test/routing_test.dart +++ b/frontend/app/test/routing_test.dart @@ -129,7 +129,7 @@ void main() { same(router), ); expect(find.byKey(const ValueKey('verification-verified')), findsOneWidget); - expect(find.text('Демоподтверждение\nзавершено.'), findsOneWidget); + expect(find.text('Ваша почта\nподтверждена.'), findsOneWidget); }); testWidgets( diff --git a/frontend/app/test/ux_analytics_test.dart b/frontend/app/test/ux_analytics_test.dart index 0f42221..3e9daf9 100644 --- a/frontend/app/test/ux_analytics_test.dart +++ b/frontend/app/test/ux_analytics_test.dart @@ -111,7 +111,7 @@ void main() { ); testWidgets( - 'signup to demo verification is correlated and never claims a business success', + 'signup verification keeps simulated analytics with ordinary product copy', (tester) async { final sink = DummyAnalyticsService(); await open(tester, '/', sink); @@ -130,10 +130,10 @@ void main() { 'example-password', ); await tap(tester, find.byKey(const ValueKey('submit'))); - expect(find.text('Demo email prepared.'), findsOneWidget); - expect(find.textContaining('We’ve sent you'), findsNothing); + expect(find.text('Check your inbox.'), findsOneWidget); + expect(find.textContaining('We’ve sent you'), findsOneWidget); await tap(tester, find.byKey(const ValueKey('demo-confirmation'))); - expect(find.text('Demo verification\ncomplete.'), findsOneWidget); + expect(find.text('Your email\nis verified.'), findsOneWidget); expect(sink.events.map((e) => e.journeyId).toSet().length, 1); expect(sink.events.where((e) => e.terminal).length, 1); expect( diff --git a/frontend/app/test/verification_test.dart b/frontend/app/test/verification_test.dart index 5bb15a8..2e69817 100644 --- a/frontend/app/test/verification_test.dart +++ b/frontend/app/test/verification_test.dart @@ -57,7 +57,7 @@ void main() { find.byKey(ValueKey('verification-${scenario.value}')), findsOneWidget, ); - expect(find.textContaining('DEMO'), findsOneWidget); + expect(find.textContaining('DEMO'), findsNothing); expect(tester.takeException(), isNull); }, );