Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ assertk = "com.willowtreeapps.assertk:assertk:0.28.1"
junit5-jupiter = "org.junit.jupiter:junit-jupiter:6.0.3"
junit-launcher = "org.junit.platform:junit-platform-launcher:6.0.3"
junit4 = "junit:junit:4.13.2"
kotlin-coroutines-test = "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.10.2"
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }

semver = "net.swiftzer.semver:semver:2.1.0"
Expand Down
4 changes: 4 additions & 0 deletions sdk/compose/icons/api/icons.api
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,10 @@ public final class io/github/composegears/valkyrie/sdk/compose/icons/colored/Goo
public static final fun getGoogleMaterialLogo (Lio/github/composegears/valkyrie/sdk/compose/icons/ValkyrieIcons$Colored;)Landroidx/compose/ui/graphics/vector/ImageVector;
}

public final class io/github/composegears/valkyrie/sdk/compose/icons/colored/HeroiconsLogoKt {
public static final fun getHeroiconsLogo (Lio/github/composegears/valkyrie/sdk/compose/icons/ValkyrieIcons$Colored;)Landroidx/compose/ui/graphics/vector/ImageVector;
}

public final class io/github/composegears/valkyrie/sdk/compose/icons/colored/IoniconsLogoKt {
public static final fun getIoniconsLogo (Lio/github/composegears/valkyrie/sdk/compose/icons/ValkyrieIcons$Colored;)Landroidx/compose/ui/graphics/vector/ImageVector;
}
Expand Down
2 changes: 2 additions & 0 deletions sdk/compose/icons/api/icons.klib.api
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ final val io.github.composegears.valkyrie.sdk.compose.icons.colored/FontAwesomeL
final fun (io.github.composegears.valkyrie.sdk.compose.icons/ValkyrieIcons.Colored).<get-FontAwesomeLogo>(): androidx.compose.ui.graphics.vector/ImageVector // io.github.composegears.valkyrie.sdk.compose.icons.colored/FontAwesomeLogo.<get-FontAwesomeLogo>|<get-FontAwesomeLogo>@io.github.composegears.valkyrie.sdk.compose.icons.ValkyrieIcons.Colored(){}[0]
final val io.github.composegears.valkyrie.sdk.compose.icons.colored/GoogleMaterialLogo // io.github.composegears.valkyrie.sdk.compose.icons.colored/GoogleMaterialLogo|@io.github.composegears.valkyrie.sdk.compose.icons.ValkyrieIcons.Colored{}GoogleMaterialLogo[0]
final fun (io.github.composegears.valkyrie.sdk.compose.icons/ValkyrieIcons.Colored).<get-GoogleMaterialLogo>(): androidx.compose.ui.graphics.vector/ImageVector // io.github.composegears.valkyrie.sdk.compose.icons.colored/GoogleMaterialLogo.<get-GoogleMaterialLogo>|<get-GoogleMaterialLogo>@io.github.composegears.valkyrie.sdk.compose.icons.ValkyrieIcons.Colored(){}[0]
final val io.github.composegears.valkyrie.sdk.compose.icons.colored/HeroiconsLogo // io.github.composegears.valkyrie.sdk.compose.icons.colored/HeroiconsLogo|@io.github.composegears.valkyrie.sdk.compose.icons.ValkyrieIcons.Colored{}HeroiconsLogo[0]
final fun (io.github.composegears.valkyrie.sdk.compose.icons/ValkyrieIcons.Colored).<get-HeroiconsLogo>(): androidx.compose.ui.graphics.vector/ImageVector // io.github.composegears.valkyrie.sdk.compose.icons.colored/HeroiconsLogo.<get-HeroiconsLogo>|<get-HeroiconsLogo>@io.github.composegears.valkyrie.sdk.compose.icons.ValkyrieIcons.Colored(){}[0]
final val io.github.composegears.valkyrie.sdk.compose.icons.colored/IoniconsLogo // io.github.composegears.valkyrie.sdk.compose.icons.colored/IoniconsLogo|@io.github.composegears.valkyrie.sdk.compose.icons.ValkyrieIcons.Colored{}IoniconsLogo[0]
final fun (io.github.composegears.valkyrie.sdk.compose.icons/ValkyrieIcons.Colored).<get-IoniconsLogo>(): androidx.compose.ui.graphics.vector/ImageVector // io.github.composegears.valkyrie.sdk.compose.icons.colored/IoniconsLogo.<get-IoniconsLogo>|<get-IoniconsLogo>@io.github.composegears.valkyrie.sdk.compose.icons.ValkyrieIcons.Colored(){}[0]
final val io.github.composegears.valkyrie.sdk.compose.icons.colored/LucideLogo // io.github.composegears.valkyrie.sdk.compose.icons.colored/LucideLogo|@io.github.composegears.valkyrie.sdk.compose.icons.ValkyrieIcons.Colored{}LucideLogo[0]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package io.github.composegears.valkyrie.sdk.compose.icons.colored

import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.SolidColor
import androidx.compose.ui.graphics.StrokeCap
import androidx.compose.ui.graphics.StrokeJoin
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.graphics.vector.path
import androidx.compose.ui.unit.dp
import io.github.composegears.valkyrie.sdk.compose.icons.ValkyrieIcons

@Suppress("UnusedReceiverParameter")
val ValkyrieIcons.Colored.HeroiconsLogo: ImageVector
get() {
if (_HeroiconsLogo != null) {
return _HeroiconsLogo!!
}
_HeroiconsLogo = ImageVector.Builder(
name = "Colored.HeroiconsLogo",
defaultWidth = 24.dp,
defaultHeight = 24.dp,
viewportWidth = 24f,
viewportHeight = 24f,
).apply {
path(
stroke = SolidColor(Color(0xFF8B5CF6)),
strokeLineWidth = 1.5f,
strokeLineCap = StrokeCap.Round,
strokeLineJoin = StrokeJoin.Round,
) {
moveTo(12f, 2.714f)
arcTo(11.959f, 11.959f, 0f, isMoreThanHalf = false, isPositiveArc = true, 3.598f, 6f)
arcTo(11.99f, 11.99f, 0f, isMoreThanHalf = false, isPositiveArc = false, 3f, 9.749f)
curveToRelative(0f, 5.592f, 3.824f, 10.29f, 9f, 11.623f)
curveToRelative(5.176f, -1.332f, 9f, -6.03f, 9f, -11.622f)
curveToRelative(0f, -1.31f, -0.21f, -2.571f, -0.598f, -3.751f)
horizontalLineToRelative(-0.152f)
curveToRelative(-3.196f, 0f, -6.1f, -1.248f, -8.25f, -3.285f)
close()
}
}.build()

return _HeroiconsLogo!!
}

@Suppress("ObjectPropertyName")
private var _HeroiconsLogo: ImageVector? = null
1 change: 1 addition & 0 deletions tools/idea-plugin/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
### Added

- [Web Import] Add `Simple` icons provider
- [Web Import] Add `Hero` icons provider
- [Web Import] Add floating zoom control bar to the icon grid β€” allows changing the visual display size of icons (
25%–200%) without affecting import settings
- [Web Import] Add `Feather` icons provider
Expand Down
1 change: 1 addition & 0 deletions tools/idea-plugin/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ dependencies {
testImplementation(testFixtures(projects.sdk.intellij.testFixtures))
testImplementation(libs.bundles.kmp.test)
testImplementation(libs.junit5.jupiter)
testImplementation(libs.kotlin.coroutines.test)
testRuntimeOnly(libs.junit.launcher)

intellijPlatform {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,9 @@ class PersistentSettings : SimplePersistentStateComponent<ValkyrieState>(Valkyri

// Simple Icons
var simpleIconsSize: Int by property(DEFAULT_SIZE)

// Heroicons
var heroiconsSize: Int by property(DEFAULT_SIZE)
}

companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ class InMemorySettings(project: Project) {
featherSize = DEFAULT_SIZE
ioniconsSize = DEFAULT_SIZE
simpleIconsSize = DEFAULT_SIZE
heroiconsSize = DEFAULT_SIZE
}

fun updateUIState(uiState: SavedState) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import io.github.composegears.valkyrie.ui.screen.webimport.standard.materialsymb
import io.github.composegears.valkyrie.ui.screen.webimport.standard.remix.RemixImportScreen
import io.github.composegears.valkyrie.ui.screen.webimport.standard.simpleicons.SimpleIconsImportScreen
import io.github.composegears.valkyrie.ui.screen.webimport.standard.tabler.TablerImportScreen
import io.github.composegears.valkyrie.ui.screen.webimport.svg.heroicons.HeroiconsImportScreen

val WebImportFlow by navDestination {
Navigation(
Expand All @@ -35,6 +36,7 @@ val WebImportFlow by navDestination {
TablerImportScreen,
EvaImportScreen,
FeatherImportScreen,
HeroiconsImportScreen,
IoniconsImportScreen,
SimpleIconsImportScreen,
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import io.github.composegears.valkyrie.sdk.compose.icons.colored.EvaLogo
import io.github.composegears.valkyrie.sdk.compose.icons.colored.FeatherLogo
import io.github.composegears.valkyrie.sdk.compose.icons.colored.FontAwesomeLogo
import io.github.composegears.valkyrie.sdk.compose.icons.colored.GoogleMaterialLogo
import io.github.composegears.valkyrie.sdk.compose.icons.colored.HeroiconsLogo
import io.github.composegears.valkyrie.sdk.compose.icons.colored.IoniconsLogo
import io.github.composegears.valkyrie.sdk.compose.icons.colored.LucideLogo
import io.github.composegears.valkyrie.sdk.compose.icons.colored.RemixLogo
Expand All @@ -39,6 +40,7 @@ import io.github.composegears.valkyrie.ui.screen.webimport.IconProviders.Eva
import io.github.composegears.valkyrie.ui.screen.webimport.IconProviders.Feather
import io.github.composegears.valkyrie.ui.screen.webimport.IconProviders.FontAwesome
import io.github.composegears.valkyrie.ui.screen.webimport.IconProviders.GoogleMaterialSymbols
import io.github.composegears.valkyrie.ui.screen.webimport.IconProviders.Heroicons
import io.github.composegears.valkyrie.ui.screen.webimport.IconProviders.Ionicons
import io.github.composegears.valkyrie.ui.screen.webimport.IconProviders.Lucide
import io.github.composegears.valkyrie.ui.screen.webimport.IconProviders.Remix
Expand All @@ -55,6 +57,7 @@ import io.github.composegears.valkyrie.ui.screen.webimport.standard.materialsymb
import io.github.composegears.valkyrie.ui.screen.webimport.standard.remix.RemixImportScreen
import io.github.composegears.valkyrie.ui.screen.webimport.standard.simpleicons.SimpleIconsImportScreen
import io.github.composegears.valkyrie.ui.screen.webimport.standard.tabler.TablerImportScreen
import io.github.composegears.valkyrie.ui.screen.webimport.svg.heroicons.HeroiconsImportScreen
import io.github.composegears.valkyrie.util.stringResource
import org.jetbrains.compose.ui.tooling.preview.Preview
import org.jetbrains.jewel.ui.component.VerticallyScrollableContainer
Expand All @@ -75,6 +78,7 @@ val WebImportSelectorScreen by navDestination {
Tabler -> TablerImportScreen
Eva -> EvaImportScreen
Feather -> FeatherImportScreen
Heroicons -> HeroiconsImportScreen
Ionicons -> IoniconsImportScreen
SimpleIcons -> SimpleIconsImportScreen
}
Expand Down Expand Up @@ -152,6 +156,11 @@ enum class IconProviders(
titleKey = "web.import.selector.google.title",
descriptionKey = "web.import.selector.google.description",
),
Heroicons(
icon = ValkyrieIcons.Colored.HeroiconsLogo,
titleKey = "web.import.selector.heroicons.title",
descriptionKey = "web.import.selector.heroicons.description",
),
Ionicons(
icon = ValkyrieIcons.Colored.IoniconsLogo,
titleKey = "web.import.selector.ionicons.title",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,15 @@ package io.github.composegears.valkyrie.ui.screen.webimport.common

import androidx.compose.animation.AnimatedContent
import androidx.compose.foundation.gestures.detectTapGestures
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.GridItemSpan
import androidx.compose.foundation.lazy.grid.LazyGridScope
import androidx.compose.foundation.lazy.grid.LazyGridState
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.foundation.lazy.grid.items
import androidx.compose.foundation.lazy.grid.rememberLazyGridState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
Expand All @@ -27,7 +19,6 @@ import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.text.font.FontVariation
Expand All @@ -49,7 +40,6 @@ import io.github.composegears.valkyrie.jewel.ui.placeholder.LoadingPlaceholder
import io.github.composegears.valkyrie.sdk.compose.foundation.ObserveEvent
import io.github.composegears.valkyrie.sdk.compose.foundation.animation.Shimmer
import io.github.composegears.valkyrie.sdk.compose.foundation.animation.rememberShimmer
import io.github.composegears.valkyrie.sdk.compose.foundation.animation.shimmer
import io.github.composegears.valkyrie.sdk.compose.foundation.rememberMutableState
import io.github.composegears.valkyrie.ui.screen.webimport.common.domain.StandardIconProvider
import io.github.composegears.valkyrie.ui.screen.webimport.common.domain.category.InferredCategory
Expand All @@ -63,15 +53,16 @@ import io.github.composegears.valkyrie.ui.screen.webimport.common.domain.icon.St
import io.github.composegears.valkyrie.ui.screen.webimport.common.domain.settings.SizeSettings
import io.github.composegears.valkyrie.ui.screen.webimport.common.ui.CategoryHeaderItem
import io.github.composegears.valkyrie.ui.screen.webimport.common.ui.IconCard
import io.github.composegears.valkyrie.ui.screen.webimport.common.ui.IconGrid
import io.github.composegears.valkyrie.ui.screen.webimport.common.ui.IconLoadingPlaceholder
import io.github.composegears.valkyrie.ui.screen.webimport.common.ui.IconSizeCustomization
import io.github.composegears.valkyrie.ui.screen.webimport.common.ui.SidePanel
import io.github.composegears.valkyrie.ui.screen.webimport.common.ui.StandardTopActions
import io.github.composegears.valkyrie.ui.screen.webimport.common.ui.WebIconTopActions
import io.github.composegears.valkyrie.ui.screen.webimport.common.ui.ZOOM_DEFAULT_SCALE
import io.github.composegears.valkyrie.ui.screen.webimport.common.ui.ZoomFloatingBar
import io.github.composegears.valkyrie.util.stringResource
import kotlinx.coroutines.launch
import org.jetbrains.jewel.foundation.theme.LocalContentColor
import org.jetbrains.jewel.ui.component.VerticalScrollbar

@Composable
internal fun StandardImportScreen(
Expand Down Expand Up @@ -219,7 +210,7 @@ private fun IconsContent(
)
},
) {
StandardTopActions(
WebIconTopActions(
categories = state.config.categories,
styles = state.config.styles,
selectedCategory = state.selectedCategory,
Expand Down Expand Up @@ -397,55 +388,3 @@ private fun rememberStandardFont(
fontVariationSettings = fontVariationSettings,
)
}

/**
* Shared icon grid for web import screens.
* Provides a consistent grid layout with scrollbar.
*
* @param state The LazyGridState for the grid
* @param modifier Modifier to be applied to the container
* @param content The content of the grid
*/
@Composable
private fun IconGrid(
state: LazyGridState,
modifier: Modifier = Modifier,
content: LazyGridScope.() -> Unit,
) {
Box(modifier = modifier) {
LazyVerticalGrid(
state = state,
modifier = Modifier.fillMaxSize(),
columns = GridCells.Adaptive(100.dp),
contentPadding = PaddingValues(16.dp),
horizontalArrangement = Arrangement.spacedBy(8.dp),
verticalArrangement = Arrangement.spacedBy(8.dp),
content = content,
)
VerticalScrollbar(
scrollState = state,
modifier = Modifier.fillMaxHeight()
.align(Alignment.CenterEnd)
.padding(end = 4.dp, top = 8.dp, bottom = 4.dp),
)
}
}

/**
* Shimmer placeholder for loading icon state.
*
* @param shimmer The shimmer animation to use
* @param modifier Modifier to be applied to the shimmer placeholder
*/
@Composable
private fun IconLoadingPlaceholder(
shimmer: Shimmer,
modifier: Modifier = Modifier,
) {
Spacer(
modifier = modifier
.fillMaxSize()
.clip(RoundedCornerShape(12.dp))
.shimmer(shimmer = shimmer, cornerRadius = 12.dp),
)
}
Loading
Loading