Jewel UI
Implement UI with Jewel by first selecting the runtime context, then applying the correct theme wrapper, then using Jewel components and icon APIs.
Quick Snippets
Standalone:
IntUiTheme(isDark = false) {
App()
}
IntelliJ plugin:
SwingBridgeTheme {
App()
}
Icon loading:
object MyIcons {
val Settings = PathIconKey("icons/settings.svg", MyIcons::class.java)
}
Icon(key = MyIcons.Settings, contentDescription = "Settings")
Classify Runtime Context
Decide runtime before writing code:
- •IntelliJ Platform plugin: use the Swing bridge (
SwingBridgeTheme) and IntelliJ bundled modules. - •Standalone Compose Desktop app: use
IntUiThemeand standalone Jewel dependencies.
If context is unclear, inspect build files and imports first:
- •
org.jetbrains.jewel.bridge.theme.SwingBridgeThemeimplies plugin context. - •
org.jetbrains.jewel.intui.standalone.theme.IntUiThemeimplies standalone context.
Use STANDALONE-VS-BRIDGE.md for dependency and wrapper snippets.
Apply Theming Correctly
Use the simplest valid theme API first:
- •Standalone quick start:
IntUiTheme(isDark = ...). - •Standalone advanced:
IntUiTheme(theme = ..., styling = ..., swingCompatMode = ...). - •IntelliJ plugin:
SwingBridgeTheme { ... }.
When implementing custom standalone themes:
- •Build
ThemeDefinitionviaJewelTheme.lightThemeDefinition(...)orJewelTheme.darkThemeDefinition(...). - •Override text styles using
JewelTheme.createDefaultTextStyle()andJewelTheme.createEditorTextStyle(). - •Pass composed styling through
ComponentStyling.default().with(...)(or specialized style builders). - •Prefer public API packages; avoid internal/experimental APIs unless explicitly required.
Use THEMING.md for concrete patterns. Use THEMING-COLORS.md for color-palette and semantic-color guidance. Use TYPOGRAPHY.md for text-style guidance and when-to-use rules.
Build UI With Jewel Components
Prefer Jewel components from org.jetbrains.jewel.ui.component over Material equivalents.
When converting existing UI:
- •Keep layout containers from Compose where appropriate.
- •Replace controls with Jewel controls (
Button,TextField,Checkbox,Tabs, etc.). - •Keep style access through Jewel theme locals and component styling APIs instead of hardcoded colors.
Use local samples as source-of-truth examples:
Use LAYOUT-PATTERNS.md for composition archetypes extracted from those sample apps. Use COMPONENTS-CATALOG.md for component-by-component catalog guidance.
Load Icons The Jewel Way
Use IconKey-based loading for portability across standalone and bridge:
- •Use
PathIconKey(path, iconClass)when icon path is the same across old/new UI. - •Use
IntelliJIconKey(oldUiPath, newUiPath, iconClass)when paths differ. - •Use
Icon(key = ..., contentDescription = ...)orImage(iconKey = ...)instead of deprecated rawpainterResource. - •Use
AllIconsKeysfor IntelliJ platform icons.
When using AllIconsKeys in standalone apps, ensure IntelliJ icons are on classpath (recommended: com.jetbrains.intellij.platform:icons).
Use PainterHint only when stateful/dynamic path or runtime icon patching behavior is required.
Use ICONS.md for icon patterns and pitfalls.
Source Permalinks
When citing source in responses, prefer master links for always-latest behavior:
- •README.md (standalone, bridge, icons)
- •standalone sample main
- •Icon API (
Iconcomposable) - •Icon key types
- •IntUiTheme implementation
Version Discipline
Treat this skill as Jewel-version scoped.
- •Ask for target Jewel version and target IntelliJ Platform version when not specified.
- •Validate compatibility against Jewel release notes.
- •Prefer APIs available in the target version; avoid suggesting newer APIs without stating the minimum version.
- •If publishing a version-pinned variant of this skill, replace
masterlinks with release-tag links.
Implementation Checklist
Before finishing:
- •Confirm context-specific theme wrapper is correct (
IntUiThemevsSwingBridgeTheme). - •Confirm icon code uses
IconKeyand classpath-friendly resource resolution. - •Confirm dependencies match context.
- •Confirm no unnecessary Material dependency is introduced in standalone flows.
- •Confirm code compiles with current module and imports.
Related Skill
For deep Compose-in-Swing integration flows (tool windows, ComposePanel wrappers, compositing flags, AWT bridging), use jewel-swing-interop.