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.
Converted and distributed by TomeVault — claim your Tome and manage your conversions.