Conversation
WalkthroughThe PR reorganizes and centralizes web-import domain types and UI into shared packages. A ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
|
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (3)
tools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/CodepointGlyphTest.kt (1)
1-7:⚠️ Potential issue | 🔴 CriticalMissing import for
Codepoint— test will not compile.The test file references
Codepointat lines 13, 18, 23, and 24, but the class is in a different package. After the refactor:
- Test package:
io.github.composegears.valkyrie.ui.screen.webimport.common.domainCodepointpackage:io.github.composegears.valkyrie.ui.screen.webimport.common.domain.fontKotlin requires an explicit import when accessing symbols in different packages. Add the missing import:
Fix
import org.junit.jupiter.api.Test +import io.github.composegears.valkyrie.ui.screen.webimport.common.domain.font.Codepoint🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@tools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/CodepointGlyphTest.kt` around lines 1 - 7, The test fails to compile because Codepoint is in a different package; add an explicit import for Codepoint in CodepointGlyphTest.kt so the test can reference the class from io.github.composegears.valkyrie.ui.screen.webimport.common.domain.font; update the imports at the top of the file (where other imports like assertk and Test are declared) to include Codepoint so references to Codepoint in the test methods resolve.tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/StandardIconViewModel.kt (1)
133-144:⚠️ Potential issue | 🟠 Major | ⚡ Quick winHandle font-load failures after clearing the preview state.
Line 134 sets
fontByteArray = null, but any exception fromprovider.loadFontBytes(...)is swallowed. A transient repository/network failure will leaveStandardState.Successstuck in the skeleton state with no recovery path.Suggested failure handling
if (cachedFont == null) { updateSuccess { it.copy(fontByteArray = null) } // Yield so Compose renders the skeleton before font bytes arrive. // Without this, providers with in-memory caches (suspendLazy) return // instantly — both state updates are batched into one frame and the // skeleton is never visible. yield() - runCatching { - val bytes = provider.loadFontBytes(resolvedStyle) - fontCache[styleKey] = bytes - updateSuccess { it.copy(fontByteArray = bytes) } - } + runCatching { provider.loadFontBytes(resolvedStyle) } + .onSuccess { bytes -> + fontCache[styleKey] = bytes + updateSuccess { it.copy(fontByteArray = bytes) } + } + .onFailure { error -> + stateRecord.value = StandardState.Error( + "Error loading ${provider.providerName} font: ${error.message}", + ) + } } else {🤖 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/common/StandardIconViewModel.kt` around lines 133 - 144, The code clears the preview via updateSuccess { it.copy(fontByteArray = null) } then calls provider.loadFontBytes(...) inside runCatching but swallows failures, leaving StandardState.Success stuck; change the runCatching usage to handle failures explicitly: when calling provider.loadFontBytes(resolvedStyle) (and updating fontCache[styleKey]), add an onFailure block that updates state to an error/retry-aware state (e.g., call the existing error updater or updateSuccess with an error marker/previous state) so consumers can recover or show an error, and ensure the cache is not populated on failure; keep updateSuccess, fontCache, cachedFont and provider.loadFontBytes references so you update the same logic path.tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/StandardImportScreenUI.kt (1)
354-360:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winUnchecked cast
item.icon as StandardIconwill produce a compiler warning.With
item: IconItem<*>, the star projection makesitem.iconof typeAny?— Kotlin emits anUNCHECKED_CASTwarning for theas StandardIconcoercion. While it's safe here sinceStandardIconGridis private and all inputs are typedStandardIcon, a safe cast is cleaner and avoids the warning.🛡️ Proposed fix
-is IconItem<*> -> iconContent(item.icon as StandardIcon) +is IconItem<*> -> (item.icon as? StandardIcon)?.let { iconContent(it) }🤖 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/common/StandardImportScreenUI.kt` around lines 354 - 360, Replace the unchecked cast of item.icon with a safe cast and only call iconContent when the cast succeeds: in the lambda that handles IconItem inside StandardImportScreenUI (the when block that checks GridItem / CategoryHeader / IconItem), change the unchecked "item.icon as StandardIcon" cast to a safe cast (item.icon as? StandardIcon) and invoke iconContent only if the result is non-null (e.g., using let or an if check) so the compiler warning is removed and you avoid a potential ClassCastException.
🧹 Nitpick comments (3)
sdk/compose/foundation/src/commonMain/kotlin/io/github/composegears/valkyrie/sdk/compose/foundation/animation/RememberShimmer.kt (1)
22-26: ⚡ Quick win
@Stableis correct;rememberShimmershould memoize the returned instance to honor the contract
@Stableis the right choice here (@Immutablewould be incorrect becauseState<Float>mutates). The annotation is valid.However,
rememberShimmer(line 51) returnsShimmer(translateState, gradientWidthFactor)withoutremember {}. With@Stable+ default reference equality, every parent recomposition creates a freshShimmerinstance that Compose treats as "changed", defeating the skippability that@Stableenables for any composable receivingShimmeras a parameter.
translateStatealready has a stable reference (it comes fromtransition.animateFloat, which is internally remembered), so aremember(gradientWidthFactor)key is sufficient:♻️ Proposed fix in
rememberShimmer- return Shimmer(translateState, gradientWidthFactor) + return remember(gradientWidthFactor) { Shimmer(translateState, gradientWidthFactor) } }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@sdk/compose/foundation/src/commonMain/kotlin/io/github/composegears/valkyrie/sdk/compose/foundation/animation/RememberShimmer.kt` around lines 22 - 26, The rememberShimmer factory currently returns a new Shimmer instance on each recomposition, defeating the `@Stable` contract; update rememberShimmer to memoize the returned Shimmer using Compose's remember keyed by gradientWidthFactor so the same Shimmer instance is reused across recompositions (e.g., remember(gradientWidthFactor) { Shimmer(translateState, gradientWidthFactor) }), referencing the Shimmer class, rememberShimmer function, translateState and gradientWidthFactor symbols.tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/font/VariableFontConfig.kt (1)
19-42: ⚡ Quick winPrefer
List<FontWeight>overArray<FontWeight>to uphold the@Stablecontract
Array<FontWeight>is mutable: any caller holding the reference can writeconfig.weights[0] = …in-place without going through Compose's snapshot system, so Compose will never detect the mutation and recomposition will be silently skipped — breaking the@Stableguarantee.List<FontWeight>is structurally immutable, has value-basedequals/hashCodeby default, and removes the need for the manual overrides entirely.♻️ Proposed refactor
`@Stable` data class VariableFontConfig( val variation: FontVariation.Settings, - val weights: Array<FontWeight>, + val weights: List<FontWeight>, val weight: FontWeight, val opticalSize: Float? = null, -) { - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is VariableFontConfig) return false - if (variation != other.variation) return false - if (!weights.contentEquals(other.weights)) return false - if (weight != other.weight) return false - if (opticalSize != other.opticalSize) return false - return true - } - - override fun hashCode(): Int { - var result = variation.hashCode() - result = 31 * result + weights.contentHashCode() - result = 31 * result + weight.hashCode() - result = 31 * result + (opticalSize?.hashCode() ?: 0) - return result - } -} +)Call sites constructing with an array literal (
arrayOf(…)) should switch tolistOf(…). Any call torememberStandardFont(weights = variableFontConfig?.weights, …)that expectsArray<FontWeight>would need a matching signature update or a.toTypedArray()conversion there.🤖 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/common/domain/font/VariableFontConfig.kt` around lines 19 - 42, VariableFontConfig currently exposes a mutable Array<FontWeight> via the weights property which breaks Compose's `@Stable` contract and necessitated manual equals/hashCode; change weights from Array<FontWeight> to List<FontWeight> (update the data class VariableFontConfig signature), remove the custom equals/hashCode overrides (the data class will get correct value-based implementations), and update all call sites that pass arrayOf(...) to use listOf(...) (or call .toTypedArray() only where an actual Array is required, e.g., in legacy APIs like rememberStandardFont if kept).tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/StandardIconProvider.kt (1)
24-25: ⚡ Quick win
variableFontConfigdefault getter allocates a newMutableStateFlowon every access.Kotlin interface properties with
get()bodies are re-evaluated on every read. Any Compose consumer usingcollectAsState()or anyLaunchedEffect(provider.variableFontConfig)will see a newFlowreference each recomposition and restart the coroutine unnecessarily. Fix by returning a shared singleton from the companion object:♻️ Proposed fix
+ companion object { + private val nullVariableFontConfig: StateFlow<VariableFontConfig?> = MutableStateFlow(null) + } + val variableFontConfig: StateFlow<VariableFontConfig?> - get() = MutableStateFlow(null) + get() = nullVariableFontConfig🤖 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/common/domain/StandardIconProvider.kt` around lines 24 - 25, The getter for StandardIconProvider.variableFontConfig currently creates a new MutableStateFlow(null) on each access which causes consumers to see a different Flow instance each read; change it to return a single shared StateFlow instance (e.g., a private val sharedVariableFontConfig = MutableStateFlow<VariableFontConfig?>(null) declared in the companion object) and have the variableFontConfig getter return that shared StateFlow so consumers reuse the same Flow instead of reallocating on every access.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Outside diff comments:
In
`@tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/StandardIconViewModel.kt`:
- Around line 133-144: The code clears the preview via updateSuccess {
it.copy(fontByteArray = null) } then calls provider.loadFontBytes(...) inside
runCatching but swallows failures, leaving StandardState.Success stuck; change
the runCatching usage to handle failures explicitly: when calling
provider.loadFontBytes(resolvedStyle) (and updating fontCache[styleKey]), add an
onFailure block that updates state to an error/retry-aware state (e.g., call the
existing error updater or updateSuccess with an error marker/previous state) so
consumers can recover or show an error, and ensure the cache is not populated on
failure; keep updateSuccess, fontCache, cachedFont and provider.loadFontBytes
references so you update the same logic path.
In
`@tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/StandardImportScreenUI.kt`:
- Around line 354-360: Replace the unchecked cast of item.icon with a safe cast
and only call iconContent when the cast succeeds: in the lambda that handles
IconItem inside StandardImportScreenUI (the when block that checks GridItem /
CategoryHeader / IconItem), change the unchecked "item.icon as StandardIcon"
cast to a safe cast (item.icon as? StandardIcon) and invoke iconContent only if
the result is non-null (e.g., using let or an if check) so the compiler warning
is removed and you avoid a potential ClassCastException.
In
`@tools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/CodepointGlyphTest.kt`:
- Around line 1-7: The test fails to compile because Codepoint is in a different
package; add an explicit import for Codepoint in CodepointGlyphTest.kt so the
test can reference the class from
io.github.composegears.valkyrie.ui.screen.webimport.common.domain.font; update
the imports at the top of the file (where other imports like assertk and Test
are declared) to include Codepoint so references to Codepoint in the test
methods resolve.
---
Nitpick comments:
In
`@sdk/compose/foundation/src/commonMain/kotlin/io/github/composegears/valkyrie/sdk/compose/foundation/animation/RememberShimmer.kt`:
- Around line 22-26: The rememberShimmer factory currently returns a new Shimmer
instance on each recomposition, defeating the `@Stable` contract; update
rememberShimmer to memoize the returned Shimmer using Compose's remember keyed
by gradientWidthFactor so the same Shimmer instance is reused across
recompositions (e.g., remember(gradientWidthFactor) { Shimmer(translateState,
gradientWidthFactor) }), referencing the Shimmer class, rememberShimmer
function, translateState and gradientWidthFactor symbols.
In
`@tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/font/VariableFontConfig.kt`:
- Around line 19-42: VariableFontConfig currently exposes a mutable
Array<FontWeight> via the weights property which breaks Compose's `@Stable`
contract and necessitated manual equals/hashCode; change weights from
Array<FontWeight> to List<FontWeight> (update the data class VariableFontConfig
signature), remove the custom equals/hashCode overrides (the data class will get
correct value-based implementations), and update all call sites that pass
arrayOf(...) to use listOf(...) (or call .toTypedArray() only where an actual
Array is required, e.g., in legacy APIs like rememberStandardFont if kept).
In
`@tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/StandardIconProvider.kt`:
- Around line 24-25: The getter for StandardIconProvider.variableFontConfig
currently creates a new MutableStateFlow(null) on each access which causes
consumers to see a different Flow instance each read; change it to return a
single shared StateFlow instance (e.g., a private val sharedVariableFontConfig =
MutableStateFlow<VariableFontConfig?>(null) declared in the companion object)
and have the variableFontConfig getter return that shared StateFlow so consumers
reuse the same Flow instead of reallocating on every access.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: a57280cc-51a2-4555-a58e-1af6d9708824
📒 Files selected for processing (89)
sdk/compose/foundation/src/commonMain/kotlin/io/github/composegears/valkyrie/sdk/compose/foundation/animation/RememberShimmer.kttools/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/common/StandardIconViewModel.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/StandardImportScreenUI.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/data/CodepointParser.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/data/RegexCssCodepointParser.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/CategoryInferrer.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/StandardIconProvider.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/category/InferredCategory.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/category/WebCategory.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/font/Codepoint.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/font/FontByteArray.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/font/VariableFontConfig.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/icon/GridItem.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/icon/IconStyle.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/icon/StandardIcon.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/icon/StandardIconConfig.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/icon/WebIcon.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/settings/IconSettings.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/settings/SizeSettings.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/ui/IconSizeCustomization.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/ui/SidePanel.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/ui/StandardTopActions.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/ui/WebImportScreenComponents.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/util/DisplayNameFormatter.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/util/GridFiltering.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/util/StandardGridFiltering.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/util/SvgSizeCustomizer.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/MaterialSymbolsImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/MaterialSymbolsViewModel.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/domain/MaterialSymbolsConfigUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/domain/model/Category.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/domain/model/MaterialConfig.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/ui/MaterialFontFamilyDropdown.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/ui/MaterialTopActions.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/bootstrap/BootstrapImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/bootstrap/data/BootstrapCodepointParser.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/bootstrap/data/BootstrapRepository.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/bootstrap/domain/BootstrapUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/boxicons/BoxIconsImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/boxicons/data/BoxCodepointParser.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/boxicons/data/BoxIconsRepository.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/boxicons/domain/BoxIconsUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/common/domain/StandardIconProvider.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/common/model/IconStyle.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/eva/EvaImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/eva/data/EvaCodepointParser.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/eva/data/EvaRepository.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/eva/domain/EvaUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/feather/FeatherImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/feather/domain/FeatherUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/fontawesome/FontAwesomeImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/fontawesome/data/FontAwesomeCategoriesYamlParser.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/fontawesome/data/FontAwesomeRepository.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/fontawesome/domain/FontAwesomeUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/ionicons/IoniconsImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/ionicons/domain/IoniconsIconConfigBuilder.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/ionicons/domain/IoniconsUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/lucide/LucideImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/lucide/data/LucideCodepointParser.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/lucide/data/LucideRepository.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/lucide/domain/LucideUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/MaterialSymbolsImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/data/config/MaterialIconsMetadata.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/data/config/MaterialSymbolsConfigRepository.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/data/font/MaterialFontRepository.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/di/MaterialSymbolsModule.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/domain/MaterialSymbolsConfigUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/domain/model/MaterialFontSettings.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/domain/model/MaterialIconFontFamily.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/ui/MaterialFontCustomization.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/RemixCodepointParser.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/domain/RemixUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/TablerImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/data/TablerCodepointParser.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/data/TablerRepository.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/domain/TablerUseCase.kttools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/CodepointGlyphTest.kttools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/eva/domain/EvaIconNameTest.kttools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/feather/domain/FeatherIconConfigBuilderTest.kttools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/fontawesome/data/FontAwesomeCategoriesYamlParserTest.kttools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/ionicons/domain/IoniconsIconConfigBuilderTest.kttools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/data/TablerSvgPathResolverTest.kttools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/domain/TablerIconConfigBuilderTest.kt
💤 Files with no reviewable changes (10)
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/domain/model/MaterialConfig.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/domain/model/Category.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/common/model/IconStyle.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/ui/MaterialFontFamilyDropdown.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/common/domain/StandardIconProvider.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/MaterialSymbolsImportScreen.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/ui/MaterialTopActions.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/domain/MaterialSymbolsConfigUseCase.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/MaterialSymbolsViewModel.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/ui/WebImportScreenComponents.kt
71b52cc to
6e396d2
Compare
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (2)
tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/settings/InMemorySettings.kt (1)
13-16: ⚖️ Poor tradeoffOptional: consider locating Material font defaults closer to
PersistentSettingsrather than a screen-scoped model.
InMemorySettingslives in the root-levelio.github.composegears.valkyrie.settingspackage and currently depends onui.screen.webimport.standard.materialsymbols.domain.model.MaterialFontSettingssolely for four reset-to-default constants. This couples a general application-settings class to a specific screen domain model, reversing the typical dependency direction (settings → screen detail). Defining these defaults directly onPersistentSettings.ValkyrieState(or a sibling defaults object in thesettingspackage) would eliminate the cross-layer import.🤖 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/settings/InMemorySettings.kt` around lines 13 - 16, InMemorySettings currently imports MaterialFontSettings.Companion.DEFAULT_FILL/DEFAULT_GRADE/DEFAULT_OPTICAL_SIZE/DEFAULT_WEIGHT from the screen domain; remove those imports and instead define the same default constants closer to the settings layer (either as companion constants on PersistentSettings.ValkyrieState or in a new SettingsDefaults object in the settings package), then update InMemorySettings to reference the new PersistentSettings.ValkyrieState (or SettingsDefaults) constants; ensure no other UI-screen packages are referenced from the settings package so the dependency direction is corrected.tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/service/PersistentSettings.kt (1)
13-17: ⚡ Quick winService layer importing from
ui.screen.*— consider inlining the primitive defaults.
PersistentSettingsis a persistence-layer IntelliJ@Stateservice. These five new imports pullDEFAULT_SIZE,DEFAULT_FILL,DEFAULT_WEIGHT,DEFAULT_GRADE, andDEFAULT_OPTICAL_SIZEfrom UI-feature packages (ui.screen.webimport.*), creating a downward dependency from the service layer into UI screen domain models. Any future rename, move, or split ofSizeSettings/MaterialFontSettingswill silently break this service at compile time.Because all five constants are primitive literals, the simplest fix is to inline them directly:
♻️ Proposed refactor — inline the primitive defaults
-import io.github.composegears.valkyrie.ui.screen.webimport.common.domain.settings.SizeSettings.Companion.DEFAULT_SIZE -import io.github.composegears.valkyrie.ui.screen.webimport.standard.materialsymbols.domain.model.MaterialFontSettings.Companion.DEFAULT_FILL -import io.github.composegears.valkyrie.ui.screen.webimport.standard.materialsymbols.domain.model.MaterialFontSettings.Companion.DEFAULT_GRADE -import io.github.composegears.valkyrie.ui.screen.webimport.standard.materialsymbols.domain.model.MaterialFontSettings.Companion.DEFAULT_OPTICAL_SIZE -import io.github.composegears.valkyrie.ui.screen.webimport.standard.materialsymbols.domain.model.MaterialFontSettings.Companion.DEFAULT_WEIGHT// MaterialSymbols - var materialFontFill: Boolean by property(DEFAULT_FILL) - var materialFontWeight: Int by property(DEFAULT_WEIGHT) - var materialFontGrade: Int by property(DEFAULT_GRADE) - var materialFontOpticalSize: Float by property(DEFAULT_OPTICAL_SIZE) + var materialFontFill: Boolean by property(false) + var materialFontWeight: Int by property(400) + var materialFontGrade: Int by property(0) + var materialFontOpticalSize: Float by property(24f) // Lucide - var lucideSize: Int by property(DEFAULT_SIZE) + var lucideSize: Int by property(24) // … and so on for the remaining size propertiesAlternatively, if a single source of truth is desired across the codebase, these constants could be hoisted to a shared (non-UI) constants file so the dependency direction is correct without requiring duplication.
🤖 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/service/PersistentSettings.kt` around lines 13 - 17, PersistentSettings currently imports UI-layer constants DEFAULT_SIZE, DEFAULT_FILL, DEFAULT_WEIGHT, DEFAULT_GRADE, and DEFAULT_OPTICAL_SIZE from SizeSettings and MaterialFontSettings (creating a downward dependency); replace those imports by inlining the primitive literal values directly into PersistentSettings (or alternatively move those constants into a shared non-UI constants object and import that instead) so the service no longer depends on ui.screen.webimport.*; update references to DEFAULT_SIZE, DEFAULT_FILL, DEFAULT_WEIGHT, DEFAULT_GRADE, and DEFAULT_OPTICAL_SIZE inside PersistentSettings accordingly.
🤖 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/common/StandardIconViewModel.kt`:
- Line 71: The export currently relies on provider-global mutable style state
updated by provider.onStyleChanged which causes downloadIcon/downloadSvg (and
MaterialSymbolsConfigUseCase.currentFontFamily) to read a possibly-stale value;
instead modify the call path to pass the selected style explicitly (or
capture/snapshot the selected style when the user triggers export) through
StandardIconViewModel -> downloadIcon -> downloadSvg (and into
MaterialSymbolsConfigUseCase methods) so each export uses the style argument
provided rather than reading the mutable currentFontFamily; remove or avoid
relying on provider-global reads for export and use the passed-in style
parameter for all downstream logic.
- Around line 135-145: The runCatching around provider.loadFontBytes in
StandardIconViewModel is swallowing CancellationException causing a cancelled
fontLoadJob to run its onFailure branch and clear fontByteArray; change the
error handling so CancellationException is re-thrown instead of being treated as
a failure: when catching errors from provider.loadFontBytes (the
runCatching/onFailure block), detect if the throwable is a CancellationException
and rethrow it, otherwise proceed to updateSuccess and fontCache as before
(affecting fontCache[styleKey] and updateSuccess { it.copy(fontByteArray = ...)
}).
In
`@tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/StandardImportScreenUI.kt`:
- Line 58: There is a name collision between the domain model CategoryHeader and
the UI composable CategoryHeader; fix it by aliasing one import (e.g., import
io.github.composegears.valkyrie.ui.screen.webimport.common.domain.icon.CategoryHeader
as CategoryHeaderModel) and leave the composable import as-is, then update all
usages: replace type checks and references like "is CategoryHeader" and any
usages that intend the domain model with "CategoryHeaderModel", while keeping
composable invocation "CategoryHeader(...)" for the UI composable.
---
Nitpick comments:
In
`@tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/service/PersistentSettings.kt`:
- Around line 13-17: PersistentSettings currently imports UI-layer constants
DEFAULT_SIZE, DEFAULT_FILL, DEFAULT_WEIGHT, DEFAULT_GRADE, and
DEFAULT_OPTICAL_SIZE from SizeSettings and MaterialFontSettings (creating a
downward dependency); replace those imports by inlining the primitive literal
values directly into PersistentSettings (or alternatively move those constants
into a shared non-UI constants object and import that instead) so the service no
longer depends on ui.screen.webimport.*; update references to DEFAULT_SIZE,
DEFAULT_FILL, DEFAULT_WEIGHT, DEFAULT_GRADE, and DEFAULT_OPTICAL_SIZE inside
PersistentSettings accordingly.
In
`@tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/settings/InMemorySettings.kt`:
- Around line 13-16: InMemorySettings currently imports
MaterialFontSettings.Companion.DEFAULT_FILL/DEFAULT_GRADE/DEFAULT_OPTICAL_SIZE/DEFAULT_WEIGHT
from the screen domain; remove those imports and instead define the same default
constants closer to the settings layer (either as companion constants on
PersistentSettings.ValkyrieState or in a new SettingsDefaults object in the
settings package), then update InMemorySettings to reference the new
PersistentSettings.ValkyrieState (or SettingsDefaults) constants; ensure no
other UI-screen packages are referenced from the settings package so the
dependency direction is corrected.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: 3eb7c156-7da0-4db4-a78f-386baf50b3be
📒 Files selected for processing (89)
sdk/compose/foundation/src/commonMain/kotlin/io/github/composegears/valkyrie/sdk/compose/foundation/animation/RememberShimmer.kttools/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/common/StandardIconViewModel.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/StandardImportScreenUI.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/data/CodepointParser.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/data/RegexCssCodepointParser.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/CategoryInferrer.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/StandardIconProvider.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/category/InferredCategory.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/category/WebCategory.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/font/Codepoint.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/font/FontByteArray.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/font/VariableFontConfig.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/icon/GridItem.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/icon/IconStyle.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/icon/StandardIcon.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/icon/StandardIconConfig.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/icon/WebIcon.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/settings/IconSettings.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/settings/SizeSettings.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/ui/IconSizeCustomization.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/ui/SidePanel.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/ui/StandardTopActions.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/ui/WebImportScreenComponents.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/util/DisplayNameFormatter.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/util/GridFiltering.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/util/StandardGridFiltering.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/util/SvgSizeCustomizer.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/MaterialSymbolsImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/MaterialSymbolsViewModel.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/domain/MaterialSymbolsConfigUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/domain/model/Category.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/domain/model/MaterialConfig.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/ui/MaterialFontFamilyDropdown.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/ui/MaterialTopActions.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/bootstrap/BootstrapImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/bootstrap/data/BootstrapCodepointParser.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/bootstrap/data/BootstrapRepository.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/bootstrap/domain/BootstrapUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/boxicons/BoxIconsImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/boxicons/data/BoxCodepointParser.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/boxicons/data/BoxIconsRepository.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/boxicons/domain/BoxIconsUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/common/domain/StandardIconProvider.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/common/model/IconStyle.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/eva/EvaImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/eva/data/EvaCodepointParser.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/eva/data/EvaRepository.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/eva/domain/EvaUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/feather/FeatherImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/feather/domain/FeatherUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/fontawesome/FontAwesomeImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/fontawesome/data/FontAwesomeCategoriesYamlParser.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/fontawesome/data/FontAwesomeRepository.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/fontawesome/domain/FontAwesomeUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/ionicons/IoniconsImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/ionicons/domain/IoniconsIconConfigBuilder.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/ionicons/domain/IoniconsUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/lucide/LucideImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/lucide/data/LucideCodepointParser.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/lucide/data/LucideRepository.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/lucide/domain/LucideUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/MaterialSymbolsImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/data/config/MaterialIconsMetadata.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/data/config/MaterialSymbolsConfigRepository.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/data/font/MaterialFontRepository.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/di/MaterialSymbolsModule.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/domain/MaterialSymbolsConfigUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/domain/model/MaterialFontSettings.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/domain/model/MaterialIconFontFamily.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/ui/MaterialFontCustomization.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/RemixCodepointParser.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/domain/RemixUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/TablerImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/data/TablerCodepointParser.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/data/TablerRepository.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/domain/TablerUseCase.kttools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/CodepointGlyphTest.kttools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/eva/domain/EvaIconNameTest.kttools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/feather/domain/FeatherIconConfigBuilderTest.kttools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/fontawesome/data/FontAwesomeCategoriesYamlParserTest.kttools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/ionicons/domain/IoniconsIconConfigBuilderTest.kttools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/data/TablerSvgPathResolverTest.kttools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/domain/TablerIconConfigBuilderTest.kt
💤 Files with no reviewable changes (10)
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/common/model/IconStyle.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/domain/model/Category.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/MaterialSymbolsImportScreen.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/domain/model/MaterialConfig.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/common/domain/StandardIconProvider.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/domain/MaterialSymbolsConfigUseCase.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/ui/MaterialTopActions.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/ui/MaterialFontFamilyDropdown.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/ui/WebImportScreenComponents.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/MaterialSymbolsViewModel.kt
✅ Files skipped from review due to trivial changes (53)
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/boxicons/data/BoxCodepointParser.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/lucide/data/LucideCodepointParser.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/fontawesome/domain/FontAwesomeUseCase.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/icon/IconStyle.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/remix/RemixImportScreen.kt
- sdk/compose/foundation/src/commonMain/kotlin/io/github/composegears/valkyrie/sdk/compose/foundation/animation/RememberShimmer.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/data/TablerRepository.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/ionicons/IoniconsImportScreen.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/CategoryInferrer.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/remix/data/RemixCodepointParser.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/remix/domain/RemixUseCase.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/ui/SidePanel.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/settings/SizeSettings.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/icon/GridItem.kt
- tools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/feather/domain/FeatherIconConfigBuilderTest.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/bootstrap/data/BootstrapRepository.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/icon/WebIcon.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/eva/data/EvaRepository.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/eva/EvaImportScreen.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/ui/IconSizeCustomization.kt
- tools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/ionicons/domain/IoniconsIconConfigBuilderTest.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/util/GridFiltering.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/TablerImportScreen.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/font/FontByteArray.kt
- tools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/eva/domain/EvaIconNameTest.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/eva/domain/EvaUseCase.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/bootstrap/BootstrapImportScreen.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/feather/FeatherImportScreen.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/domain/TablerUseCase.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/fontawesome/FontAwesomeImportScreen.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/bootstrap/domain/BootstrapUseCase.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/boxicons/data/BoxIconsRepository.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/ui/MaterialFontCustomization.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/boxicons/domain/BoxIconsUseCase.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/eva/data/EvaCodepointParser.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/lucide/data/LucideRepository.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/data/TablerCodepointParser.kt
- tools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/data/TablerSvgPathResolverTest.kt
- tools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/CodepointGlyphTest.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/feather/domain/FeatherUseCase.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/icon/StandardIconConfig.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/lucide/LucideImportScreen.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/util/StandardGridFiltering.kt
- tools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/fontawesome/data/FontAwesomeCategoriesYamlParserTest.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/data/config/MaterialIconsMetadata.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/domain/model/MaterialIconFontFamily.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/ionicons/domain/IoniconsIconConfigBuilder.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/lucide/domain/LucideUseCase.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/bootstrap/data/BootstrapCodepointParser.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/util/SvgSizeCustomizer.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/util/DisplayNameFormatter.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/remix/data/RemixRepository.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/di/MaterialSymbolsModule.kt
🚧 Files skipped from review as they are similar to previous changes (15)
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/font/Codepoint.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/data/config/MaterialSymbolsConfigRepository.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/domain/model/MaterialFontSettings.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/ui/StandardTopActions.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/MaterialSymbolsImportScreen.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/fontawesome/data/FontAwesomeRepository.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/settings/IconSettings.kt
- tools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/domain/TablerIconConfigBuilderTest.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/category/InferredCategory.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/fontawesome/data/FontAwesomeCategoriesYamlParser.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/boxicons/BoxIconsImportScreen.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/domain/MaterialSymbolsConfigUseCase.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/StandardIconProvider.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/icon/StandardIcon.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/data/font/MaterialFontRepository.kt
…mmon files in new package
…aterialSymbolsConfigUseCase with keepAlive option
6e396d2 to
cc32418
Compare
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/StandardIconViewModel.kt (1)
243-248:⚠️ Potential issue | 🟠 Major | ⚡ Quick win
prefetchStyleFontsswallowsCancellationException, preventing prompt cancellation of prefetch jobs.
runCatchingat line 244 catches everyThrowable, includingCancellationException. WhenprefetchJob.cancel()is called (line 237 on the nextprefetchStyleFontscall), the cancelled coroutine throws at eachloadFontBytessuspension point, but that exception is silently discarded and theforEachcontinues iterating over all remaining styles — triggering unnecessary network requests.The identical bug was just fixed in
downloadFont(lines 145-147). Apply the same fix here:🐛 Proposed fix
if (fontCache[style.id] == null) { runCatching { provider.loadFontBytes(style) }.onSuccess { bytes -> fontCache[style.id] = bytes + }.onFailure { error -> + if (error is CancellationException) throw error } }🤖 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/common/StandardIconViewModel.kt` around lines 243 - 248, The prefetchStyleFonts implementation uses runCatching around provider.loadFontBytes which swallows CancellationException and prevents prompt cancellation; change the error handling so CancellationException is rethrown immediately (same approach used in downloadFont): call provider.loadFontBytes(style) inside a try block and in the catch rethrow if the caught exception is a CancellationException, otherwise handle/log/store the error and only then update fontCache[style.id] on success (refer to prefetchStyleFonts, provider.loadFontBytes, fontCache and remove the runCatching that swallows CancellationException).
🧹 Nitpick comments (1)
sdk/compose/foundation/src/commonMain/kotlin/io/github/composegears/valkyrie/sdk/compose/foundation/animation/RememberShimmer.kt (1)
52-54: 💤 Low value
remember(gradientWidthFactor)is correct, but consider documenting whytranslateStateis intentionally omitted as a key.
translateStateis captured in the lambda but not included as a key. This is safe becausetransition.animateFloat(...)is itself internallyremember-ed byrememberInfiniteTransitionand always returns the sameState<Float>object across recompositions—so the captured reference in the closure is always the live, up-to-date state. IfdurationMillis/easingchange, those updates propagate through the stableState<Float>without requiring a newShimmerinstance.However, this invariant is non-obvious and easy to break if someone later replaces
rememberInfiniteTransition/animateFloatwith an implementation that returns a new state object on each recomposition. A short KDoc note would prevent a future maintainer from "fixing" this by addingtranslateStateas a key (which would be redundant but harmless) or—worse—assuming the omission is a bug.📝 Suggested documentation
- return remember(gradientWidthFactor) { + // translateState is intentionally not a key: rememberInfiniteTransition / animateFloat + // always return the same State<Float> object across recompositions, so the captured + // reference remains live. Only gradientWidthFactor is a direct Shimmer field that + // requires object recreation when it changes. + return remember(gradientWidthFactor) { Shimmer(translateState, gradientWidthFactor) }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@sdk/compose/foundation/src/commonMain/kotlin/io/github/composegears/valkyrie/sdk/compose/foundation/animation/RememberShimmer.kt` around lines 52 - 54, Add a brief KDoc above the remember call (or above the RememberShimmer function) explaining that translateState is intentionally omitted from the remember keys because the State<Float> returned by rememberInfiniteTransition.animateFloat is stable and always the same live State instance across recompositions, so the closure can safely capture it; mention that durationMillis/easing changes propagate via that stable State and warn maintainers not to add translateState as a key or replace the animateFloat implementation with one that returns new State objects without updating this doc.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Outside diff comments:
In
`@tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/StandardIconViewModel.kt`:
- Around line 243-248: The prefetchStyleFonts implementation uses runCatching
around provider.loadFontBytes which swallows CancellationException and prevents
prompt cancellation; change the error handling so CancellationException is
rethrown immediately (same approach used in downloadFont): call
provider.loadFontBytes(style) inside a try block and in the catch rethrow if the
caught exception is a CancellationException, otherwise handle/log/store the
error and only then update fontCache[style.id] on success (refer to
prefetchStyleFonts, provider.loadFontBytes, fontCache and remove the runCatching
that swallows CancellationException).
---
Nitpick comments:
In
`@sdk/compose/foundation/src/commonMain/kotlin/io/github/composegears/valkyrie/sdk/compose/foundation/animation/RememberShimmer.kt`:
- Around line 52-54: Add a brief KDoc above the remember call (or above the
RememberShimmer function) explaining that translateState is intentionally
omitted from the remember keys because the State<Float> returned by
rememberInfiniteTransition.animateFloat is stable and always the same live State
instance across recompositions, so the closure can safely capture it; mention
that durationMillis/easing changes propagate via that stable State and warn
maintainers not to add translateState as a key or replace the animateFloat
implementation with one that returns new State objects without updating this
doc.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: 7f6f46f0-3e41-4668-bb56-56386165dc5a
📒 Files selected for processing (91)
sdk/compose/foundation/src/commonMain/kotlin/io/github/composegears/valkyrie/sdk/compose/foundation/animation/RememberShimmer.kttools/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/common/StandardIconViewModel.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/StandardImportScreenUI.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/data/CodepointParser.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/data/RegexCssCodepointParser.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/CategoryInferrer.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/StandardIconProvider.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/category/InferredCategory.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/category/WebCategory.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/font/Codepoint.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/font/FontByteArray.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/font/VariableFontConfig.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/icon/GridItem.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/icon/IconStyle.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/icon/StandardIcon.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/icon/StandardIconConfig.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/icon/WebIcon.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/settings/IconSettings.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/settings/SizeSettings.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/ui/CategoryHeaderItem.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/ui/IconSizeCustomization.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/ui/SidePanel.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/ui/StandardTopActions.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/ui/WebImportScreenComponents.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/util/DisplayNameFormatter.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/util/GridFiltering.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/util/StandardGridFiltering.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/util/SvgSizeCustomizer.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/MaterialSymbolsImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/MaterialSymbolsViewModel.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/di/MaterialSymbolsModule.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/domain/MaterialSymbolsConfigUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/domain/model/Category.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/domain/model/MaterialConfig.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/ui/MaterialFontFamilyDropdown.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/ui/MaterialTopActions.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/bootstrap/BootstrapImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/bootstrap/data/BootstrapCodepointParser.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/bootstrap/data/BootstrapRepository.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/bootstrap/domain/BootstrapUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/boxicons/BoxIconsImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/boxicons/data/BoxCodepointParser.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/boxicons/data/BoxIconsRepository.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/boxicons/domain/BoxIconsUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/common/domain/StandardIconProvider.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/common/model/IconStyle.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/eva/EvaImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/eva/data/EvaCodepointParser.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/eva/data/EvaRepository.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/eva/domain/EvaUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/feather/FeatherImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/feather/domain/FeatherUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/fontawesome/FontAwesomeImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/fontawesome/data/FontAwesomeCategoriesYamlParser.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/fontawesome/data/FontAwesomeRepository.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/fontawesome/domain/FontAwesomeUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/ionicons/IoniconsImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/ionicons/domain/IoniconsIconConfigBuilder.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/ionicons/domain/IoniconsUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/lucide/LucideImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/lucide/data/LucideCodepointParser.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/lucide/data/LucideRepository.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/lucide/domain/LucideUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/MaterialSymbolsImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/data/config/MaterialIconsMetadata.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/data/config/MaterialSymbolsConfigRepository.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/data/font/MaterialFontRepository.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/di/MaterialSymbolsModule.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/domain/MaterialSymbolsConfigUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/domain/model/MaterialFontSettings.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/domain/model/MaterialIconFontFamily.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/ui/MaterialFontCustomization.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/RemixCodepointParser.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/domain/RemixUseCase.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/TablerImportScreen.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/data/TablerCodepointParser.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/data/TablerRepository.kttools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/domain/TablerUseCase.kttools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/CodepointGlyphTest.kttools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/eva/domain/EvaIconNameTest.kttools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/feather/domain/FeatherIconConfigBuilderTest.kttools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/fontawesome/data/FontAwesomeCategoriesYamlParserTest.kttools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/ionicons/domain/IoniconsIconConfigBuilderTest.kttools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/data/TablerSvgPathResolverTest.kttools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/domain/TablerIconConfigBuilderTest.kt
💤 Files with no reviewable changes (11)
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/common/model/IconStyle.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/di/MaterialSymbolsModule.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/domain/model/MaterialConfig.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/common/domain/StandardIconProvider.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/ui/MaterialFontFamilyDropdown.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/ui/WebImportScreenComponents.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/domain/MaterialSymbolsConfigUseCase.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/MaterialSymbolsViewModel.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/domain/model/Category.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/ui/MaterialTopActions.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/MaterialSymbolsImportScreen.kt
✅ Files skipped from review due to trivial changes (49)
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/remix/data/RemixCodepointParser.kt
- tools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/feather/domain/FeatherIconConfigBuilderTest.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/ui/IconSizeCustomization.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/icon/IconStyle.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/util/GridFiltering.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/util/DisplayNameFormatter.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/lucide/LucideImportScreen.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/boxicons/data/BoxCodepointParser.kt
- tools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/fontawesome/data/FontAwesomeCategoriesYamlParserTest.kt
- tools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/data/TablerSvgPathResolverTest.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/bootstrap/BootstrapImportScreen.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/ui/StandardTopActions.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/TablerImportScreen.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/data/CodepointParser.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/bootstrap/data/BootstrapRepository.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/data/TablerCodepointParser.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/bootstrap/data/BootstrapCodepointParser.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/eva/data/EvaCodepointParser.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/icon/StandardIconConfig.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/category/WebCategory.kt
- tools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/domain/TablerIconConfigBuilderTest.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/domain/model/MaterialIconFontFamily.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/boxicons/BoxIconsImportScreen.kt
- tools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/eva/domain/EvaIconNameTest.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/remix/data/RemixRepository.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/fontawesome/data/FontAwesomeCategoriesYamlParser.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/fontawesome/FontAwesomeImportScreen.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/WebImportSelectorScreen.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/boxicons/data/BoxIconsRepository.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/remix/RemixImportScreen.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/data/config/MaterialIconsMetadata.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/eva/data/EvaRepository.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/service/PersistentSettings.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/ionicons/domain/IoniconsIconConfigBuilder.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/feather/FeatherImportScreen.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/settings/InMemorySettings.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/data/font/MaterialFontRepository.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/font/FontByteArray.kt
- tools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/ionicons/domain/IoniconsIconConfigBuilderTest.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/ionicons/IoniconsImportScreen.kt
- tools/idea-plugin/src/test/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/CodepointGlyphTest.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/tabler/data/TablerRepository.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/font/Codepoint.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/eva/EvaImportScreen.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/lucide/data/LucideCodepointParser.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/settings/SizeSettings.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/di/MaterialSymbolsModule.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/fontawesome/data/FontAwesomeRepository.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/CategoryInferrer.kt
🚧 Files skipped from review as they are similar to previous changes (19)
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/data/RegexCssCodepointParser.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/ui/SidePanel.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/domain/model/MaterialFontSettings.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/data/config/MaterialSymbolsConfigRepository.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/icon/GridItem.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/StandardIconProvider.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/util/SvgSizeCustomizer.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/font/VariableFontConfig.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/feather/domain/FeatherUseCase.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/WebImportFlow.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/ui/MaterialFontCustomization.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/MaterialSymbolsImportScreen.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/boxicons/domain/BoxIconsUseCase.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/util/StandardGridFiltering.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/category/InferredCategory.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/settings/IconSettings.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/icon/WebIcon.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/common/domain/icon/StandardIcon.kt
- tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/materialsymbols/domain/MaterialSymbolsConfigUseCase.kt
📝 Changelog
If this PR introduces user-facing changes, please update the relevant Unreleased section in changelogs: