diff --git a/platform/jewel/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/theme/IntUiBridge.kt b/platform/jewel/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/theme/IntUiBridge.kt index 9f41d0c669c88..467648a24bbf8 100644 --- a/platform/jewel/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/theme/IntUiBridge.kt +++ b/platform/jewel/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/theme/IntUiBridge.kt @@ -69,6 +69,7 @@ internal fun createBridgeComponentStyling(theme: ThemeDefinition): ComponentStyl val menuStyle = readMenuStyle() return DefaultComponentStyling( + badgeStyle = readBadgeStyle(), checkboxStyle = readCheckboxStyle(), chipStyle = readChipStyle(), circularProgressStyle = readCircularProgressStyle(theme.isDark), diff --git a/platform/jewel/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/theme/IntUiBridgeBadge.kt b/platform/jewel/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/theme/IntUiBridgeBadge.kt new file mode 100644 index 0000000000000..9fed3f62fdb2f --- /dev/null +++ b/platform/jewel/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/theme/IntUiBridgeBadge.kt @@ -0,0 +1,48 @@ +package org.jetbrains.jewel.bridge.theme + +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.shape.CornerSize +import androidx.compose.ui.graphics.takeOrElse +import androidx.compose.ui.unit.DpSize +import androidx.compose.ui.unit.dp +import org.jetbrains.jewel.bridge.createVerticalBrush +import org.jetbrains.jewel.bridge.retrieveColorOrUnspecified +import org.jetbrains.jewel.bridge.retrieveColorsOrUnspecified +import org.jetbrains.jewel.ui.component.styling.BadgeColors +import org.jetbrains.jewel.ui.component.styling.BadgeMetrics +import org.jetbrains.jewel.ui.component.styling.BadgeStyle + +// Note: there isn't a badge spec in the IntelliJ Platform LaF, so we're deriving +// this from similar small promotional UI elements. +// Badges are small colored elements used to display promotional text like "New", "Beta", etc. +internal fun readBadgeStyle(): BadgeStyle { + val normalBackground = + retrieveColorsOrUnspecified("Button.startBackground", "Button.endBackground").createVerticalBrush() + + val normalContent = retrieveColorOrUnspecified("Label.foreground") + val disabledContent = retrieveColorOrUnspecified("Label.disabledForeground").takeOrElse { normalContent } + + val colors = + BadgeColors( + background = normalBackground, + backgroundDisabled = normalBackground, + backgroundFocused = normalBackground, + backgroundPressed = normalBackground, + backgroundHovered = normalBackground, + content = normalContent, + contentDisabled = disabledContent, + contentFocused = normalContent, + contentPressed = normalContent, + contentHovered = normalContent, + ) + + return BadgeStyle( + colors = colors, + metrics = + BadgeMetrics( + cornerSize = CornerSize(0.dp), + padding = PaddingValues(horizontal = 6.dp, vertical = 2.dp), + minSize = DpSize(32.dp, 18.dp), + ), + ) +} diff --git a/platform/jewel/int-ui/int-ui-standalone/api-dump.txt b/platform/jewel/int-ui/int-ui-standalone/api-dump.txt index 7ee937012b2f5..729388e2df1ec 100644 --- a/platform/jewel/int-ui/int-ui-standalone/api-dump.txt +++ b/platform/jewel/int-ui/int-ui-standalone/api-dump.txt @@ -60,6 +60,17 @@ f:org.jetbrains.jewel.intui.standalone.styling.IntUIBannerStylingKt - sf:getWarning(org.jetbrains.jewel.ui.component.styling.BannerColors$Companion):org.jetbrains.jewel.intui.standalone.styling.IntUiWarningBannerColorFactory - sf:getWarning(org.jetbrains.jewel.ui.component.styling.DefaultBannerStyle$Companion):org.jetbrains.jewel.intui.standalone.styling.IntUiDefaultWarningBannerStyleFactory - sf:getWarning(org.jetbrains.jewel.ui.component.styling.InlineBannerStyle$Companion):org.jetbrains.jewel.intui.standalone.styling.IntUiInlineWarningBannerStyleFactory +f:org.jetbrains.jewel.intui.standalone.styling.IntUiBadgeStylingKt +- sf:dark(org.jetbrains.jewel.ui.component.styling.BadgeStyle$Companion,org.jetbrains.jewel.ui.component.styling.BadgeColors,org.jetbrains.jewel.ui.component.styling.BadgeMetrics):org.jetbrains.jewel.ui.component.styling.BadgeStyle +- bs:dark$default(org.jetbrains.jewel.ui.component.styling.BadgeStyle$Companion,org.jetbrains.jewel.ui.component.styling.BadgeColors,org.jetbrains.jewel.ui.component.styling.BadgeMetrics,I,java.lang.Object):org.jetbrains.jewel.ui.component.styling.BadgeStyle +- sf:dark-d4pgSKA(org.jetbrains.jewel.ui.component.styling.BadgeColors$Companion,androidx.compose.ui.graphics.Brush,androidx.compose.ui.graphics.Brush,androidx.compose.ui.graphics.Brush,androidx.compose.ui.graphics.Brush,androidx.compose.ui.graphics.Brush,J,J,J,J,J):org.jetbrains.jewel.ui.component.styling.BadgeColors +- bs:dark-d4pgSKA$default(org.jetbrains.jewel.ui.component.styling.BadgeColors$Companion,androidx.compose.ui.graphics.Brush,androidx.compose.ui.graphics.Brush,androidx.compose.ui.graphics.Brush,androidx.compose.ui.graphics.Brush,androidx.compose.ui.graphics.Brush,J,J,J,J,J,I,java.lang.Object):org.jetbrains.jewel.ui.component.styling.BadgeColors +- sf:defaults-aAmSZ4M(org.jetbrains.jewel.ui.component.styling.BadgeMetrics$Companion,androidx.compose.foundation.shape.CornerSize,androidx.compose.foundation.layout.PaddingValues,J):org.jetbrains.jewel.ui.component.styling.BadgeMetrics +- bs:defaults-aAmSZ4M$default(org.jetbrains.jewel.ui.component.styling.BadgeMetrics$Companion,androidx.compose.foundation.shape.CornerSize,androidx.compose.foundation.layout.PaddingValues,J,I,java.lang.Object):org.jetbrains.jewel.ui.component.styling.BadgeMetrics +- sf:light(org.jetbrains.jewel.ui.component.styling.BadgeStyle$Companion,org.jetbrains.jewel.ui.component.styling.BadgeColors,org.jetbrains.jewel.ui.component.styling.BadgeMetrics):org.jetbrains.jewel.ui.component.styling.BadgeStyle +- bs:light$default(org.jetbrains.jewel.ui.component.styling.BadgeStyle$Companion,org.jetbrains.jewel.ui.component.styling.BadgeColors,org.jetbrains.jewel.ui.component.styling.BadgeMetrics,I,java.lang.Object):org.jetbrains.jewel.ui.component.styling.BadgeStyle +- sf:light-d4pgSKA(org.jetbrains.jewel.ui.component.styling.BadgeColors$Companion,androidx.compose.ui.graphics.Brush,androidx.compose.ui.graphics.Brush,androidx.compose.ui.graphics.Brush,androidx.compose.ui.graphics.Brush,androidx.compose.ui.graphics.Brush,J,J,J,J,J):org.jetbrains.jewel.ui.component.styling.BadgeColors +- bs:light-d4pgSKA$default(org.jetbrains.jewel.ui.component.styling.BadgeColors$Companion,androidx.compose.ui.graphics.Brush,androidx.compose.ui.graphics.Brush,androidx.compose.ui.graphics.Brush,androidx.compose.ui.graphics.Brush,androidx.compose.ui.graphics.Brush,J,J,J,J,J,I,java.lang.Object):org.jetbrains.jewel.ui.component.styling.BadgeColors f:org.jetbrains.jewel.intui.standalone.styling.IntUiButtonStylingKt - sf:default-Kzyhx1A(org.jetbrains.jewel.ui.component.styling.ButtonMetrics$Companion,androidx.compose.foundation.shape.CornerSize,androidx.compose.foundation.layout.PaddingValues,J,F,F):org.jetbrains.jewel.ui.component.styling.ButtonMetrics - bs:default-Kzyhx1A$default(org.jetbrains.jewel.ui.component.styling.ButtonMetrics$Companion,androidx.compose.foundation.shape.CornerSize,androidx.compose.foundation.layout.PaddingValues,J,F,F,I,java.lang.Object):org.jetbrains.jewel.ui.component.styling.ButtonMetrics @@ -678,9 +689,11 @@ f:org.jetbrains.jewel.intui.standalone.theme.IntUiGrayFilterValuesKt f:org.jetbrains.jewel.intui.standalone.theme.IntUiThemeKt - sf:IntUiTheme(org.jetbrains.jewel.foundation.theme.ThemeDefinition,org.jetbrains.jewel.ui.ComponentStyling,Z,kotlin.jvm.functions.Function2,androidx.compose.runtime.Composer,I,I):V - sf:IntUiTheme(Z,Z,kotlin.jvm.functions.Function2,androidx.compose.runtime.Composer,I,I):V +- sf:dark(org.jetbrains.jewel.ui.ComponentStyling,org.jetbrains.jewel.ui.component.styling.BadgeStyle,org.jetbrains.jewel.ui.component.styling.CheckboxStyle,org.jetbrains.jewel.ui.component.styling.ChipStyle,org.jetbrains.jewel.ui.component.styling.CircularProgressStyle,org.jetbrains.jewel.ui.component.styling.DefaultBannerStyles,org.jetbrains.jewel.ui.component.styling.ComboBoxStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.DividerStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.GroupHeaderStyle,org.jetbrains.jewel.ui.component.styling.HorizontalProgressBarStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.InlineBannerStyles,org.jetbrains.jewel.ui.component.styling.LazyTreeStyle,org.jetbrains.jewel.ui.component.styling.LinkStyle,org.jetbrains.jewel.ui.component.styling.MenuStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.PopupContainerStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.RadioButtonStyle,org.jetbrains.jewel.ui.component.styling.ScrollbarStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlButtonStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlStyle,org.jetbrains.jewel.ui.component.styling.SelectableLazyColumnStyle,org.jetbrains.jewel.ui.component.styling.SliderStyle,org.jetbrains.jewel.ui.component.styling.SimpleListItemStyle,org.jetbrains.jewel.ui.component.styling.TextAreaStyle,org.jetbrains.jewel.ui.component.styling.TextFieldStyle,org.jetbrains.jewel.ui.component.styling.TooltipStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.SpeedSearchStyle,org.jetbrains.jewel.ui.component.styling.SearchMatchStyle):org.jetbrains.jewel.ui.ComponentStyling - bsf:dark(org.jetbrains.jewel.ui.ComponentStyling,org.jetbrains.jewel.ui.component.styling.CheckboxStyle,org.jetbrains.jewel.ui.component.styling.ChipStyle,org.jetbrains.jewel.ui.component.styling.CircularProgressStyle,org.jetbrains.jewel.ui.component.styling.DefaultBannerStyles,org.jetbrains.jewel.ui.component.styling.ComboBoxStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.DividerStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.GroupHeaderStyle,org.jetbrains.jewel.ui.component.styling.HorizontalProgressBarStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.InlineBannerStyles,org.jetbrains.jewel.ui.component.styling.LazyTreeStyle,org.jetbrains.jewel.ui.component.styling.LinkStyle,org.jetbrains.jewel.ui.component.styling.MenuStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.PopupContainerStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.RadioButtonStyle,org.jetbrains.jewel.ui.component.styling.ScrollbarStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlButtonStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlStyle,org.jetbrains.jewel.ui.component.styling.SelectableLazyColumnStyle,org.jetbrains.jewel.ui.component.styling.SliderStyle,org.jetbrains.jewel.ui.component.styling.SimpleListItemStyle,org.jetbrains.jewel.ui.component.styling.TextAreaStyle,org.jetbrains.jewel.ui.component.styling.TextFieldStyle,org.jetbrains.jewel.ui.component.styling.TooltipStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle):org.jetbrains.jewel.ui.ComponentStyling -- sf:dark(org.jetbrains.jewel.ui.ComponentStyling,org.jetbrains.jewel.ui.component.styling.CheckboxStyle,org.jetbrains.jewel.ui.component.styling.ChipStyle,org.jetbrains.jewel.ui.component.styling.CircularProgressStyle,org.jetbrains.jewel.ui.component.styling.DefaultBannerStyles,org.jetbrains.jewel.ui.component.styling.ComboBoxStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.DividerStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.GroupHeaderStyle,org.jetbrains.jewel.ui.component.styling.HorizontalProgressBarStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.InlineBannerStyles,org.jetbrains.jewel.ui.component.styling.LazyTreeStyle,org.jetbrains.jewel.ui.component.styling.LinkStyle,org.jetbrains.jewel.ui.component.styling.MenuStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.PopupContainerStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.RadioButtonStyle,org.jetbrains.jewel.ui.component.styling.ScrollbarStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlButtonStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlStyle,org.jetbrains.jewel.ui.component.styling.SelectableLazyColumnStyle,org.jetbrains.jewel.ui.component.styling.SliderStyle,org.jetbrains.jewel.ui.component.styling.SimpleListItemStyle,org.jetbrains.jewel.ui.component.styling.TextAreaStyle,org.jetbrains.jewel.ui.component.styling.TextFieldStyle,org.jetbrains.jewel.ui.component.styling.TooltipStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.SpeedSearchStyle,org.jetbrains.jewel.ui.component.styling.SearchMatchStyle):org.jetbrains.jewel.ui.ComponentStyling +- bsf:dark(org.jetbrains.jewel.ui.ComponentStyling,org.jetbrains.jewel.ui.component.styling.CheckboxStyle,org.jetbrains.jewel.ui.component.styling.ChipStyle,org.jetbrains.jewel.ui.component.styling.CircularProgressStyle,org.jetbrains.jewel.ui.component.styling.DefaultBannerStyles,org.jetbrains.jewel.ui.component.styling.ComboBoxStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.DividerStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.GroupHeaderStyle,org.jetbrains.jewel.ui.component.styling.HorizontalProgressBarStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.InlineBannerStyles,org.jetbrains.jewel.ui.component.styling.LazyTreeStyle,org.jetbrains.jewel.ui.component.styling.LinkStyle,org.jetbrains.jewel.ui.component.styling.MenuStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.PopupContainerStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.RadioButtonStyle,org.jetbrains.jewel.ui.component.styling.ScrollbarStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlButtonStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlStyle,org.jetbrains.jewel.ui.component.styling.SelectableLazyColumnStyle,org.jetbrains.jewel.ui.component.styling.SliderStyle,org.jetbrains.jewel.ui.component.styling.SimpleListItemStyle,org.jetbrains.jewel.ui.component.styling.TextAreaStyle,org.jetbrains.jewel.ui.component.styling.TextFieldStyle,org.jetbrains.jewel.ui.component.styling.TooltipStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.SpeedSearchStyle,org.jetbrains.jewel.ui.component.styling.SearchMatchStyle):org.jetbrains.jewel.ui.ComponentStyling - bsf:dark(org.jetbrains.jewel.ui.ComponentStyling,org.jetbrains.jewel.ui.component.styling.CheckboxStyle,org.jetbrains.jewel.ui.component.styling.ChipStyle,org.jetbrains.jewel.ui.component.styling.CircularProgressStyle,org.jetbrains.jewel.ui.component.styling.DefaultBannerStyles,org.jetbrains.jewel.ui.component.styling.ComboBoxStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.DividerStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.GroupHeaderStyle,org.jetbrains.jewel.ui.component.styling.HorizontalProgressBarStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.InlineBannerStyles,org.jetbrains.jewel.ui.component.styling.LazyTreeStyle,org.jetbrains.jewel.ui.component.styling.LinkStyle,org.jetbrains.jewel.ui.component.styling.MenuStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.PopupContainerStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.RadioButtonStyle,org.jetbrains.jewel.ui.component.styling.ScrollbarStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlButtonStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlStyle,org.jetbrains.jewel.ui.component.styling.SelectableLazyColumnStyle,org.jetbrains.jewel.ui.component.styling.SliderStyle,org.jetbrains.jewel.ui.component.styling.SimpleListItemStyle,org.jetbrains.jewel.ui.component.styling.TextAreaStyle,org.jetbrains.jewel.ui.component.styling.TextFieldStyle,org.jetbrains.jewel.ui.component.styling.TooltipStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle):org.jetbrains.jewel.ui.ComponentStyling +- bs:dark$default(org.jetbrains.jewel.ui.ComponentStyling,org.jetbrains.jewel.ui.component.styling.BadgeStyle,org.jetbrains.jewel.ui.component.styling.CheckboxStyle,org.jetbrains.jewel.ui.component.styling.ChipStyle,org.jetbrains.jewel.ui.component.styling.CircularProgressStyle,org.jetbrains.jewel.ui.component.styling.DefaultBannerStyles,org.jetbrains.jewel.ui.component.styling.ComboBoxStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.DividerStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.GroupHeaderStyle,org.jetbrains.jewel.ui.component.styling.HorizontalProgressBarStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.InlineBannerStyles,org.jetbrains.jewel.ui.component.styling.LazyTreeStyle,org.jetbrains.jewel.ui.component.styling.LinkStyle,org.jetbrains.jewel.ui.component.styling.MenuStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.PopupContainerStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.RadioButtonStyle,org.jetbrains.jewel.ui.component.styling.ScrollbarStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlButtonStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlStyle,org.jetbrains.jewel.ui.component.styling.SelectableLazyColumnStyle,org.jetbrains.jewel.ui.component.styling.SliderStyle,org.jetbrains.jewel.ui.component.styling.SimpleListItemStyle,org.jetbrains.jewel.ui.component.styling.TextAreaStyle,org.jetbrains.jewel.ui.component.styling.TextFieldStyle,org.jetbrains.jewel.ui.component.styling.TooltipStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.SpeedSearchStyle,org.jetbrains.jewel.ui.component.styling.SearchMatchStyle,I,I,java.lang.Object):org.jetbrains.jewel.ui.ComponentStyling - bs:dark$default(org.jetbrains.jewel.ui.ComponentStyling,org.jetbrains.jewel.ui.component.styling.CheckboxStyle,org.jetbrains.jewel.ui.component.styling.ChipStyle,org.jetbrains.jewel.ui.component.styling.CircularProgressStyle,org.jetbrains.jewel.ui.component.styling.DefaultBannerStyles,org.jetbrains.jewel.ui.component.styling.ComboBoxStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.DividerStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.GroupHeaderStyle,org.jetbrains.jewel.ui.component.styling.HorizontalProgressBarStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.InlineBannerStyles,org.jetbrains.jewel.ui.component.styling.LazyTreeStyle,org.jetbrains.jewel.ui.component.styling.LinkStyle,org.jetbrains.jewel.ui.component.styling.MenuStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.PopupContainerStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.RadioButtonStyle,org.jetbrains.jewel.ui.component.styling.ScrollbarStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlButtonStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlStyle,org.jetbrains.jewel.ui.component.styling.SelectableLazyColumnStyle,org.jetbrains.jewel.ui.component.styling.SliderStyle,org.jetbrains.jewel.ui.component.styling.SimpleListItemStyle,org.jetbrains.jewel.ui.component.styling.TextAreaStyle,org.jetbrains.jewel.ui.component.styling.TextFieldStyle,org.jetbrains.jewel.ui.component.styling.TooltipStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,I,I,java.lang.Object):org.jetbrains.jewel.ui.ComponentStyling - bs:dark$default(org.jetbrains.jewel.ui.ComponentStyling,org.jetbrains.jewel.ui.component.styling.CheckboxStyle,org.jetbrains.jewel.ui.component.styling.ChipStyle,org.jetbrains.jewel.ui.component.styling.CircularProgressStyle,org.jetbrains.jewel.ui.component.styling.DefaultBannerStyles,org.jetbrains.jewel.ui.component.styling.ComboBoxStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.DividerStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.GroupHeaderStyle,org.jetbrains.jewel.ui.component.styling.HorizontalProgressBarStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.InlineBannerStyles,org.jetbrains.jewel.ui.component.styling.LazyTreeStyle,org.jetbrains.jewel.ui.component.styling.LinkStyle,org.jetbrains.jewel.ui.component.styling.MenuStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.PopupContainerStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.RadioButtonStyle,org.jetbrains.jewel.ui.component.styling.ScrollbarStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlButtonStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlStyle,org.jetbrains.jewel.ui.component.styling.SelectableLazyColumnStyle,org.jetbrains.jewel.ui.component.styling.SliderStyle,org.jetbrains.jewel.ui.component.styling.SimpleListItemStyle,org.jetbrains.jewel.ui.component.styling.TextAreaStyle,org.jetbrains.jewel.ui.component.styling.TextFieldStyle,org.jetbrains.jewel.ui.component.styling.TooltipStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.SpeedSearchStyle,org.jetbrains.jewel.ui.component.styling.SearchMatchStyle,I,I,java.lang.Object):org.jetbrains.jewel.ui.ComponentStyling - bs:dark$default(org.jetbrains.jewel.ui.ComponentStyling,org.jetbrains.jewel.ui.component.styling.CheckboxStyle,org.jetbrains.jewel.ui.component.styling.ChipStyle,org.jetbrains.jewel.ui.component.styling.CircularProgressStyle,org.jetbrains.jewel.ui.component.styling.DefaultBannerStyles,org.jetbrains.jewel.ui.component.styling.ComboBoxStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.DividerStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.GroupHeaderStyle,org.jetbrains.jewel.ui.component.styling.HorizontalProgressBarStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.InlineBannerStyles,org.jetbrains.jewel.ui.component.styling.LazyTreeStyle,org.jetbrains.jewel.ui.component.styling.LinkStyle,org.jetbrains.jewel.ui.component.styling.MenuStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.PopupContainerStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.RadioButtonStyle,org.jetbrains.jewel.ui.component.styling.ScrollbarStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlButtonStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlStyle,org.jetbrains.jewel.ui.component.styling.SelectableLazyColumnStyle,org.jetbrains.jewel.ui.component.styling.SliderStyle,org.jetbrains.jewel.ui.component.styling.SimpleListItemStyle,org.jetbrains.jewel.ui.component.styling.TextAreaStyle,org.jetbrains.jewel.ui.component.styling.TextFieldStyle,org.jetbrains.jewel.ui.component.styling.TooltipStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,I,java.lang.Object):org.jetbrains.jewel.ui.ComponentStyling @@ -689,9 +702,11 @@ f:org.jetbrains.jewel.intui.standalone.theme.IntUiThemeKt - sf:darkThemeDefinition-uyGnus8(org.jetbrains.jewel.foundation.theme.JewelTheme$Companion,org.jetbrains.jewel.foundation.GlobalColors,org.jetbrains.jewel.foundation.GlobalMetrics,org.jetbrains.jewel.foundation.theme.ThemeColorPalette,org.jetbrains.jewel.foundation.theme.ThemeIconData,androidx.compose.ui.text.TextStyle,androidx.compose.ui.text.TextStyle,androidx.compose.ui.text.TextStyle,J,org.jetbrains.jewel.foundation.DisabledAppearanceValues):org.jetbrains.jewel.foundation.theme.ThemeDefinition - bs:darkThemeDefinition-uyGnus8$default(org.jetbrains.jewel.foundation.theme.JewelTheme$Companion,org.jetbrains.jewel.foundation.GlobalColors,org.jetbrains.jewel.foundation.GlobalMetrics,org.jetbrains.jewel.foundation.theme.ThemeColorPalette,org.jetbrains.jewel.foundation.theme.ThemeIconData,androidx.compose.ui.text.TextStyle,androidx.compose.ui.text.TextStyle,androidx.compose.ui.text.TextStyle,J,org.jetbrains.jewel.foundation.DisabledAppearanceValues,I,java.lang.Object):org.jetbrains.jewel.foundation.theme.ThemeDefinition - sf:default(org.jetbrains.jewel.ui.ComponentStyling,androidx.compose.runtime.Composer,I):org.jetbrains.jewel.ui.ComponentStyling +- sf:light(org.jetbrains.jewel.ui.ComponentStyling,org.jetbrains.jewel.ui.component.styling.BadgeStyle,org.jetbrains.jewel.ui.component.styling.CheckboxStyle,org.jetbrains.jewel.ui.component.styling.ChipStyle,org.jetbrains.jewel.ui.component.styling.CircularProgressStyle,org.jetbrains.jewel.ui.component.styling.DefaultBannerStyles,org.jetbrains.jewel.ui.component.styling.ComboBoxStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.DividerStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.GroupHeaderStyle,org.jetbrains.jewel.ui.component.styling.HorizontalProgressBarStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.InlineBannerStyles,org.jetbrains.jewel.ui.component.styling.LazyTreeStyle,org.jetbrains.jewel.ui.component.styling.LinkStyle,org.jetbrains.jewel.ui.component.styling.MenuStyle,org.jetbrains.jewel.ui.component.styling.PopupContainerStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.RadioButtonStyle,org.jetbrains.jewel.ui.component.styling.ScrollbarStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlButtonStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlStyle,org.jetbrains.jewel.ui.component.styling.SliderStyle,org.jetbrains.jewel.ui.component.styling.SelectableLazyColumnStyle,org.jetbrains.jewel.ui.component.styling.SimpleListItemStyle,org.jetbrains.jewel.ui.component.styling.TextAreaStyle,org.jetbrains.jewel.ui.component.styling.TextFieldStyle,org.jetbrains.jewel.ui.component.styling.TooltipStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.SpeedSearchStyle,org.jetbrains.jewel.ui.component.styling.SearchMatchStyle):org.jetbrains.jewel.ui.ComponentStyling - bsf:light(org.jetbrains.jewel.ui.ComponentStyling,org.jetbrains.jewel.ui.component.styling.CheckboxStyle,org.jetbrains.jewel.ui.component.styling.ChipStyle,org.jetbrains.jewel.ui.component.styling.CircularProgressStyle,org.jetbrains.jewel.ui.component.styling.DefaultBannerStyles,org.jetbrains.jewel.ui.component.styling.ComboBoxStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.DividerStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.GroupHeaderStyle,org.jetbrains.jewel.ui.component.styling.HorizontalProgressBarStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.InlineBannerStyles,org.jetbrains.jewel.ui.component.styling.LazyTreeStyle,org.jetbrains.jewel.ui.component.styling.LinkStyle,org.jetbrains.jewel.ui.component.styling.MenuStyle,org.jetbrains.jewel.ui.component.styling.PopupContainerStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.RadioButtonStyle,org.jetbrains.jewel.ui.component.styling.ScrollbarStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlButtonStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlStyle,org.jetbrains.jewel.ui.component.styling.SliderStyle,org.jetbrains.jewel.ui.component.styling.SelectableLazyColumnStyle,org.jetbrains.jewel.ui.component.styling.SimpleListItemStyle,org.jetbrains.jewel.ui.component.styling.TextAreaStyle,org.jetbrains.jewel.ui.component.styling.TextFieldStyle,org.jetbrains.jewel.ui.component.styling.TooltipStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle):org.jetbrains.jewel.ui.ComponentStyling -- sf:light(org.jetbrains.jewel.ui.ComponentStyling,org.jetbrains.jewel.ui.component.styling.CheckboxStyle,org.jetbrains.jewel.ui.component.styling.ChipStyle,org.jetbrains.jewel.ui.component.styling.CircularProgressStyle,org.jetbrains.jewel.ui.component.styling.DefaultBannerStyles,org.jetbrains.jewel.ui.component.styling.ComboBoxStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.DividerStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.GroupHeaderStyle,org.jetbrains.jewel.ui.component.styling.HorizontalProgressBarStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.InlineBannerStyles,org.jetbrains.jewel.ui.component.styling.LazyTreeStyle,org.jetbrains.jewel.ui.component.styling.LinkStyle,org.jetbrains.jewel.ui.component.styling.MenuStyle,org.jetbrains.jewel.ui.component.styling.PopupContainerStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.RadioButtonStyle,org.jetbrains.jewel.ui.component.styling.ScrollbarStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlButtonStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlStyle,org.jetbrains.jewel.ui.component.styling.SliderStyle,org.jetbrains.jewel.ui.component.styling.SelectableLazyColumnStyle,org.jetbrains.jewel.ui.component.styling.SimpleListItemStyle,org.jetbrains.jewel.ui.component.styling.TextAreaStyle,org.jetbrains.jewel.ui.component.styling.TextFieldStyle,org.jetbrains.jewel.ui.component.styling.TooltipStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.SpeedSearchStyle,org.jetbrains.jewel.ui.component.styling.SearchMatchStyle):org.jetbrains.jewel.ui.ComponentStyling +- bsf:light(org.jetbrains.jewel.ui.ComponentStyling,org.jetbrains.jewel.ui.component.styling.CheckboxStyle,org.jetbrains.jewel.ui.component.styling.ChipStyle,org.jetbrains.jewel.ui.component.styling.CircularProgressStyle,org.jetbrains.jewel.ui.component.styling.DefaultBannerStyles,org.jetbrains.jewel.ui.component.styling.ComboBoxStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.DividerStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.GroupHeaderStyle,org.jetbrains.jewel.ui.component.styling.HorizontalProgressBarStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.InlineBannerStyles,org.jetbrains.jewel.ui.component.styling.LazyTreeStyle,org.jetbrains.jewel.ui.component.styling.LinkStyle,org.jetbrains.jewel.ui.component.styling.MenuStyle,org.jetbrains.jewel.ui.component.styling.PopupContainerStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.RadioButtonStyle,org.jetbrains.jewel.ui.component.styling.ScrollbarStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlButtonStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlStyle,org.jetbrains.jewel.ui.component.styling.SliderStyle,org.jetbrains.jewel.ui.component.styling.SelectableLazyColumnStyle,org.jetbrains.jewel.ui.component.styling.SimpleListItemStyle,org.jetbrains.jewel.ui.component.styling.TextAreaStyle,org.jetbrains.jewel.ui.component.styling.TextFieldStyle,org.jetbrains.jewel.ui.component.styling.TooltipStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.SpeedSearchStyle,org.jetbrains.jewel.ui.component.styling.SearchMatchStyle):org.jetbrains.jewel.ui.ComponentStyling - bsf:light(org.jetbrains.jewel.ui.ComponentStyling,org.jetbrains.jewel.ui.component.styling.CheckboxStyle,org.jetbrains.jewel.ui.component.styling.ChipStyle,org.jetbrains.jewel.ui.component.styling.CircularProgressStyle,org.jetbrains.jewel.ui.component.styling.DefaultBannerStyles,org.jetbrains.jewel.ui.component.styling.ComboBoxStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.DividerStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.GroupHeaderStyle,org.jetbrains.jewel.ui.component.styling.HorizontalProgressBarStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.InlineBannerStyles,org.jetbrains.jewel.ui.component.styling.LazyTreeStyle,org.jetbrains.jewel.ui.component.styling.LinkStyle,org.jetbrains.jewel.ui.component.styling.MenuStyle,org.jetbrains.jewel.ui.component.styling.PopupContainerStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.RadioButtonStyle,org.jetbrains.jewel.ui.component.styling.ScrollbarStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlButtonStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlStyle,org.jetbrains.jewel.ui.component.styling.SliderStyle,org.jetbrains.jewel.ui.component.styling.SelectableLazyColumnStyle,org.jetbrains.jewel.ui.component.styling.SimpleListItemStyle,org.jetbrains.jewel.ui.component.styling.TextAreaStyle,org.jetbrains.jewel.ui.component.styling.TextFieldStyle,org.jetbrains.jewel.ui.component.styling.TooltipStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle):org.jetbrains.jewel.ui.ComponentStyling +- bs:light$default(org.jetbrains.jewel.ui.ComponentStyling,org.jetbrains.jewel.ui.component.styling.BadgeStyle,org.jetbrains.jewel.ui.component.styling.CheckboxStyle,org.jetbrains.jewel.ui.component.styling.ChipStyle,org.jetbrains.jewel.ui.component.styling.CircularProgressStyle,org.jetbrains.jewel.ui.component.styling.DefaultBannerStyles,org.jetbrains.jewel.ui.component.styling.ComboBoxStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.DividerStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.GroupHeaderStyle,org.jetbrains.jewel.ui.component.styling.HorizontalProgressBarStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.InlineBannerStyles,org.jetbrains.jewel.ui.component.styling.LazyTreeStyle,org.jetbrains.jewel.ui.component.styling.LinkStyle,org.jetbrains.jewel.ui.component.styling.MenuStyle,org.jetbrains.jewel.ui.component.styling.PopupContainerStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.RadioButtonStyle,org.jetbrains.jewel.ui.component.styling.ScrollbarStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlButtonStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlStyle,org.jetbrains.jewel.ui.component.styling.SliderStyle,org.jetbrains.jewel.ui.component.styling.SelectableLazyColumnStyle,org.jetbrains.jewel.ui.component.styling.SimpleListItemStyle,org.jetbrains.jewel.ui.component.styling.TextAreaStyle,org.jetbrains.jewel.ui.component.styling.TextFieldStyle,org.jetbrains.jewel.ui.component.styling.TooltipStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.SpeedSearchStyle,org.jetbrains.jewel.ui.component.styling.SearchMatchStyle,I,I,java.lang.Object):org.jetbrains.jewel.ui.ComponentStyling - bs:light$default(org.jetbrains.jewel.ui.ComponentStyling,org.jetbrains.jewel.ui.component.styling.CheckboxStyle,org.jetbrains.jewel.ui.component.styling.ChipStyle,org.jetbrains.jewel.ui.component.styling.CircularProgressStyle,org.jetbrains.jewel.ui.component.styling.DefaultBannerStyles,org.jetbrains.jewel.ui.component.styling.ComboBoxStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.DividerStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.GroupHeaderStyle,org.jetbrains.jewel.ui.component.styling.HorizontalProgressBarStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.InlineBannerStyles,org.jetbrains.jewel.ui.component.styling.LazyTreeStyle,org.jetbrains.jewel.ui.component.styling.LinkStyle,org.jetbrains.jewel.ui.component.styling.MenuStyle,org.jetbrains.jewel.ui.component.styling.PopupContainerStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.RadioButtonStyle,org.jetbrains.jewel.ui.component.styling.ScrollbarStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlButtonStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlStyle,org.jetbrains.jewel.ui.component.styling.SliderStyle,org.jetbrains.jewel.ui.component.styling.SelectableLazyColumnStyle,org.jetbrains.jewel.ui.component.styling.SimpleListItemStyle,org.jetbrains.jewel.ui.component.styling.TextAreaStyle,org.jetbrains.jewel.ui.component.styling.TextFieldStyle,org.jetbrains.jewel.ui.component.styling.TooltipStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,I,I,java.lang.Object):org.jetbrains.jewel.ui.ComponentStyling - bs:light$default(org.jetbrains.jewel.ui.ComponentStyling,org.jetbrains.jewel.ui.component.styling.CheckboxStyle,org.jetbrains.jewel.ui.component.styling.ChipStyle,org.jetbrains.jewel.ui.component.styling.CircularProgressStyle,org.jetbrains.jewel.ui.component.styling.DefaultBannerStyles,org.jetbrains.jewel.ui.component.styling.ComboBoxStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.DividerStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.GroupHeaderStyle,org.jetbrains.jewel.ui.component.styling.HorizontalProgressBarStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.InlineBannerStyles,org.jetbrains.jewel.ui.component.styling.LazyTreeStyle,org.jetbrains.jewel.ui.component.styling.LinkStyle,org.jetbrains.jewel.ui.component.styling.MenuStyle,org.jetbrains.jewel.ui.component.styling.PopupContainerStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.RadioButtonStyle,org.jetbrains.jewel.ui.component.styling.ScrollbarStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlButtonStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlStyle,org.jetbrains.jewel.ui.component.styling.SliderStyle,org.jetbrains.jewel.ui.component.styling.SelectableLazyColumnStyle,org.jetbrains.jewel.ui.component.styling.SimpleListItemStyle,org.jetbrains.jewel.ui.component.styling.TextAreaStyle,org.jetbrains.jewel.ui.component.styling.TextFieldStyle,org.jetbrains.jewel.ui.component.styling.TooltipStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.SpeedSearchStyle,org.jetbrains.jewel.ui.component.styling.SearchMatchStyle,I,I,java.lang.Object):org.jetbrains.jewel.ui.ComponentStyling - bs:light$default(org.jetbrains.jewel.ui.ComponentStyling,org.jetbrains.jewel.ui.component.styling.CheckboxStyle,org.jetbrains.jewel.ui.component.styling.ChipStyle,org.jetbrains.jewel.ui.component.styling.CircularProgressStyle,org.jetbrains.jewel.ui.component.styling.DefaultBannerStyles,org.jetbrains.jewel.ui.component.styling.ComboBoxStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.DividerStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.GroupHeaderStyle,org.jetbrains.jewel.ui.component.styling.HorizontalProgressBarStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.InlineBannerStyles,org.jetbrains.jewel.ui.component.styling.LazyTreeStyle,org.jetbrains.jewel.ui.component.styling.LinkStyle,org.jetbrains.jewel.ui.component.styling.MenuStyle,org.jetbrains.jewel.ui.component.styling.PopupContainerStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.RadioButtonStyle,org.jetbrains.jewel.ui.component.styling.ScrollbarStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlButtonStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlStyle,org.jetbrains.jewel.ui.component.styling.SliderStyle,org.jetbrains.jewel.ui.component.styling.SelectableLazyColumnStyle,org.jetbrains.jewel.ui.component.styling.SimpleListItemStyle,org.jetbrains.jewel.ui.component.styling.TextAreaStyle,org.jetbrains.jewel.ui.component.styling.TextFieldStyle,org.jetbrains.jewel.ui.component.styling.TooltipStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,I,java.lang.Object):org.jetbrains.jewel.ui.ComponentStyling diff --git a/platform/jewel/int-ui/int-ui-standalone/src/main/kotlin/org/jetbrains/jewel/intui/standalone/styling/IntUiBadgeStyling.kt b/platform/jewel/int-ui/int-ui-standalone/src/main/kotlin/org/jetbrains/jewel/intui/standalone/styling/IntUiBadgeStyling.kt new file mode 100644 index 0000000000000..5b8e10cfd5c82 --- /dev/null +++ b/platform/jewel/int-ui/int-ui-standalone/src/main/kotlin/org/jetbrains/jewel/intui/standalone/styling/IntUiBadgeStyling.kt @@ -0,0 +1,80 @@ +package org.jetbrains.jewel.intui.standalone.styling + +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.shape.CornerSize +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.unit.DpSize +import androidx.compose.ui.unit.dp +import org.jetbrains.jewel.intui.core.theme.IntUiDarkTheme +import org.jetbrains.jewel.intui.core.theme.IntUiLightTheme +import org.jetbrains.jewel.ui.component.styling.BadgeColors +import org.jetbrains.jewel.ui.component.styling.BadgeMetrics +import org.jetbrains.jewel.ui.component.styling.BadgeStyle + +public fun BadgeStyle.Companion.light( + colors: BadgeColors = BadgeColors.light(), + metrics: BadgeMetrics = BadgeMetrics.defaults(), +): BadgeStyle = BadgeStyle(colors = colors, metrics = metrics) + +public fun BadgeStyle.Companion.dark( + colors: BadgeColors = BadgeColors.dark(), + metrics: BadgeMetrics = BadgeMetrics.defaults(), +): BadgeStyle = BadgeStyle(colors = colors, metrics = metrics) + +public fun BadgeColors.Companion.light( + background: Brush = SolidColor(IntUiLightTheme.colors.blue(4)), + backgroundDisabled: Brush = SolidColor(IntUiLightTheme.colors.gray(12)), + backgroundFocused: Brush = SolidColor(IntUiLightTheme.colors.blue(5)), + backgroundPressed: Brush = SolidColor(IntUiLightTheme.colors.blue(6)), + backgroundHovered: Brush = SolidColor(IntUiLightTheme.colors.blue(5)), + content: Color = IntUiLightTheme.colors.gray(14), + contentDisabled: Color = IntUiLightTheme.colors.gray(8), + contentFocused: Color = IntUiLightTheme.colors.gray(14), + contentPressed: Color = IntUiLightTheme.colors.gray(14), + contentHovered: Color = IntUiLightTheme.colors.gray(14), +): BadgeColors = + BadgeColors( + background = background, + backgroundDisabled = backgroundDisabled, + backgroundFocused = backgroundFocused, + backgroundPressed = backgroundPressed, + backgroundHovered = backgroundHovered, + content = content, + contentDisabled = contentDisabled, + contentFocused = contentFocused, + contentPressed = contentPressed, + contentHovered = contentHovered, + ) + +public fun BadgeColors.Companion.dark( + background: Brush = SolidColor(IntUiDarkTheme.colors.blue(6)), + backgroundDisabled: Brush = SolidColor(IntUiDarkTheme.colors.gray(3)), + backgroundFocused: Brush = SolidColor(IntUiDarkTheme.colors.blue(5)), + backgroundPressed: Brush = SolidColor(IntUiDarkTheme.colors.blue(7)), + backgroundHovered: Brush = SolidColor(IntUiDarkTheme.colors.blue(5)), + content: Color = IntUiDarkTheme.colors.gray(14), + contentDisabled: Color = IntUiDarkTheme.colors.gray(8), + contentFocused: Color = IntUiDarkTheme.colors.gray(14), + contentPressed: Color = IntUiDarkTheme.colors.gray(14), + contentHovered: Color = IntUiDarkTheme.colors.gray(14), +): BadgeColors = + BadgeColors( + background = background, + backgroundDisabled = backgroundDisabled, + backgroundFocused = backgroundFocused, + backgroundPressed = backgroundPressed, + backgroundHovered = backgroundHovered, + content = content, + contentDisabled = contentDisabled, + contentFocused = contentFocused, + contentPressed = contentPressed, + contentHovered = contentHovered, + ) + +public fun BadgeMetrics.Companion.defaults( + cornerSize: CornerSize = CornerSize(0.dp), + padding: PaddingValues = PaddingValues(horizontal = 6.dp, vertical = 2.dp), + minSize: DpSize = DpSize(32.dp, 18.dp), +): BadgeMetrics = BadgeMetrics(cornerSize = cornerSize, padding = padding, minSize = minSize) diff --git a/platform/jewel/int-ui/int-ui-standalone/src/main/kotlin/org/jetbrains/jewel/intui/standalone/theme/IntUiTheme.kt b/platform/jewel/int-ui/int-ui-standalone/src/main/kotlin/org/jetbrains/jewel/intui/standalone/theme/IntUiTheme.kt index 22e0ea17b1711..b4b6ba1e2f6d0 100644 --- a/platform/jewel/int-ui/int-ui-standalone/src/main/kotlin/org/jetbrains/jewel/intui/standalone/theme/IntUiTheme.kt +++ b/platform/jewel/int-ui/int-ui-standalone/src/main/kotlin/org/jetbrains/jewel/intui/standalone/theme/IntUiTheme.kt @@ -35,6 +35,7 @@ import org.jetbrains.jewel.ui.DefaultComponentStyling import org.jetbrains.jewel.ui.LocalMenuItemShortcutHintProvider import org.jetbrains.jewel.ui.LocalMenuItemShortcutProvider import org.jetbrains.jewel.ui.LocalTypography +import org.jetbrains.jewel.ui.component.styling.BadgeStyle import org.jetbrains.jewel.ui.component.styling.ButtonStyle import org.jetbrains.jewel.ui.component.styling.CheckboxStyle import org.jetbrains.jewel.ui.component.styling.ChipStyle @@ -243,6 +244,7 @@ public fun ComponentStyling.default(): ComponentStyling = with { @Suppress("UnusedReceiverParameter") public fun ComponentStyling.dark( + badgeStyle: BadgeStyle = BadgeStyle.dark(), checkboxStyle: CheckboxStyle = CheckboxStyle.dark(), chipStyle: ChipStyle = ChipStyle.dark(), circularProgressStyle: CircularProgressStyle = CircularProgressStyle.dark(), @@ -280,6 +282,85 @@ public fun ComponentStyling.dark( searchMatchStyle: SearchMatchStyle = SearchMatchStyle.dark(), ): ComponentStyling = DefaultComponentStyling( + badgeStyle = badgeStyle, + checkboxStyle = checkboxStyle, + chipStyle = chipStyle, + circularProgressStyle = circularProgressStyle, + defaultBannerStyle = defaultBannerStyle, + comboBoxStyle = comboBoxStyle, + defaultButtonStyle = defaultButtonStyle, + defaultDropdownStyle = dropdownStyle, + defaultSplitButtonStyle = defaultSplitButtonStyle, + defaultTabStyle = defaultTabStyle, + dividerStyle = dividerStyle, + editorTabStyle = editorTabStyle, + groupHeaderStyle = groupHeaderStyle, + horizontalProgressBarStyle = horizontalProgressBarStyle, + iconButtonStyle = iconButtonStyle, + transparentIconButtonStyle = transparentIconButtonStyle, + inlineBannerStyle = inlineBannerStyle, + lazyTreeStyle = lazyTreeStyle, + linkStyle = linkStyle, + menuStyle = menuStyle, + outlinedButtonStyle = outlinedButtonStyle, + popupContainerStyle = popupContainerStyle, + outlinedSplitButtonStyle = outlinedSplitButtonStyle, + radioButtonStyle = radioButtonStyle, + scrollbarStyle = scrollbarStyle, + segmentedControlButtonStyle = segmentedControlButtonStyle, + segmentedControlStyle = segmentedControlStyle, + selectableLazyColumnStyle = selectableLazyColumnStyle, + simpleListItemStyle = simpleListItemStyle, + sliderStyle = sliderStyle, + textAreaStyle = textAreaStyle, + textFieldStyle = textFieldStyle, + tooltipStyle = tooltipStyle, + undecoratedDropdownStyle = undecoratedDropdownStyle, + speedSearchStyle = speedSearchStyle, + searchMatchStyle = searchMatchStyle, + ) + +@Suppress("UnusedReceiverParameter", "DEPRECATION_ERROR") +@Deprecated("Use the variant with badgeStyle.", level = DeprecationLevel.HIDDEN) +public fun ComponentStyling.dark( + checkboxStyle: CheckboxStyle = CheckboxStyle.dark(), + chipStyle: ChipStyle = ChipStyle.dark(), + circularProgressStyle: CircularProgressStyle = CircularProgressStyle.dark(), + defaultBannerStyle: DefaultBannerStyles = DefaultBannerStyles.Default.dark(), + comboBoxStyle: ComboBoxStyle = ComboBoxStyle.Default.dark(), + defaultButtonStyle: ButtonStyle = ButtonStyle.Default.dark(), + defaultSplitButtonStyle: SplitButtonStyle = SplitButtonStyle.Default.dark(), + defaultTabStyle: TabStyle = TabStyle.Default.dark(), + dividerStyle: DividerStyle = DividerStyle.dark(), + dropdownStyle: DropdownStyle = DropdownStyle.Default.dark(), + editorTabStyle: TabStyle = TabStyle.Editor.dark(), + groupHeaderStyle: GroupHeaderStyle = GroupHeaderStyle.dark(), + horizontalProgressBarStyle: HorizontalProgressBarStyle = HorizontalProgressBarStyle.dark(), + iconButtonStyle: IconButtonStyle = IconButtonStyle.dark(), + transparentIconButtonStyle: IconButtonStyle = IconButtonStyle.darkTransparentBackground(), + inlineBannerStyle: InlineBannerStyles = InlineBannerStyles.Default.dark(), + lazyTreeStyle: LazyTreeStyle = LazyTreeStyle.dark(), + linkStyle: LinkStyle = LinkStyle.dark(), + menuStyle: MenuStyle = MenuStyle.dark(), + outlinedButtonStyle: ButtonStyle = ButtonStyle.Outlined.dark(), + popupContainerStyle: PopupContainerStyle = PopupContainerStyle.dark(), + outlinedSplitButtonStyle: SplitButtonStyle = SplitButtonStyle.Outlined.dark(), + radioButtonStyle: RadioButtonStyle = RadioButtonStyle.dark(), + scrollbarStyle: ScrollbarStyle = ScrollbarStyle.dark(), + segmentedControlButtonStyle: SegmentedControlButtonStyle = SegmentedControlButtonStyle.dark(), + segmentedControlStyle: SegmentedControlStyle = SegmentedControlStyle.dark(), + selectableLazyColumnStyle: SelectableLazyColumnStyle = SelectableLazyColumnStyle.dark(), + sliderStyle: SliderStyle = SliderStyle.dark(), + simpleListItemStyle: SimpleListItemStyle = SimpleListItemStyle.dark(), + textAreaStyle: TextAreaStyle = TextAreaStyle.dark(), + textFieldStyle: TextFieldStyle = TextFieldStyle.dark(), + tooltipStyle: TooltipStyle = TooltipStyle.dark(autoHideBehavior = TooltipAutoHideBehavior.Normal), + undecoratedDropdownStyle: DropdownStyle = DropdownStyle.Undecorated.dark(), + speedSearchStyle: SpeedSearchStyle = SpeedSearchStyle.dark(), + searchMatchStyle: SearchMatchStyle = SearchMatchStyle.dark(), +): ComponentStyling = + DefaultComponentStyling( + badgeStyle = BadgeStyle.dark(), checkboxStyle = checkboxStyle, chipStyle = chipStyle, circularProgressStyle = circularProgressStyle, @@ -355,6 +436,7 @@ public fun ComponentStyling.dark( undecoratedDropdownStyle: DropdownStyle = DropdownStyle.Undecorated.dark(), ): ComponentStyling = DefaultComponentStyling( + badgeStyle = BadgeStyle.dark(), checkboxStyle = checkboxStyle, chipStyle = chipStyle, circularProgressStyle = circularProgressStyle, @@ -429,6 +511,7 @@ public fun ComponentStyling.dark( undecoratedDropdownStyle: DropdownStyle = DropdownStyle.Undecorated.dark(), ): ComponentStyling = DefaultComponentStyling( + badgeStyle = BadgeStyle.dark(), checkboxStyle = checkboxStyle, chipStyle = chipStyle, circularProgressStyle = circularProgressStyle, @@ -467,6 +550,85 @@ public fun ComponentStyling.dark( ) @Suppress("UnusedReceiverParameter") +public fun ComponentStyling.light( + badgeStyle: BadgeStyle = BadgeStyle.light(), + checkboxStyle: CheckboxStyle = CheckboxStyle.light(), + chipStyle: ChipStyle = ChipStyle.light(), + circularProgressStyle: CircularProgressStyle = CircularProgressStyle.light(), + defaultBannerStyle: DefaultBannerStyles = DefaultBannerStyles.Default.light(), + comboBoxStyle: ComboBoxStyle = ComboBoxStyle.Default.light(), + defaultButtonStyle: ButtonStyle = ButtonStyle.Default.light(), + defaultSplitButtonStyle: SplitButtonStyle = SplitButtonStyle.Default.light(), + defaultTabStyle: TabStyle = TabStyle.Default.light(), + dividerStyle: DividerStyle = DividerStyle.light(), + dropdownStyle: DropdownStyle = DropdownStyle.Default.light(), + editorTabStyle: TabStyle = TabStyle.Editor.light(), + groupHeaderStyle: GroupHeaderStyle = GroupHeaderStyle.light(), + horizontalProgressBarStyle: HorizontalProgressBarStyle = HorizontalProgressBarStyle.light(), + iconButtonStyle: IconButtonStyle = IconButtonStyle.light(), + transparentIconButtonStyle: IconButtonStyle = IconButtonStyle.lightTransparentBackground(), + inlineBannerStyle: InlineBannerStyles = InlineBannerStyles.Default.light(), + lazyTreeStyle: LazyTreeStyle = LazyTreeStyle.light(), + linkStyle: LinkStyle = LinkStyle.light(), + menuStyle: MenuStyle = MenuStyle.light(), + popupContainerStyle: PopupContainerStyle = PopupContainerStyle.light(), + outlinedButtonStyle: ButtonStyle = ButtonStyle.Outlined.light(), + outlinedSplitButtonStyle: SplitButtonStyle = SplitButtonStyle.Outlined.light(), + radioButtonStyle: RadioButtonStyle = RadioButtonStyle.light(), + scrollbarStyle: ScrollbarStyle = ScrollbarStyle.light(), + segmentedControlButtonStyle: SegmentedControlButtonStyle = SegmentedControlButtonStyle.light(), + segmentedControlStyle: SegmentedControlStyle = SegmentedControlStyle.light(), + sliderStyle: SliderStyle = SliderStyle.light(), + selectableLazyColumnStyle: SelectableLazyColumnStyle = SelectableLazyColumnStyle.light(), + simpleListItemStyle: SimpleListItemStyle = SimpleListItemStyle.light(), + textAreaStyle: TextAreaStyle = TextAreaStyle.light(), + textFieldStyle: TextFieldStyle = TextFieldStyle.light(), + tooltipStyle: TooltipStyle = TooltipStyle.light(autoHideBehavior = TooltipAutoHideBehavior.Normal), + undecoratedDropdownStyle: DropdownStyle = DropdownStyle.Undecorated.light(), + speedSearchStyle: SpeedSearchStyle = SpeedSearchStyle.light(), + searchMatchStyle: SearchMatchStyle = SearchMatchStyle.light(), +): ComponentStyling = + DefaultComponentStyling( + badgeStyle = badgeStyle, + checkboxStyle = checkboxStyle, + chipStyle = chipStyle, + circularProgressStyle = circularProgressStyle, + comboBoxStyle = comboBoxStyle, + defaultBannerStyle = defaultBannerStyle, + defaultButtonStyle = defaultButtonStyle, + defaultDropdownStyle = dropdownStyle, + defaultSplitButtonStyle = defaultSplitButtonStyle, + defaultTabStyle = defaultTabStyle, + dividerStyle = dividerStyle, + editorTabStyle = editorTabStyle, + groupHeaderStyle = groupHeaderStyle, + horizontalProgressBarStyle = horizontalProgressBarStyle, + iconButtonStyle = iconButtonStyle, + transparentIconButtonStyle = transparentIconButtonStyle, + inlineBannerStyle = inlineBannerStyle, + lazyTreeStyle = lazyTreeStyle, + linkStyle = linkStyle, + menuStyle = menuStyle, + outlinedButtonStyle = outlinedButtonStyle, + popupContainerStyle = popupContainerStyle, + outlinedSplitButtonStyle = outlinedSplitButtonStyle, + radioButtonStyle = radioButtonStyle, + scrollbarStyle = scrollbarStyle, + segmentedControlButtonStyle = segmentedControlButtonStyle, + segmentedControlStyle = segmentedControlStyle, + selectableLazyColumnStyle = selectableLazyColumnStyle, + sliderStyle = sliderStyle, + simpleListItemStyle = simpleListItemStyle, + textAreaStyle = textAreaStyle, + textFieldStyle = textFieldStyle, + tooltipStyle = tooltipStyle, + undecoratedDropdownStyle = undecoratedDropdownStyle, + speedSearchStyle = speedSearchStyle, + searchMatchStyle = searchMatchStyle, + ) + +@Suppress("UnusedReceiverParameter", "DEPRECATION_ERROR") +@Deprecated("Use the variant with badgeStyle.", level = DeprecationLevel.HIDDEN) public fun ComponentStyling.light( checkboxStyle: CheckboxStyle = CheckboxStyle.light(), chipStyle: ChipStyle = ChipStyle.light(), @@ -505,6 +667,7 @@ public fun ComponentStyling.light( searchMatchStyle: SearchMatchStyle = SearchMatchStyle.light(), ): ComponentStyling = DefaultComponentStyling( + badgeStyle = BadgeStyle.light(), checkboxStyle = checkboxStyle, chipStyle = chipStyle, circularProgressStyle = circularProgressStyle, @@ -580,6 +743,7 @@ public fun ComponentStyling.light( undecoratedDropdownStyle: DropdownStyle = DropdownStyle.Undecorated.light(), ): ComponentStyling = DefaultComponentStyling( + badgeStyle = BadgeStyle.light(), checkboxStyle = checkboxStyle, chipStyle = chipStyle, circularProgressStyle = circularProgressStyle, @@ -654,6 +818,7 @@ public fun ComponentStyling.light( undecoratedDropdownStyle: DropdownStyle = DropdownStyle.Undecorated.light(), ): ComponentStyling = DefaultComponentStyling( + badgeStyle = BadgeStyle.light(), checkboxStyle = checkboxStyle, chipStyle = chipStyle, circularProgressStyle = circularProgressStyle, diff --git a/platform/jewel/samples/showcase/api-dump.txt b/platform/jewel/samples/showcase/api-dump.txt index 4fdef35983bf1..40d5f962e9316 100644 --- a/platform/jewel/samples/showcase/api-dump.txt +++ b/platform/jewel/samples/showcase/api-dump.txt @@ -14,6 +14,7 @@ f:org.jetbrains.jewel.samples.showcase.ShowcaseIcons f:org.jetbrains.jewel.samples.showcase.ShowcaseIcons$Components - sf:$stable:I - sf:INSTANCE:org.jetbrains.jewel.samples.showcase.ShowcaseIcons$Components +- f:getBadge():org.jetbrains.jewel.ui.icon.PathIconKey - f:getBanners():org.jetbrains.jewel.ui.icon.PathIconKey - f:getBorders():org.jetbrains.jewel.ui.icon.PathIconKey - f:getBrush():org.jetbrains.jewel.ui.icon.PathIconKey @@ -38,6 +39,8 @@ f:org.jetbrains.jewel.samples.showcase.ShowcaseIcons$ProgrammingLanguages - sf:$stable:I - sf:INSTANCE:org.jetbrains.jewel.samples.showcase.ShowcaseIcons$ProgrammingLanguages - f:getKotlin():org.jetbrains.jewel.ui.icon.PathIconKey +f:org.jetbrains.jewel.samples.showcase.components.BadgesKt +- sf:Badges(androidx.compose.ui.Modifier,androidx.compose.runtime.Composer,I,I):V f:org.jetbrains.jewel.samples.showcase.components.BannersKt - sf:Banners(androidx.compose.ui.Modifier,androidx.compose.runtime.Composer,I,I):V f:org.jetbrains.jewel.samples.showcase.components.BordersKt diff --git a/platform/jewel/samples/showcase/src/main/kotlin/org/jetbrains/jewel/samples/showcase/ShowcaseIcons.kt b/platform/jewel/samples/showcase/src/main/kotlin/org/jetbrains/jewel/samples/showcase/ShowcaseIcons.kt index 66bbb0bb37dd3..e70aee7bc3641 100644 --- a/platform/jewel/samples/showcase/src/main/kotlin/org/jetbrains/jewel/samples/showcase/ShowcaseIcons.kt +++ b/platform/jewel/samples/showcase/src/main/kotlin/org/jetbrains/jewel/samples/showcase/ShowcaseIcons.kt @@ -17,6 +17,7 @@ public object ShowcaseIcons { public val sunny: PathIconKey = PathIconKey("icons/sunny.svg", ShowcaseIcons::class.java) public object Components { + public val badge: PathIconKey = PathIconKey("icons/components/badge.svg", ShowcaseIcons::class.java) public val banners: PathIconKey = PathIconKey("icons/components/banners.svg", ShowcaseIcons::class.java) public val borders: PathIconKey = PathIconKey("icons/components/borders.svg", ShowcaseIcons::class.java) public val brush: PathIconKey = PathIconKey("icons/components/brush.svg", ShowcaseIcons::class.java) diff --git a/platform/jewel/samples/showcase/src/main/kotlin/org/jetbrains/jewel/samples/showcase/components/Badges.kt b/platform/jewel/samples/showcase/src/main/kotlin/org/jetbrains/jewel/samples/showcase/components/Badges.kt new file mode 100644 index 0000000000000..68a4aa0fd59dd --- /dev/null +++ b/platform/jewel/samples/showcase/src/main/kotlin/org/jetbrains/jewel/samples/showcase/components/Badges.kt @@ -0,0 +1,207 @@ +package org.jetbrains.jewel.samples.showcase.components + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.CornerSize +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.unit.dp +import org.jetbrains.jewel.foundation.theme.JewelTheme +import org.jetbrains.jewel.ui.component.Badge +import org.jetbrains.jewel.ui.component.GroupHeader +import org.jetbrains.jewel.ui.component.VerticallyScrollableContainer +import org.jetbrains.jewel.ui.component.styling.BadgeColors +import org.jetbrains.jewel.ui.component.styling.BadgeMetrics +import org.jetbrains.jewel.ui.component.styling.BadgeStyle +import org.jetbrains.jewel.ui.theme.badgeStyle + +@Composable +public fun Badges(modifier: Modifier = Modifier) { + VerticallyScrollableContainer(modifier.fillMaxSize()) { + Column(Modifier.fillMaxWidth().padding(16.dp), verticalArrangement = Arrangement.spacedBy(16.dp)) { + GroupHeader("Basic Badges (Non-clickable)") + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + Badge(text = "New") + Badge(text = "Beta") + Badge(text = "Preview") + Badge(text = "Experimental") + } + + GroupHeader("Clickable Badges") + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + var clickCount by remember { mutableIntStateOf(0) } + Badge(text = "Clicks: $clickCount", onClick = { clickCount++ }) + + Badge(text = "Action", onClick = { println("Badge clicked!") }) + } + + GroupHeader("Disabled Badges") + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + Badge(text = "Disabled", enabled = false) + + Badge(text = "Disabled Clickable", enabled = false, onClick = { println("This won't print") }) + } + + GroupHeader("Custom Background Colors") + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + Badge( + text = "Success", + style = + BadgeStyle( + colors = + BadgeColors( + background = SolidColor(Color(0xFF4CAF50)), + backgroundDisabled = SolidColor(Color(0xFFE0E0E0)), + backgroundFocused = SolidColor(Color(0xFF45A049)), + backgroundPressed = SolidColor(Color(0xFF3D8B40)), + backgroundHovered = SolidColor(Color(0xFF45A049)), + content = Color.White, + contentDisabled = Color.Gray, + contentFocused = Color.White, + contentPressed = Color.White, + contentHovered = Color.White, + ), + metrics = JewelTheme.badgeStyle.metrics, + ), + ) + + Badge( + text = "Warning", + style = + BadgeStyle( + colors = + BadgeColors( + background = SolidColor(Color(0xFFFF9800)), + backgroundDisabled = SolidColor(Color(0xFFE0E0E0)), + backgroundFocused = SolidColor(Color(0xFFFB8C00)), + backgroundPressed = SolidColor(Color(0xFFEF6C00)), + backgroundHovered = SolidColor(Color(0xFFFB8C00)), + content = Color.White, + contentDisabled = Color.Gray, + contentFocused = Color.White, + contentPressed = Color.White, + contentHovered = Color.White, + ), + metrics = JewelTheme.badgeStyle.metrics, + ), + ) + + Badge( + text = "Error", + style = + BadgeStyle( + colors = + BadgeColors( + background = SolidColor(Color(0xFFF44336)), + backgroundDisabled = SolidColor(Color(0xFFE0E0E0)), + backgroundFocused = SolidColor(Color(0xFFE53935)), + backgroundPressed = SolidColor(Color(0xFFD32F2F)), + backgroundHovered = SolidColor(Color(0xFFE53935)), + content = Color.White, + contentDisabled = Color.Gray, + contentFocused = Color.White, + contentPressed = Color.White, + contentHovered = Color.White, + ), + metrics = JewelTheme.badgeStyle.metrics, + ), + ) + + Badge( + text = "Horizontal Gradient", + style = + BadgeStyle( + colors = + BadgeColors( + background = + Brush.horizontalGradient(colors = listOf(Color(0xFF667EEA), Color(0xFF764BA2))), + backgroundDisabled = SolidColor(Color.Gray), + backgroundFocused = + Brush.horizontalGradient(colors = listOf(Color(0xFF667EEA), Color(0xFF764BA2))), + backgroundPressed = + Brush.horizontalGradient(colors = listOf(Color(0xFF667EEA), Color(0xFF764BA2))), + backgroundHovered = + Brush.horizontalGradient(colors = listOf(Color(0xFF667EEA), Color(0xFF764BA2))), + content = Color.White, + contentDisabled = Color.Gray, + contentFocused = Color.White, + contentPressed = Color.White, + contentHovered = Color.White, + ), + metrics = JewelTheme.badgeStyle.metrics, + ), + ) + } + + GroupHeader("Rounded Corners") + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + Badge( + text = "2dp", + style = + BadgeStyle( + colors = JewelTheme.badgeStyle.colors, + metrics = + BadgeMetrics( + cornerSize = CornerSize(2.dp), + padding = JewelTheme.badgeStyle.metrics.padding, + minSize = JewelTheme.badgeStyle.metrics.minSize, + ), + ), + ) + + Badge( + text = "4dp", + style = + BadgeStyle( + colors = JewelTheme.badgeStyle.colors, + metrics = + BadgeMetrics( + cornerSize = CornerSize(4.dp), + padding = JewelTheme.badgeStyle.metrics.padding, + minSize = JewelTheme.badgeStyle.metrics.minSize, + ), + ), + ) + + Badge( + text = "8dp", + style = + BadgeStyle( + colors = JewelTheme.badgeStyle.colors, + metrics = + BadgeMetrics( + cornerSize = CornerSize(8.dp), + padding = JewelTheme.badgeStyle.metrics.padding, + minSize = JewelTheme.badgeStyle.metrics.minSize, + ), + ), + ) + + Badge( + text = "Pill", + style = + BadgeStyle( + colors = JewelTheme.badgeStyle.colors, + metrics = + BadgeMetrics( + cornerSize = CornerSize(100), + padding = JewelTheme.badgeStyle.metrics.padding, + minSize = JewelTheme.badgeStyle.metrics.minSize, + ), + ), + ) + } + } + } +} diff --git a/platform/jewel/samples/showcase/src/main/kotlin/org/jetbrains/jewel/samples/showcase/views/ComponentsViewModel.kt b/platform/jewel/samples/showcase/src/main/kotlin/org/jetbrains/jewel/samples/showcase/views/ComponentsViewModel.kt index a904e30cb26af..6803802b803ad 100644 --- a/platform/jewel/samples/showcase/src/main/kotlin/org/jetbrains/jewel/samples/showcase/views/ComponentsViewModel.kt +++ b/platform/jewel/samples/showcase/src/main/kotlin/org/jetbrains/jewel/samples/showcase/views/ComponentsViewModel.kt @@ -8,6 +8,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshots.SnapshotStateList import org.jetbrains.jewel.samples.showcase.ShowcaseIcons +import org.jetbrains.jewel.samples.showcase.components.Badges import org.jetbrains.jewel.samples.showcase.components.Banners import org.jetbrains.jewel.samples.showcase.components.Borders import org.jetbrains.jewel.samples.showcase.components.BrushesShowcase @@ -96,6 +97,7 @@ public class ComponentsViewModel( ) }, ), + ViewInfo(title = "Badges", iconKey = ShowcaseIcons.Components.badge, content = { Badges() }), ViewInfo(title = "Banners", iconKey = ShowcaseIcons.Components.banners, content = { Banners() }), ViewInfo( title = "Typography", diff --git a/platform/jewel/samples/showcase/src/main/resources/icons/components/badge.svg b/platform/jewel/samples/showcase/src/main/resources/icons/components/badge.svg new file mode 100644 index 0000000000000..48b281fe3a4ca --- /dev/null +++ b/platform/jewel/samples/showcase/src/main/resources/icons/components/badge.svg @@ -0,0 +1,4 @@ + + + + diff --git a/platform/jewel/samples/showcase/src/main/resources/icons/components/badge_dark.svg b/platform/jewel/samples/showcase/src/main/resources/icons/components/badge_dark.svg new file mode 100644 index 0000000000000..6615fd7b0ff25 --- /dev/null +++ b/platform/jewel/samples/showcase/src/main/resources/icons/components/badge_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/platform/jewel/ui-tests/src/test/kotlin/org/jetbrains/jewel/ui/component/BadgeUiTest.kt b/platform/jewel/ui-tests/src/test/kotlin/org/jetbrains/jewel/ui/component/BadgeUiTest.kt new file mode 100644 index 0000000000000..8c4c24d2ea851 --- /dev/null +++ b/platform/jewel/ui-tests/src/test/kotlin/org/jetbrains/jewel/ui/component/BadgeUiTest.kt @@ -0,0 +1,208 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package org.jetbrains.jewel.ui.component + +import androidx.compose.foundation.shape.CornerSize +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.semantics.Role +import androidx.compose.ui.semantics.SemanticsProperties +import androidx.compose.ui.test.SemanticsMatcher +import androidx.compose.ui.test.assert +import androidx.compose.ui.test.assertHasClickAction +import androidx.compose.ui.test.assertHasNoClickAction +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertIsEnabled +import androidx.compose.ui.test.assertIsNotEnabled +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.compose.ui.unit.dp +import kotlin.test.assertFalse +import kotlin.test.assertTrue +import org.jetbrains.jewel.foundation.theme.JewelTheme +import org.jetbrains.jewel.intui.standalone.theme.IntUiTheme +import org.jetbrains.jewel.ui.component.styling.BadgeColors +import org.jetbrains.jewel.ui.component.styling.BadgeMetrics +import org.jetbrains.jewel.ui.component.styling.BadgeStyle +import org.jetbrains.jewel.ui.theme.badgeStyle +import org.junit.Rule +import org.junit.Test + +class BadgeUiTest { + @get:Rule val rule = createComposeRule() + + @Test + fun `should render badge with text`() { + rule.setContent { IntUiTheme { Badge("New") } } + + rule.onNodeWithText("New").assertExists().assertIsDisplayed() + } + + @Test + fun `should apply provided modifier correctly`() { + rule.setContent { IntUiTheme { Badge("Beta", modifier = Modifier.testTag("badge-tag")) } } + + rule.onNodeWithText("Beta").assertExists() + rule.onNodeWithTag("badge-tag").assertExists() + } + + @Test + fun `non-clickable badge should not have click action`() { + rule.setContent { IntUiTheme { Badge("New", onClick = null) } } + + rule.onNodeWithText("New").assertHasNoClickAction() + } + + @Test + fun `non-clickable badge should not have button role`() { + rule.setContent { IntUiTheme { Badge("New") } } + + val node = rule.onNodeWithText("New") + node.assertExists() + + val hasRole = node.fetchSemanticsNode().config.contains(SemanticsProperties.Role) + assertFalse(hasRole, "Non-clickable badge should not have a button role") + } + + @Test + fun `clickable badge should have click action`() { + rule.setContent { IntUiTheme { Badge("New", onClick = {}) } } + + rule.onNodeWithText("New").assertHasClickAction() + } + + @Test + fun `clickable badge should have button role`() { + rule.setContent { IntUiTheme { Badge("New", onClick = {}) } } + + rule.onNodeWithText("New").assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Button)) + } + + @Test + fun `clicking badge should trigger onClick`() { + var clicked = false + rule.setContent { IntUiTheme { Badge("New", onClick = { clicked = true }) } } + + assertFalse(clicked, "Badge should not be clicked initially") + + rule.onNodeWithText("New").performClick() + rule.waitForIdle() + + assertTrue(clicked, "Badge onClick should have been triggered") + } + + @Test + fun `enabled badge should be enabled`() { + rule.setContent { IntUiTheme { Badge("New", onClick = {}, enabled = true) } } + + rule.onNodeWithText("New").assertIsEnabled() + } + + @Test + fun `disabled badge should not be enabled`() { + rule.setContent { IntUiTheme { Badge("New", onClick = {}, enabled = false) } } + + rule.onNodeWithText("New").assertIsNotEnabled() + } + + @Test + fun `disabled badge should not trigger onClick`() { + var clicked = false + rule.setContent { IntUiTheme { Badge("New", onClick = { clicked = true }, enabled = false) } } + + rule.onNodeWithText("New").performClick() + rule.waitForIdle() + + assertFalse(clicked, "Disabled badge should not trigger onClick") + } + + @Test + fun `badge should support custom background color`() { + val customGreen = Color(0xFF4CAF50) + rule.setContent { + IntUiTheme { + Badge( + text = "Success", + style = + BadgeStyle( + colors = + BadgeColors( + background = SolidColor(customGreen), + backgroundDisabled = SolidColor(Color.Gray), + backgroundFocused = SolidColor(customGreen), + backgroundPressed = SolidColor(customGreen), + backgroundHovered = SolidColor(customGreen), + content = Color.White, + contentDisabled = Color.Gray, + contentFocused = Color.White, + contentPressed = Color.White, + contentHovered = Color.White, + ), + metrics = JewelTheme.badgeStyle.metrics, + ), + ) + } + } + + rule.onNodeWithText("Success").assertExists().assertIsDisplayed() + } + + @Test + fun `badge should support brush background`() { + rule.setContent { + IntUiTheme { + Badge( + text = "Gradient", + style = + BadgeStyle( + colors = + BadgeColors( + background = Brush.linearGradient(colors = listOf(Color.Blue, Color.Cyan)), + backgroundDisabled = SolidColor(Color.Gray), + backgroundFocused = Brush.linearGradient(colors = listOf(Color.Blue, Color.Cyan)), + backgroundPressed = Brush.linearGradient(colors = listOf(Color.Blue, Color.Cyan)), + backgroundHovered = Brush.linearGradient(colors = listOf(Color.Blue, Color.Cyan)), + content = Color.White, + contentDisabled = Color.Gray, + contentFocused = Color.White, + contentPressed = Color.White, + contentHovered = Color.White, + ), + metrics = JewelTheme.badgeStyle.metrics, + ), + ) + } + } + + rule.onNodeWithText("Gradient").assertExists().assertIsDisplayed() + } + + @Test + fun `badge should support custom corner radius via metrics`() { + rule.setContent { + IntUiTheme { + Badge( + text = "Rounded", + style = + BadgeStyle( + colors = JewelTheme.badgeStyle.colors, + metrics = + BadgeMetrics( + cornerSize = CornerSize(8.dp), + padding = JewelTheme.badgeStyle.metrics.padding, + minSize = JewelTheme.badgeStyle.metrics.minSize, + ), + ), + modifier = Modifier.testTag("rounded-badge"), + ) + } + } + + rule.onNodeWithTag("rounded-badge").assertExists().assertIsDisplayed() + rule.onNodeWithText("Rounded").assertExists() + } +} diff --git a/platform/jewel/ui/api-dump.txt b/platform/jewel/ui/api-dump.txt index 30483656ee0d1..c514f7a538b84 100644 --- a/platform/jewel/ui/api-dump.txt +++ b/platform/jewel/ui/api-dump.txt @@ -12,10 +12,12 @@ f:org.jetbrains.jewel.ui.ComponentStyling$Companion f:org.jetbrains.jewel.ui.DefaultComponentStyling - org.jetbrains.jewel.ui.ComponentStyling - sf:$stable:I +- (org.jetbrains.jewel.ui.component.styling.BadgeStyle,org.jetbrains.jewel.ui.component.styling.CheckboxStyle,org.jetbrains.jewel.ui.component.styling.ChipStyle,org.jetbrains.jewel.ui.component.styling.CircularProgressStyle,org.jetbrains.jewel.ui.component.styling.DefaultBannerStyles,org.jetbrains.jewel.ui.component.styling.ComboBoxStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.DividerStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.GroupHeaderStyle,org.jetbrains.jewel.ui.component.styling.HorizontalProgressBarStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.InlineBannerStyles,org.jetbrains.jewel.ui.component.styling.LazyTreeStyle,org.jetbrains.jewel.ui.component.styling.LinkStyle,org.jetbrains.jewel.ui.component.styling.MenuStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.PopupContainerStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.RadioButtonStyle,org.jetbrains.jewel.ui.component.styling.ScrollbarStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlButtonStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlStyle,org.jetbrains.jewel.ui.component.styling.SelectableLazyColumnStyle,org.jetbrains.jewel.ui.component.styling.SimpleListItemStyle,org.jetbrains.jewel.ui.component.styling.SliderStyle,org.jetbrains.jewel.ui.component.styling.TextAreaStyle,org.jetbrains.jewel.ui.component.styling.TextFieldStyle,org.jetbrains.jewel.ui.component.styling.TooltipStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.SpeedSearchStyle,org.jetbrains.jewel.ui.component.styling.SearchMatchStyle):V - b:(org.jetbrains.jewel.ui.component.styling.CheckboxStyle,org.jetbrains.jewel.ui.component.styling.ChipStyle,org.jetbrains.jewel.ui.component.styling.CircularProgressStyle,org.jetbrains.jewel.ui.component.styling.DefaultBannerStyles,org.jetbrains.jewel.ui.component.styling.ComboBoxStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.DividerStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.GroupHeaderStyle,org.jetbrains.jewel.ui.component.styling.HorizontalProgressBarStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.InlineBannerStyles,org.jetbrains.jewel.ui.component.styling.LazyTreeStyle,org.jetbrains.jewel.ui.component.styling.LinkStyle,org.jetbrains.jewel.ui.component.styling.MenuStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.PopupContainerStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.RadioButtonStyle,org.jetbrains.jewel.ui.component.styling.ScrollbarStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlButtonStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlStyle,org.jetbrains.jewel.ui.component.styling.SelectableLazyColumnStyle,org.jetbrains.jewel.ui.component.styling.SimpleListItemStyle,org.jetbrains.jewel.ui.component.styling.SliderStyle,org.jetbrains.jewel.ui.component.styling.TextAreaStyle,org.jetbrains.jewel.ui.component.styling.TextFieldStyle,org.jetbrains.jewel.ui.component.styling.TooltipStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle):V -- (org.jetbrains.jewel.ui.component.styling.CheckboxStyle,org.jetbrains.jewel.ui.component.styling.ChipStyle,org.jetbrains.jewel.ui.component.styling.CircularProgressStyle,org.jetbrains.jewel.ui.component.styling.DefaultBannerStyles,org.jetbrains.jewel.ui.component.styling.ComboBoxStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.DividerStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.GroupHeaderStyle,org.jetbrains.jewel.ui.component.styling.HorizontalProgressBarStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.InlineBannerStyles,org.jetbrains.jewel.ui.component.styling.LazyTreeStyle,org.jetbrains.jewel.ui.component.styling.LinkStyle,org.jetbrains.jewel.ui.component.styling.MenuStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.PopupContainerStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.RadioButtonStyle,org.jetbrains.jewel.ui.component.styling.ScrollbarStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlButtonStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlStyle,org.jetbrains.jewel.ui.component.styling.SelectableLazyColumnStyle,org.jetbrains.jewel.ui.component.styling.SimpleListItemStyle,org.jetbrains.jewel.ui.component.styling.SliderStyle,org.jetbrains.jewel.ui.component.styling.TextAreaStyle,org.jetbrains.jewel.ui.component.styling.TextFieldStyle,org.jetbrains.jewel.ui.component.styling.TooltipStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.SpeedSearchStyle,org.jetbrains.jewel.ui.component.styling.SearchMatchStyle):V +- b:(org.jetbrains.jewel.ui.component.styling.CheckboxStyle,org.jetbrains.jewel.ui.component.styling.ChipStyle,org.jetbrains.jewel.ui.component.styling.CircularProgressStyle,org.jetbrains.jewel.ui.component.styling.DefaultBannerStyles,org.jetbrains.jewel.ui.component.styling.ComboBoxStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.DividerStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.GroupHeaderStyle,org.jetbrains.jewel.ui.component.styling.HorizontalProgressBarStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.InlineBannerStyles,org.jetbrains.jewel.ui.component.styling.LazyTreeStyle,org.jetbrains.jewel.ui.component.styling.LinkStyle,org.jetbrains.jewel.ui.component.styling.MenuStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.PopupContainerStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.RadioButtonStyle,org.jetbrains.jewel.ui.component.styling.ScrollbarStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlButtonStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlStyle,org.jetbrains.jewel.ui.component.styling.SelectableLazyColumnStyle,org.jetbrains.jewel.ui.component.styling.SimpleListItemStyle,org.jetbrains.jewel.ui.component.styling.SliderStyle,org.jetbrains.jewel.ui.component.styling.TextAreaStyle,org.jetbrains.jewel.ui.component.styling.TextFieldStyle,org.jetbrains.jewel.ui.component.styling.TooltipStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.SpeedSearchStyle,org.jetbrains.jewel.ui.component.styling.SearchMatchStyle):V - b:(org.jetbrains.jewel.ui.component.styling.CheckboxStyle,org.jetbrains.jewel.ui.component.styling.ChipStyle,org.jetbrains.jewel.ui.component.styling.CircularProgressStyle,org.jetbrains.jewel.ui.component.styling.DefaultBannerStyles,org.jetbrains.jewel.ui.component.styling.ComboBoxStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.DividerStyle,org.jetbrains.jewel.ui.component.styling.TabStyle,org.jetbrains.jewel.ui.component.styling.GroupHeaderStyle,org.jetbrains.jewel.ui.component.styling.HorizontalProgressBarStyle,org.jetbrains.jewel.ui.component.styling.IconButtonStyle,org.jetbrains.jewel.ui.component.styling.InlineBannerStyles,org.jetbrains.jewel.ui.component.styling.LazyTreeStyle,org.jetbrains.jewel.ui.component.styling.LinkStyle,org.jetbrains.jewel.ui.component.styling.MenuStyle,org.jetbrains.jewel.ui.component.styling.ButtonStyle,org.jetbrains.jewel.ui.component.styling.PopupContainerStyle,org.jetbrains.jewel.ui.component.styling.SplitButtonStyle,org.jetbrains.jewel.ui.component.styling.RadioButtonStyle,org.jetbrains.jewel.ui.component.styling.ScrollbarStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlButtonStyle,org.jetbrains.jewel.ui.component.styling.SegmentedControlStyle,org.jetbrains.jewel.ui.component.styling.SelectableLazyColumnStyle,org.jetbrains.jewel.ui.component.styling.SimpleListItemStyle,org.jetbrains.jewel.ui.component.styling.SliderStyle,org.jetbrains.jewel.ui.component.styling.TextAreaStyle,org.jetbrains.jewel.ui.component.styling.TextFieldStyle,org.jetbrains.jewel.ui.component.styling.TooltipStyle,org.jetbrains.jewel.ui.component.styling.DropdownStyle):V - equals(java.lang.Object):Z +- f:getBadgeStyle():org.jetbrains.jewel.ui.component.styling.BadgeStyle - f:getCheckboxStyle():org.jetbrains.jewel.ui.component.styling.CheckboxStyle - f:getChipStyle():org.jetbrains.jewel.ui.component.styling.ChipStyle - f:getCircularProgressStyle():org.jetbrains.jewel.ui.component.styling.CircularProgressStyle @@ -115,6 +117,36 @@ e:org.jetbrains.jewel.ui.component.AutoHideBehavior - s:getEntries():kotlin.enums.EnumEntries - s:valueOf(java.lang.String):org.jetbrains.jewel.ui.component.AutoHideBehavior - s:values():org.jetbrains.jewel.ui.component.AutoHideBehavior[] +f:org.jetbrains.jewel.ui.component.BadgeKt +- sf:Badge(java.lang.String,androidx.compose.ui.Modifier,kotlin.jvm.functions.Function0,Z,androidx.compose.foundation.interaction.MutableInteractionSource,org.jetbrains.jewel.ui.component.styling.BadgeStyle,androidx.compose.ui.text.TextStyle,androidx.compose.runtime.Composer,I,I):V +f:org.jetbrains.jewel.ui.component.BadgeState +- org.jetbrains.jewel.foundation.state.FocusableComponentState +- sf:Companion:org.jetbrains.jewel.ui.component.BadgeState$Companion +- bsf:box-impl(J):org.jetbrains.jewel.ui.component.BadgeState +- s:constructor-impl(J):J +- sf:copy-pFhIJiE(J,Z,Z,Z,Z,Z):J +- bs:copy-pFhIJiE$default(J,Z,Z,Z,Z,Z,I,java.lang.Object):J +- equals(java.lang.Object):Z +- s:equals-impl(J,java.lang.Object):Z +- sf:equals-impl0(J,J):Z +- f:getState-s-VKNKU():J +- hashCode():I +- s:hashCode-impl(J):I +- isActive():Z +- s:isActive-impl(J):Z +- isEnabled():Z +- s:isEnabled-impl(J):Z +- isFocused():Z +- s:isFocused-impl(J):Z +- isHovered():Z +- s:isHovered-impl(J):Z +- isPressed():Z +- s:isPressed-impl(J):Z +- s:toString-impl(J):java.lang.String +- bf:unbox-impl():J +f:org.jetbrains.jewel.ui.component.BadgeState$Companion +- f:of-pFhIJiE(Z,Z,Z,Z,Z):J +- bs:of-pFhIJiE$default(org.jetbrains.jewel.ui.component.BadgeState$Companion,Z,Z,Z,Z,Z,I,java.lang.Object):J f:org.jetbrains.jewel.ui.component.BannerKt - sf:DefaultErrorBanner(androidx.compose.ui.Modifier,kotlin.jvm.functions.Function2,kotlin.jvm.functions.Function1,kotlin.jvm.functions.Function1,org.jetbrains.jewel.ui.component.styling.DefaultBannerStyle,kotlin.jvm.functions.Function2,androidx.compose.runtime.Composer,I,I):V - sf:DefaultErrorBanner(java.lang.String,androidx.compose.ui.Modifier,kotlin.jvm.functions.Function2,kotlin.jvm.functions.Function1,kotlin.jvm.functions.Function1,org.jetbrains.jewel.ui.component.styling.DefaultBannerStyle,androidx.compose.ui.text.TextStyle,androidx.compose.runtime.Composer,I,I):V @@ -963,6 +995,44 @@ f:org.jetbrains.jewel.ui.component.search.HighlightKt f:org.jetbrains.jewel.ui.component.search.SpeedSearchableComboBoxKt f:org.jetbrains.jewel.ui.component.search.SpeedSearchableLazyColumnKt f:org.jetbrains.jewel.ui.component.search.SpeedSearchableTreeKt +f:org.jetbrains.jewel.ui.component.styling.BadgeColors +- sf:$stable:I +- sf:Companion:org.jetbrains.jewel.ui.component.styling.BadgeColors$Companion +- f:backgroundFor-nFed6Z8(J,androidx.compose.runtime.Composer,I):androidx.compose.runtime.State +- f:contentFor-nFed6Z8(J,androidx.compose.runtime.Composer,I):androidx.compose.runtime.State +- equals(java.lang.Object):Z +- f:getBackground():androidx.compose.ui.graphics.Brush +- f:getBackgroundDisabled():androidx.compose.ui.graphics.Brush +- f:getBackgroundFocused():androidx.compose.ui.graphics.Brush +- f:getBackgroundHovered():androidx.compose.ui.graphics.Brush +- f:getBackgroundPressed():androidx.compose.ui.graphics.Brush +- f:getContent-0d7_KjU():J +- f:getContentDisabled-0d7_KjU():J +- f:getContentFocused-0d7_KjU():J +- f:getContentHovered-0d7_KjU():J +- f:getContentPressed-0d7_KjU():J +- hashCode():I +f:org.jetbrains.jewel.ui.component.styling.BadgeColors$Companion +f:org.jetbrains.jewel.ui.component.styling.BadgeMetrics +- sf:$stable:I +- sf:Companion:org.jetbrains.jewel.ui.component.styling.BadgeMetrics$Companion +- equals(java.lang.Object):Z +- f:getCornerSize():androidx.compose.foundation.shape.CornerSize +- f:getMinSize-MYxV2XQ():J +- f:getPadding():androidx.compose.foundation.layout.PaddingValues +- hashCode():I +f:org.jetbrains.jewel.ui.component.styling.BadgeMetrics$Companion +f:org.jetbrains.jewel.ui.component.styling.BadgeStyle +- sf:$stable:I +- sf:Companion:org.jetbrains.jewel.ui.component.styling.BadgeStyle$Companion +- (org.jetbrains.jewel.ui.component.styling.BadgeColors,org.jetbrains.jewel.ui.component.styling.BadgeMetrics):V +- equals(java.lang.Object):Z +- f:getColors():org.jetbrains.jewel.ui.component.styling.BadgeColors +- f:getMetrics():org.jetbrains.jewel.ui.component.styling.BadgeMetrics +- hashCode():I +f:org.jetbrains.jewel.ui.component.styling.BadgeStyle$Companion +f:org.jetbrains.jewel.ui.component.styling.BadgeStylingKt +- sf:getLocalBadgeStyle():androidx.compose.runtime.ProvidableCompositionLocal f:org.jetbrains.jewel.ui.component.styling.BannerColors - sf:$stable:I - sf:Companion:org.jetbrains.jewel.ui.component.styling.BannerColors$Companion @@ -3943,6 +4013,7 @@ f:org.jetbrains.jewel.ui.painter.hints.StatefulKt f:org.jetbrains.jewel.ui.theme.JewelThemeKt - sf:BaseJewelTheme(org.jetbrains.jewel.foundation.theme.ThemeDefinition,org.jetbrains.jewel.ui.ComponentStyling,kotlin.jvm.functions.Function2,androidx.compose.runtime.Composer,I):V - sf:BaseJewelTheme(org.jetbrains.jewel.foundation.theme.ThemeDefinition,org.jetbrains.jewel.ui.ComponentStyling,Z,kotlin.jvm.functions.Function2,androidx.compose.runtime.Composer,I,I):V +- sf:getBadgeStyle(org.jetbrains.jewel.foundation.theme.JewelTheme$Companion,androidx.compose.runtime.Composer,I):org.jetbrains.jewel.ui.component.styling.BadgeStyle - sf:getCheckboxStyle(org.jetbrains.jewel.foundation.theme.JewelTheme$Companion,androidx.compose.runtime.Composer,I):org.jetbrains.jewel.ui.component.styling.CheckboxStyle - sf:getChipStyle(org.jetbrains.jewel.foundation.theme.JewelTheme$Companion,androidx.compose.runtime.Composer,I):org.jetbrains.jewel.ui.component.styling.ChipStyle - sf:getCircularProgressStyle(org.jetbrains.jewel.foundation.theme.JewelTheme$Companion,androidx.compose.runtime.Composer,I):org.jetbrains.jewel.ui.component.styling.CircularProgressStyle diff --git a/platform/jewel/ui/src/main/kotlin/org/jetbrains/jewel/ui/DefaultComponentStyling.kt b/platform/jewel/ui/src/main/kotlin/org/jetbrains/jewel/ui/DefaultComponentStyling.kt index afb15cc4a2e6e..d89b9a17b0be7 100644 --- a/platform/jewel/ui/src/main/kotlin/org/jetbrains/jewel/ui/DefaultComponentStyling.kt +++ b/platform/jewel/ui/src/main/kotlin/org/jetbrains/jewel/ui/DefaultComponentStyling.kt @@ -8,6 +8,7 @@ import androidx.compose.runtime.Stable import org.jetbrains.jewel.foundation.GenerateDataFunctions import org.jetbrains.jewel.ui.component.ContextMenuRepresentation import org.jetbrains.jewel.ui.component.TextContextMenu +import org.jetbrains.jewel.ui.component.styling.BadgeStyle import org.jetbrains.jewel.ui.component.styling.ButtonStyle import org.jetbrains.jewel.ui.component.styling.CheckboxStyle import org.jetbrains.jewel.ui.component.styling.ChipStyle @@ -22,6 +23,7 @@ import org.jetbrains.jewel.ui.component.styling.IconButtonStyle import org.jetbrains.jewel.ui.component.styling.InlineBannerStyles import org.jetbrains.jewel.ui.component.styling.LazyTreeStyle import org.jetbrains.jewel.ui.component.styling.LinkStyle +import org.jetbrains.jewel.ui.component.styling.LocalBadgeStyle import org.jetbrains.jewel.ui.component.styling.LocalCheckboxStyle import org.jetbrains.jewel.ui.component.styling.LocalChipStyle import org.jetbrains.jewel.ui.component.styling.LocalCircularProgressStyle @@ -73,12 +75,14 @@ import org.jetbrains.jewel.ui.component.styling.TabStyle import org.jetbrains.jewel.ui.component.styling.TextAreaStyle import org.jetbrains.jewel.ui.component.styling.TextFieldStyle import org.jetbrains.jewel.ui.component.styling.TooltipStyle +import org.jetbrains.jewel.ui.component.styling.fallbackBadgeStyle import org.jetbrains.jewel.ui.component.styling.fallbackSearchMatchStyle import org.jetbrains.jewel.ui.component.styling.fallbackSpeedSearchStyle @Stable @GenerateDataFunctions public class DefaultComponentStyling( + public val badgeStyle: BadgeStyle, public val checkboxStyle: CheckboxStyle, public val chipStyle: ChipStyle, public val circularProgressStyle: CircularProgressStyle, @@ -115,6 +119,82 @@ public class DefaultComponentStyling( public val speedSearchStyle: SpeedSearchStyle, public val searchMatchStyle: SearchMatchStyle, ) : ComponentStyling { + @Deprecated("Use the variant with badgeStyle.", level = DeprecationLevel.HIDDEN) + public constructor( + checkboxStyle: CheckboxStyle, + chipStyle: ChipStyle, + circularProgressStyle: CircularProgressStyle, + defaultBannerStyle: DefaultBannerStyles, + comboBoxStyle: ComboBoxStyle, + defaultButtonStyle: ButtonStyle, + defaultDropdownStyle: DropdownStyle, + defaultSplitButtonStyle: SplitButtonStyle, + defaultTabStyle: TabStyle, + dividerStyle: DividerStyle, + editorTabStyle: TabStyle, + groupHeaderStyle: GroupHeaderStyle, + horizontalProgressBarStyle: HorizontalProgressBarStyle, + iconButtonStyle: IconButtonStyle, + transparentIconButtonStyle: IconButtonStyle, + inlineBannerStyle: InlineBannerStyles, + lazyTreeStyle: LazyTreeStyle, + linkStyle: LinkStyle, + menuStyle: MenuStyle, + outlinedButtonStyle: ButtonStyle, + popupContainerStyle: PopupContainerStyle, + outlinedSplitButtonStyle: SplitButtonStyle, + radioButtonStyle: RadioButtonStyle, + scrollbarStyle: ScrollbarStyle, + segmentedControlButtonStyle: SegmentedControlButtonStyle, + segmentedControlStyle: SegmentedControlStyle, + selectableLazyColumnStyle: SelectableLazyColumnStyle, + simpleListItemStyle: SimpleListItemStyle, + sliderStyle: SliderStyle, + textAreaStyle: TextAreaStyle, + textFieldStyle: TextFieldStyle, + tooltipStyle: TooltipStyle, + undecoratedDropdownStyle: DropdownStyle, + speedSearchStyle: SpeedSearchStyle, + searchMatchStyle: SearchMatchStyle, + ) : this( + badgeStyle = fallbackBadgeStyle(), + checkboxStyle, + chipStyle, + circularProgressStyle, + defaultBannerStyle, + comboBoxStyle, + defaultButtonStyle, + defaultDropdownStyle, + defaultSplitButtonStyle, + defaultTabStyle, + dividerStyle, + editorTabStyle, + groupHeaderStyle, + horizontalProgressBarStyle, + iconButtonStyle, + transparentIconButtonStyle, + inlineBannerStyle, + lazyTreeStyle, + linkStyle, + menuStyle, + outlinedButtonStyle, + popupContainerStyle, + outlinedSplitButtonStyle, + radioButtonStyle, + scrollbarStyle, + segmentedControlButtonStyle, + segmentedControlStyle, + selectableLazyColumnStyle, + simpleListItemStyle, + sliderStyle, + textAreaStyle, + textFieldStyle, + tooltipStyle, + undecoratedDropdownStyle, + speedSearchStyle, + searchMatchStyle, + ) + @Deprecated("Use the variant with speedSearchStyle.", level = DeprecationLevel.HIDDEN) public constructor( checkboxStyle: CheckboxStyle, @@ -151,6 +231,7 @@ public class DefaultComponentStyling( tooltipStyle: TooltipStyle, undecoratedDropdownStyle: DropdownStyle, ) : this( + badgeStyle = fallbackBadgeStyle(), checkboxStyle, chipStyle, circularProgressStyle, @@ -223,6 +304,7 @@ public class DefaultComponentStyling( tooltipStyle: TooltipStyle, undecoratedDropdownStyle: DropdownStyle, ) : this( + badgeStyle = fallbackBadgeStyle(), checkboxStyle, chipStyle, circularProgressStyle, @@ -263,6 +345,7 @@ public class DefaultComponentStyling( @Composable override fun styles(): Array> = arrayOf( + LocalBadgeStyle provides badgeStyle, LocalCheckboxStyle provides checkboxStyle, LocalChipStyle provides chipStyle, LocalCircularProgressStyle provides circularProgressStyle, @@ -308,6 +391,7 @@ public class DefaultComponentStyling( other as DefaultComponentStyling + if (badgeStyle != other.badgeStyle) return false if (checkboxStyle != other.checkboxStyle) return false if (chipStyle != other.chipStyle) return false if (circularProgressStyle != other.circularProgressStyle) return false @@ -348,7 +432,8 @@ public class DefaultComponentStyling( } override fun hashCode(): Int { - var result = checkboxStyle.hashCode() + var result = badgeStyle.hashCode() + result = 31 * result + checkboxStyle.hashCode() result = 31 * result + chipStyle.hashCode() result = 31 * result + circularProgressStyle.hashCode() result = 31 * result + defaultBannerStyle.hashCode() @@ -388,6 +473,7 @@ public class DefaultComponentStyling( override fun toString(): String = "DefaultComponentStyling(" + + "badgeStyle=$badgeStyle, " + "checkboxStyle=$checkboxStyle, " + "chipStyle=$chipStyle, " + "circularProgressStyle=$circularProgressStyle, " + diff --git a/platform/jewel/ui/src/main/kotlin/org/jetbrains/jewel/ui/component/Badge.kt b/platform/jewel/ui/src/main/kotlin/org/jetbrains/jewel/ui/component/Badge.kt new file mode 100644 index 0000000000000..735e8d610bf01 --- /dev/null +++ b/platform/jewel/ui/src/main/kotlin/org/jetbrains/jewel/ui/component/Badge.kt @@ -0,0 +1,205 @@ +package org.jetbrains.jewel.ui.component + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.FocusInteraction +import androidx.compose.foundation.interaction.HoverInteraction +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.PressInteraction +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.Immutable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.semantics.Role +import androidx.compose.ui.text.TextStyle +import org.jetbrains.annotations.Nls +import org.jetbrains.jewel.foundation.modifier.thenIf +import org.jetbrains.jewel.foundation.state.CommonStateBitMask.Active +import org.jetbrains.jewel.foundation.state.CommonStateBitMask.Enabled +import org.jetbrains.jewel.foundation.state.CommonStateBitMask.Focused +import org.jetbrains.jewel.foundation.state.CommonStateBitMask.Hovered +import org.jetbrains.jewel.foundation.state.CommonStateBitMask.Pressed +import org.jetbrains.jewel.foundation.state.FocusableComponentState +import org.jetbrains.jewel.foundation.theme.JewelTheme +import org.jetbrains.jewel.foundation.theme.LocalContentColor +import org.jetbrains.jewel.ui.component.styling.BadgeStyle +import org.jetbrains.jewel.ui.focusOutline +import org.jetbrains.jewel.ui.theme.badgeStyle + +/** + * A small, colored badge component used to display promotional text like "New", "Beta", or other short labels. + * + * Badges are compact UI elements with customizable backgrounds and text colors, typically used to highlight features, + * statuses, or promotional messages. They can be either static (non-clickable) or interactive (clickable). + * + * By default, badges have square corners. To add rounded corners, provide a custom [BadgeStyle] with modified metrics: + * ```kotlin + * Badge( + * text = "New", + * style = BadgeStyle( + * colors = JewelTheme.badgeStyle.colors, + * metrics = BadgeMetrics( + * cornerSize = CornerSize(4.dp), + * padding = JewelTheme.badgeStyle.metrics.padding, + * minSize = JewelTheme.badgeStyle.metrics.minSize + * ) + * ) + * ) + * ``` + * + * **Usage example:** + * [`Badges.kt`](https://github.com/JetBrains/intellij-community/blob/master/platform/jewel/samples/showcase/src/main/kotlin/org/jetbrains/jewel/samples/showcase/components/Badges.kt) + * + * @param text The text to display in the badge (e.g., "New", "Beta"). + * @param modifier [Modifier] to be applied to the badge. + * @param onClick Optional click handler. When provided, the badge becomes clickable. When null, the badge is static. + * @param enabled Controls the enabled state of the badge. When false, the badge appears dimmed and is not clickable. + * @param interactionSource An optional [MutableInteractionSource] for observing and emitting interactions for this + * badge. Use this to observe state changes or customize interaction handling. + * @param style The visual styling configuration for the badge. Defaults to the theme's badge style. + * @param textStyle The typography style to be applied to the badge's text content. + */ +@Composable +public fun Badge( + @Nls text: String, + modifier: Modifier = Modifier, + onClick: (() -> Unit)? = null, + enabled: Boolean = true, + interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, + style: BadgeStyle = JewelTheme.badgeStyle, + textStyle: TextStyle = JewelTheme.defaultTextStyle, +) { + BadgeImpl( + text = text, + modifier = modifier, + onClick = onClick, + enabled = enabled, + interactionSource = interactionSource, + style = style, + textStyle = textStyle, + ) +} + +@Composable +internal fun BadgeImpl( + @Nls text: String, + modifier: Modifier = Modifier, + onClick: (() -> Unit)? = null, + enabled: Boolean = true, + interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, + style: BadgeStyle = JewelTheme.badgeStyle, + textStyle: TextStyle = JewelTheme.defaultTextStyle, +) { + val colors = style.colors + val metrics = style.metrics + val shape = RoundedCornerShape(metrics.cornerSize) + + var badgeState by remember(interactionSource) { mutableStateOf(BadgeState.of(enabled = enabled)) } + + remember(enabled) { badgeState = badgeState.copy(enabled = enabled) } + + LaunchedEffect(interactionSource) { + interactionSource.interactions.collect { interaction -> + when (interaction) { + is PressInteraction.Press -> badgeState = badgeState.copy(pressed = true) + is PressInteraction.Cancel, + is PressInteraction.Release -> badgeState = badgeState.copy(pressed = false) + is HoverInteraction.Enter -> badgeState = badgeState.copy(hovered = true) + is HoverInteraction.Exit -> badgeState = badgeState.copy(hovered = false) + is FocusInteraction.Focus -> badgeState = badgeState.copy(focused = true) + is FocusInteraction.Unfocus -> badgeState = badgeState.copy(focused = false) + } + } + } + + val backgroundColor by colors.backgroundFor(badgeState) + val contentColor by colors.contentFor(badgeState) + + Row( + modifier = + modifier + .thenIf(onClick != null) { + clickable( + onClick = onClick ?: {}, + enabled = enabled, + role = Role.Button, + interactionSource = interactionSource, + indication = null, + ) + } + .defaultMinSize(metrics.minSize.width, metrics.minSize.height) + .background(backgroundColor, shape) + .focusOutline(badgeState, shape) + .padding(metrics.padding), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center, + ) { + CompositionLocalProvider(LocalContentColor provides contentColor) { Text(text = text, style = textStyle) } + } +} + +/** + * Represents the visual state of a [Badge](org.jetbrains.jewel.ui.component.Badge). + * + * This is an immutable state object that tracks whether the badge is enabled, focused, hovered, pressed, and active. + * + * @property state The underlying state value as a ULong bit mask. + */ +@Immutable +@JvmInline +public value class BadgeState(public val state: ULong) : FocusableComponentState { + override val isActive: Boolean + get() = state and Active != 0UL + + override val isEnabled: Boolean + get() = state and Enabled != 0UL + + override val isFocused: Boolean + get() = state and Focused != 0UL + + override val isHovered: Boolean + get() = state and Hovered != 0UL + + override val isPressed: Boolean + get() = state and Pressed != 0UL + + public fun copy( + enabled: Boolean = isEnabled, + focused: Boolean = isFocused, + hovered: Boolean = isHovered, + pressed: Boolean = isPressed, + active: Boolean = isActive, + ): BadgeState = of(enabled = enabled, focused = focused, hovered = hovered, pressed = pressed, active = active) + + override fun toString(): String = + "BadgeState(isEnabled=$isEnabled, isFocused=$isFocused, isHovered=$isHovered, " + + "isPressed=$isPressed, isActive=$isActive)" + + public companion object { + public fun of( + enabled: Boolean = true, + focused: Boolean = false, + hovered: Boolean = false, + pressed: Boolean = false, + active: Boolean = false, + ): BadgeState = + BadgeState( + (if (enabled) Enabled else 0UL) or + (if (focused) Focused else 0UL) or + (if (hovered) Hovered else 0UL) or + (if (pressed) Pressed else 0UL) or + (if (active) Active else 0UL) + ) + } +} diff --git a/platform/jewel/ui/src/main/kotlin/org/jetbrains/jewel/ui/component/styling/BadgeStyling.kt b/platform/jewel/ui/src/main/kotlin/org/jetbrains/jewel/ui/component/styling/BadgeStyling.kt new file mode 100644 index 0000000000000..77266eb5eff36 --- /dev/null +++ b/platform/jewel/ui/src/main/kotlin/org/jetbrains/jewel/ui/component/styling/BadgeStyling.kt @@ -0,0 +1,193 @@ +package org.jetbrains.jewel.ui.component.styling + +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.shape.CornerSize +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Immutable +import androidx.compose.runtime.ProvidableCompositionLocal +import androidx.compose.runtime.State +import androidx.compose.runtime.rememberUpdatedState +import androidx.compose.runtime.staticCompositionLocalOf +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.unit.DpSize +import androidx.compose.ui.unit.dp +import org.jetbrains.jewel.foundation.GenerateDataFunctions +import org.jetbrains.jewel.ui.component.BadgeState + +@Immutable +@GenerateDataFunctions +public class BadgeStyle(public val colors: BadgeColors, public val metrics: BadgeMetrics) { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as BadgeStyle + + if (colors != other.colors) return false + if (metrics != other.metrics) return false + + return true + } + + override fun hashCode(): Int { + var result = colors.hashCode() + result = 31 * result + metrics.hashCode() + return result + } + + override fun toString(): String = "BadgeStyle(colors=$colors, metrics=$metrics)" + + public companion object +} + +@Immutable +@GenerateDataFunctions +public class BadgeColors( + public val background: Brush, + public val backgroundDisabled: Brush, + public val backgroundFocused: Brush, + public val backgroundPressed: Brush, + public val backgroundHovered: Brush, + public val content: Color, + public val contentDisabled: Color, + public val contentFocused: Color, + public val contentPressed: Color, + public val contentHovered: Color, +) { + + @Composable + public fun backgroundFor(state: BadgeState): State = + rememberUpdatedState( + when { + !state.isEnabled -> backgroundDisabled + state.isPressed -> backgroundPressed + state.isFocused -> backgroundFocused + state.isHovered -> backgroundHovered + else -> background + } + ) + + @Composable + public fun contentFor(state: BadgeState): State = + rememberUpdatedState( + when { + !state.isEnabled -> contentDisabled + state.isPressed -> contentPressed + state.isFocused -> contentFocused + state.isHovered -> contentHovered + else -> content + } + ) + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as BadgeColors + + if (background != other.background) return false + if (backgroundDisabled != other.backgroundDisabled) return false + if (backgroundFocused != other.backgroundFocused) return false + if (backgroundPressed != other.backgroundPressed) return false + if (backgroundHovered != other.backgroundHovered) return false + if (content != other.content) return false + if (contentDisabled != other.contentDisabled) return false + if (contentFocused != other.contentFocused) return false + if (contentPressed != other.contentPressed) return false + if (contentHovered != other.contentHovered) return false + + return true + } + + override fun hashCode(): Int { + var result = background.hashCode() + result = 31 * result + backgroundDisabled.hashCode() + result = 31 * result + backgroundFocused.hashCode() + result = 31 * result + backgroundPressed.hashCode() + result = 31 * result + backgroundHovered.hashCode() + result = 31 * result + content.hashCode() + result = 31 * result + contentDisabled.hashCode() + result = 31 * result + contentFocused.hashCode() + result = 31 * result + contentPressed.hashCode() + result = 31 * result + contentHovered.hashCode() + return result + } + + override fun toString(): String = + "BadgeColors(" + + "background=$background, " + + "backgroundDisabled=$backgroundDisabled, " + + "backgroundFocused=$backgroundFocused, " + + "backgroundPressed=$backgroundPressed, " + + "backgroundHovered=$backgroundHovered, " + + "content=$content, " + + "contentDisabled=$contentDisabled, " + + "contentFocused=$contentFocused, " + + "contentPressed=$contentPressed, " + + "contentHovered=$contentHovered" + + ")" + + public companion object +} + +@Immutable +@GenerateDataFunctions +public class BadgeMetrics( + public val cornerSize: CornerSize, + public val padding: PaddingValues, + public val minSize: DpSize, +) { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as BadgeMetrics + + if (cornerSize != other.cornerSize) return false + if (padding != other.padding) return false + if (minSize != other.minSize) return false + + return true + } + + override fun hashCode(): Int { + var result = cornerSize.hashCode() + result = 31 * result + padding.hashCode() + result = 31 * result + minSize.hashCode() + return result + } + + override fun toString(): String = "BadgeMetrics(cornerSize=$cornerSize, padding=$padding, minSize=$minSize)" + + public companion object +} + +public val LocalBadgeStyle: ProvidableCompositionLocal = staticCompositionLocalOf { + error("No BadgeStyle provided. Have you forgotten the theme?") +} + +/** Creating fallback style for compatibility with older versions. */ +internal fun fallbackBadgeStyle() = + BadgeStyle( + colors = + BadgeColors( + background = SolidColor(Color(0xFF3574F0)), + backgroundDisabled = SolidColor(Color(0xFFEBECF0)), + backgroundFocused = SolidColor(Color(0xFF4682FA)), + backgroundPressed = SolidColor(Color(0xFF588CF3)), + backgroundHovered = SolidColor(Color(0xFF4682FA)), + content = Color(0xFFFFFFFF), + contentDisabled = Color(0xFFA8ADBD), + contentFocused = Color(0xFFFFFFFF), + contentPressed = Color(0xFFFFFFFF), + contentHovered = Color(0xFFFFFFFF), + ), + metrics = + BadgeMetrics( + cornerSize = CornerSize(0.dp), + padding = PaddingValues(horizontal = 6.dp, vertical = 2.dp), + minSize = DpSize(32.dp, 18.dp), + ), + ) diff --git a/platform/jewel/ui/src/main/kotlin/org/jetbrains/jewel/ui/theme/JewelTheme.kt b/platform/jewel/ui/src/main/kotlin/org/jetbrains/jewel/ui/theme/JewelTheme.kt index edfd99fbc3e6c..cba8d026a7c68 100644 --- a/platform/jewel/ui/src/main/kotlin/org/jetbrains/jewel/ui/theme/JewelTheme.kt +++ b/platform/jewel/ui/src/main/kotlin/org/jetbrains/jewel/ui/theme/JewelTheme.kt @@ -17,6 +17,7 @@ import org.jetbrains.jewel.foundation.theme.ThemeColorPalette import org.jetbrains.jewel.foundation.theme.ThemeDefinition import org.jetbrains.jewel.foundation.theme.ThemeIconData import org.jetbrains.jewel.ui.ComponentStyling +import org.jetbrains.jewel.ui.component.styling.BadgeStyle import org.jetbrains.jewel.ui.component.styling.ButtonStyle import org.jetbrains.jewel.ui.component.styling.CheckboxStyle import org.jetbrains.jewel.ui.component.styling.ChipStyle @@ -31,6 +32,7 @@ import org.jetbrains.jewel.ui.component.styling.IconButtonStyle import org.jetbrains.jewel.ui.component.styling.InlineBannerStyles import org.jetbrains.jewel.ui.component.styling.LazyTreeStyle import org.jetbrains.jewel.ui.component.styling.LinkStyle +import org.jetbrains.jewel.ui.component.styling.LocalBadgeStyle import org.jetbrains.jewel.ui.component.styling.LocalCheckboxStyle import org.jetbrains.jewel.ui.component.styling.LocalChipStyle import org.jetbrains.jewel.ui.component.styling.LocalCircularProgressStyle @@ -107,6 +109,9 @@ public val JewelTheme.Companion.defaultSplitButtonStyle: SplitButtonStyle public val JewelTheme.Companion.outlinedSplitButtonStyle: SplitButtonStyle @Composable @ReadOnlyComposable get() = LocalOutlinedSplitButtonStyle.current +public val JewelTheme.Companion.badgeStyle: BadgeStyle + @Composable @ReadOnlyComposable get() = LocalBadgeStyle.current + public val JewelTheme.Companion.checkboxStyle: CheckboxStyle @Composable @ReadOnlyComposable get() = LocalCheckboxStyle.current