platform/jewel/RELEASE NOTES.md
| Min supported IJP versions | Compose Multiplatform version |
|---|---|
| 2025.3.3, 2026.1.1 | 1.10.0 |
SlimButton, which has both DefaultSlimButton and OutlinedSlimButton styles (#3360)SelectableLazyColumn selecting items on click and on initial focus even when SelectionMode.None was set (#3446)| Min supported IJP versions | Compose Multiplatform version |
|---|---|
| 2025.3.3, 2026.1 EAP | 1.10.0 |
mimeType: MimeType? parameter name from FencedCodeBlock class was changed to language: String?, which takes the raw string for the code block language identifier. This won't introduce binary nor behavioural changes since MimeType is a value class that is seen as String? by the compiler (#3171)PopupAd component, PopupAdStyle theming, and adContent parameter to PopupContainer and Menu components (#3358)TextAreas (#3391)displayName wasn't returning the correct display name for mime types that also defined a role (#3171)MimeType value class has been deprecated, along with all of its functions, variables and extensions (#3171)CodeHighlighter.highlight(code: String, mimeType: MimeType?) has been deprecated. Please use highlight(code: String, language: String) (#3171)| Min supported IJP versions | Compose Multiplatform version |
|---|---|
| 2025.3.2, 2026.1 EAP | 1.10.0-rc01 |
Last release of 2025, with plenty of fixes and new features. See you in 2026! 👋
FlowRow with Images instead of inlines in Text (#3285)
width, widthIn, fillMaxWidth, weight, ...)DynamicBundle API to support loading string from resources in standaloneComboBox padding values to better match Swing (#3290)ImageSourceResolver.default, which allows setting the resolver capabilities (e.g., external URIs, .jar resources, and local images), as well as whether to log resolve issues (#3292)@Nls annotations for better IJPL tooling support (#3292)EmbeddedToInlineCssStyleSvgPatchHint painter hint to support rendering SVG files with embedded CSS class selectors exported from vector graphics editors (#3335)
EmbeddedToInlineCssStyleSvgPatchHint documentation and the PRTabStrip scrollbar to better align with Swing's (#3289)
TabStrip now only shows the scrollbar when the container is hoveredListComboBox to now visually match Swing when the list is empty (#3290)*SplitButtons where the chevron would get squashed if the button wasn't wide enough to fit both the main and secondary content*SplitButtons where the divider height was limited, and would not grow with the button's height if it gets taller than the minimum height*Button colours in standalone, especially in the disabled state, to realign them with Swing*SplitButtons to be the same as in Swing*SplitButtons being applied to the wrong level, causing all sorts of unexpected behaviour (e.g., if you set a height, the button's visual height would not grow)TextField and TextArea styling (#3334)
SelectionContainer has no selection
BasicTextField context menu would not show a Paste action when it should
BasicTextFields context menusonGloballyPositioned when the popup container (Swing JDialog, or IJP's JBPopup) gets dismissedScrollingSynchronizer#scrollToLine is now marked as non-extendable (@ApiStatus.NonExtendable), in favor of new methods ScrollingSynchronizer#scrollToCoordinate and ScrollingSynchronizer#findYCoordinateToScroll (#3287)| Min supported IJP versions | Compose Multiplatform version |
|---|---|
| 2025.3, (2026.1) | 1.10.0-alpha01 |
Hotfix release for an issue introduced by CMP 1.10.0-alpha01.
BasicTextField context menu would not show a Paste action when it should
| Min supported IJP versions | Compose Multiplatform version |
|---|---|
| 2025.3, (2026.1) | 1.10.0-alpha01 |
This is a small release, not too much going on. But we still shipped a big improvement to Markdown rendering, which now supports some basic HTML too!
intellij.libraries.compose.foundation.desktop module and into the intellij.libraries.compose.runtime.desktop module
plugin.xml dependenciesbundledModule dependency entry until the plugin includes it in the composeUI helperSpeedSearchableComboBox component that supports speed search (#3250)
SpeedSearchArea and has a similar syntax to a normal ListComboBoxh1..6, b/strong, i/em, s/strike/del, p, br, code, pre, ol/ul/li, a, img, table/th/tr/td| Min supported IJP versions | Compose Multiplatform version |
|---|---|
| 2025.2.4, 2025.3 EAP | 1.9.0 |
SpeedSearchArea container to provide speed search functionality
SelectableLazyColumn (in (#3214)) and Tree (in (#3242)) componentsComboBoxes are not yet supported, but should be in 0.32SpeedSearchMatcher.patternMatcher()SpeedSearchMatcher.substringMatcher()SpeedSearchMatcher to provide your own matching logicPopupMenu variant that takes a PopupPositionProvider as parameter (#3202)LazyListState.visibleItemsRange and SelectableLazyListState.visibleItemsRange methods that were returning one more item than they should have (#3214)ComboBox.padding, TabbedPane.tabInsets, and SpeedSearch.borderInsets from the LaF (#3235)SimpleListItem's semantics to ensure screen readers will read the content description from the children elements (#3227)SelectableLazyColumn's semantics to ensure screen readers will read the content description from the children elements (#3227)SelectableLazyColumn's semantics to ensure screen readers will read the selected/unselected state of items correctly (#3227)
Chip component's appearance in the IDE (#3239)dismissOnClickOutside = false for custom native popups in standalone (#3208)ListComboBoxes were not making focused entries fully visible on keyboard navigation (#3237)ListComboBoxes not closing when pressing enter (#3237)ListComboBoxes scrolling to only move by one item at a time, to match Swing implementations (#3237)ListComboBox to properly scroll to ensure the selected item is visible when first opening the popup (#3243)ListComboBox to properly reset the scroll position when the popup is dismissed (#3234)instanceUuid in standalone themes and could cause crashing at startup (#3216)SelectableLazyColumn overload that does not accept an interactionSource as parameter (#3214)| Supported IJP versions | Compose Multiplatform version |
|---|---|
| 2025.2.2+, 2025.1.5+ | 1.9.0-beta03 |
ApiStatus annotation (#3136)
6d9016a)renderImagesContent renamed to renderImageContent (singular) (#3145)JewelToolWindowNoThemeComposePanel and composeForToolWindowWithoutTheme APIs — they were identical to the non-ToolWindow variants (#3143)Indication has been set to a no-op implementation in both standalone and bridge, instead of the previous default implementation we inherited from Compose (#3161)
Indication API, and as such this would only cause visual issues when using certain modifiers (e.g., selectable)ComboBox overload has changed in a breaking way by reordering its parameters (#3161)*.render Markdown renderer APIs have been renamed and have lost the onTextClick parameter (non-breaking change) (#3162)
onTextClickMarkdown and LazyMarkdown composables have lost the onTextClick parameter (non-breaking change) (#3162)ImageRendererExtension.renderImagesContent was renamed to renderImageContent (singular "image") in a breaking manner (#3162)GitHubTableBlockRenderer has been made private (#3162)LocalMessageResourceResolverProvider was not marked as experimental, but should have. This has been rectified (#3191)JewelTheme.instanceUuid and LocalThemeInstanceUuid are now stable (#3193)161c8f7)62c5e21)IconButtons with a transparent background (#3129)
IconButton and set its style to the new JewelTheme.transparentIconButtonStyleDefault*Banner and Inline*Banner components with support for automatically hiding the overflowing actions into a dropdown menu (#3124)JewelFlagsJDialog and requires one of the following conditions to work:
compose.interop.blending system property;Panel.background to a transparent value;Brush.cssLinearGradient() API that allows you to create CSS-like linear gradients (#3121)
src/main/resources folder and reference them directly. For example, to display my-logo.png located in src/main/resources/images/, you would write:  (#3145)warning and disabledSelected colors to TextColors (#3144)InlineMarkdownRenderer to help you create an inline Markdown renderer (#3156)Modifier.outline() (#3161)InfoText component to easily show info-styled text (#3172)ScrollableState parameter, that can be used with all lazy containers, as well as non-lazy containers that want to own their scroll modifier (#3166)JewelBuild.apiVersionString property (#3179)Image composable that uses Jewel's IconKey-based icon loading pipeline to safely load non-icon images in both standalone and bridge modes (#3180)ScrollState-based scrollable containers that allows users to disable scrolling entirely (#3168)liga feature, now we also toggle calt.Link not updating its state correctly (hovering, clicking, focusing, etc.) when it is disabled and re-enabled (#3128)Popup implementation where you needed two clicks to open the popups a second time (#3131)
TextColors.info not being properly set in Darcula (#3144)
AccessibleContext when inspecting Jewel UI (#3142)Button.arc LaF key (#3147)BasicLazyTree where the item background state was not properly remembered (#3161)ListComboBox where changing the itemKeys parameter value would not be picked up by the component until it exited and re-entered the composition (#3161)CircularProgressIndicator where changing the frameRetriever parameter value would not be picked up by the component until it exited and re-entered the composition (#3161)PopupMenu was over-remembering some internal state (#3161)AlwaysVisible reserving space for the scrollbar even when the content is smaller than the viewport and the scrollbar is not visible (#3158)SimpleListItem colours in standalone and bridge (#3160)ListComboBox items (#3160)ArrayIndexOutOfBoundsException in ListComboBox when passing an out-of-bounds selected index (#3184)LocalCodeHighlighter and NoOpCodeHighlighterLocalPopupRendererui module's POM (#3195)
plugin.xml dependencies for the Markdown styling modules — both standalone and bridge (#3197)Banner APIs that had a composable slot for the actions. Migrate to the versions with linkActions and iconActions parameters (#3124)Menu.kt that were left public by mistake so they can be made private as they should, in the future (#3161)LazyListState- and LazyGridState-based APIs for scrollable containers as they can be trivially migrated to the new ScrollableState-based APIs (#3166)MarkdownBlockRenderer.render APIs in favour of the new APIs with better naming, and no onTextClick parameter (#3162)Markdown and LazyMarkdown overloads with the onTextClick parameter (#3162)LocalMenuManager as MenuManager is also deprecated (#3193)| Supported IJP versions | Compose Multiplatform version |
|---|---|
| 2025.2.1+, 2025.1.4.1+ | 1.8.2 |
JBPopup. You can enable this feature via the new
JewelFlags API (may take effect only after a recomposition), but we do not recommend doing so
yet (#3105)
Popup component, such as tooltips and menus, will render in separate native windows.com.jetbrains.intellij.platform:icons
instead. (#3097)Tooltip component auto-hide behavior to match Swing (auto-hide after 10 seconds). To restore the previous
behaviour, please use the AutoHideBehavior.Never option in the style. (#3085)Typography APIs have changed. The new way to access typography is via JewelTheme.typography instead of directly accessing
the (now deprecated) Typography object. The [...].ui.component.Typography API is deprecated and should be replaced by JewelTheme.typography.
Automatic replacement is provided. (#3073)compose { } API for IJ bridge users to easily inject Compose UI in a Swing layout. It is an alias for the
existing JewelComposePanel. We also provide composeWithoutTheme { }, an alias for
JewelComposeNoThemePanel. (#3099)JBPopup API for Popups, Tooltips and Menus. This allows popups to grow larger than, and go outside the
composable area, if needed (#3105)TabStrip with left/right
arrows (#3016)ContextMenuItemOption API to provide icons and shortcut data (a hint and the actual keystroke) to menu
items (#3091)MarkdownProcessor (#3054)ExternalLink, like the Swing
equivalents (#3105)intellij.platform.compose.markdown module to include all Markdown dependencies, including extensions
(bad53dd9)TextField and TextArea to show placeholders (if they have
any) (#3111)Tooltip delay duration when appearing and disappearing to better match the
IDE (#3029)ThemeColorPalette with IJ themes that have no palette
defined (#3015)iconClass parameter defaults for *IconActionButton to use
iconKey.iconClass (#3046)MarkdownMode.EditorPreview (#3051)TabStrip component (#3066)TextStyle line height being too short in bridge (#3064)SegmentedControlButton in bridge to align with specs and
Swing (#3103)ComboBoxes (#3106)Modifier.onHover and
Modifier.onMove (#3116)reverseLayout behaviour for non-lazy ScrollableContainer
variants (#3118)MenuManager is now deprecated. You should use MenuController or BaseMenuController. This new interface now handles shortcut key
presses (#3091)Tooltip composable with an AutoHideBehavior argument was deprecated; please use the version without it, and set the behavior
in the
style parameter instead (#3085)org.jetbrains.jewel.ui.component.Typography and related API have been deprecated, please migrate usages to
org.jetbrains.jewel.ui.Typography and JewelTheme.typography (#3073)ColorFilter.Companion.disabled() was deprecated. Avoid using this function and use the disabledAppearance() modifier instead to
make something look disabled (#3094)| Supported IJP versions | Compose Multiplatform version |
|---|---|
| 2025.2 EAP1+, 2025.1.1+, 2024.3.6+ | 1.8.0-alpha04 |
[!IMPORTANT] Jewel 0.28 is the first Jewel version to be published since the migration into the IJP codebase. Users of the library are expected to use the bundled dependencies when running in the IJP, and the Maven artefacts for running in non-IJP scenarios (standalone).
A sample setup using the IJP Gradle plugin is available here. If you need to support IJP 243.5 or lower, you'll need to use the bridge Maven artefacts. An example is available in that repository's
243-and-251-compatbranch.
Starting from Jewel 0.28, artefacts are published to Maven Central. It is no longer necessary to add a custom repository to your project to access
Jewel artefacts. You can remove the https://packages.jetbrains.team/maven/p/kpm/public repository from your builds.
Artefact IDs are also changing, removing the -[ijpVersion] suffixes. Now, the target IJP version is included in the version number. The new version
format is: [jewelVersion]-[ijpBuild]. The jewelVersion tells you that a certain set of features and APIs are available, and the ijpBuild tells
you which IJP build this was derived from. For example, 0.28-243.15667 means that the artifact contains the Jewel 0.28 features and APIs, and was
built from the IJP 243.15567 build. From the ijpBuild you can derive two pieces of information; the first is that this artefact is targeting IJP
243, and the second is that it is guaranteed to work for 243 builds with ID >= 15567.
As mentioned in the Jewel readme, if you're building a purely non-IJP app with Jewel, it's always recommended to use the version with the highest
jewelVersion and ijpBuilds, as to get the latest version of Jewel with all the features supported in standalone mode. If, however, you are using
the standalone artefacts in conjunction with bridge artefacts, you must always use the same version of the standalone and bridge artefacts to avoid
incompatibilities. An example use case is using standalone artefacts in UI unit tests to avoid having to spin up the entire IJ platform, which can
cause flakiness and obscure issues in UI tests.
[!NOTE] For standalone projects, until [JEWEL-821] is resolved, you'll need to add a custom repository to your build, in order to let Gradle find the custom-built
skiko-awt-runtime-alldependency:kotlinmaven("https://cache-redirector.jetbrains.com/intellij-dependencies")You will also need to add the required transitive dependencies that have erroneously marked as runtime in the POMs. For example, for
int-ui-standalone, you need to add:tomljewel-ui = { module = "org.jetbrains.jewel:jewel-ui", version.ref = "jewel" } jewel-foundation = { module = "org.jetbrains.jewel:jewel-foundation", version.ref = "jewel" } kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" } skiko-awt = { module = "org.jetbrains.skiko:skiko-awt", version = "0.9.2" }
Artefacts with the same jewelVersion number are generally binary and source compatible with each other across IJP versions, with the exception of
deprecated and scheduled-for-removal APIs, which can be removed in newer versions.
Jewel APIs marked as experimental can change at any time and no guarantees are made on their binary and source compatibility. We'll try to minimise these changes as much as possible, but by using these APIs you acknowledge there might be disruptions. APIs marked as internal must never be used by clients and are subject to change at any point without notice, and no compatibility guarantees of any kind are made about them.
Dependency Updates: Key dependencies have been updated, including Compose to 1.8.0-alpha04 and Gradle to 8.13. (#2927, #2992)
New Features & Improvements:
ListComboBox component family expanded with EditableComboBox and generic variants. Includes fixes for selection clearing and popup closing
behavior. (#2965, #2952)GroupHeader. (#719)SplitButton component. (#2909)Notable Bug Fixes:
SelectableLazyColumn. (#2905, #723)DecoratedWindow behavior on Windows. (#2920)Link. (#2942)toggleKeySelection. (#2900)TooltipMetrics delay. (#3011)extension module and package to extensions. Renamed Alert class to
GitHubAlert. (#2995)ListComboBox internals (behavior should be consistent, but internal structure
changed). (#2912, #715)Dropdown component; use ListComboBox instead. (#2911)thenIf modifier function from ui to foundation module. (#2923)ListComboBox variants; older stateful ones may be deprecated
later. (#2955)KeyActions. (#3014)Please refer to the releases page on the (archived) Jewel repository.