Перейти к содержанию

03 shared ui

onewallet_shared_ui — общие виджеты, AppTheme и AutoLockService для всех приложений.

Экспортируемые компоненты

Виджет / Класс Назначение
AppTheme Цветовые токены, типографика, lightTheme/darkTheme
AppSpacing Константы отступов
OWWelcomeScreen Экран приветствия (общий для всех приложений)
OWAccountBanner Баннер с балансом/именем аккаунта
OWAuthHeader Шапка auth-экранов (логотип + заголовок)
OWErrorBanner Красный баннер с текстом ошибки
OWIconCircle Круглая иконка с фоном
OWPasswordField Поле ввода пароля с toggle visibility
OWPinInput 6-значный PIN-ввод (NatBank C-2)
OWPrimaryButton Основная CTA-кнопка (full-width, 54dp)
OWStepProgress Индикатор шага в multi-step flow
OWBiometricButton Кнопка входа по биометрике (fingerprint/face)
OWStatusBlockWidget Блок отображения статуса (success/error/pending)
OWSecureOverlay Overlay-защита от скриншотов OS при переводе в фон
OWAppVersionText Текст с версией приложения
OWMiniappTile Тайл мини-приложения в каталоге
OWSuccessToast Toast-уведомление об успехе
OWWaitingPulse Анимация ожидания (пульсирующий индикатор)
OWInvoiceCard Карточка инвойса (сумма, получатель, статус)
validators Валидаторы форм (email, phone, password, PIN)
pinProvider StateNotifierProvider<PinNotifier, PinState> — shared PIN state
localeProvider StateNotifierProvider — язык приложения
AutoLockService Сервис авто-блокировки по таймеру (5 мин)

AppTheme цвета

Токен HEX Назначение
primary #FF5B00 Основной бренд-цвет Tangerine
primaryDark #CC4900 Тёмный вариант primary
primaryLight #FAFBFF Светлый фон primary
truePurple #6C00F7 Акцент, info-цвет
nightSky #110138 Тёмный акцент, OWSecureOverlay фон
sky400 #E5E7FE Support palette — насыщенный
sky300 #F2F3FF Support palette — средний
sky200 #F6F7FF Support palette — светлый
sky100 #FAFBFF Support palette — минимальный
success #00C669 Успех (=secondary)
successDark #02542D Тёмный вариант success
successBackground #EBFFEE Фон success-блоков
warning #BF6A02 Предупреждение
warningBackground #FFF1C2 Фон warning-блоков
error #EC221F Ошибка
errorBackground #FEE9E7 Фон error-блоков
disabled #D9D9D9 Неактивный элемент
disabledText #8E8E93 Текст неактивного элемента
background #FFFFFF Основной фон (светлая тема)
backgroundDark #110138 Основной фон (тёмная тема)
surfaceDark #1F2937 Surface тёмной темы
textPrimary #303030 Основной текст
textSecondary #767676 Вторичный текст
textTertiary #B3B3B3 Третичный текст
textLight #F5F5F5 Текст на тёмном фоне

Border-radius константы: radiusButton=20, radiusInput=12, radiusCard=16, radiusNavIcon=12.

Типографика

Шрифт: Inter (локальные файлы в пакете, НЕ Google Fonts runtime).

  • fontFamily: 'packages/onewallet_shared_ui/Inter' — задан в AppTheme.lightTheme и darkTheme
  • GoogleFonts.config.allowRuntimeFetching = false — сетевые загрузки шрифтов запрещены
  • Поддерживаемые веса: Regular (400), Medium (500), SemiBold (600), Bold (700)
Стиль Размер Вес Назначение
textNumericEmphasis 36sp w500 Баланс, крупные суммы
textBodyEmphasis 16sp w500 Акцентированный body
textBodyDefault 14sp w400 Основной текст
textBodyDefaultEmphasis 14sp w500 Акцентированный основной
textBodySmall 12sp w400 Мелкий вспомогательный
textBodySuperSmall 10sp w400 Подписи, метаданные
textButtonSmall 14sp w700 Текст кнопок (small)
displayLarge (TextTheme) 32sp w700 Крупные заголовки
displaySmall (TextTheme) 24sp w500 Средние заголовки
titleLarge (TextTheme) 20sp w500 Заголовок экрана

AutoLockService

Реализован как WidgetsBindingObserver в auto_lock_service.dart. Порог блокировки: 300 секунд (5 минут) — требование NatBank.

Механизм: 1. При AppLifecycleState.pausedpinNotifier.saveLastActiveTime() записывает timestamp 2. При AppLifecycleState.resumedshouldLock() сравнивает DateTime.now().difference(lastActive).inSeconds >= 300 3. Если порог превышен → pinNotifier.lockApp() → GoRouter redirect на /pin-unlock 4. Опциональный onResume callback — каждое приложение передаёт свою логику (перезагрузка статуса пользователя, проверка JWT)

Инициализируется в app.dart каждого приложения через autoLockServiceProvider.

OWSecureOverlay

Защита экрана при переводе приложения в фон (требование NatBank C-3).

Реализация: - WidgetsBindingObserver внутри StatefulWidget - При AppLifecycleState.paused или inactive → показывает Positioned.fill с ColoredBox(color: AppTheme.nightSky) (#110138) поверх всего контента - При AppLifecycleState.resumed → overlay скрывается

Используется как обёртка корневого виджета в app.dart всех трёх приложений. Предотвращает попадание содержимого экрана в switcher OS и снимки экрана операционной системы.

Правило использования

  • Цвета — только через AppTheme.* константы. Никаких хардкодных HEX-значений в коде приложений.
  • MerchantTheme переопределяет primary через copyWith от AppTheme — не дублирует цвета.
  • Виджеты из onewallet_shared_ui не дублируются в отдельных приложениях.
  • При добавлении нового UI-компонента, используемого в 2+ приложениях, он создаётся в onewallet_shared_ui и экспортируется через onewallet_shared_ui.dart.