Последние посты

Compose Broadcast
17 сент., 11:07
В Compose 1.13 появится полноценный Blur для контента через Modifier#Compose
Compose Broadcast
14 сент., 12:41
⚙️ Вышел Compose HotSwan 2.0.0 - Hot Reload для Android, iOS и Desktop. В новой версии прокачали движок определения изменений.Полезно как для людей, так и для разработки с AI агентами, так как не приходится прокликивать приложение до экрана при каждых изменениях, что экономит токены.💰Решение платное - 5$/месяц, есть триал на 2 недели.💬 Если кто уже пробовал - делитесь опытом в комментариях#Compose #CMP #Android #Desktop #iOS
Compose Broadcast
14 сент., 05:48
⚙️ Compose Web можно выложить как офлайн-приложениеВ Issue CMP-10781 в официальном баг-трекере CMP Константин Цховребов расписал рецепт офлайн-приложения Compose Web: после Gradle-задачи wasmJsBrowserDistribution отдельная задача (исходный код в issue) копирует статику, вычисляет SHA-256 по путям и содержимому и генерирует service-worker.js.Что получается на практике: 👉 index.html, JS, Wasm и Compose Resources кладутся в Cache Storage 👉 SW перехватывает только эти файлы 👉 запросы к API идут в сеть как обычно 👉 новая сборка меняет версию кэша и удаляет старыйОграничения: 👉 cache.addAll() падает, если не скачался хотя бы один файл из списка 👉 source maps тоже попадают в кэш, если не отфильтровать 👉 новая версия подхватится только при следующем запускеЭто не официальная задача в плагине CMP и не «PWA из коробки», а лишь рецепт, который вполне3,360Открыть в Telegram
Compose Broadcast
9 сент., 17:54
переслано из @auroradevelopers
🚀 Вышла новая альфа-версия адаптации CMP для ОС Аврора (v0.0.5)Прошёл квартал — а значит, вышла новая альфа-версия адаптации CMP для ОС Аврора. Рассказываем, что изменилось.🛠 Инструментарий разработчика- Плагин для IntelliJ IDEA для быстрого старта - Автопринятие разрешений при запуске приложений - Возможность указать дополнительные файлы при сборке RPM✨ Расширение возможностей фреймворка- Создания обложек приложения используя Compose - Открытие URI с системным диалогом выбора приложения - Поддержка ориентаций приложения - Новая библиотека адаптивных иконок ОС Аврора - Полная поддержка экранной клавиатуры — предиктивный ввод и автокоррекция🚗 Аврора автомобильная
4,059Открыть в Telegram
Compose Broadcast
7 сент., 14:51изменён
🐱 compose-recomposition-highlighter - отслеживание статистики рекомпозиций в AndroidСледит за теми Composable где проведете инициализацию @Composable fun UserProfileCard(user: User) { Card( modifier = Modifier .fillMaxWidth() // Attach highlighter .recompositionHighlighter("UserProfileCard") ) { Text(text = user.name) } }#Compose
3,700Открыть в Telegram
Compose Broadcast
7 сент., 07:57
⚙️ Анимация смены чисел на Compose. Как сделали тут#Compose #Анимация
Compose Broadcast
7 сент., 05:47
⚙️ Compose Multiplatform 1.12.0 вышел, а tvOS в списке поддерживаемых платформ как не было, так и нет: Android, iOS, macOS, Windows, Linux, веб. Дыру закрывает compose-tvos, и интересен он не столько самим tvOS, сколько приёмом.Плагин через ComponentMetadataRule подвешивает available-at вариант с tvOS-klib к официальному org.jetbrains.compose.. Дальше решает штатный variant resolution Gradle: tvOS-таргет забирает форк, а iOS/Android/Desktop продолжают резолвить артефакт JetBrains.Отдельно перехватывается маркер плагина через pluginManagement.resolutionStrategy.eachPlugin, чтобы работала упаковка Compose Resources.// settings.gradle.kts plugins { id("dev.sajidali.compose-tvos") version "1.3.0" }Всё, dependencies {} не меняешь. Приём годится далеко за пределами tvOS: так же можно подсунуть свою пересборку любой чужой библиотеки, у которой не3,110Открыть в Telegram
Compose Broadcast
3 сент., 18:10
⚙️ Compose Remote добрался до первой Альфы. Это реализация BDUI (верстка приходит с сервера) на основе Compose от Google!💬 Нужно ли оно вам?#Compose #Android #Remote #BDUI
4,600Открыть в Telegram
Compose Broadcast
1 сент., 08:36изменён
⚙️ Новый выбор текста Compose 1.12 — SelectionContainer и SelectionState APIВ Compose 1.12 у SelectionContainer появился hoisted-state: SelectionState. Раньше весь механизм выделения был спрятан внутри текстовых полей. Теперь же стало возможно: 👉 читать выбранный текст реактивно 👉 выделять программно: всё / диапазон / по словам 👉 сбрасывать выделение 👉 искать цитату по всему контейнеру, даже если она размазана по нескольким Text// Один SelectionState нельзя шарить между несколькими SelectionContainer val state = rememberSelectionState()SelectionContainer(state = state) { Text("Text to be selected...") }val selectedTexts : List<AnnotatedString> = state.selectedTexts Text("Выбрано символов: ${selectedTexts.sumOf { it.text.length }}")#Compose4,530Открыть в Telegram
Compose Broadcast
27 авг., 08:08
⚙️ Compose Multiplatform 1.12.0: AI агент наконец видит, что написалВышел стабильный CMP 1.12.0.Главное в релизе - MCP в Compose Desktop Hot Reload 1.2.0. Раньше агент правил @Composable вслепую: не знал, прошёл ли reload, что на экране, не упало ли. Теперь есть сервер с нормальными тулами. Поднимается таской, в .mcp.json достаточно hotMcpServer:{ "mcpServers": { "compose-hot-reload": { "command": "./gradlew", "args": ["--no-daemon", "--quiet", "--console=plain", "hotMcpServer"] } } }Много фиксов и улучшений для Desktop, Web, iOS. Еще отдельно расскажу постами в @compose_broadcast🔗 Полный список изменений#Compose #CMP #Desktop #AI
5,590Открыть в Telegram
Compose Broadcast
24 авг., 06:01
🐱 Адаптивный UI в Compose Multiplatform через набор простый функцийKitFlow — небольшая KMP-либа, которая показывает, как можно держать адаптив в одном месте.Главная идея — Adaptive.value(): val padding = Adaptive.value( sm = 12.dp, md = 16.dp, lg = 20.dp, tab = 24.dp, desktop = 28.dp )То же самое для высоты кнопки, ширины карточки, scale шрифта, Boolean, цветов, любых кастомных значений. Есть Adaptive.layoutValue() (по текущей ширине, включая split-screen и resize) и Adaptive.onOrientationChange для портрета/ландшафта.Подключать как зависимость я не рекомендую. Всё, что там есть, легко реализовать самому, и тогда получаешь полную гибкость под свой дизайн-систем и breakpoints. А вот разобрать реализацию и вдохновиться будет полезно, особенно если пишешь shared UI под Android + iOS + Desktop + Web. Я еще для себя делал расширение в зависимости от
5,270Открыть в Telegram
Compose Broadcast
18 авг., 05:13
⚙️ mediaQuery в Compose: один вызов вместо кучи WindowSizeClass + posture + inputОфициально появился mediaQuery — лямбда, которая смотрит на текущий UiMediaScope и возвращает boolean. Внутри можно проверять: 👉 windowWidth / windowHeight 👉 windowPosture (Tabletop, Book, Flat) 👉 pointerPrecision (Fine → Coarse → Blunt → None) 👉 keyboardKind (Physical / Virtual / None) 👉 hasCamera / hasMicrophone 👉 viewingDistance (Near / Medium / Far)Включается одним флагом при запуске приложения: ComposeUiFlags.isMediaQueryIntegrationEnabled = trueДля размеров, которые дёргаются часто, лучше использовать derivedMediaQuery (обёртка над derivedStateOf): // Composable code val narrowerThanMedium by derivedMediaQuery { windowWidth < WindowSizeClass.WIDTH_DP_MEDIUM_LOWER_BOUND.dp } val narrowerThanExpanded by derivedMediaQuery { windowWidth < WindowSizeClass.WIDTH_D9,360Открыть в Telegram
Compose Broadcast
17 авг., 07:20изменён
JetBrains исследует Compose HTML для Server-Side Rendering (SSR)Frederik Pietzko из JetBrains решил проверить идею: что если Compose-компоненты рендерить в HTML на сервере, а не только в canvas/JS. В Compose добавляется обычная функция с типами:@Composable fun Card(title: String, count: Int) { Div({ classes("card") }) { H3 { Text(title) } Span { Text(count.toString()) } } }Идея — добавить функции Compose HTML renderToString / renderToBytes, чтобы один раз прогнать composition и получить строку HTML. Без браузера, без DOM, без recomposition и effects (как классический SSR). Пока речь идет только про JVM тартегМне нравится направление. Если Compose HTML получит нормальный серверный рендер, у Kotlin наконец появится шанс на type-safe fullstack без ухода в JS-фреймворки. Пока же это просто интересный разговор, который стоит почитать.🔗 Источник#Compose #ComposeHTML #Kotlin #SSR4,750Открыть в Telegram
Compose Broadcast
16 авг., 10:24изменён
⚙️ MCP сервер в для Compose Desktop: агент сам видит UI и кликаетВ Compose Multiplatform 1.12.0-rc01 (через Compose Hot Reload 1.2.0) появился экспериментальный MCP-сервер для Hot Reload.Агент теперь может: 👉 reload — пересобрать и хотрелоудить 👉 take_screenshot — снять текущее окно 👉 get_semantic_tree — получить semantic tree (включая Dialog/Popup) 👉 click / type_text / scroll — симулировать ввод 👉 get_logs — читать runtime-логи и ошибкиПодключается через Gradle-таску. В конфиге агента (.mcp.json):{ "mcpServers": { "compose-hot-reload": { "command": "./gradlew", "args": [ "--no-daemon", "--quiet",
4,800Открыть в Telegram
Compose Broadcast
13 авг., 14:22изменён
⚙️ Новый релиз Material3 Adaptive 1.3.0Новая библиотека adaptive-navigation3. Теперь можно легко строить адаптивные Material-интерфейсы в связке с Navigation 3. Что внутри:Scene Strategies 👉 ListDetailSceneStrategy + rememberListDetailSceneStrategy — канонический list-detail 👉 SupportingPaneSceneStrategy + rememberSupportingPaneSceneStrategy — supporting pane 👉 В ListDetailPaneScaffold и SupportingPaneScaffold. Теперь поддерживают margins и edge-to-edge. 🔄 RTL-поддержка для pane expansion. tive:adaptive-navigation3:1.3.0")🔗 Полный changelog#AndroidDev #JetpackCompose #Material35,170Открыть в Telegram
Compose Broadcast
13 авг., 14:07
⚙️ В Compose 1.12.0 появилась экспериментальная реализация Slot Table на основе связного списка (LinkBuffer).Slot Table — это внутренняя структура данных, в которой Compose Runtime хранит всё дерево композиции: каждый Composable, каждое состояние remember, ключи и связи между элементами. С момента первого релиза Slot Table был реализован на основе Gap Buffer — структуры, вдохновлённой текстовыми редакторами.Gap Buffer хранит все группы в плоском IntArray с пустой областью (gap), которая перемещается к месту следующей записи. Его проблема что при удалении или переупорядочивании элементов gap должен переместиться к нужной позиции, копируя все элементы на своём пути.Для композиции с 1000 группами удаление группы №500 требует перемещения gap через 500 позиций. Переупорядочивание одного элемента в списке из 100 записей требует двух перемещений gap,4,620Открыть в Telegram
Compose Broadcast
13 авг., 12:00
3,520Открыть в Telegram
Compose Broadcast
13 авг., 08:19
⚙️ Улучшения текстовых полей в Compose 1.12.0👉 В BasicTextField можно теперь программно применять SpanStyle и ParagraphStyle через edit { addStyle(...) }: state.edit { addStyle(SpanStyle(fontWeight = FontWeight.Bold), start = 0, end = 9) } Стили сохраняются при смене конфигурации.👉 Программное управление выделением. Новый SelectionState с методами selectAll(), clear(), select(range) и extendSelectionByWord() val selectionState = rememberSelectionState() val characterCount = selectionState.selectedTexts.sumOf { it.text.length }Column { SelectionContainer(state = selectionState) { Column { BasicText(text = "Text to be selected...") } } if (characterCount > 0) { BasicText(text = "Characters selected: $characterCount") } }3,230Открыть в Telegram
Compose Broadcast
13 авг., 06:33
🚀 В Compose 1.12.0 прокачали производительность и по бенчмарку Google, на котором тестируются все версии, уже сравнялись с View.Очень хочется верить в то, что это реально, а также что это можно сделать просто без отладки и замера характеристик рендеринга.#Compose #Performance
3,900Открыть в Telegram
Compose Broadcast
13 авг., 06:20
⚙️ Compose Grid стал удобнееТеперь области можно задавать через имя в Grid в дополнение к индексу. Дайте областям имена и размещайте элементы с помощью gridItem(areaId = "header"): Grid( config = { area("header", row = 0, column = 0, rowSpan = 1, columnSpan = 2) area("sidebar", row = 1, column = 0) area("content", row = 1, column = 1) } ) { HeaderSection(modifier = Modifier.gridItem(areaId = "header")) Sidebar(modifier = Modifier.gridItem(areaId = "sidebar")) Content(modifier = Modifier.gridItem(areaId = "content")) }#Compose3,670Открыть в Telegram
