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