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иdarkThemeGoogleFonts.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.paused → pinNotifier.saveLastActiveTime() записывает timestamp
2. При AppLifecycleState.resumed → shouldLock() сравнивает 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.