본문으로 건너뛰기
cccskills
무료GitHub에 공개한국어 소개

jewel-ui

Jewel 테마와 컴포넌트로 데스크톱 Compose UI를 구성하는 방법을 안내합니다. IntelliJ 플러그인과 독립 앱에 맞는 테마를 고르고, 화면에 맞는 컨트롤과 아이콘을 선택하며 플랫폼 로직을 컴포저블 밖에 둡니다.

원문원문 설명 보기

Build UI with Jewel components and themes.

JetBrains/intellij-community스타 20,685(GitHub 20,685 + cccskills 0)

실행 점수 미검증

설치 방법 보기

이럴 때 유용합니다

  • Jewel로 데스크톱 UI 만들기
  • 플러그인과 독립 앱의 테마 고르기
  • 화면에 맞는 컴포넌트와 아이콘 선택

한국어 소개

할 수 있는 일

이 스킬은 Jewel의 테마, 컴포넌트, 레이아웃, 아이콘, 타이포그래피를 사용해 Compose UI를 구현하는 방법을 안내합니다. 먼저 실행 환경이 IntelliJ 플러그인인지 독립 Compose Desktop 앱인지 구분하고, 각각에 맞는 SwingBridgeTheme 또는 IntUiTheme를 선택합니다. 버튼, 선택 컨트롤, 입력 필드 등은 상호작용에 맞춰 고르고, 색상과 크기는 테마에서 가져오는 방법을 설명합니다. 아이콘을 불러오는 방식, 사용자 정의 테마, 화면을 작은 컴포저블로 나누는 방법도 다룹니다. IntelliJ Platform의 상태와 서비스는 컴포저블 밖에 두고, 상태를 UI에 전달하며 이벤트는 콜백으로 돌려주는 구성을 안내합니다.

이럴 때 유용합니다

IntelliJ 스타일의 데스크톱 화면을 만들거나, 플러그인과 독립 앱 중 실행 환경에 맞는 테마를 선택하거나, 화면에 어울리는 Jewel 컴포넌트와 아이콘을 확인할 때 유용합니다.

사용 예시

  • “독립 앱에 Jewel 테마와 버튼을 사용한 화면을 만들어 주세요.”
  • “IntelliJ 플러그인 안의 Compose UI에 맞는 테마를 골라 주세요.”
  • “이 설정 화면에 어울리는 Jewel 입력 컴포넌트를 추천해 주세요.”

주의 사항

Jewel은 글꼴과 렌더링을 완전하게 처리하려면 JetBrains Runtime이 필요합니다. Compose와 Swing을 임베드하는 방법은 이 스킬의 범위가 아닙니다. ToolWindow 또는 ComposePanel 설정이 주된 작업이라면 jewel-swing-interop을 사용합니다.

이 소개문은 공개된 SKILL.md를 바탕으로 AI(OpenAI Codex)가 작성했습니다. 정확한 사양은 아래 원문을 확인하세요.

문서 점검

AI가 SKILL.md의 내용에서 주의가 필요한 작업과 도입 전제를 확인했습니다. 점수는 실제로 실행한 결과(실행 검증)만으로 매깁니다.

안전성전송·삭제·명령 실행 등을 명시하고 있는가
A양호IntelliJ Platform API 접근은 컴포저블 밖에서 처리하도록 명시합니다.
도입의 용이성필요한 도구나 API 키가 적고 적혀 있는가
B일부 부족플러그인과 독립 앱의 설정이 다르고 JetBrains Runtime이 필요합니다.

점수에는 넣지 않았습니다. 2026년 10월 28일 기준으로 AI(OpenAI Codex)가 판정했습니다. 참고용이므로 설치 전에 원문도 확인해 주세요.

평가가 다르다고 생각되면 재검토를 요청하기

어느 항목이 왜 다르다고 생각하는지 적어 주세요. 로그인은 필요 없습니다. SKILL.md와 대조해 평가를 다시 만들고 이곳에 반영합니다.

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

포함된 파일(12)

  • SKILL.md13.2 KB
  • evals/evals.json2.3 KB
  • references/COMPONENT-SELECTION.md12.8 KB
  • references/COMPONENTS-CATALOG.md5.4 KB
  • references/ICONS.md3.8 KB
  • references/LABEL-RULES.md3.0 KB
  • references/LAYOUT-PATTERNS.md3.6 KB
  • references/STANDALONE-VS-BRIDGE.md2.1 KB
  • references/THEMING-COLORS.md3.5 KB
  • references/THEMING.md2.7 KB
  • references/TYPOGRAPHY.md3.4 KB
  • skill-source.json1.1 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

<!-- Generated by community/.ai/render-guides.mjs; edit community/.agents/skills/jewel-ui/SKILL.md -->

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")

Decorated window (standalone, custom title bar):

IntUiTheme(
    theme = themeDefinition,
    styling = ComponentStyling.default().decoratedWindow(
        titleBarStyle = TitleBarStyle.light(),
    ),
) {
    DecoratedWindow(onCloseRequest = ::exitApplication) {
        TitleBar { /* title bar content */ }
        App()
    }
}

Customize the title bar (colors, metrics, and fullscreen-control handling) by passing TitleBarStyle to ComponentStyling.default().decoratedWindow(...), not through IntUiTheme(isDark = ...) alone.

Scope Boundary

This skill covers Jewel's theme wrappers, components, layout, icons, and typography — the Compose side of the UI. It does not cover Compose-in-Swing embedding mechanics. If the user's question is primarily about:

  • Registering ToolWindowFactory / ToolWindow content
  • Instantiating ComposePanel or wiring setContent
  • plugin.xml tool window extensions
  • enableNewSwingCompositing and related compositing/AWT flags
  • LocalComponent and Swing ↔ Compose bidirectional integration

…the correct response is to name jewel-swing-interop explicitly as the skill for that work and stop. Do not walk through ToolWindowFactory / ComposePanel / plugin.xml setup here, even if you know how. You can still state that content inside the ComposePanel must use SwingBridgeTheme (a theming concern, in scope), and defer the rest to jewel-swing-interop.

Classify Runtime Context

Decide runtime before writing code:

  1. IntelliJ Platform plugin: use the Swing bridge (SwingBridgeTheme) and IntelliJ bundled modules.
  2. Standalone Compose Desktop app: use IntUiTheme and standalone Jewel dependencies.

For agent-generated desktop UI prototypes, prefer a Jewel/desktop preview or sandbox when one is available. Choose Material-style mobile previews only deliberately for mobile/Android-targeting prototypes or when the user explicitly wants a mobile device-frame preview; Material styling is not the general desktop default.

If context is unclear, inspect build files and imports first:

  • org.jetbrains.jewel.bridge.theme.SwingBridgeTheme implies plugin context.
  • org.jetbrains.jewel.intui.standalone.theme.IntUiTheme implies standalone context.

Use STANDALONE-VS-BRIDGE.md for dependency and wrapper snippets.

Keep IntelliJ Platform APIs Out Of Composition

Do not leak or access IntelliJ Platform APIs (IJPL) directly or indirectly inside Jewel/Compose composition. Composables must render explicit state and emit events; IntelliJ Platform interaction belongs at the presenter, controller, service, or action boundary.

Avoid calling or indirectly reaching from composition into platform services, application state, registry, action system, project model, PSI, VFS, message bus, disposables, or other platform-owned mutable/thread-bound APIs. This protects recomposition stability, preview/test isolation, and compatibility across IntelliJ Platform updates.

Preferred pattern:

  1. Platform boundary reads/writes IntelliJ state and owns threading/lifecycle concerns.
  2. The boundary maps that platform state into stable UI state for the composable.
  3. Composable renders the state and invokes callbacks.
  4. Boundary handles callbacks and performs platform work outside composition.

If direct or indirect platform access from composition is unavoidable, pass an injected collaborator as a parameter or composition-local dependency that tests can replace with a fake. Keep the collaborator surface minimal and exclude platform objects from stable UI state. Manage threading, read/write actions, disposables, and Compose stability explicitly.

Apply Theming Correctly

Use the simplest valid theme API first:

  1. Standalone quick start: IntUiTheme(isDark = ...).
  2. For advanced standalone configuration, call IntUiTheme(theme = ..., styling = ..., swingCompatMode = ...).
  3. IntelliJ plugin: SwingBridgeTheme { ... }.

When implementing custom standalone themes:

  1. Build ThemeDefinition via JewelTheme.lightThemeDefinition(...) or JewelTheme.darkThemeDefinition(...).
  2. Override text styles using JewelTheme.createDefaultTextStyle() and JewelTheme.createEditorTextStyle().
  3. Pass composed styling through ComponentStyling.default().with(...) (or specialized style builders).
  4. 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.

Key Theme-Derived Caches By Theme State

Do not key remember only by JewelTheme.name, a LaF name, or another human-readable label when the cached value is derived from theme data. Colours, metrics, typography, icon data, and Swing defaults can change while the visible theme name stays the same.

Prefer the narrowest correct key:

  1. If the calculation is cheap, skip remember.
  2. If the cached value depends on concrete values, key by those concrete values, such as colours, text styles, metrics, shortcut text, or strings.
  3. If the cached value depends on broad Jewel theme or LaF environment state that is not practical to enumerate, key by JewelTheme.instanceUuid.

Use JewelTheme.instanceUuid as an invalidation token for theme-instance changes, not as a blanket replacement for precise keys. Avoid JewelTheme.name as a proxy for theme state.

Pick the Right Component

Before writing component code, check COMPONENT-SELECTION.md for the when-to-use rule. Jewel implements the JetBrains IntelliJ Platform UI Guidelines — those guidelines constrain which control fits a given interaction, not just which APIs exist.

Most common decisions:

  1. Mutually exclusive pick from 2–4 options → RadioButtonRow under a GroupHeader (label ends with :). Do not use three DefaultButtons.
  2. For multi-select of independent boolean options, use a group of CheckboxRow controls, and use ThreeStateCheckbox for a "select all" parent.
  3. Pick from 5+ options, long labels, or less-frequent setting → ListComboBox / ComboBox.
  4. Use DefaultButton for the primary action in a form or dialog and OutlinedButton for secondary or cancel actions. Never place two DefaultButton controls side by side.
  5. Icon-only buttons → wrap in a Tooltip carrying the action name + keyboard shortcut. Every icon-only control needs one.
  6. Text input → TextField for one-line; TextArea for multi-line / newline-valid content (commit messages, descriptions, code).

Use COMPONENT-SELECTION.md for the full decision tables and LABEL-RULES.md for label-writing conventions.

Build UI With Jewel Components

Use Jewel components from org.jetbrains.jewel.ui.component for IntelliJ-styled UI.

  1. Use Compose layout containers (Row, Column, Box) for composition.
  2. Use Jewel controls (DefaultButton, OutlinedButton, TextField, Checkbox, Tabs, etc.) for interactive primitives.
  3. Access colors and metrics through Jewel theme locals and component styling APIs instead of hardcoded values.

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.

Keep Composables Small And Navigable

Treat composables like any other production code: keep them clean, clear, and as small as practical. Avoid huge composables with deep nesting and mixed responsibilities. Extract sub-composables when a branch, section, row, toolbar, footer, popup, or repeated layout block has a distinct purpose.

Organize files so readers can follow the UI top-down: put public entry-point composables near the top, then the private sub-composables they call in usage order. Keep helper functions, constants, and state-holder glue close to the code that uses them unless project conventions say otherwise.

Reusable composables are APIs. Give public or cross-file reusable composables KDoc that states their purpose, key parameters, slot expectations, and any non-obvious behavior. For high-level API design, use the AndroidX Compose guidance as a reference, adapted for Desktop/Jewel rather than Android-only APIs:

Do not copy those guidelines wholesale into this skill; link to the source so the guidance stays current.

Load Icons The Jewel Way

Use IconKey-based loading for portability across standalone and bridge:

  1. Use PathIconKey(path, iconClass) when icon path is the same across old/new UI.
  2. Use IntelliJIconKey(oldUiPath, newUiPath, iconClass) when paths differ.
  3. Use Icon(key = ..., contentDescription = ...) or Image(iconKey = ...) instead of deprecated raw painterResource.
  4. Use AllIconsKeys for IntelliJ platform icons.

When using AllIconsKeys in standalone apps, make sure IntelliJ icons are on the classpath (recommended: com.jetbrains.intellij.platform:icons).

Use PainterHint only when you need stateful or dynamic paths or runtime icon patching behavior.

When debugging icon-not-found errors, confirm runtime context (standalone vs plugin) before recommending a fix — AllIconsKeys availability and classpath layout differ between the two. Ask the user if context is not clear from the question.

Use ICONS.md for icon patterns and pitfalls.

Source Permalinks

When citing source in responses, prefer master links for always-latest behavior:

Version Discipline

Treat this skill as Jewel-version scoped.

  1. When version matters, check build files (libs.versions.toml, build.gradle.kts) first; ask only if ambiguous.
  2. Validate compatibility against Jewel release notes.
  3. Prefer APIs available in the target version; avoid suggesting newer APIs without stating the minimum version.
  4. If publishing a version-pinned variant of this skill, replace master links with release-tag links.

Implementation Checklist

Before finishing:

  1. Confirm context-specific theme wrapper is correct (IntUiTheme vs SwingBridgeTheme).
  2. Confirm icon code uses IconKey and classpath-friendly resource resolution.
  3. Confirm dependencies match context.
  4. Confirm no unnecessary Material dependency is introduced in standalone flows.
  5. Confirm code compiles with current module and imports.
  6. Confirm composables do not directly or indirectly access IntelliJ Platform APIs; platform interaction stays at the presenter/controller boundary or behind a tiny injected fakeable collaborator.
  7. Confirm large or deeply nested composables are split into clear sub-composables, file order follows top-down usage, and reusable composables have useful KDoc.
  8. Confirm theme-derived remember values are either uncached, keyed by the concrete values they use, or keyed by JewelTheme.instanceUuid when broad theme/LaF state is the dependency; do not key them by JewelTheme.name alone.
  9. For standalone apps, confirm JetBrains Runtime is used (Jewel requires JBR for full font/rendering behavior).

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

actions

무료요약 있음

IntelliJ `AnAction` 클래스를 구현하거나 수정하고 `plugin.xml`에 등록하도록 안내합니다. 표시 이름과 설명은 메시지 번들에 두고, 필요하면 아이콘을 설정하며, 이벤트 코루틴 범위에서 중단 함수를 실행해 동기식 처리로 IDE가 멈추는 일을 방지합니다.

  • IDE 메뉴에 새 동작 추가
  • 동작 등록이나 아이콘 변경
  • 동작 이름과 설명 정리
JetBrains/intellij-community2.1만2026년 10월 29일 업데이트

bazel-test-migration

무료요약 있음

IntelliJ JPS 테스트 모듈을 Bazel로 옮기고 Bazel에서만 발생하는 실패를 조사하는 안내서입니다. 의존성, 플러그인, 테스트 데이터와 runfiles 문제를 확인하고 생성된 대상과 이전된 테스트를 검증합니다.

  • 기존 JPS 테스트 모듈을 Bazel로 이전할 때
  • Bazel에서만 실패하는 테스트를 조사할 때
  • 테스트 의존성과 데이터 설정을 확인할 때
JetBrains/intellij-community2.1만2026년 10월 29일 업데이트

code-style

무료요약 있음

IntelliJ 프로젝트 규칙에 맞춰 Kotlin과 Java 코드를 작성하거나 검토합니다. 언어 선택, 서식, 봉인 타입, 스레드 주석, 제어 흐름 예외 처리를 확인합니다.

  • IntelliJ 규칙에 맞는 Kotlin 작성
  • Java 코드 검토
  • 예외 처리와 봉인 타입 분기 확인
JetBrains/intellij-community2.1만2026년 10월 29일 업데이트

commits

무료요약 있음

이 가이드는 IntelliJ 프로젝트의 변경 사항을 목적별로 나누고 프로젝트 형식에 맞는 커밋 메시지를 작성하도록 돕습니다. 티켓이 있으면 번호와 변경 설명을, 없으면 레이블과 하위 시스템명을 사용하며 필요에 따라 이유와 판단을 본문에 담습니다.

  • 티켓이 있는 변경의 프로젝트 형식 메시지 작성
  • 테스트나 문서 커밋에 적절한 레이블 적용
  • 기존 커밋 메시지를 규칙에 맞게 수정
JetBrains/intellij-community2.1만2026년 10월 29일 업데이트

compare-python-typecheckers

무료요약 있음

여러 Python 타입 검사기로 코드 조각이나 파일의 타입 추론과 오류 판정을 비교합니다. 도구별 결과, 실행 시간, 진단 내용을 Markdown 보고서로 모아 저장할 수 있습니다.

  • 검사기별 타입 추론 비교
  • 코드가 타입 오류로 판정되는지 확인
  • 여러 도구의 진단 결과 비교
JetBrains/intellij-community2.1만2026년 10월 29일 업데이트

compose-ui-architecture

무료요약 있음

Compose Desktop 화면을 구성할 때 컴포저블은 렌더링을 맡고 프레젠터나 코디네이터는 앱 결정을 맡도록 구조를 정리합니다. 상태 소유권, Effect, 재사용 컴포넌트 API, 지연 목록 키, 애니메이션과 성능을 개별 UI 변경에 맞춰 살펴봅니다.

  • 화면 렌더링과 프레젠터 판단 분리
  • UI 상태를 둘 위치 정리
  • Effect 키와 코루틴 사용 검토
JetBrains/intellij-community2.1만2026년 10월 29일 업데이트

JetBrains의 스킬 모두 보기

이 스킬의 문제 신고