Conversation
WalkthroughThis change adds Remix icon support to the SDK's compose icons library and the IDE plugin's web import feature. The SDK adds a new RemixLogo icon to the colored icons package with associated ImageVector implementation featuring gradient-based paths. The IDE plugin extends the web import flow by introducing RemixImportScreen, RemixRepository for fetching icon metadata and assets from CDN, RemixUseCase for handling business logic, RemixModule for dependency injection, and navigation routing. Persistent size settings for Remix are added alongside related UI components and localization entries enabling users to import Remix icons through the web import interface. 🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches
🧪 Generate unit tests (beta)
Tip Try Coding Plans. Let us write the prompt for your AI agent so you can ship faster (with fewer bugs). Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/remix/data/RemixRepository.kt (1)
84-97: Redundant nestedwithContext(Dispatchers.IO)insidemetadataMutexblock
loadSvgMetadataalready switches toDispatchers.IO, butloadFlatIndexUrl()→loadPackageVersion()each callwithContext(Dispatchers.IO)again. The inner context switches are no-ops when already on IO, so there's no correctness issue — just minor noise.♻️ Optional cleanup
private suspend fun loadPackageVersion(): String = withContext(Dispatchers.IO) {The inner
withContext(Dispatchers.IO)calls inloadFlatIndexUrlandloadPackageVersioncan be removed if callers already guarantee the IO dispatcher. Alternatively, keep them for resilience if these functions are ever called from a non-IO context.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/remix/data/RemixRepository.kt` around lines 84 - 97, The code in loadSvgMetadata wraps the metadataMutex block with withContext(Dispatchers.IO) while its callees loadFlatIndexUrl and loadPackageVersion also perform their own withContext(Dispatchers.IO), causing redundant inner context switches; either remove the inner withContext(Dispatchers.IO) calls from loadFlatIndexUrl and loadPackageVersion (so they assume callers like loadSvgMetadata already run on IO) or remove the outer withContext in loadSvgMetadata and keep the inner guards for resilience — update the implementations of loadFlatIndexUrl and loadPackageVersion (or loadSvgMetadata) consistently and ensure metadataMutex.withLock remains inside the chosen IO context to avoid blocking the main thread.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In
`@tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/remix/data/RemixRepository.kt`:
- Around line 23-27: RemixRepository currently mixes `@latest` CDN URLs
(CDN_BASE/PACKAGE_JSON_URL -> FONT_URL, GLYPH_URL) with a version-pinned
FLAT_INDEX_URL_TEMPLATE causing cache mismatches; change the flow to resolve the
package version once (use or add loadPackageVersion()/the existing
PACKAGE_JSON_URL fetch), build a VERSIONED_CDN_TEMPLATE (e.g. formatable string
like "https://cdn.jsdelivr.net/npm/remixicon@%s"), and derive FONT_URL,
GLYPH_URL and the flat index URL from that resolved version so that
loadCodepoints(), loadFontBytes() and any SVG metadata lookup all use the same
versioned URLs.
---
Nitpick comments:
In
`@tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/remix/data/RemixRepository.kt`:
- Around line 84-97: The code in loadSvgMetadata wraps the metadataMutex block
with withContext(Dispatchers.IO) while its callees loadFlatIndexUrl and
loadPackageVersion also perform their own withContext(Dispatchers.IO), causing
redundant inner context switches; either remove the inner
withContext(Dispatchers.IO) calls from loadFlatIndexUrl and loadPackageVersion
(so they assume callers like loadSvgMetadata already run on IO) or remove the
outer withContext in loadSvgMetadata and keep the inner guards for resilience —
update the implementations of loadFlatIndexUrl and loadPackageVersion (or
loadSvgMetadata) consistently and ensure metadataMutex.withLock remains inside
the chosen IO context to avoid blocking the main thread.
ℹ️ Review info
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (13)
sdk/compose/icons/api/icons.apisdk/compose/icons/api/icons.klib.apisdk/compose/icons/src/commonMain/kotlin/io/github/composegears/valkyrie/sdk/compose/icons/colored/RemixLogo.kttools/idea-plugin/CHANGELOG.mdtools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/service/PersistentSettings.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/settings/InMemorySettings.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/WebImportFlow.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/WebImportSelectorScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/remix/RemixImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/remix/data/RemixRepository.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/remix/di/RemixModule.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/remix/domain/RemixUseCase.kttools/idea-plugin/src/main/resources/messages/Valkyrie.properties
Adds support for importing Remix Icons
Screen.Recording.2026-02-25.at.23.47.22.mov
📝 Changelog
If this PR introduces user-facing changes, please update the relevant Unreleased section in changelogs: