design(login): фон, локальный логотип, QR-кнопка по живой теме

_page-login.css: фон страницы #E5EFE8 (был белый); big-forbion.svg
забандлен в assets/login/ — логотип виден офлайн и до ввода адреса
сервера (грузился с сервера); кнопка QR — «ссылка-кнопка» 40dp
с фоном #F0F1F4 r8 и чёрным текстом 14 (была текстовая). Карточка
440/r8/24, заголовок 18/600, поля — уже совпадали.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
b-dev-mobile
2026-07-10 03:20:42 +00:00
parent 3da61da45d
commit 753b574e1a
2 changed files with 80 additions and 9 deletions
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 57 KiB

@@ -3,6 +3,8 @@ package ru.forbion.f7cloud.mobile.ui
import android.app.Activity import android.app.Activity
import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
@@ -31,9 +33,11 @@ import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.focus.focusProperties import androidx.compose.ui.focus.focusProperties
import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalFocusManager
@@ -148,13 +152,15 @@ internal fun LoginScreen(onLogin: (AuthSession) -> Unit) {
} }
} }
val logoUrl = remember(serverUrl) { // Логотип — локальный (assets/login/big-forbion.svg из живой темы): виден офлайн и до
"${normalizeServerUrl(serverUrl).trimEnd('/')}/themes/forbion/images/login/big-forbion.svg" // ввода адреса сервера.
} val logoUrl = "file:///android_asset/login/big-forbion.svg"
Box( Box(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
// Живая тема логина: фон страницы --backgroud-color-main-darkgray
.background(Color(0xFFE5EFE8))
.f7SafeTopInsets() .f7SafeTopInsets()
.verticalScroll(rememberScrollState()) .verticalScroll(rememberScrollState())
.padding(horizontal = 16.dp, vertical = 24.dp), .padding(horizontal = 16.dp, vertical = 24.dp),
@@ -269,12 +275,23 @@ internal fun LoginScreen(onLogin: (AuthSession) -> Unit) {
enabled = !loading && serverUrl.isNotBlank() && username.isNotBlank() && password.isNotBlank(), enabled = !loading && serverUrl.isNotBlank() && username.isNotBlank() && password.isNotBlank(),
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
) )
F7TextButton( // Живая тема: вторичная кнопка-ссылка 40dp, фон #F0F1F4, r8, текст 14 чёрный
text = "Сканировать QR для входа", Box(
onClick = { launchQrScan() }, modifier = Modifier
enabled = !loading, .fillMaxWidth()
modifier = Modifier.fillMaxWidth(), .height(40.dp)
) .clip(RoundedCornerShape(8.dp))
.background(Color(0xFFF0F1F4))
.clickable(enabled = !loading, onClick = { launchQrScan() }),
contentAlignment = Alignment.Center,
) {
Text(
"Сканировать QR для входа",
fontSize = 14.sp,
lineHeight = 20.sp,
color = F7Colors.TextPrimary,
)
}
if (loading) { if (loading) {
CircularProgressIndicator(color = F7Colors.Primary) CircularProgressIndicator(color = F7Colors.Primary)
} }