diff --git a/processor/build.gradle b/processor/build.gradle index 251096e1..d51b1294 100644 --- a/processor/build.gradle +++ b/processor/build.gradle @@ -1,4 +1,4 @@ apply from: "${project.rootDir}/gradle/kotlin/processor.gradle" group = 'com.kotlitecture.kotli' -version = '0.1.1' \ No newline at end of file +version = '0.1.2' \ No newline at end of file diff --git a/processor/src/main/kotlin/kotli/template/multiplatform/compose/MultiplatformComposeTemplateProcessor.kt b/processor/src/main/kotlin/kotli/template/multiplatform/compose/MultiplatformComposeTemplateProcessor.kt index 849d95a1..c78f8eac 100644 --- a/processor/src/main/kotlin/kotli/template/multiplatform/compose/MultiplatformComposeTemplateProcessor.kt +++ b/processor/src/main/kotlin/kotli/template/multiplatform/compose/MultiplatformComposeTemplateProcessor.kt @@ -161,7 +161,7 @@ object MultiplatformComposeTemplateProcessor : BaseTemplateProcessor() { ) ) state.onApplyRules( - Rules.AppIconsKt, + Rules.AppIconsProviderKt, ReplaceMarkedText( text = "import template.", marker = "import template.", diff --git a/processor/src/main/kotlin/kotli/template/multiplatform/compose/Rules.kt b/processor/src/main/kotlin/kotli/template/multiplatform/compose/Rules.kt index 4ce6bb6b..ec2374de 100644 --- a/processor/src/main/kotlin/kotli/template/multiplatform/compose/Rules.kt +++ b/processor/src/main/kotlin/kotli/template/multiplatform/compose/Rules.kt @@ -31,8 +31,7 @@ object Rules { const val CommonAppSrcDir = "composeApp/src" const val SharedDesignSrcDir = "shared/design/src" const val CommonAppMainDir = "${CommonAppSrcDir}/commonMain" - const val CommonAppMainDrawableDir = "${CommonAppMainDir}/composeResources/drawable" - const val AppIconsKt = "${SharedDesignSrcDir}/commonMain/kotlin/shared/design/AppIcons.kt" + const val AppIconsProviderKt = "${SharedDesignSrcDir}/commonMain/kotlin/shared/design/icon/AppIconsProvider.kt" const val AppKt = "${CommonAppMainDir}/kotlin/kotli/app/App.kt" const val AppDIKt = "${CommonAppMainDir}/kotlin/kotli/app/di/DI.kt" const val AppScreenKt = "${CommonAppMainDir}/kotlin/kotli/app/AppScreen.kt" diff --git a/processor/src/main/kotlin/kotli/template/multiplatform/compose/showcases/ShowcasesProcessor.kt b/processor/src/main/kotlin/kotli/template/multiplatform/compose/showcases/ShowcasesProcessor.kt index 76cd5bfc..0c4ce8d2 100644 --- a/processor/src/main/kotlin/kotli/template/multiplatform/compose/showcases/ShowcasesProcessor.kt +++ b/processor/src/main/kotlin/kotli/template/multiplatform/compose/showcases/ShowcasesProcessor.kt @@ -42,10 +42,6 @@ object ShowcasesProcessor : BaseFeatureProcessor() { RemoveMarkedLine("ic_nav_showcases"), RemoveMarkedLine("ShowcasesDestination"), ) - state.onApplyRules( - "${Rules.CommonAppMainDrawableDir}/ic_nav_showcases.svg", - RemoveFile() - ) state.onApplyRules( Rules.AppNavigationRouterKt, ReplaceMarkedText( diff --git a/processor/src/main/kotlin/kotli/template/multiplatform/compose/userflow/navigation/NavigationBarProcessor.kt b/processor/src/main/kotlin/kotli/template/multiplatform/compose/userflow/navigation/NavigationBarProcessor.kt index eb66586b..1c143409 100644 --- a/processor/src/main/kotlin/kotli/template/multiplatform/compose/userflow/navigation/NavigationBarProcessor.kt +++ b/processor/src/main/kotlin/kotli/template/multiplatform/compose/userflow/navigation/NavigationBarProcessor.kt @@ -61,18 +61,6 @@ object NavigationBarProcessor : BaseFeatureProcessor() { RemoveMarkedLine("NavigationCViewModel"), RemoveMarkedLine("NavigationBarViewModel") ) - state.onApplyRules( - "${Rules.CommonAppMainDrawableDir}/ic_nav_a.svg", - RemoveFile() - ) - state.onApplyRules( - "${Rules.CommonAppMainDrawableDir}/ic_nav_b.svg", - RemoveFile() - ) - state.onApplyRules( - "${Rules.CommonAppMainDrawableDir}/ic_nav_c.svg", - RemoveFile() - ) } } \ No newline at end of file diff --git a/template/composeApp/src/commonMain/composeResources/drawable/ic_nav_b.svg b/template/composeApp/src/commonMain/composeResources/drawable/ic_nav_b.svg deleted file mode 100644 index 763e3f55..00000000 --- a/template/composeApp/src/commonMain/composeResources/drawable/ic_nav_b.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/template/composeApp/src/commonMain/kotlin/kotli/app/di/state/ProvidesNavigationBarState.kt b/template/composeApp/src/commonMain/kotlin/kotli/app/di/state/ProvidesNavigationBarState.kt index dac04716..54a6819e 100644 --- a/template/composeApp/src/commonMain/kotlin/kotli/app/di/state/ProvidesNavigationBarState.kt +++ b/template/composeApp/src/commonMain/kotlin/kotli/app/di/state/ProvidesNavigationBarState.kt @@ -11,11 +11,8 @@ import org.koin.dsl.module import shared.core.navigation.NavigationDestination import shared.core.navigation.NavigationState import shared.core.navigation.NavigationStrategy -import template.composeapp.generated.resources.Res -import template.composeapp.generated.resources.ic_nav_a -import template.composeapp.generated.resources.ic_nav_b -import template.composeapp.generated.resources.ic_nav_c -import template.composeapp.generated.resources.ic_nav_showcases +import shared.design.icon.AppIconModel +import shared.design.icon.AppIcons val ProvidesNavigationBarState = module { single { @@ -25,30 +22,30 @@ val ProvidesNavigationBarState = module { createPage( navigationState = get(), destination = ShowcasesDestination, - getActiveIcon = { Res.drawable.ic_nav_showcases }, - getInactiveIcon = { Res.drawable.ic_nav_showcases }, + getActiveIcon = { AppIcons.school }, + getInactiveIcon = { AppIcons.school }, getLabel = { "Showcases" } ), // end {showcases} createPage( navigationState = get(), destination = NavigationADestination, - getActiveIcon = { Res.drawable.ic_nav_a }, - getInactiveIcon = { Res.drawable.ic_nav_a }, + getActiveIcon = { AppIcons.wineBar }, + getInactiveIcon = { AppIcons.wineBar }, getLabel = { "Page 1" } ), createPage( navigationState = get(), destination = NavigationBDestination, - getActiveIcon = { Res.drawable.ic_nav_b }, - getInactiveIcon = { Res.drawable.ic_nav_b }, + getActiveIcon = { AppIcons.localDrink }, + getInactiveIcon = { AppIcons.localDrink }, getLabel = { "Page 2" } ), createPage( navigationState = get(), destination = NavigationCDestination, - getActiveIcon = { Res.drawable.ic_nav_c }, - getInactiveIcon = { Res.drawable.ic_nav_c }, + getActiveIcon = { AppIcons.coffee }, + getInactiveIcon = { AppIcons.coffee }, getLabel = { "Page 3" } ) ), @@ -63,8 +60,8 @@ val ProvidesNavigationBarState = module { private fun createPage( navigationState: NavigationState, destination: NavigationDestination, - getInactiveIcon: () -> Any, - getActiveIcon: () -> Any, + getInactiveIcon: () -> AppIconModel, + getActiveIcon: () -> AppIconModel, getLabel: @Composable () -> String?, ): NavigationBarPage { return NavigationBarPage( diff --git a/template/composeApp/src/commonMain/kotlin/kotli/app/feature/theme/toggle/ToggleThemeData.kt b/template/composeApp/src/commonMain/kotlin/kotli/app/feature/theme/toggle/ToggleThemeData.kt index ce66601c..bfa6ae1a 100644 --- a/template/composeApp/src/commonMain/kotlin/kotli/app/feature/theme/toggle/ToggleThemeData.kt +++ b/template/composeApp/src/commonMain/kotlin/kotli/app/feature/theme/toggle/ToggleThemeData.kt @@ -2,9 +2,9 @@ package kotli.app.feature.theme.toggle import androidx.compose.runtime.Immutable import androidx.compose.runtime.Stable -import org.jetbrains.compose.resources.DrawableResource import shared.core.theme.ThemeData -import shared.design.AppIcons +import shared.design.icon.AppIconModel +import shared.design.icon.AppIcons /** * Data class representing theme toggle data. @@ -20,10 +20,10 @@ data class ToggleThemeData( } @Stable - fun getIcon(): DrawableResource { + fun getIcon(): AppIconModel { return when { - data.context.dark -> AppIcons.LightMode - else -> AppIcons.DarkMode + data.context.dark -> AppIcons.lightMode + else -> AppIcons.darkMode } } } \ No newline at end of file diff --git a/template/composeApp/src/commonMain/kotlin/kotli/app/showcases/ShowcasesScreen.kt b/template/composeApp/src/commonMain/kotlin/kotli/app/showcases/ShowcasesScreen.kt index a0496c55..9625e337 100644 --- a/template/composeApp/src/commonMain/kotlin/kotli/app/showcases/ShowcasesScreen.kt +++ b/template/composeApp/src/commonMain/kotlin/kotli/app/showcases/ShowcasesScreen.kt @@ -12,7 +12,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import shared.core.provideViewModel import shared.core.state.StoreObject -import shared.design.AppIcons import shared.design.component.AppActionButton import shared.design.component.AppAlertDialog import shared.design.component.AppIcon @@ -21,6 +20,7 @@ import shared.design.component.AppSpacer16 import shared.design.component.AppText import shared.design.component.AppTextPrimaryHeader import shared.design.container.AppFixedTopBarLazyColumn +import shared.design.icon.AppIcons /** * Composable function for displaying the showcases screen. @@ -36,7 +36,7 @@ fun ShowcasesScreen() { AppActionButton( modifier = Modifier .padding(horizontal = 8.dp), - icon = AppIcons.Info, + icon = AppIcons.info, onClick = viewModel::onShowHint, ) }, @@ -109,7 +109,7 @@ private fun LazyListScope.showcaseItem( horizontalArrangement = Arrangement.SpaceBetween ) { AppText(text = showcase.label) - AppIcon(model = AppIcons.ChevronRight) + AppIcon(model = AppIcons.chevronRight) } } } diff --git a/template/shared/design/src/androidMain/kotlin/shared/design/icon/appIconsProvider.kt b/template/shared/design/src/androidMain/kotlin/shared/design/icon/appIconsProvider.kt new file mode 100644 index 00000000..bc264cd9 --- /dev/null +++ b/template/shared/design/src/androidMain/kotlin/shared/design/icon/appIconsProvider.kt @@ -0,0 +1,29 @@ +package shared.design.icon + +import androidx.compose.ui.res.painterResource +import shared.design.R + +actual fun appIconsProvider() = object : AppIconsProvider { + + override val info: AppIconModel + get() = PainterIcon { painterResource(R.drawable.ic_info) } + override val cancel: AppIconModel + get() = PainterIcon { painterResource(R.drawable.ic_cancel) } + override val arrowBack: AppIconModel + get() = PainterIcon { painterResource(R.drawable.ic_arrow_back) } + override val chevronRight: AppIconModel + get() = PainterIcon { painterResource(R.drawable.ic_chevron_right) } + override val lightMode: AppIconModel + get() = PainterIcon { painterResource(R.drawable.ic_light_mode) } + override val darkMode: AppIconModel + get() = PainterIcon { painterResource(R.drawable.ic_dark_mode) } + override val school: AppIconModel + get() = PainterIcon { painterResource(R.drawable.ic_school) } + override val coffee: AppIconModel + get() = PainterIcon { painterResource(R.drawable.ic_coffee) } + override val wineBar: AppIconModel + get() = PainterIcon { painterResource(R.drawable.ic_wine_bar) } + override val localDrink: AppIconModel + get() = PainterIcon { painterResource(R.drawable.ic_local_drink) } + +} \ No newline at end of file diff --git a/template/shared/design/src/androidMain/res/drawable/ic_arrow_back.xml b/template/shared/design/src/androidMain/res/drawable/ic_arrow_back.xml new file mode 100644 index 00000000..d6fbee0e --- /dev/null +++ b/template/shared/design/src/androidMain/res/drawable/ic_arrow_back.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/template/shared/design/src/androidMain/res/drawable/ic_cancel.xml b/template/shared/design/src/androidMain/res/drawable/ic_cancel.xml new file mode 100644 index 00000000..696f39dd --- /dev/null +++ b/template/shared/design/src/androidMain/res/drawable/ic_cancel.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/template/shared/design/src/androidMain/res/drawable/ic_chevron_right.xml b/template/shared/design/src/androidMain/res/drawable/ic_chevron_right.xml new file mode 100644 index 00000000..67bd0be8 --- /dev/null +++ b/template/shared/design/src/androidMain/res/drawable/ic_chevron_right.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/template/shared/design/src/androidMain/res/drawable/ic_coffee.xml b/template/shared/design/src/androidMain/res/drawable/ic_coffee.xml new file mode 100644 index 00000000..c0ab130d --- /dev/null +++ b/template/shared/design/src/androidMain/res/drawable/ic_coffee.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/template/shared/design/src/androidMain/res/drawable/ic_dark_mode.xml b/template/shared/design/src/androidMain/res/drawable/ic_dark_mode.xml new file mode 100644 index 00000000..44ba76d3 --- /dev/null +++ b/template/shared/design/src/androidMain/res/drawable/ic_dark_mode.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/template/shared/design/src/androidMain/res/drawable/ic_info.xml b/template/shared/design/src/androidMain/res/drawable/ic_info.xml new file mode 100644 index 00000000..8dca6081 --- /dev/null +++ b/template/shared/design/src/androidMain/res/drawable/ic_info.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/template/shared/design/src/androidMain/res/drawable/ic_light_mode.xml b/template/shared/design/src/androidMain/res/drawable/ic_light_mode.xml new file mode 100644 index 00000000..8567c3d1 --- /dev/null +++ b/template/shared/design/src/androidMain/res/drawable/ic_light_mode.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/template/shared/design/src/androidMain/res/drawable/ic_local_drink.xml b/template/shared/design/src/androidMain/res/drawable/ic_local_drink.xml new file mode 100644 index 00000000..d7725af2 --- /dev/null +++ b/template/shared/design/src/androidMain/res/drawable/ic_local_drink.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/template/shared/design/src/androidMain/res/drawable/ic_school.xml b/template/shared/design/src/androidMain/res/drawable/ic_school.xml new file mode 100644 index 00000000..5b857d16 --- /dev/null +++ b/template/shared/design/src/androidMain/res/drawable/ic_school.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/template/shared/design/src/androidMain/res/drawable/ic_wine_bar.xml b/template/shared/design/src/androidMain/res/drawable/ic_wine_bar.xml new file mode 100644 index 00000000..8b9b0955 --- /dev/null +++ b/template/shared/design/src/androidMain/res/drawable/ic_wine_bar.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/template/composeApp/src/commonMain/composeResources/drawable/ic_nav_c.svg b/template/shared/design/src/commonMain/composeResources/drawable/ic_coffee.svg similarity index 100% rename from template/composeApp/src/commonMain/composeResources/drawable/ic_nav_c.svg rename to template/shared/design/src/commonMain/composeResources/drawable/ic_coffee.svg diff --git a/template/shared/design/src/commonMain/composeResources/drawable/ic_local_drink.svg b/template/shared/design/src/commonMain/composeResources/drawable/ic_local_drink.svg new file mode 100644 index 00000000..a17e94ef --- /dev/null +++ b/template/shared/design/src/commonMain/composeResources/drawable/ic_local_drink.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/template/composeApp/src/commonMain/composeResources/drawable/ic_nav_showcases.svg b/template/shared/design/src/commonMain/composeResources/drawable/ic_school.svg similarity index 100% rename from template/composeApp/src/commonMain/composeResources/drawable/ic_nav_showcases.svg rename to template/shared/design/src/commonMain/composeResources/drawable/ic_school.svg diff --git a/template/composeApp/src/commonMain/composeResources/drawable/ic_nav_a.svg b/template/shared/design/src/commonMain/composeResources/drawable/ic_wine_bar.svg similarity index 100% rename from template/composeApp/src/commonMain/composeResources/drawable/ic_nav_a.svg rename to template/shared/design/src/commonMain/composeResources/drawable/ic_wine_bar.svg diff --git a/template/shared/design/src/commonMain/kotlin/shared/design/AppIcons.kt b/template/shared/design/src/commonMain/kotlin/shared/design/AppIcons.kt deleted file mode 100644 index 48a775a3..00000000 --- a/template/shared/design/src/commonMain/kotlin/shared/design/AppIcons.kt +++ /dev/null @@ -1,26 +0,0 @@ -package shared.design - -import template.shared.design.generated.resources.Res -import template.shared.design.generated.resources.ic_arrow_back -import template.shared.design.generated.resources.ic_cancel -import template.shared.design.generated.resources.ic_chevron_right -import template.shared.design.generated.resources.ic_dark_mode -import template.shared.design.generated.resources.ic_info -import template.shared.design.generated.resources.ic_light_mode - -object AppIcons { - - val ArrowBack - get() = Res.drawable.ic_arrow_back - val Cancel - get() = Res.drawable.ic_cancel - val DarkMode - get() = Res.drawable.ic_dark_mode - val LightMode - get() = Res.drawable.ic_light_mode - val Info - get() = Res.drawable.ic_info - val ChevronRight - get() = Res.drawable.ic_chevron_right - -} \ No newline at end of file diff --git a/template/shared/design/src/commonMain/kotlin/shared/design/component/AppButton.kt b/template/shared/design/src/commonMain/kotlin/shared/design/component/AppButton.kt index e43c494d..7ff7f6fc 100644 --- a/template/shared/design/src/commonMain/kotlin/shared/design/component/AppButton.kt +++ b/template/shared/design/src/commonMain/kotlin/shared/design/component/AppButton.kt @@ -7,6 +7,7 @@ import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import shared.design.icon.AppIconModel /** * Button commonly used in the app bars. @@ -20,7 +21,7 @@ import androidx.compose.ui.graphics.Color fun AppActionButton( modifier: Modifier = Modifier, onClick: () -> Unit, - icon: Any?, + icon: AppIconModel?, tint: Color = LocalContentColor.current ) { IconButton( diff --git a/template/shared/design/src/commonMain/kotlin/shared/design/component/AppIcon.kt b/template/shared/design/src/commonMain/kotlin/shared/design/component/AppIcon.kt index d22d27e0..29867af9 100644 --- a/template/shared/design/src/commonMain/kotlin/shared/design/component/AppIcon.kt +++ b/template/shared/design/src/commonMain/kotlin/shared/design/component/AppIcon.kt @@ -8,10 +8,13 @@ import androidx.compose.material3.LocalContentColor import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.unit.Dp -import org.jetbrains.compose.resources.DrawableResource import org.jetbrains.compose.resources.painterResource +import shared.design.icon.AppIconModel +import shared.design.icon.ColorIcon +import shared.design.icon.DrawableResourceIcon +import shared.design.icon.ImageVectorIcon +import shared.design.icon.PainterIcon /** * Icon. @@ -26,16 +29,40 @@ fun AppIcon( modifier: Modifier = Modifier, tint: Color = LocalContentColor.current, size: Dp = Dp.Unspecified, - model: Any? + model: AppIconModel? ) { when (model) { - is ImageVector -> AppIcon(modifier, tint, size, model) - is DrawableResource -> AppIcon(modifier, tint, size, model) - is Color -> AppIcon(modifier, size, model) + is ColorIcon -> AppIcon(modifier, size, model) + is PainterIcon -> AppIcon(modifier, tint, size, model) + is ImageVectorIcon -> AppIcon(modifier, tint, size, model) + is DrawableResourceIcon -> AppIcon(modifier, tint, size, model) else -> Box(modifier = modifier.size(size).background(tint)) } } +/** + * Icon from an Painter. + * + * @param modifier Modifier to be applied to the icon. + * @param tint Color to be applied to the icon. + * @param size Size of the icon. + * @param model ImageVector representing the icon. + */ +@Composable +private fun AppIcon( + modifier: Modifier = Modifier, + tint: Color = LocalContentColor.current, + size: Dp = Dp.Unspecified, + model: PainterIcon +) { + Icon( + modifier = modifier.size(size), + contentDescription = null, + painter = model.value(), + tint = tint + ) +} + /** * Icon from an ImageVector. * @@ -45,16 +72,16 @@ fun AppIcon( * @param model ImageVector representing the icon. */ @Composable -fun AppIcon( +private fun AppIcon( modifier: Modifier = Modifier, tint: Color = LocalContentColor.current, size: Dp = Dp.Unspecified, - model: ImageVector + model: ImageVectorIcon ) { Icon( modifier = modifier.size(size), contentDescription = null, - imageVector = model, + imageVector = model.value, tint = tint ) } @@ -68,15 +95,15 @@ fun AppIcon( * @param model DrawableResource representing the icon. */ @Composable -fun AppIcon( +private fun AppIcon( modifier: Modifier = Modifier, tint: Color = LocalContentColor.current, size: Dp = Dp.Unspecified, - model: DrawableResource + model: DrawableResourceIcon ) { Icon( modifier = modifier.size(size), - painter = painterResource(model), + painter = painterResource(model.value), contentDescription = null, tint = tint ) @@ -90,14 +117,14 @@ fun AppIcon( * @param model Color representing the icon. */ @Composable -fun AppIcon( +private fun AppIcon( modifier: Modifier = Modifier, size: Dp = Dp.Unspecified, - model: Color + model: ColorIcon ) { Box( modifier = modifier .size(size) - .background(model) + .background(model.value) ) } \ No newline at end of file diff --git a/template/shared/design/src/commonMain/kotlin/shared/design/component/AppTextField.kt b/template/shared/design/src/commonMain/kotlin/shared/design/component/AppTextField.kt index 5236ad07..db1d1567 100644 --- a/template/shared/design/src/commonMain/kotlin/shared/design/component/AppTextField.kt +++ b/template/shared/design/src/commonMain/kotlin/shared/design/component/AppTextField.kt @@ -8,7 +8,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import shared.core.state.StoreObject -import shared.design.AppIcons +import shared.design.icon.AppIcons /** * Text field. @@ -35,7 +35,7 @@ fun AppTextField( if (!valueStore.asStateValue().isNullOrEmpty()) { AppActionButton( modifier = Modifier.size(24.dp), - icon = AppIcons.Cancel, + icon = AppIcons.cancel, onClick = valueStore::clear ) } diff --git a/template/shared/design/src/commonMain/kotlin/shared/design/container/AppFixedTopBar.kt b/template/shared/design/src/commonMain/kotlin/shared/design/container/AppFixedTopBar.kt index b184c75a..24c4366b 100644 --- a/template/shared/design/src/commonMain/kotlin/shared/design/container/AppFixedTopBar.kt +++ b/template/shared/design/src/commonMain/kotlin/shared/design/container/AppFixedTopBar.kt @@ -14,7 +14,7 @@ import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import shared.design.AppIcons +import shared.design.icon.AppIcons import shared.design.component.AppActionButton import shared.design.theme.AppTheme @@ -93,7 +93,7 @@ private fun HeaderBlock( if (onBack != null) { AppActionButton( onClick = onBack, - icon = AppIcons.ArrowBack + icon = AppIcons.arrowBack ) } } diff --git a/template/shared/design/src/commonMain/kotlin/shared/design/container/AppNavigation.kt b/template/shared/design/src/commonMain/kotlin/shared/design/container/AppNavigation.kt index 65ff4b62..91b80663 100644 --- a/template/shared/design/src/commonMain/kotlin/shared/design/container/AppNavigation.kt +++ b/template/shared/design/src/commonMain/kotlin/shared/design/container/AppNavigation.kt @@ -28,6 +28,7 @@ import shared.core.state.StoreObject import shared.design.component.AppIcon import shared.design.component.AppSpacer8 import shared.design.component.AppText +import shared.design.icon.AppIconModel /** * Represents a navigation item. @@ -45,12 +46,12 @@ data class AppNavigationItem( val enabled: Boolean = true, val alwaysShowLabel: Boolean = true, val getLabel: @Composable () -> String?, - val getActiveIcon: () -> Any, - val getInactiveIcon: () -> Any, + val getActiveIcon: () -> AppIconModel, + val getInactiveIcon: () -> AppIconModel, val onClick: () -> Unit ) { @Stable - fun getIcon(selected: Boolean): Any { + fun getIcon(selected: Boolean): AppIconModel { return if (selected) { getActiveIcon() } else { diff --git a/template/shared/design/src/commonMain/kotlin/shared/design/icon/AppIconModel.kt b/template/shared/design/src/commonMain/kotlin/shared/design/icon/AppIconModel.kt new file mode 100644 index 00000000..7df9b856 --- /dev/null +++ b/template/shared/design/src/commonMain/kotlin/shared/design/icon/AppIconModel.kt @@ -0,0 +1,21 @@ +package shared.design.icon + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Immutable +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.graphics.vector.ImageVector +import org.jetbrains.compose.resources.DrawableResource + +@Immutable +sealed class AppIconModel + +data class ColorIcon(val value: Color) : AppIconModel() + +data class ImageVectorIcon(val value: ImageVector) : AppIconModel() + +data class DrawableResourceIcon(val value: DrawableResource) : AppIconModel() + +data class PainterIcon(val value: @Composable () -> Painter) : AppIconModel() + + diff --git a/template/shared/design/src/commonMain/kotlin/shared/design/icon/AppIcons.kt b/template/shared/design/src/commonMain/kotlin/shared/design/icon/AppIcons.kt new file mode 100644 index 00000000..3c8de9fd --- /dev/null +++ b/template/shared/design/src/commonMain/kotlin/shared/design/icon/AppIcons.kt @@ -0,0 +1,5 @@ +package shared.design.icon + +expect fun appIconsProvider(): AppIconsProvider + +val AppIcons by lazy { appIconsProvider() } \ No newline at end of file diff --git a/template/shared/design/src/commonMain/kotlin/shared/design/icon/AppIconsProvider.kt b/template/shared/design/src/commonMain/kotlin/shared/design/icon/AppIconsProvider.kt new file mode 100644 index 00000000..b6751e03 --- /dev/null +++ b/template/shared/design/src/commonMain/kotlin/shared/design/icon/AppIconsProvider.kt @@ -0,0 +1,38 @@ +package shared.design.icon + +import template.shared.design.generated.resources.Res +import template.shared.design.generated.resources.ic_arrow_back +import template.shared.design.generated.resources.ic_cancel +import template.shared.design.generated.resources.ic_chevron_right +import template.shared.design.generated.resources.ic_coffee +import template.shared.design.generated.resources.ic_dark_mode +import template.shared.design.generated.resources.ic_info +import template.shared.design.generated.resources.ic_light_mode +import template.shared.design.generated.resources.ic_local_drink +import template.shared.design.generated.resources.ic_school +import template.shared.design.generated.resources.ic_wine_bar + +interface AppIconsProvider { + + val info: AppIconModel + get() = DrawableResourceIcon(Res.drawable.ic_info) + val cancel: AppIconModel + get() = DrawableResourceIcon(Res.drawable.ic_cancel) + val arrowBack: AppIconModel + get() = DrawableResourceIcon(Res.drawable.ic_arrow_back) + val chevronRight: AppIconModel + get() = DrawableResourceIcon(Res.drawable.ic_chevron_right) + val lightMode: AppIconModel + get() = DrawableResourceIcon(Res.drawable.ic_light_mode) + val darkMode: AppIconModel + get() = DrawableResourceIcon(Res.drawable.ic_dark_mode) + val school: AppIconModel + get() = DrawableResourceIcon(Res.drawable.ic_school) + val coffee: AppIconModel + get() = DrawableResourceIcon(Res.drawable.ic_coffee) + val wineBar: AppIconModel + get() = DrawableResourceIcon(Res.drawable.ic_wine_bar) + val localDrink: AppIconModel + get() = DrawableResourceIcon(Res.drawable.ic_local_drink) + +} \ No newline at end of file diff --git a/template/shared/design/src/iosMain/kotlin/shared/design/icon/appIconsProvider.kt b/template/shared/design/src/iosMain/kotlin/shared/design/icon/appIconsProvider.kt new file mode 100644 index 00000000..70a9145e --- /dev/null +++ b/template/shared/design/src/iosMain/kotlin/shared/design/icon/appIconsProvider.kt @@ -0,0 +1,3 @@ +package shared.design.icon + +actual fun appIconsProvider() = object : AppIconsProvider {} \ No newline at end of file diff --git a/template/shared/design/src/jsMain/kotlin/shared/design/icon/appIconsProvider.kt b/template/shared/design/src/jsMain/kotlin/shared/design/icon/appIconsProvider.kt new file mode 100644 index 00000000..70a9145e --- /dev/null +++ b/template/shared/design/src/jsMain/kotlin/shared/design/icon/appIconsProvider.kt @@ -0,0 +1,3 @@ +package shared.design.icon + +actual fun appIconsProvider() = object : AppIconsProvider {} \ No newline at end of file diff --git a/template/shared/design/src/jvmMain/kotlin/shared/design/icon/appIconsProvider.kt b/template/shared/design/src/jvmMain/kotlin/shared/design/icon/appIconsProvider.kt new file mode 100644 index 00000000..70a9145e --- /dev/null +++ b/template/shared/design/src/jvmMain/kotlin/shared/design/icon/appIconsProvider.kt @@ -0,0 +1,3 @@ +package shared.design.icon + +actual fun appIconsProvider() = object : AppIconsProvider {} \ No newline at end of file