Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ internal fun createBridgeComponentStyling(theme: ThemeDefinition): ComponentStyl
menuStyle = menuStyle,
outlinedButtonStyle = readOutlinedButtonStyle(),
outlinedSplitButtonStyle = readOutlinedSplitButtonStyle(),
popupAdTextStyle = readPopupAdTextStyle(),
popupContainerStyle = readPopupContainerStyle(),
radioButtonStyle = readRadioButtonStyle(),
scrollbarStyle = readScrollbarStyle(theme.isDark),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package org.jetbrains.jewel.bridge.theme

import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.ui.graphics.takeOrElse
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.intellij.ui.NewUiValue
import com.intellij.util.ui.JBUI
import org.jetbrains.jewel.bridge.retrieveColorOrUnspecified
import org.jetbrains.jewel.bridge.retrieveInsetsAsPaddingValuesOrNull
import org.jetbrains.jewel.bridge.toComposeColor
import org.jetbrains.jewel.ui.component.styling.PopupAdTextColors
import org.jetbrains.jewel.ui.component.styling.PopupAdTextMetrics
import org.jetbrains.jewel.ui.component.styling.PopupAdTextStyle

internal fun readPopupAdTextStyle(): PopupAdTextStyle {
// Get colors from LaF following JBUI.CurrentTheme.Advertiser pattern
// Uses Popup.Advertiser.* keys with fallback to SearchEverywhere.Advertiser.*
val foregroundColor =
retrieveColorOrUnspecified("Popup.Advertiser.foreground").takeOrElse {
retrieveColorOrUnspecified("SearchEverywhere.Advertiser.foreground").takeOrElse {
JBUI.CurrentTheme.Advertiser.foreground().toComposeColor()
}
}

val backgroundColor =
retrieveColorOrUnspecified("Popup.Advertiser.background").takeOrElse {
retrieveColorOrUnspecified("SearchEverywhere.Advertiser.background").takeOrElse {
JBUI.CurrentTheme.Advertiser.background().toComposeColor()
}
}

val colors = PopupAdTextColors(foreground = foregroundColor, background = backgroundColor)

// Get border insets from LaF following JBUI.CurrentTheme.Advertiser.borderInsets() pattern
// For new UI: insets(6, 20), for legacy UI: insets(5, 10, 5, 15)
val borderInsets =
retrieveInsetsAsPaddingValuesOrNull("Popup.Advertiser.borderInsets")
?: if (NewUiValue.isEnabled()) {
// New UI default
PaddingValues(horizontal = 20.dp, vertical = 6.dp)
} else {
// Legacy UI default
PaddingValues(start = 10.dp, top = 5.dp, end = 15.dp, bottom = 5.dp)
}

// Get font size offset from LaF following JBUI.CurrentTheme.Advertiser.FONT_SIZE_OFFSET
// Default is -2 (making font slightly smaller)
val fontSizeOffset = uiDefaults["Popup.Advertiser.fontSizeOffset"] as? Int ?: -2

val baseFontSize = uiDefaults.getFont("Label.font")?.size ?: 13
val fontSize = (baseFontSize + fontSizeOffset).coerceAtLeast(9)

val metrics = PopupAdTextMetrics(padding = borderInsets, minHeight = 20.dp, spacerHeight = 4.dp)

val textStyle = TextStyle(fontSize = fontSize.sp, fontFamily = FontFamily.Default)

return PopupAdTextStyle(colors = colors, metrics = metrics, textStyle = textStyle)
}
21 changes: 19 additions & 2 deletions platform/jewel/int-ui/int-ui-standalone/api-dump.txt

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// 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.intui.standalone.styling

import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import org.jetbrains.jewel.intui.core.theme.IntUiDarkTheme
import org.jetbrains.jewel.ui.component.styling.PopupAdTextColors
import org.jetbrains.jewel.ui.component.styling.PopupAdTextMetrics
import org.jetbrains.jewel.ui.component.styling.PopupAdTextStyle

public fun PopupAdTextStyle.Companion.light(
colors: PopupAdTextColors = PopupAdTextColors.light(),
metrics: PopupAdTextMetrics = PopupAdTextMetrics.light(),
textStyle: TextStyle = TextStyle(fontSize = 11.sp),
): PopupAdTextStyle = PopupAdTextStyle(colors = colors, metrics = metrics, textStyle = textStyle)

public fun PopupAdTextColors.Companion.light(
foreground: Color = Color.Gray,
background: Color = Color(0xFFF2F2F2),
): PopupAdTextColors = PopupAdTextColors(foreground = foreground, background = background)

public fun PopupAdTextMetrics.Companion.light(
padding: PaddingValues = PaddingValues(horizontal = 20.dp, vertical = 6.dp),
minHeight: Dp = 20.dp,
spacerHeight: Dp = 4.dp,
): PopupAdTextMetrics = PopupAdTextMetrics(padding = padding, minHeight = minHeight, spacerHeight = spacerHeight)

public fun PopupAdTextStyle.Companion.dark(
colors: PopupAdTextColors = PopupAdTextColors.dark(),
metrics: PopupAdTextMetrics = PopupAdTextMetrics.dark(),
textStyle: TextStyle = TextStyle(fontSize = 11.sp),
): PopupAdTextStyle = PopupAdTextStyle(colors = colors, metrics = metrics, textStyle = textStyle)

public fun PopupAdTextColors.Companion.dark(
foreground: Color = Color.LightGray,
background: Color = IntUiDarkTheme.colors.grayOrNull(2) ?: Color(0xFF2B2B2B),
): PopupAdTextColors = PopupAdTextColors(foreground = foreground, background = background)

public fun PopupAdTextMetrics.Companion.dark(
padding: PaddingValues = PaddingValues(horizontal = 20.dp, vertical = 6.dp),
minHeight: Dp = 20.dp,
spacerHeight: Dp = 4.dp,
): PopupAdTextMetrics = PopupAdTextMetrics(padding = padding, minHeight = minHeight, spacerHeight = spacerHeight)
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ 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.MenuStyle
import org.jetbrains.jewel.ui.component.styling.PopupAdTextStyle
import org.jetbrains.jewel.ui.component.styling.PopupContainerStyle
import org.jetbrains.jewel.ui.component.styling.RadioButtonStyle
import org.jetbrains.jewel.ui.component.styling.ScrollbarStyle
Expand Down Expand Up @@ -263,6 +264,7 @@ public fun ComponentStyling.dark(
linkStyle: LinkStyle = LinkStyle.dark(),
menuStyle: MenuStyle = MenuStyle.dark(),
outlinedButtonStyle: ButtonStyle = ButtonStyle.Outlined.dark(),
popupAdTextStyle: PopupAdTextStyle = PopupAdTextStyle.dark(),
popupContainerStyle: PopupContainerStyle = PopupContainerStyle.dark(),
outlinedSplitButtonStyle: SplitButtonStyle = SplitButtonStyle.Outlined.dark(),
radioButtonStyle: RadioButtonStyle = RadioButtonStyle.dark(),
Expand Down Expand Up @@ -300,6 +302,85 @@ public fun ComponentStyling.dark(
linkStyle = linkStyle,
menuStyle = menuStyle,
outlinedButtonStyle = outlinedButtonStyle,
popupAdTextStyle = popupAdTextStyle,
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 popupAdTextStyle.", 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(
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,
popupAdTextStyle = PopupAdTextStyle.dark(),
popupContainerStyle = popupContainerStyle,
outlinedSplitButtonStyle = outlinedSplitButtonStyle,
radioButtonStyle = radioButtonStyle,
Expand Down Expand Up @@ -375,6 +456,7 @@ public fun ComponentStyling.dark(
linkStyle = linkStyle,
menuStyle = menuStyle,
outlinedButtonStyle = outlinedButtonStyle,
popupAdTextStyle = PopupAdTextStyle.dark(),
popupContainerStyle = popupContainerStyle,
outlinedSplitButtonStyle = outlinedSplitButtonStyle,
radioButtonStyle = radioButtonStyle,
Expand Down Expand Up @@ -449,6 +531,7 @@ public fun ComponentStyling.dark(
linkStyle = linkStyle,
menuStyle = menuStyle,
outlinedButtonStyle = outlinedButtonStyle,
popupAdTextStyle = PopupAdTextStyle.dark(),
popupContainerStyle = popupContainerStyle,
outlinedSplitButtonStyle = outlinedSplitButtonStyle,
radioButtonStyle = radioButtonStyle,
Expand All @@ -467,6 +550,85 @@ public fun ComponentStyling.dark(
)

@Suppress("UnusedReceiverParameter")
public fun ComponentStyling.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(),
popupAdTextStyle: PopupAdTextStyle = PopupAdTextStyle.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(
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,
popupAdTextStyle = popupAdTextStyle,
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 popupAdTextStyle.", level = DeprecationLevel.HIDDEN)
public fun ComponentStyling.light(
checkboxStyle: CheckboxStyle = CheckboxStyle.light(),
chipStyle: ChipStyle = ChipStyle.light(),
Expand Down Expand Up @@ -525,6 +687,7 @@ public fun ComponentStyling.light(
linkStyle = linkStyle,
menuStyle = menuStyle,
outlinedButtonStyle = outlinedButtonStyle,
popupAdTextStyle = PopupAdTextStyle.light(),
popupContainerStyle = popupContainerStyle,
outlinedSplitButtonStyle = outlinedSplitButtonStyle,
radioButtonStyle = radioButtonStyle,
Expand Down Expand Up @@ -600,6 +763,7 @@ public fun ComponentStyling.light(
linkStyle = linkStyle,
menuStyle = menuStyle,
outlinedButtonStyle = outlinedButtonStyle,
popupAdTextStyle = PopupAdTextStyle.light(),
popupContainerStyle = popupContainerStyle,
outlinedSplitButtonStyle = outlinedSplitButtonStyle,
radioButtonStyle = radioButtonStyle,
Expand Down Expand Up @@ -674,6 +838,7 @@ public fun ComponentStyling.light(
linkStyle = linkStyle,
menuStyle = menuStyle,
outlinedButtonStyle = outlinedButtonStyle,
popupAdTextStyle = PopupAdTextStyle.light(),
popupContainerStyle = popupContainerStyle,
outlinedSplitButtonStyle = outlinedSplitButtonStyle,
radioButtonStyle = radioButtonStyle,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,9 @@ public fun ComboBoxes(modifier: Modifier = Modifier) {
GroupHeader("Editable list combo box")
EditableListComboBoxes()

GroupHeader("Editable list combo box with ad text")
EditableListComboBoxesWithAdText()

GroupHeader("Custom combo box content")
CustomComboBoxes()

Expand Down Expand Up @@ -247,6 +250,25 @@ private fun EditableListComboBoxes() {
}
}

@Composable
private fun EditableListComboBoxesWithAdText() {
FlowRow(horizontalArrangement = Arrangement.spacedBy(8.dp), verticalArrangement = Arrangement.spacedBy(8.dp)) {
Column(Modifier.weight(1f).widthIn(min = 125.dp), verticalArrangement = Arrangement.spacedBy(8.dp)) {
Text("Ad text example")
var selectedIndex by remember { mutableIntStateOf(0) }
InfoText(text = "Editable combo box with hints")

EditableListComboBox(
items = listOf("Focused", "Balance", "Creative"),
adText = "Balance between the number of code suggestions and error filtration",
selectedIndex = selectedIndex,
onSelectedItemChange = { index -> selectedIndex = index },
modifier = Modifier.widthIn(max = 200.dp).fillMaxWidth(),
)
}
}
}

@Composable
private fun CustomComboBoxes() {
FlowRow(horizontalArrangement = Arrangement.spacedBy(8.dp), verticalArrangement = Arrangement.spacedBy(8.dp)) {
Expand Down
Loading
Loading