menu: состав пунктов точно по дизайну (+Уведомления/Настройки)

По дизайну выдвижного меню: Файлы/Календарь/Контакты/Карточки/Заметки +
Bitrix/1C/Личный кабинет + Уведомления/Настройки. Убраны Почта/Конференции/
Задачи/Поддержка (остаются в нижней панели).
- F7AppMenuItem: опц. localIcon (ImageVector); нативные пункты рисуются в
  круглом бейдже с зелёной обводкой (стиль glass) вместо серверной SVG;
- Уведомления → NotificationsSheet, Настройки → настройки активного таба,
  обработка по label в AppScaffold.onItemClick.
This commit is contained in:
b-dev-mobile
2026-07-08 13:18:45 +00:00
parent fda34a5b69
commit a30af98a8d
3 changed files with 85 additions and 25 deletions
@@ -25,8 +25,10 @@ import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.foundation.lazy.grid.itemsIndexed
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@@ -40,6 +42,7 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.shadow
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.SolidColor
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight
@@ -63,6 +66,9 @@ data class F7AppMenuItem(
val iconUrl: String,
val selected: Boolean,
val externalUrl: String? = null,
// Локальная иконка вместо серверной (для нативных пунктов — Уведомления/Настройки),
// рисуется в круглом бейдже с зелёной обводкой под стиль glass-иконок.
val localIcon: ImageVector? = null,
)
@Composable
@@ -245,12 +251,32 @@ private fun F7AppMenuGridItem(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(8.dp),
) {
AsyncImage(
model = item.iconUrl,
contentDescription = item.label,
modifier = Modifier.size(MenuIconSize),
contentScale = ContentScale.Fit,
)
val localIcon = item.localIcon
if (localIcon != null) {
// Нативный пункт: иконка в круглом бейдже с зелёной обводкой (стиль glass)
Box(
modifier = Modifier
.size(MenuIconSize)
.clip(CircleShape)
.background(Color.White)
.border(1.5.dp, F7Colors.Green30, CircleShape),
contentAlignment = Alignment.Center,
) {
Icon(
localIcon,
contentDescription = item.label,
tint = F7Colors.Primary,
modifier = Modifier.size(MenuIconSize * 0.46f),
)
}
} else {
AsyncImage(
model = item.iconUrl,
contentDescription = item.label,
modifier = Modifier.size(MenuIconSize),
contentScale = ContentScale.Fit,
)
}
Text(
text = item.label,
style = MaterialTheme.typography.labelLarge.copy(