.cursor/skills/jetpack-compose-safe-areas/SKILL.md
Корректная обработка безопасных зон в Jetpack Compose приложениях для Android. Используй при работе с TopAppBar, Scaffold и безопасными зонами экранов в Jetpack-WorkoutApp.
npx skillsauth add easydev991/Jetpack-WorkoutApp jetpack-compose-safe-areasInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
В Jetpack Compose компонент TopAppBar автоматически обрабатывает безопасные зоны (status bar insets) и не требует дополнительной настройки. Это означает, что при правильной реализации заголовок экрана не будет перекрываться камерой, динамиком или другими системными элементами на устройствах с вырезом экрана.
Ключевое правило: НИКОГДА не используй windowInsets = WindowInsets(top = 0) в TopAppBar. Это отключает автоматическую обработку безопасных зон и приводит к перекрытию контента.
В MainActivity используется enableEdgeToEdge(), который заставляет приложение занимать весь экран, включая области под системными барами. Это требует специальной настройки insets на уровне Scaffold.
В корневом экране приложения (RootScreen) используется Scaffold с BottomNavigationBar. Важно отключить автоматические отступы для контента через contentWindowInsets = WindowInsets(0, 0, 0, 0), чтобы контент не получал лишних отступов. Параметр paddingValues используется только для учёта BottomNavigationBar.
Правила:
contentWindowInsets = WindowInsets(0, 0, 0, 0)paddingValues применяется только к NavHost для учёта BottomNavigationBarКогда экран имеет TopAppBar, безопасная зона обрабатывается автоматически. TopAppBar сам определяет высоту статус-бара и добавляет необходимые отступы.
Правила:
windowInsets в TopAppBarpaddingValues через модификатор компонента, а не через contentPaddingfillMaxWidth() вместо fillMaxSize() для правильной работы безопасных зонpaddingValues к контенту, чтобы контент не перекрывался TopAppBar или BottomBarЕсли экран не имеет TopAppBar, необходимо вручную добавить безопасную зону сверху, чтобы контент не заезжал под статус-бар. Для этого используется WindowInsets.systemBars.top.
Правила:
WindowInsets.systemBars.top как отдельный paddingpaddingValues только для BottomNavigationBar (если он есть)paddingValuesПримечание: В текущей реализации проекта все экраны используют TopAppBar, поэтому этот сценарий пока не применяется.
Для работы с безопасными зонами необходимы следующие импорты:
androidx.compose.foundation.layout.WindowInsets - для работы с системными вставкамиandroidx.compose.foundation.layout.padding - для применения отступовandroidx.compose.foundation.layout.systemBars - для доступа к статус-бару и навигационной панелиandroidx.compose.ui.res.dimensionResource - для получения размеров из ресурсовПроблема: При использовании fillMaxSize() вместо fillMaxWidth() для Column при повороте экрана контент наезжает на камеру или динамик.
Решение: Используй fillMaxWidth() вместо fillMaxSize() для Column с вертикальной прокруткой.
Проблема: При использовании calculateTopPadding() в contentPadding LazyColumn контент заезжает на камеру при повороте экрана.
Решение: Применяй весь paddingValues через модификатор LazyColumn, а contentPadding используй только для горизонтальных отступов и небольшого визуального отступа сверху.
При реализации безопасных зон проверяй следующие критерии:
windowInsets = WindowInsets(top = 0)contentWindowInsets = WindowInsets(0, 0, 0, 0)Modifier.padding(paddingValues) для LazyColumnfillMaxWidth() и Modifier.padding(paddingValues)WindowInsets.systemBars.top вручнуюДля полной проверки корректности обработки безопасных зон:
Более подробные примеры кода см. в файле references/EXAMPLES.md.
Jetpack Compose documentation: https://developer.android.com/jetpack/compose/layouts/insets
testing
Пиши тесты в андроид-проекте правильно. Используй этот навык при написании любых типов тестов (unit, integration, UI), тестировании бизнес-логики, сетевых функций и компонентов UI.
tools
Реализуй pull-to-refresh в Jetpack Compose с использованием Material 3 PullToRefreshBox. Используй этот навык при добавлении возможности обновления данных на экранах со списками или карточками.
tools
Правильно работай с локализацией в Android-проекте. Используй этот навык при добавлении новых строковых ресурсов, работе с plurals, форматировании дат и текстов.
tools
Блокировка UI контента экрана во время загрузки данных или выполнения асинхронных операций с отображением индикатора загрузки. Используй этот навык при разработке экранов с сетевыми запросами, операциями CRUD и других асинхронных действий.