From 40da5d76a7fb426f40ffd26dd258d26b5eba8da8 Mon Sep 17 00:00:00 2001 From: Daniel Bertoldi Date: Fri, 20 Mar 2026 09:56:52 -0300 Subject: [PATCH] [JEWEL-1290] DefaultBanner Should not Hardcode Padding closes https://github.com/JetBrains/intellij-community/pull/3466 (cherry picked from commit eb08e9e97f5826f128a09714d04e11c8ed1eaf94) (cherry picked from commit 20876635a7c17f6f45f1b42b654b6a6f41ec82d4) IJ-MR-211495 GitOrigin-RevId: 8111038cfcbfde9d45e72bf38af041f02c110739 --- .../samples/showcase/components/Banners.kt | 15 +++++++++++-- .../jewel/ui/component/DefaultBanner.kt | 21 +++++++++++++++++-- .../src/demo/SwingComparisonTabPanel.kt | 2 +- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/platform/jewel/samples/showcase/src/main/kotlin/org/jetbrains/jewel/samples/showcase/components/Banners.kt b/platform/jewel/samples/showcase/src/main/kotlin/org/jetbrains/jewel/samples/showcase/components/Banners.kt index a1fcfc43c296..a4b977ec971e 100644 --- a/platform/jewel/samples/showcase/src/main/kotlin/org/jetbrains/jewel/samples/showcase/components/Banners.kt +++ b/platform/jewel/samples/showcase/src/main/kotlin/org/jetbrains/jewel/samples/showcase/components/Banners.kt @@ -65,6 +65,7 @@ public fun Banners(modifier: Modifier = Modifier) { GroupHeader("Default banner (aka editor banners)") DefaultInformationBanner( + modifier = Modifier.fillMaxWidth(), style = JewelTheme.defaultBannerStyle.information, text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt", linkActions = { @@ -74,6 +75,7 @@ public fun Banners(modifier: Modifier = Modifier) { ) DefaultInformationBanner( + modifier = Modifier.fillMaxWidth(), style = JewelTheme.defaultBannerStyle.information, iconActions = { iconAction( @@ -91,6 +93,7 @@ public fun Banners(modifier: Modifier = Modifier) { ) DefaultInformationBanner( + modifier = Modifier.fillMaxWidth(), style = JewelTheme.defaultBannerStyle.information, text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt", icon = null, @@ -100,32 +103,40 @@ public fun Banners(modifier: Modifier = Modifier) { }, ) - DefaultInformationBanner(style = JewelTheme.defaultBannerStyle.information, text = LONG_IPSUM) + DefaultInformationBanner( + modifier = Modifier.fillMaxWidth(), + style = JewelTheme.defaultBannerStyle.information, + text = LONG_IPSUM, + ) DefaultInformationBanner( + modifier = Modifier.fillMaxWidth(), style = JewelTheme.defaultBannerStyle.information, text = LONG_IPSUM, icon = null, ) DefaultInformationBanner( + modifier = Modifier.fillMaxWidth(), style = JewelTheme.defaultBannerStyle.information, text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt", ) DefaultSuccessBanner( + modifier = Modifier.fillMaxWidth(), text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt", style = JewelTheme.defaultBannerStyle.success, ) DefaultWarningBanner( + modifier = Modifier.fillMaxWidth(), text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt", style = JewelTheme.defaultBannerStyle.warning, ) DefaultErrorBanner( + modifier = Modifier.fillMaxWidth(), text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt", - modifier = Modifier, icon = { Icon(AllIconsKeys.General.BalloonError, null) }, linkActions = { action("Action A", onClick = { clickLabel = "Error default Action A clicked" }) diff --git a/platform/jewel/ui/src/main/kotlin/org/jetbrains/jewel/ui/component/DefaultBanner.kt b/platform/jewel/ui/src/main/kotlin/org/jetbrains/jewel/ui/component/DefaultBanner.kt index 46d9074eb3dc..81717a27b92f 100644 --- a/platform/jewel/ui/src/main/kotlin/org/jetbrains/jewel/ui/component/DefaultBanner.kt +++ b/platform/jewel/ui/src/main/kotlin/org/jetbrains/jewel/ui/component/DefaultBanner.kt @@ -6,6 +6,7 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.Spacer @@ -186,6 +187,10 @@ public fun DefaultInformationBanner( * * This banner is primarily used to display persistent messages without interrupting the workflow. * + * **Note:** The [content] slot does not support subcomposition-based composables (e.g., `BoxWithConstraints`, lazy + * layouts), because the banner uses `Modifier.width(IntrinsicSize.Max)` internally. Subcomposition-based layouts cannot + * report intrinsic measurements and will throw at runtime. + * * **Guidelines:** [on IJP SDK webhelp](https://plugins.jetbrains.com/docs/intellij/banner.html) * * **Swing equivalent:** @@ -376,6 +381,10 @@ public fun DefaultSuccessBanner( * * Use this banner to provide clear, visual feedback of a completed or successful action. * + * **Note:** The [content] slot does not support subcomposition-based composables (e.g., `BoxWithConstraints`, lazy + * layouts), because the banner uses `Modifier.width(IntrinsicSize.Max)` internally. Subcomposition-based layouts cannot + * report intrinsic measurements and will throw at runtime. + * * **Guidelines:** [on IJP SDK webhelp](https://plugins.jetbrains.com/docs/intellij/banner.html) * * **Swing equivalent:** @@ -563,6 +572,10 @@ public fun DefaultWarningBanner( * * Use this banner to make users aware of potential issues without stopping their flow. * + * **Note:** The [content] slot does not support subcomposition-based composables (e.g., `BoxWithConstraints`, lazy + * layouts), because the banner uses `Modifier.width(IntrinsicSize.Max)` internally. Subcomposition-based layouts cannot + * report intrinsic measurements and will throw at runtime. + * * **Guidelines:** [on IJP SDK webhelp](https://plugins.jetbrains.com/docs/intellij/banner.html) * * **Swing equivalent:** @@ -747,6 +760,10 @@ public fun DefaultErrorBanner( * * Use this banner to provide high-visibility error messages requiring immediate user attention. * + * **Note:** The [content] slot does not support subcomposition-based composables (e.g., `BoxWithConstraints`, lazy + * layouts), because the banner uses `Modifier.width(IntrinsicSize.Max)` internally. Subcomposition-based layouts cannot + * report intrinsic measurements and will throw at runtime. + * * **Guidelines:** [on IJP SDK webhelp](https://plugins.jetbrains.com/docs/intellij/banner.html) * * **Swing equivalent:** @@ -850,10 +867,10 @@ private fun DefaultBannerImpl( modifier: Modifier = Modifier, content: @Composable (() -> Unit), ) { - Column(modifier = modifier) { + Column(modifier = modifier.width(IntrinsicSize.Max)) { Divider(orientation = Orientation.Horizontal, color = style.colors.border, modifier = Modifier.fillMaxWidth()) Row( - modifier = Modifier.background(style.colors.background).padding(10.dp), + modifier = Modifier.background(style.colors.background).padding(style.metrics.padding), verticalAlignment = Alignment.CenterVertically, ) { if (icon != null) { diff --git a/plugins/devkit/intellij.devkit.compose/src/demo/SwingComparisonTabPanel.kt b/plugins/devkit/intellij.devkit.compose/src/demo/SwingComparisonTabPanel.kt index 9bafdec02349..dee71fb8b0ea 100644 --- a/plugins/devkit/intellij.devkit.compose/src/demo/SwingComparisonTabPanel.kt +++ b/plugins/devkit/intellij.devkit.compose/src/demo/SwingComparisonTabPanel.kt @@ -205,7 +205,7 @@ internal class SwingComparisonTabPanel : BorderLayoutPanel() { .align(AlignY.CENTER) compose { - Box(Modifier.width(400.dp)) { + Box { DefaultInformationBanner( text = DevkitComposeBundle.message("jewel.compose.banners"), iconActions = {