diff --git a/.github/workflows/update_readme.yml b/.github/workflows/update_readme.yml
new file mode 100644
index 00000000..65b0dc50
--- /dev/null
+++ b/.github/workflows/update_readme.yml
@@ -0,0 +1,65 @@
+name: Update README.md with generated image grids
+
+on:
+ push:
+ branches:
+ - update-readme
+
+jobs:
+ generate_image_grids:
+ runs-on: macOS-latest
+
+ strategy:
+ fail-fast: false
+ matrix:
+ api-level: [29]
+ steps:
+ - uses: actions/checkout@v2
+ - name: set up JDK
+ uses: actions/setup-java@v1
+ with:
+ java-version: 11
+
+ - name: Install ADB
+ run: brew install android-platform-tools
+
+ - name: Gradle cache
+ uses: gradle/gradle-build-action@v2
+
+ - name: Run CaptureDialogSamples Test
+ uses: ReactiveCircus/android-emulator-runner@v2.28.0
+ with:
+ api-level: ${{ matrix.api-level }}
+ script: |
+ adb root
+ ./gradlew connectedCheck -Pandroid.testInstrumentationRunnerArguments.class=com.mk.sheets.sample_images.CaptureDialogSamples
+ adb pull /storage/emulated/0/Download/sheets/ ./docs/res/sheets
+
+ - name: Set up Python
+ uses: actions/setup-python@v2
+ with:
+ python-version: 3.x
+
+ - name: Install Pillow
+ run: pip install Pillow
+
+ - name: Set up Python
+ uses: actions/setup-python@v2
+ with:
+ python-version: '3.x'
+
+ - name: Generate image grid in README
+ run: |
+ python3 scripts/generate_image_grid.py
+
+ - name: Commit and Push Changes
+ run: |
+ git config user.name "README Bot"
+ git config user.email "<>"
+ git add README.md
+ git add docs/res/sheets
+ git add docs/README.md
+ git commit -m "Update README.md"
+ git push
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/README.md b/README.md
index 3768f5a5..14ed9338 100644
--- a/README.md
+++ b/README.md
@@ -86,211 +86,12 @@ Available modules: `core` | `info` | `color` | `calendar` | `clock` | `duration`
[Sheets-Compose-Dialogs General Documentation](https://maxkeppeler.notion.site/sheets-compose-dialogs-804f0ebcb2c84b98b7afa5f687295aed)
# Showcase
-Check out some of the use-cases as dialogs. All of them could be displayed within a PopUp, BottomSheet or another container view as well.
+Check out some of the use-cases as dialogs. All of them can be displayed within a PopUp, BottomSheet or another container view as well.
-## Color Dialog / View
-The color dialog / view allows you to pick a color from a range of template colors or a custom color.
-
-
- Sample 1 |
- Sample 2 |
- Sample 3 |
- |
-
-
- ![](docs/res/light/dialog_color_sample_1.gif) |
- ![](docs/res/light/dialog_color_sample_2.gif) |
- ![](docs/res/light/dialog_color_sample_3.gif) |
-
-
- ![](docs/res/dark/dialog_color_sample_1.gif) |
- ![](docs/res/dark/dialog_color_sample_2.gif) |
- ![](docs/res/dark/dialog_color_sample_3.gif) |
-
-
-
-## Calendar Dialog / View
-The calendar dialog / view allows you to pick a date, multiple dates or a range.
-
-
-
- Sample 1 |
- Sample 2 |
- Sample 3 |
- |
-
-
- ![](docs/res/light/dialog_calendar_sample_1.gif) |
- ![](docs/res/light/dialog_calendar_sample_2.gif) |
- ![](docs/res/light/dialog_calendar_sample_3.gif) |
-
-
- ![](docs/res/dark/dialog_calendar_sample_1.gif) |
- ![](docs/res/dark/dialog_calendar_sample_2.gif) |
- ![](docs/res/dark/dialog_calendar_sample_3.gif) |
-
-
-
-
-## Clock Dialog / View
-The clock dialog / view allows you to pick a clock time, in either the 12-Hour-Format or the 24-Hour-Format.
-
-
-
- Sample 1 |
- Sample 2 |
- |
- |
-
-
- ![](docs/res/light/dialog_clock_sample_1.gif) |
- ![](docs/res/light/dialog_clock_sample_2.gif) |
-
-
- ![](docs/res/dark/dialog_clock_sample_1.gif) |
- ![](docs/res/dark/dialog_clock_sample_2.gif) |
-
-
-
-
-## Duration Dialog / View
-The duration dialog / view allows you to pick a duration time within the bounds of a time format.
-
-
-
- Sample 1 |
- Sample 2 |
- |
- |
-
-
- ![](docs/res/light/dialog_duration_sample_1.gif) |
- ![](docs/res/light/dialog_duration_sample_2.gif) |
-
-
- ![](docs/res/dark/dialog_duration_sample_1.gif) |
- ![](docs/res/dark/dialog_duration_sample_2.gif) |
-
-
-
-## Date-Time Dialog / View
-The date-time dialog / view allows you to pick a date and/ or clock-time in a quick spinner-styled way.
-
-
-
- Sample 1 |
- Sample 2 |
- Sample 3 |
- |
-
-
- ![](docs/res/light/dialog_date-time_sample_1.gif) |
- ![](docs/res/light/dialog_date-time_sample_2.gif) |
- ![](docs/res/light/dialog_date-time_sample_3.gif) |
-
-
- ![](docs/res/dark/dialog_date-time_sample_1.gif) |
- ![](docs/res/dark/dialog_date-time_sample_2.gif) |
- ![](docs/res/dark/dialog_date-time_sample_3.gif) |
-
-
-
-
-## Option Dialog / View
-The option dialog / view allows you to pick one or multiple options. Options can be preselected, disabled and the selection can be limited.
-
-
-
- Sample 1 |
- Sample 2 |
- Sample 3 |
- |
-
-
- ![](docs/res/light/dialog_option_sample_1.gif) |
- ![](docs/res/light/dialog_option_sample_2.gif) |
- ![](docs/res/light/dialog_option_sample_3.gif) |
-
-
- ![](docs/res/dark/dialog_option_sample_1.gif) |
- ![](docs/res/dark/dialog_option_sample_2.gif) |
- ![](docs/res/dark/dialog_option_sample_3.gif) |
-
-
-
-
-## List Dialog / View
-The list dialog / view allows you to pick one or multiple options within a vertical list. Options can be preselected and the selection can be limited. The options can be displayed with a CheckBoxes and RadioButtons depending on the selection type.
-
-
-
- Sample 1 |
- Sample 2 |
- Sample 3 |
- Sample 4 |
-
-
- ![](docs/res/light/dialog_list_sample_1.gif) |
- ![](docs/res/light/dialog_list_sample_2.gif) |
- ![](docs/res/light/dialog_list_sample_3.gif) |
- ![](docs/res/light/dialog_list_sample_4.gif) |
-
-
- ![](docs/res/dark/dialog_list_sample_1.gif) |
- ![](docs/res/dark/dialog_list_sample_2.gif) |
- ![](docs/res/dark/dialog_list_sample_3.gif) |
- ![](docs/res/dark/dialog_list_sample_4.gif) |
-
-
-
-
-## Input Dialog / View
-The input dialog / view allows you to build up a small form of various components to collect quickly information.
-
-
-
- Sample 1 |
- Sample 2 |
- Sample 3 |
- Sample 4 |
-
-
- ![](docs/res/light/dialog_input_sample_1.gif) |
- ![](docs/res/light/dialog_input_sample_2.gif) |
- ![](docs/res/light/dialog_input_sample_3.gif) |
- ![](docs/res/light/dialog_input_sample_4.gif) |
-
-
- ![](docs/res/dark/dialog_input_sample_1.gif) |
- ![](docs/res/dark/dialog_input_sample_2.gif) |
- ![](docs/res/dark/dialog_input_sample_3.gif) |
- ![](docs/res/dark/dialog_input_sample_4.gif) |
-
-
-
-## Emoji Dialog / View
-The emoji dialog / view allows you to pick an emoji.
-
-
-
- Sample 1 |
- Sample 2 |
- |
- |
-
-
- ![](docs/res/light/dialog_emoji_sample_1.gif) |
- ![](docs/res/light/dialog_emoji_sample_2.gif) |
-
-
- ![](docs/res/dark/dialog_emoji_sample_1.gif) |
- ![](docs/res/dark/dialog_emoji_sample_2.gif) |
-
-
-
-Credits to [Vannik Tech's Emoji library](https://github.com/vanniktech/Emoji) - this module makes use of that lib.
+
+
## Donate
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index dc919211..4a5671ba 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -72,8 +72,8 @@ dependencies {
// Dependencies of sheets-compose-dialogs
//
-// val sheetsVersion = "0.0.1"
-//
+// val sheetsVersion = "1.1.1"
+////
// implementation("com.maxkeppeler.sheets-compose-dialogs:core:$sheetsVersion")
// implementation("com.maxkeppeler.sheets-compose-dialogs:info:$sheetsVersion")
// implementation("com.maxkeppeler.sheets-compose-dialogs:color:$sheetsVersion")
@@ -121,9 +121,12 @@ dependencies {
// Test libs
androidTestImplementations(
+ Dependencies.AndroidX.Test.TEST_CORE,
+ Dependencies.AndroidX.Test.TEST_RUNNER,
Dependencies.AndroidX.Test.JUNIT,
Dependencies.AndroidX.Test.ESPRESSO_CORE,
Dependencies.Compose.Test.JUNIT,
+ project(":test")
)
debugImplementations(
Dependencies.Compose.Test.TOOLING,
diff --git a/app/src/androidTest/java/com/mk/sheets/sample_images/CaptureDialogSamples.kt b/app/src/androidTest/java/com/mk/sheets/sample_images/CaptureDialogSamples.kt
new file mode 100644
index 00000000..27a6c2e5
--- /dev/null
+++ b/app/src/androidTest/java/com/mk/sheets/sample_images/CaptureDialogSamples.kt
@@ -0,0 +1,106 @@
+package com.mk.sheets.sample_images
+
+import androidx.compose.ui.test.SemanticsNodeInteraction
+import androidx.compose.ui.test.junit4.ComposeContentTestRule
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import com.maxkeppeker.sheets.core.utils.TestTags
+import com.maxkeppeler.sheets.test.utils.setContentAndWaitForIdle
+import com.mk.sheets.compose.ShowcaseDialogSamples
+import com.mk.sheets.compose.models.Sample
+import com.mk.sheets.compose.ui.theme.ColorfulRandomTestTheme
+import com.mk.sheets.saveScreenshotToFile
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.runBlocking
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+/**
+ * Capture the content of the [ShowcaseDialogSamples] and save it to a file.
+ */
+@RunWith(Parameterized::class)
+class CaptureDialogSamples(private val sample: Sample) {
+
+ @get:Rule
+ val rule = createComposeRule()
+
+ @Test
+ fun captureDialogSampleLight() {
+ captureDialogSample(darkTheme = false)
+ assert(true)
+ }
+
+ @Test
+ fun captureDialogSampleDark() {
+ captureDialogSample(darkTheme = true)
+ assert(true)
+ }
+
+ /**
+ * Set the content of the [ComposeContentTestRule] and capture the content.
+ */
+ private fun captureDialogSample(darkTheme: Boolean) {
+ setContent(rule, darkTheme)
+ captureContent(rule.onNodeWithTag(TestTags.DIALOG_BASE_CONTENT), darkTheme)
+ assert(true)
+ }
+
+ /**
+ * Set the content of the [ComposeContentTestRule] and wait until the content is idle.
+ */
+ private fun setContent(
+ rule: ComposeContentTestRule,
+ darkTheme: Boolean = false
+ ) {
+ rule.setContentAndWaitForIdle {
+ ColorfulRandomTestTheme(
+ darkTheme = darkTheme,
+ content = { ShowcaseDialogSamples(sample) }
+ )
+ }
+ rule.waitUntil(RECORDING_DELAY) { true }
+ }
+
+ /**
+ * Capture the content of the [SemanticsNodeInteraction] and save it to a file.
+ * The file will be saved in the following path:
+ */
+ private fun captureContent(node: SemanticsNodeInteraction, darkTheme: Boolean) {
+ val type = if (darkTheme) TYPE_DARK else TYPE_LIGHT
+ runBlocking {
+ delay(RECORDING_DELAY)
+ saveScreenshotToFile(
+ node = node,
+ path = "${sample.category.name.lowercase()}/$type",
+ fileName = sample.name.lowercase()
+ )
+ saveScreenshotToFile(
+ node = node,
+ path = "_all",
+ fileName = "${sample.category.name.lowercase()}_${sample.name.lowercase()}_$type"
+ )
+ }
+ }
+
+ companion object {
+
+ /**
+ * The delay between setting the content and capturing the content.
+ */
+ private const val RECORDING_DELAY = 2000L
+
+ private const val TYPE_LIGHT = "light"
+ private const val TYPE_DARK = "dark"
+
+ /**
+ * Create a [Parameterized.Parameters] for each [Sample].
+ * This will create a test for each sample.
+ * The [Parameterized.Parameters] will be passed to the constructor of this class.
+ */
+ @JvmStatic
+ @Parameterized.Parameters
+ fun data(): Collection> = Sample.values().map { arrayOf(it) }
+ }
+}
\ No newline at end of file
diff --git a/app/src/androidTest/java/com/mk/sheets/utils/Utils.kt b/app/src/androidTest/java/com/mk/sheets/utils/Utils.kt
new file mode 100644
index 00000000..6b8e47eb
--- /dev/null
+++ b/app/src/androidTest/java/com/mk/sheets/utils/Utils.kt
@@ -0,0 +1,41 @@
+package com.mk.sheets
+
+import android.graphics.Bitmap
+import android.os.Environment
+import android.util.Log
+import androidx.compose.ui.graphics.asAndroidBitmap
+import androidx.compose.ui.test.SemanticsNodeInteraction
+import androidx.compose.ui.test.captureToImage
+import java.io.File
+import java.io.FileOutputStream
+
+/**
+ * Saves a screenshot of the given node to the external storage.
+ * @param node The node to take the screenshot from.
+ * @param fileName The name of the file to save the screenshot to.
+ */
+internal fun saveScreenshotToFile(
+ node: SemanticsNodeInteraction,
+ path: String? = null,
+ fileName: String
+) {
+ val bitmap: Bitmap = node.captureToImage().asAndroidBitmap()
+
+ // Get the Downloads folder
+ val downloadsFolder =
+ Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
+ val actualPath = "sheets${path?.let { "/$it" }}"
+ val sheetsFolder = File(downloadsFolder, actualPath)
+
+ // Create the sheets directory if it doesn't exist
+ if (!sheetsFolder.exists()) {
+ sheetsFolder.mkdirs()
+ }
+
+ val file = File(sheetsFolder, "$fileName.png")
+ Log.d("Screenshot", "Saving screenshot to ${file.absolutePath}")
+
+ FileOutputStream(file).use { out ->
+ bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index aacceebf..7bd2ca6c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -2,6 +2,8 @@
+
+
Unit = {},
+ onResetSheet: UseCaseState.() -> Unit = {}
+) {
+ when (currentSample) {
Sample.CORE_SAMPLE_1 -> CoreSample1(onReset)
Sample.INFO_SAMPLE_1 -> InfoSample1(onReset)
diff --git a/app/src/main/java/com/mk/sheets/compose/main/MainActivity.kt b/app/src/main/java/com/mk/sheets/compose/main/MainActivity.kt
index abc50c6e..a16f5b78 100644
--- a/app/src/main/java/com/mk/sheets/compose/main/MainActivity.kt
+++ b/app/src/main/java/com/mk/sheets/compose/main/MainActivity.kt
@@ -40,7 +40,7 @@ import androidx.navigation.NavHostController
import androidx.navigation.compose.rememberNavController
import com.mk.sheets.compose.R
import com.mk.sheets.compose.models.Screen
-import com.mk.sheets.compose.ui.theme.SheetsComposeTheme
+import com.mk.sheets.compose.ui.theme.ColorfulRandomTestTheme
@ExperimentalMaterial3Api
class MainActivity : ComponentActivity() {
@@ -48,7 +48,7 @@ class MainActivity : ComponentActivity() {
super.onCreate(savedInstanceState)
setContent {
val navController = rememberNavController()
- SheetsComposeTheme {
+ ColorfulRandomTestTheme {
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
diff --git a/app/src/main/java/com/mk/sheets/compose/samples/BottomSheetSample.kt b/app/src/main/java/com/mk/sheets/compose/samples/BottomSheetSample.kt
index e9c7eb5e..c9392000 100644
--- a/app/src/main/java/com/mk/sheets/compose/samples/BottomSheetSample.kt
+++ b/app/src/main/java/com/mk/sheets/compose/samples/BottomSheetSample.kt
@@ -18,21 +18,10 @@
package com.mk.sheets.compose.samples
import androidx.compose.material.ExperimentalMaterialApi
-import androidx.compose.material.ModalBottomSheetLayout
import androidx.compose.material.ModalBottomSheetState
-import androidx.compose.material.ModalBottomSheetValue
import androidx.compose.material3.ExperimentalMaterial3Api
-import androidx.compose.material3.MaterialTheme
-import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.rememberCoroutineScope
-import com.maxkeppeker.sheets.core.models.base.rememberUseCaseState
-import com.maxkeppeler.sheets.calendar.CalendarView
-import com.maxkeppeler.sheets.calendar.models.CalendarConfig
-import com.maxkeppeler.sheets.calendar.models.CalendarSelection
-import com.maxkeppeler.sheets.calendar.models.CalendarStyle
-import kotlinx.coroutines.launch
@Composable
fun BottomSheetSample(
@@ -40,36 +29,36 @@ fun BottomSheetSample(
screenContent: @Composable () -> Unit,
) {
val coroutine = rememberCoroutineScope()
- val hideBottomSheet = { coroutine.launch { state.animateTo(ModalBottomSheetValue.Hidden) } }
- val useCaseState =
- rememberUseCaseState(visible = true, onCloseRequest = { hideBottomSheet(); })
+// val hideBottomSheet = { coroutine.launch { state.animateTo(ModalBottomSheetValue.Hidden) } }
+// val useCaseState =
+// rememberUseCaseState(visible = true, onCloseRequest = { hideBottomSheet(); })
- LaunchedEffect(state.currentValue) {
- when (state.currentValue) {
- ModalBottomSheetValue.Hidden,
- ModalBottomSheetValue.Expanded -> {
- useCaseState.invokeReset() // Manually reset internal state if required
- }
- ModalBottomSheetValue.HalfExpanded -> Unit
+// LaunchedEffect(state.currentValue) {
+// when (state.currentValue) {
+// ModalBottomSheetValue.Hidden,
+// ModalBottomSheetValue.Expanded -> {
+//// useCaseState.invokeReset() // Manually reset internal state if required
+// }
+// ModalBottomSheetValue.HalfExpanded -> Unit
+//
+// }
+// }
- }
- }
-
- ModalBottomSheetLayout(
- content = screenContent,
- sheetState = state,
- sheetContent = {
- Surface(
- color = MaterialTheme.colorScheme.surface,
- ) {
- CalendarView(
- useCaseState = useCaseState,
- config = CalendarConfig(
- style = CalendarStyle.WEEK
- ),
- selection = CalendarSelection.Dates {},
- )
- }
- }
- )
+// ModalBottomSheetLayout(
+// content = screenContent,
+// sheetState = state,
+// sheetContent = {
+// Surface(
+// color = MaterialTheme.colorScheme.surface,
+// ) {
+// CalendarView(
+// useCaseState = useCaseState,
+// config = CalendarConfig(
+// style = CalendarStyle.WEEK
+// ),
+// selection = CalendarSelection.Dates {},
+// )
+// }
+// }
+// )
}
\ No newline at end of file
diff --git a/app/src/main/java/com/mk/sheets/compose/ui/theme/Theme.kt b/app/src/main/java/com/mk/sheets/compose/ui/theme/Theme.kt
index 27742267..856299de 100644
--- a/app/src/main/java/com/mk/sheets/compose/ui/theme/Theme.kt
+++ b/app/src/main/java/com/mk/sheets/compose/ui/theme/Theme.kt
@@ -15,14 +15,22 @@
*/
package com.mk.sheets.compose.ui.theme
+import BlueDarkColors
+import BlueLightColors
+import DeepPurpleDarkColors
+import DeepPurpleLightColors
+import GreenDarkColors
+import GreenLightColors
+import OrangeDarkColors
+import OrangeLightColors
+import PinkDarkColors
+import PinkLightColors
+import PurpleDarkColors
+import PurpleLightColors
import android.app.Activity
import android.os.Build
import androidx.compose.foundation.isSystemInDarkTheme
-import androidx.compose.material3.MaterialTheme
-import androidx.compose.material3.darkColorScheme
-import androidx.compose.material3.dynamicDarkColorScheme
-import androidx.compose.material3.dynamicLightColorScheme
-import androidx.compose.material3.lightColorScheme
+import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.SideEffect
import androidx.compose.ui.graphics.toArgb
@@ -40,18 +48,38 @@ private val LightColorScheme = lightColorScheme(
primary = Purple40,
secondary = PurpleGrey40,
tertiary = Pink40
-
- /* Other default colors to override
- background = Color(0xFFFFFBFE),
- surface = Color(0xFFFFFBFE),
- onPrimary = Color.White,
- onSecondary = Color.White,
- onTertiary = Color.White,
- onBackground = Color(0xFF1C1B1F),
- onSurface = Color(0xFF1C1B1F),
- */
)
+@Composable
+fun ColorfulRandomTestTheme(
+ darkTheme: Boolean = false,
+ content: @Composable () -> Unit
+) {
+ val colorScheme = when {
+ darkTheme -> listOf(
+ PinkDarkColors,
+ PurpleDarkColors,
+ DeepPurpleDarkColors,
+ BlueDarkColors,
+ GreenDarkColors,
+ OrangeDarkColors,
+ )
+ else -> listOf(
+ PinkLightColors,
+ PurpleLightColors,
+ DeepPurpleLightColors,
+ BlueLightColors,
+ GreenLightColors,
+ OrangeLightColors,
+ )
+ }.random()
+
+ MaterialTheme(
+ colorScheme = colorScheme,
+ content = content
+ )
+}
+
@Composable
fun SheetsComposeTheme(
darkTheme: Boolean = isSystemInDarkTheme(),
diff --git a/app/src/main/java/com/mk/sheets/compose/ui/theme/themes/blue/BlueTheme.kt b/app/src/main/java/com/mk/sheets/compose/ui/theme/themes/blue/BlueTheme.kt
new file mode 100644
index 00000000..d932fea7
--- /dev/null
+++ b/app/src/main/java/com/mk/sheets/compose/ui/theme/themes/blue/BlueTheme.kt
@@ -0,0 +1,130 @@
+import androidx.compose.material3.darkColorScheme
+import androidx.compose.material3.lightColorScheme
+import androidx.compose.ui.graphics.Color
+
+private val md_theme_light_primary = Color(0xFF006878)
+private val md_theme_light_onPrimary = Color(0xFFFFFFFF)
+private val md_theme_light_primaryContainer = Color(0xFFA6EEFF)
+private val md_theme_light_onPrimaryContainer = Color(0xFF001F25)
+private val md_theme_light_secondary = Color(0xFF4B6268)
+private val md_theme_light_onSecondary = Color(0xFFFFFFFF)
+private val md_theme_light_secondaryContainer = Color(0xFFCDE7EE)
+private val md_theme_light_onSecondaryContainer = Color(0xFF051F24)
+private val md_theme_light_tertiary = Color(0xFF555D7E)
+private val md_theme_light_onTertiary = Color(0xFFFFFFFF)
+private val md_theme_light_tertiaryContainer = Color(0xFFDCE1FF)
+private val md_theme_light_onTertiaryContainer = Color(0xFF111A37)
+private val md_theme_light_error = Color(0xFFBA1A1A)
+private val md_theme_light_errorContainer = Color(0xFFFFDAD6)
+private val md_theme_light_onError = Color(0xFFFFFFFF)
+private val md_theme_light_onErrorContainer = Color(0xFF410002)
+private val md_theme_light_background = Color(0xFFFBFCFD)
+private val md_theme_light_onBackground = Color(0xFF191C1D)
+private val md_theme_light_surface = Color(0xFFFBFCFD)
+private val md_theme_light_onSurface = Color(0xFF191C1D)
+private val md_theme_light_surfaceVariant = Color(0xFFDBE4E7)
+private val md_theme_light_onSurfaceVariant = Color(0xFF3F484B)
+private val md_theme_light_outline = Color(0xFF6F797B)
+private val md_theme_light_inverseOnSurface = Color(0xFFEFF1F2)
+private val md_theme_light_inverseSurface = Color(0xFF2E3132)
+private val md_theme_light_inversePrimary = Color(0xFF53D7F1)
+private val md_theme_light_shadow = Color(0xFF000000)
+private val md_theme_light_surfaceTint = Color(0xFF006878)
+private val md_theme_light_outlineVariant = Color(0xFFBFC8CB)
+private val md_theme_light_scrim = Color(0xFF000000)
+
+private val md_theme_dark_primary = Color(0xFF53D7F1)
+private val md_theme_dark_onPrimary = Color(0xFF00363F)
+private val md_theme_dark_primaryContainer = Color(0xFF004E5B)
+private val md_theme_dark_onPrimaryContainer = Color(0xFFA6EEFF)
+private val md_theme_dark_secondary = Color(0xFFB2CBD1)
+private val md_theme_dark_onSecondary = Color(0xFF1C3439)
+private val md_theme_dark_secondaryContainer = Color(0xFF334A50)
+private val md_theme_dark_onSecondaryContainer = Color(0xFFCDE7EE)
+private val md_theme_dark_tertiary = Color(0xFFBDC5EB)
+private val md_theme_dark_onTertiary = Color(0xFF272F4D)
+private val md_theme_dark_tertiaryContainer = Color(0xFF3D4565)
+private val md_theme_dark_onTertiaryContainer = Color(0xFFDCE1FF)
+private val md_theme_dark_error = Color(0xFFFFB4AB)
+private val md_theme_dark_errorContainer = Color(0xFF93000A)
+private val md_theme_dark_onError = Color(0xFF690005)
+private val md_theme_dark_onErrorContainer = Color(0xFFFFDAD6)
+private val md_theme_dark_background = Color(0xFF191C1D)
+private val md_theme_dark_onBackground = Color(0xFFE1E3E4)
+private val md_theme_dark_surface = Color(0xFF191C1D)
+private val md_theme_dark_onSurface = Color(0xFFE1E3E4)
+private val md_theme_dark_surfaceVariant = Color(0xFF3F484B)
+private val md_theme_dark_onSurfaceVariant = Color(0xFFBFC8CB)
+private val md_theme_dark_outline = Color(0xFF899295)
+private val md_theme_dark_inverseOnSurface = Color(0xFF191C1D)
+private val md_theme_dark_inverseSurface = Color(0xFFE1E3E4)
+private val md_theme_dark_inversePrimary = Color(0xFF006878)
+private val md_theme_dark_shadow = Color(0xFF000000)
+private val md_theme_dark_surfaceTint = Color(0xFF53D7F1)
+private val md_theme_dark_outlineVariant = Color(0xFF3F484B)
+private val md_theme_dark_scrim = Color(0xFF000000)
+
+val BlueLightColors = lightColorScheme(
+ primary = md_theme_light_primary,
+ onPrimary = md_theme_light_onPrimary,
+ primaryContainer = md_theme_light_primaryContainer,
+ onPrimaryContainer = md_theme_light_onPrimaryContainer,
+ secondary = md_theme_light_secondary,
+ onSecondary = md_theme_light_onSecondary,
+ secondaryContainer = md_theme_light_secondaryContainer,
+ onSecondaryContainer = md_theme_light_onSecondaryContainer,
+ tertiary = md_theme_light_tertiary,
+ onTertiary = md_theme_light_onTertiary,
+ tertiaryContainer = md_theme_light_tertiaryContainer,
+ onTertiaryContainer = md_theme_light_onTertiaryContainer,
+ error = md_theme_light_error,
+ errorContainer = md_theme_light_errorContainer,
+ onError = md_theme_light_onError,
+ onErrorContainer = md_theme_light_onErrorContainer,
+ background = md_theme_light_background,
+ onBackground = md_theme_light_onBackground,
+ surface = md_theme_light_surface,
+ onSurface = md_theme_light_onSurface,
+ surfaceVariant = md_theme_light_surfaceVariant,
+ onSurfaceVariant = md_theme_light_onSurfaceVariant,
+ outline = md_theme_light_outline,
+ inverseOnSurface = md_theme_light_inverseOnSurface,
+ inverseSurface = md_theme_light_inverseSurface,
+ inversePrimary = md_theme_light_inversePrimary,
+ surfaceTint = md_theme_light_surfaceTint,
+ outlineVariant = md_theme_light_outlineVariant,
+ scrim = md_theme_light_scrim,
+)
+
+
+val BlueDarkColors = darkColorScheme(
+ primary = md_theme_dark_primary,
+ onPrimary = md_theme_dark_onPrimary,
+ primaryContainer = md_theme_dark_primaryContainer,
+ onPrimaryContainer = md_theme_dark_onPrimaryContainer,
+ secondary = md_theme_dark_secondary,
+ onSecondary = md_theme_dark_onSecondary,
+ secondaryContainer = md_theme_dark_secondaryContainer,
+ onSecondaryContainer = md_theme_dark_onSecondaryContainer,
+ tertiary = md_theme_dark_tertiary,
+ onTertiary = md_theme_dark_onTertiary,
+ tertiaryContainer = md_theme_dark_tertiaryContainer,
+ onTertiaryContainer = md_theme_dark_onTertiaryContainer,
+ error = md_theme_dark_error,
+ errorContainer = md_theme_dark_errorContainer,
+ onError = md_theme_dark_onError,
+ onErrorContainer = md_theme_dark_onErrorContainer,
+ background = md_theme_dark_background,
+ onBackground = md_theme_dark_onBackground,
+ surface = md_theme_dark_surface,
+ onSurface = md_theme_dark_onSurface,
+ surfaceVariant = md_theme_dark_surfaceVariant,
+ onSurfaceVariant = md_theme_dark_onSurfaceVariant,
+ outline = md_theme_dark_outline,
+ inverseOnSurface = md_theme_dark_inverseOnSurface,
+ inverseSurface = md_theme_dark_inverseSurface,
+ inversePrimary = md_theme_dark_inversePrimary,
+ surfaceTint = md_theme_dark_surfaceTint,
+ outlineVariant = md_theme_dark_outlineVariant,
+ scrim = md_theme_dark_scrim,
+)
diff --git a/app/src/main/java/com/mk/sheets/compose/ui/theme/themes/deep_purple/DeepPurpleTheme.kt b/app/src/main/java/com/mk/sheets/compose/ui/theme/themes/deep_purple/DeepPurpleTheme.kt
new file mode 100644
index 00000000..1c4bca4d
--- /dev/null
+++ b/app/src/main/java/com/mk/sheets/compose/ui/theme/themes/deep_purple/DeepPurpleTheme.kt
@@ -0,0 +1,132 @@
+
+import androidx.compose.material3.darkColorScheme
+import androidx.compose.material3.lightColorScheme
+import androidx.compose.ui.graphics.Color
+
+
+private val md_theme_light_primary = Color(0xFF5F52A7)
+private val md_theme_light_onPrimary = Color(0xFFFFFFFF)
+private val md_theme_light_primaryContainer = Color(0xFFE5DEFF)
+private val md_theme_light_onPrimaryContainer = Color(0xFF1A0161)
+private val md_theme_light_secondary = Color(0xFF605C71)
+private val md_theme_light_onSecondary = Color(0xFFFFFFFF)
+private val md_theme_light_secondaryContainer = Color(0xFFE5DFF9)
+private val md_theme_light_onSecondaryContainer = Color(0xFF1C192B)
+private val md_theme_light_tertiary = Color(0xFF7C5264)
+private val md_theme_light_onTertiary = Color(0xFFFFFFFF)
+private val md_theme_light_tertiaryContainer = Color(0xFFFFD8E6)
+private val md_theme_light_onTertiaryContainer = Color(0xFF301120)
+private val md_theme_light_error = Color(0xFFBA1A1A)
+private val md_theme_light_errorContainer = Color(0xFFFFDAD6)
+private val md_theme_light_onError = Color(0xFFFFFFFF)
+private val md_theme_light_onErrorContainer = Color(0xFF410002)
+private val md_theme_light_background = Color(0xFFFFFBFF)
+private val md_theme_light_onBackground = Color(0xFF1C1B1F)
+private val md_theme_light_surface = Color(0xFFFFFBFF)
+private val md_theme_light_onSurface = Color(0xFF1C1B1F)
+private val md_theme_light_surfaceVariant = Color(0xFFE5E0EC)
+private val md_theme_light_onSurfaceVariant = Color(0xFF48454E)
+private val md_theme_light_outline = Color(0xFF79757F)
+private val md_theme_light_inverseOnSurface = Color(0xFFF4EFF4)
+private val md_theme_light_inverseSurface = Color(0xFF313033)
+private val md_theme_light_inversePrimary = Color(0xFFC9BFFF)
+private val md_theme_light_shadow = Color(0xFF000000)
+private val md_theme_light_surfaceTint = Color(0xFF5F52A7)
+private val md_theme_light_outlineVariant = Color(0xFFC9C5D0)
+private val md_theme_light_scrim = Color(0xFF000000)
+
+private val md_theme_dark_primary = Color(0xFFC9BFFF)
+private val md_theme_dark_onPrimary = Color(0xFF302176)
+private val md_theme_dark_primaryContainer = Color(0xFF47398D)
+private val md_theme_dark_onPrimaryContainer = Color(0xFFE5DEFF)
+private val md_theme_dark_secondary = Color(0xFFC9C3DC)
+private val md_theme_dark_onSecondary = Color(0xFF312E41)
+private val md_theme_dark_secondaryContainer = Color(0xFF484459)
+private val md_theme_dark_onSecondaryContainer = Color(0xFFE5DFF9)
+private val md_theme_dark_tertiary = Color(0xFFEDB8CD)
+private val md_theme_dark_onTertiary = Color(0xFF482536)
+private val md_theme_dark_tertiaryContainer = Color(0xFF623B4C)
+private val md_theme_dark_onTertiaryContainer = Color(0xFFFFD8E6)
+private val md_theme_dark_error = Color(0xFFFFB4AB)
+private val md_theme_dark_errorContainer = Color(0xFF93000A)
+private val md_theme_dark_onError = Color(0xFF690005)
+private val md_theme_dark_onErrorContainer = Color(0xFFFFDAD6)
+private val md_theme_dark_background = Color(0xFF1C1B1F)
+private val md_theme_dark_onBackground = Color(0xFFE5E1E6)
+private val md_theme_dark_surface = Color(0xFF1C1B1F)
+private val md_theme_dark_onSurface = Color(0xFFE5E1E6)
+private val md_theme_dark_surfaceVariant = Color(0xFF48454E)
+private val md_theme_dark_onSurfaceVariant = Color(0xFFC9C5D0)
+private val md_theme_dark_outline = Color(0xFF938F99)
+private val md_theme_dark_inverseOnSurface = Color(0xFF1C1B1F)
+private val md_theme_dark_inverseSurface = Color(0xFFE5E1E6)
+private val md_theme_dark_inversePrimary = Color(0xFF5F52A7)
+private val md_theme_dark_shadow = Color(0xFF000000)
+private val md_theme_dark_surfaceTint = Color(0xFFC9BFFF)
+private val md_theme_dark_outlineVariant = Color(0xFF48454E)
+private val md_theme_dark_scrim = Color(0xFF000000)
+
+val DeepPurpleLightColors = lightColorScheme(
+ primary = md_theme_light_primary,
+ onPrimary = md_theme_light_onPrimary,
+ primaryContainer = md_theme_light_primaryContainer,
+ onPrimaryContainer = md_theme_light_onPrimaryContainer,
+ secondary = md_theme_light_secondary,
+ onSecondary = md_theme_light_onSecondary,
+ secondaryContainer = md_theme_light_secondaryContainer,
+ onSecondaryContainer = md_theme_light_onSecondaryContainer,
+ tertiary = md_theme_light_tertiary,
+ onTertiary = md_theme_light_onTertiary,
+ tertiaryContainer = md_theme_light_tertiaryContainer,
+ onTertiaryContainer = md_theme_light_onTertiaryContainer,
+ error = md_theme_light_error,
+ errorContainer = md_theme_light_errorContainer,
+ onError = md_theme_light_onError,
+ onErrorContainer = md_theme_light_onErrorContainer,
+ background = md_theme_light_background,
+ onBackground = md_theme_light_onBackground,
+ surface = md_theme_light_surface,
+ onSurface = md_theme_light_onSurface,
+ surfaceVariant = md_theme_light_surfaceVariant,
+ onSurfaceVariant = md_theme_light_onSurfaceVariant,
+ outline = md_theme_light_outline,
+ inverseOnSurface = md_theme_light_inverseOnSurface,
+ inverseSurface = md_theme_light_inverseSurface,
+ inversePrimary = md_theme_light_inversePrimary,
+ surfaceTint = md_theme_light_surfaceTint,
+ outlineVariant = md_theme_light_outlineVariant,
+ scrim = md_theme_light_scrim,
+)
+
+
+val DeepPurpleDarkColors = darkColorScheme(
+ primary = md_theme_dark_primary,
+ onPrimary = md_theme_dark_onPrimary,
+ primaryContainer = md_theme_dark_primaryContainer,
+ onPrimaryContainer = md_theme_dark_onPrimaryContainer,
+ secondary = md_theme_dark_secondary,
+ onSecondary = md_theme_dark_onSecondary,
+ secondaryContainer = md_theme_dark_secondaryContainer,
+ onSecondaryContainer = md_theme_dark_onSecondaryContainer,
+ tertiary = md_theme_dark_tertiary,
+ onTertiary = md_theme_dark_onTertiary,
+ tertiaryContainer = md_theme_dark_tertiaryContainer,
+ onTertiaryContainer = md_theme_dark_onTertiaryContainer,
+ error = md_theme_dark_error,
+ errorContainer = md_theme_dark_errorContainer,
+ onError = md_theme_dark_onError,
+ onErrorContainer = md_theme_dark_onErrorContainer,
+ background = md_theme_dark_background,
+ onBackground = md_theme_dark_onBackground,
+ surface = md_theme_dark_surface,
+ onSurface = md_theme_dark_onSurface,
+ surfaceVariant = md_theme_dark_surfaceVariant,
+ onSurfaceVariant = md_theme_dark_onSurfaceVariant,
+ outline = md_theme_dark_outline,
+ inverseOnSurface = md_theme_dark_inverseOnSurface,
+ inverseSurface = md_theme_dark_inverseSurface,
+ inversePrimary = md_theme_dark_inversePrimary,
+ surfaceTint = md_theme_dark_surfaceTint,
+ outlineVariant = md_theme_dark_outlineVariant,
+ scrim = md_theme_dark_scrim,
+)
\ No newline at end of file
diff --git a/app/src/main/java/com/mk/sheets/compose/ui/theme/themes/green/GreenTheme.kt b/app/src/main/java/com/mk/sheets/compose/ui/theme/themes/green/GreenTheme.kt
new file mode 100644
index 00000000..7ce46065
--- /dev/null
+++ b/app/src/main/java/com/mk/sheets/compose/ui/theme/themes/green/GreenTheme.kt
@@ -0,0 +1,132 @@
+
+import androidx.compose.material3.darkColorScheme
+import androidx.compose.material3.lightColorScheme
+import androidx.compose.ui.graphics.Color
+
+
+private val md_theme_light_primary = Color(0xFF006C45)
+private val md_theme_light_onPrimary = Color(0xFFFFFFFF)
+private val md_theme_light_primaryContainer = Color(0xFF8DF8BE)
+private val md_theme_light_onPrimaryContainer = Color(0xFF002112)
+private val md_theme_light_secondary = Color(0xFF4E6355)
+private val md_theme_light_onSecondary = Color(0xFFFFFFFF)
+private val md_theme_light_secondaryContainer = Color(0xFFD0E8D7)
+private val md_theme_light_onSecondaryContainer = Color(0xFF0B1F15)
+private val md_theme_light_tertiary = Color(0xFF3C6471)
+private val md_theme_light_onTertiary = Color(0xFFFFFFFF)
+private val md_theme_light_tertiaryContainer = Color(0xFFBFE9F9)
+private val md_theme_light_onTertiaryContainer = Color(0xFF001F28)
+private val md_theme_light_error = Color(0xFFBA1A1A)
+private val md_theme_light_errorContainer = Color(0xFFFFDAD6)
+private val md_theme_light_onError = Color(0xFFFFFFFF)
+private val md_theme_light_onErrorContainer = Color(0xFF410002)
+private val md_theme_light_background = Color(0xFFFBFDF8)
+private val md_theme_light_onBackground = Color(0xFF191C1A)
+private val md_theme_light_surface = Color(0xFFFBFDF8)
+private val md_theme_light_onSurface = Color(0xFF191C1A)
+private val md_theme_light_surfaceVariant = Color(0xFFDCE5DC)
+private val md_theme_light_onSurfaceVariant = Color(0xFF404943)
+private val md_theme_light_outline = Color(0xFF707972)
+private val md_theme_light_inverseOnSurface = Color(0xFFEFF1ED)
+private val md_theme_light_inverseSurface = Color(0xFF2E312E)
+private val md_theme_light_inversePrimary = Color(0xFF70DBA3)
+private val md_theme_light_shadow = Color(0xFF000000)
+private val md_theme_light_surfaceTint = Color(0xFF006C45)
+private val md_theme_light_outlineVariant = Color(0xFFC0C9C0)
+private val md_theme_light_scrim = Color(0xFF000000)
+
+private val md_theme_dark_primary = Color(0xFF70DBA3)
+private val md_theme_dark_onPrimary = Color(0xFF003822)
+private val md_theme_dark_primaryContainer = Color(0xFF005233)
+private val md_theme_dark_onPrimaryContainer = Color(0xFF8DF8BE)
+private val md_theme_dark_secondary = Color(0xFFB5CCBB)
+private val md_theme_dark_onSecondary = Color(0xFF203529)
+private val md_theme_dark_secondaryContainer = Color(0xFF364B3E)
+private val md_theme_dark_onSecondaryContainer = Color(0xFFD0E8D7)
+private val md_theme_dark_tertiary = Color(0xFFA4CDDC)
+private val md_theme_dark_onTertiary = Color(0xFF043542)
+private val md_theme_dark_tertiaryContainer = Color(0xFF224C59)
+private val md_theme_dark_onTertiaryContainer = Color(0xFFBFE9F9)
+private val md_theme_dark_error = Color(0xFFFFB4AB)
+private val md_theme_dark_errorContainer = Color(0xFF93000A)
+private val md_theme_dark_onError = Color(0xFF690005)
+private val md_theme_dark_onErrorContainer = Color(0xFFFFDAD6)
+private val md_theme_dark_background = Color(0xFF191C1A)
+private val md_theme_dark_onBackground = Color(0xFFE1E3DF)
+private val md_theme_dark_surface = Color(0xFF191C1A)
+private val md_theme_dark_onSurface = Color(0xFFE1E3DF)
+private val md_theme_dark_surfaceVariant = Color(0xFF404943)
+private val md_theme_dark_onSurfaceVariant = Color(0xFFC0C9C0)
+private val md_theme_dark_outline = Color(0xFF8A938B)
+private val md_theme_dark_inverseOnSurface = Color(0xFF191C1A)
+private val md_theme_dark_inverseSurface = Color(0xFFE1E3DF)
+private val md_theme_dark_inversePrimary = Color(0xFF006C45)
+private val md_theme_dark_shadow = Color(0xFF000000)
+private val md_theme_dark_surfaceTint = Color(0xFF70DBA3)
+private val md_theme_dark_outlineVariant = Color(0xFF404943)
+private val md_theme_dark_scrim = Color(0xFF000000)
+
+val GreenLightColors = lightColorScheme(
+ primary = md_theme_light_primary,
+ onPrimary = md_theme_light_onPrimary,
+ primaryContainer = md_theme_light_primaryContainer,
+ onPrimaryContainer = md_theme_light_onPrimaryContainer,
+ secondary = md_theme_light_secondary,
+ onSecondary = md_theme_light_onSecondary,
+ secondaryContainer = md_theme_light_secondaryContainer,
+ onSecondaryContainer = md_theme_light_onSecondaryContainer,
+ tertiary = md_theme_light_tertiary,
+ onTertiary = md_theme_light_onTertiary,
+ tertiaryContainer = md_theme_light_tertiaryContainer,
+ onTertiaryContainer = md_theme_light_onTertiaryContainer,
+ error = md_theme_light_error,
+ errorContainer = md_theme_light_errorContainer,
+ onError = md_theme_light_onError,
+ onErrorContainer = md_theme_light_onErrorContainer,
+ background = md_theme_light_background,
+ onBackground = md_theme_light_onBackground,
+ surface = md_theme_light_surface,
+ onSurface = md_theme_light_onSurface,
+ surfaceVariant = md_theme_light_surfaceVariant,
+ onSurfaceVariant = md_theme_light_onSurfaceVariant,
+ outline = md_theme_light_outline,
+ inverseOnSurface = md_theme_light_inverseOnSurface,
+ inverseSurface = md_theme_light_inverseSurface,
+ inversePrimary = md_theme_light_inversePrimary,
+ surfaceTint = md_theme_light_surfaceTint,
+ outlineVariant = md_theme_light_outlineVariant,
+ scrim = md_theme_light_scrim,
+)
+
+
+val GreenDarkColors = darkColorScheme(
+ primary = md_theme_dark_primary,
+ onPrimary = md_theme_dark_onPrimary,
+ primaryContainer = md_theme_dark_primaryContainer,
+ onPrimaryContainer = md_theme_dark_onPrimaryContainer,
+ secondary = md_theme_dark_secondary,
+ onSecondary = md_theme_dark_onSecondary,
+ secondaryContainer = md_theme_dark_secondaryContainer,
+ onSecondaryContainer = md_theme_dark_onSecondaryContainer,
+ tertiary = md_theme_dark_tertiary,
+ onTertiary = md_theme_dark_onTertiary,
+ tertiaryContainer = md_theme_dark_tertiaryContainer,
+ onTertiaryContainer = md_theme_dark_onTertiaryContainer,
+ error = md_theme_dark_error,
+ errorContainer = md_theme_dark_errorContainer,
+ onError = md_theme_dark_onError,
+ onErrorContainer = md_theme_dark_onErrorContainer,
+ background = md_theme_dark_background,
+ onBackground = md_theme_dark_onBackground,
+ surface = md_theme_dark_surface,
+ onSurface = md_theme_dark_onSurface,
+ surfaceVariant = md_theme_dark_surfaceVariant,
+ onSurfaceVariant = md_theme_dark_onSurfaceVariant,
+ outline = md_theme_dark_outline,
+ inverseOnSurface = md_theme_dark_inverseOnSurface,
+ inverseSurface = md_theme_dark_inverseSurface,
+ inversePrimary = md_theme_dark_inversePrimary,
+ surfaceTint = md_theme_dark_surfaceTint,
+ outlineVariant = md_theme_dark_outlineVariant,
+ scrim = md_theme_dark_scrim,
+)
\ No newline at end of file
diff --git a/app/src/main/java/com/mk/sheets/compose/ui/theme/themes/orange/OrangeTheme.kt b/app/src/main/java/com/mk/sheets/compose/ui/theme/themes/orange/OrangeTheme.kt
new file mode 100644
index 00000000..07988dc2
--- /dev/null
+++ b/app/src/main/java/com/mk/sheets/compose/ui/theme/themes/orange/OrangeTheme.kt
@@ -0,0 +1,131 @@
+import androidx.compose.material3.darkColorScheme
+import androidx.compose.material3.lightColorScheme
+import androidx.compose.ui.graphics.Color
+
+
+private val md_theme_light_primary = Color(0xFF9D4235)
+private val md_theme_light_onPrimary = Color(0xFFFFFFFF)
+private val md_theme_light_primaryContainer = Color(0xFFFFDAD4)
+private val md_theme_light_onPrimaryContainer = Color(0xFF410000)
+private val md_theme_light_secondary = Color(0xFF775651)
+private val md_theme_light_onSecondary = Color(0xFFFFFFFF)
+private val md_theme_light_secondaryContainer = Color(0xFFFFDAD4)
+private val md_theme_light_onSecondaryContainer = Color(0xFF2C1511)
+private val md_theme_light_tertiary = Color(0xFF705C2E)
+private val md_theme_light_onTertiary = Color(0xFFFFFFFF)
+private val md_theme_light_tertiaryContainer = Color(0xFFFBDFA6)
+private val md_theme_light_onTertiaryContainer = Color(0xFF251A00)
+private val md_theme_light_error = Color(0xFFBA1A1A)
+private val md_theme_light_errorContainer = Color(0xFFFFDAD6)
+private val md_theme_light_onError = Color(0xFFFFFFFF)
+private val md_theme_light_onErrorContainer = Color(0xFF410002)
+private val md_theme_light_background = Color(0xFFFFFBFF)
+private val md_theme_light_onBackground = Color(0xFF201A19)
+private val md_theme_light_surface = Color(0xFFFFFBFF)
+private val md_theme_light_onSurface = Color(0xFF201A19)
+private val md_theme_light_surfaceVariant = Color(0xFFF5DDDA)
+private val md_theme_light_onSurfaceVariant = Color(0xFF534341)
+private val md_theme_light_outline = Color(0xFF857370)
+private val md_theme_light_inverseOnSurface = Color(0xFFFBEEEC)
+private val md_theme_light_inverseSurface = Color(0xFF362F2E)
+private val md_theme_light_inversePrimary = Color(0xFFFFB4A8)
+private val md_theme_light_shadow = Color(0xFF000000)
+private val md_theme_light_surfaceTint = Color(0xFF9D4235)
+private val md_theme_light_outlineVariant = Color(0xFFD8C2BE)
+private val md_theme_light_scrim = Color(0xFF000000)
+
+private val md_theme_dark_primary = Color(0xFFFFB4A8)
+private val md_theme_dark_onPrimary = Color(0xFF5F140C)
+private val md_theme_dark_primaryContainer = Color(0xFF7E2B20)
+private val md_theme_dark_onPrimaryContainer = Color(0xFFFFDAD4)
+private val md_theme_dark_secondary = Color(0xFFE7BDB6)
+private val md_theme_dark_onSecondary = Color(0xFF442925)
+private val md_theme_dark_secondaryContainer = Color(0xFF5D3F3B)
+private val md_theme_dark_onSecondaryContainer = Color(0xFFFFDAD4)
+private val md_theme_dark_tertiary = Color(0xFFDEC48C)
+private val md_theme_dark_onTertiary = Color(0xFF3E2E04)
+private val md_theme_dark_tertiaryContainer = Color(0xFF564419)
+private val md_theme_dark_onTertiaryContainer = Color(0xFFFBDFA6)
+private val md_theme_dark_error = Color(0xFFFFB4AB)
+private val md_theme_dark_errorContainer = Color(0xFF93000A)
+private val md_theme_dark_onError = Color(0xFF690005)
+private val md_theme_dark_onErrorContainer = Color(0xFFFFDAD6)
+private val md_theme_dark_background = Color(0xFF201A19)
+private val md_theme_dark_onBackground = Color(0xFFEDE0DD)
+private val md_theme_dark_surface = Color(0xFF201A19)
+private val md_theme_dark_onSurface = Color(0xFFEDE0DD)
+private val md_theme_dark_surfaceVariant = Color(0xFF534341)
+private val md_theme_dark_onSurfaceVariant = Color(0xFFD8C2BE)
+private val md_theme_dark_outline = Color(0xFFA08C89)
+private val md_theme_dark_inverseOnSurface = Color(0xFF201A19)
+private val md_theme_dark_inverseSurface = Color(0xFFEDE0DD)
+private val md_theme_dark_inversePrimary = Color(0xFF9D4235)
+private val md_theme_dark_shadow = Color(0xFF000000)
+private val md_theme_dark_surfaceTint = Color(0xFFFFB4A8)
+private val md_theme_dark_outlineVariant = Color(0xFF534341)
+private val md_theme_dark_scrim = Color(0xFF000000)
+
+val OrangeLightColors = lightColorScheme(
+ primary = md_theme_light_primary,
+ onPrimary = md_theme_light_onPrimary,
+ primaryContainer = md_theme_light_primaryContainer,
+ onPrimaryContainer = md_theme_light_onPrimaryContainer,
+ secondary = md_theme_light_secondary,
+ onSecondary = md_theme_light_onSecondary,
+ secondaryContainer = md_theme_light_secondaryContainer,
+ onSecondaryContainer = md_theme_light_onSecondaryContainer,
+ tertiary = md_theme_light_tertiary,
+ onTertiary = md_theme_light_onTertiary,
+ tertiaryContainer = md_theme_light_tertiaryContainer,
+ onTertiaryContainer = md_theme_light_onTertiaryContainer,
+ error = md_theme_light_error,
+ errorContainer = md_theme_light_errorContainer,
+ onError = md_theme_light_onError,
+ onErrorContainer = md_theme_light_onErrorContainer,
+ background = md_theme_light_background,
+ onBackground = md_theme_light_onBackground,
+ surface = md_theme_light_surface,
+ onSurface = md_theme_light_onSurface,
+ surfaceVariant = md_theme_light_surfaceVariant,
+ onSurfaceVariant = md_theme_light_onSurfaceVariant,
+ outline = md_theme_light_outline,
+ inverseOnSurface = md_theme_light_inverseOnSurface,
+ inverseSurface = md_theme_light_inverseSurface,
+ inversePrimary = md_theme_light_inversePrimary,
+ surfaceTint = md_theme_light_surfaceTint,
+ outlineVariant = md_theme_light_outlineVariant,
+ scrim = md_theme_light_scrim,
+)
+
+
+val OrangeDarkColors = darkColorScheme(
+ primary = md_theme_dark_primary,
+ onPrimary = md_theme_dark_onPrimary,
+ primaryContainer = md_theme_dark_primaryContainer,
+ onPrimaryContainer = md_theme_dark_onPrimaryContainer,
+ secondary = md_theme_dark_secondary,
+ onSecondary = md_theme_dark_onSecondary,
+ secondaryContainer = md_theme_dark_secondaryContainer,
+ onSecondaryContainer = md_theme_dark_onSecondaryContainer,
+ tertiary = md_theme_dark_tertiary,
+ onTertiary = md_theme_dark_onTertiary,
+ tertiaryContainer = md_theme_dark_tertiaryContainer,
+ onTertiaryContainer = md_theme_dark_onTertiaryContainer,
+ error = md_theme_dark_error,
+ errorContainer = md_theme_dark_errorContainer,
+ onError = md_theme_dark_onError,
+ onErrorContainer = md_theme_dark_onErrorContainer,
+ background = md_theme_dark_background,
+ onBackground = md_theme_dark_onBackground,
+ surface = md_theme_dark_surface,
+ onSurface = md_theme_dark_onSurface,
+ surfaceVariant = md_theme_dark_surfaceVariant,
+ onSurfaceVariant = md_theme_dark_onSurfaceVariant,
+ outline = md_theme_dark_outline,
+ inverseOnSurface = md_theme_dark_inverseOnSurface,
+ inverseSurface = md_theme_dark_inverseSurface,
+ inversePrimary = md_theme_dark_inversePrimary,
+ surfaceTint = md_theme_dark_surfaceTint,
+ outlineVariant = md_theme_dark_outlineVariant,
+ scrim = md_theme_dark_scrim,
+)
\ No newline at end of file
diff --git a/app/src/main/java/com/mk/sheets/compose/ui/theme/themes/pink/PinkTheme.kt b/app/src/main/java/com/mk/sheets/compose/ui/theme/themes/pink/PinkTheme.kt
new file mode 100644
index 00000000..07e7ac5d
--- /dev/null
+++ b/app/src/main/java/com/mk/sheets/compose/ui/theme/themes/pink/PinkTheme.kt
@@ -0,0 +1,131 @@
+
+import androidx.compose.material3.darkColorScheme
+import androidx.compose.material3.lightColorScheme
+import androidx.compose.ui.graphics.Color
+
+private val md_theme_light_primary = Color(0xFF984061)
+private val md_theme_light_onPrimary = Color(0xFFFFFFFF)
+private val md_theme_light_primaryContainer = Color(0xFFFFD9E2)
+private val md_theme_light_onPrimaryContainer = Color(0xFF3E001D)
+private val md_theme_light_secondary = Color(0xFF74565F)
+private val md_theme_light_onSecondary = Color(0xFFFFFFFF)
+private val md_theme_light_secondaryContainer = Color(0xFFFFD9E2)
+private val md_theme_light_onSecondaryContainer = Color(0xFF2B151C)
+private val md_theme_light_tertiary = Color(0xFF7C5635)
+private val md_theme_light_onTertiary = Color(0xFFFFFFFF)
+private val md_theme_light_tertiaryContainer = Color(0xFFFFDCC2)
+private val md_theme_light_onTertiaryContainer = Color(0xFF2E1500)
+private val md_theme_light_error = Color(0xFFBA1A1A)
+private val md_theme_light_errorContainer = Color(0xFFFFDAD6)
+private val md_theme_light_onError = Color(0xFFFFFFFF)
+private val md_theme_light_onErrorContainer = Color(0xFF410002)
+private val md_theme_light_background = Color(0xFFFFFBFF)
+private val md_theme_light_onBackground = Color(0xFF201A1B)
+private val md_theme_light_surface = Color(0xFFFFFBFF)
+private val md_theme_light_onSurface = Color(0xFF201A1B)
+private val md_theme_light_surfaceVariant = Color(0xFFF2DDE2)
+private val md_theme_light_onSurfaceVariant = Color(0xFF514347)
+private val md_theme_light_outline = Color(0xFF837377)
+private val md_theme_light_inverseOnSurface = Color(0xFFFAEEEF)
+private val md_theme_light_inverseSurface = Color(0xFF352F30)
+private val md_theme_light_inversePrimary = Color(0xFFFFB0C8)
+private val md_theme_light_shadow = Color(0xFF000000)
+private val md_theme_light_surfaceTint = Color(0xFF984061)
+private val md_theme_light_outlineVariant = Color(0xFFD5C2C6)
+private val md_theme_light_scrim = Color(0xFF000000)
+
+private val md_theme_dark_primary = Color(0xFFFFB0C8)
+private val md_theme_dark_onPrimary = Color(0xFF5E1133)
+private val md_theme_dark_primaryContainer = Color(0xFF7B2949)
+private val md_theme_dark_onPrimaryContainer = Color(0xFFFFD9E2)
+private val md_theme_dark_secondary = Color(0xFFE2BDC6)
+private val md_theme_dark_onSecondary = Color(0xFF422931)
+private val md_theme_dark_secondaryContainer = Color(0xFF5A3F47)
+private val md_theme_dark_onSecondaryContainer = Color(0xFFFFD9E2)
+private val md_theme_dark_tertiary = Color(0xFFEFBD94)
+private val md_theme_dark_onTertiary = Color(0xFF48290C)
+private val md_theme_dark_tertiaryContainer = Color(0xFF623F20)
+private val md_theme_dark_onTertiaryContainer = Color(0xFFFFDCC2)
+private val md_theme_dark_error = Color(0xFFFFB4AB)
+private val md_theme_dark_errorContainer = Color(0xFF93000A)
+private val md_theme_dark_onError = Color(0xFF690005)
+private val md_theme_dark_onErrorContainer = Color(0xFFFFDAD6)
+private val md_theme_dark_background = Color(0xFF201A1B)
+private val md_theme_dark_onBackground = Color(0xFFEBE0E1)
+private val md_theme_dark_surface = Color(0xFF201A1B)
+private val md_theme_dark_onSurface = Color(0xFFEBE0E1)
+private val md_theme_dark_surfaceVariant = Color(0xFF514347)
+private val md_theme_dark_onSurfaceVariant = Color(0xFFD5C2C6)
+private val md_theme_dark_outline = Color(0xFF9E8C90)
+private val md_theme_dark_inverseOnSurface = Color(0xFF201A1B)
+private val md_theme_dark_inverseSurface = Color(0xFFEBE0E1)
+private val md_theme_dark_inversePrimary = Color(0xFF984061)
+private val md_theme_dark_shadow = Color(0xFF000000)
+private val md_theme_dark_surfaceTint = Color(0xFFFFB0C8)
+private val md_theme_dark_outlineVariant = Color(0xFF514347)
+private val md_theme_dark_scrim = Color(0xFF000000)
+
+val PinkLightColors = lightColorScheme(
+ primary = md_theme_light_primary,
+ onPrimary = md_theme_light_onPrimary,
+ primaryContainer = md_theme_light_primaryContainer,
+ onPrimaryContainer = md_theme_light_onPrimaryContainer,
+ secondary = md_theme_light_secondary,
+ onSecondary = md_theme_light_onSecondary,
+ secondaryContainer = md_theme_light_secondaryContainer,
+ onSecondaryContainer = md_theme_light_onSecondaryContainer,
+ tertiary = md_theme_light_tertiary,
+ onTertiary = md_theme_light_onTertiary,
+ tertiaryContainer = md_theme_light_tertiaryContainer,
+ onTertiaryContainer = md_theme_light_onTertiaryContainer,
+ error = md_theme_light_error,
+ errorContainer = md_theme_light_errorContainer,
+ onError = md_theme_light_onError,
+ onErrorContainer = md_theme_light_onErrorContainer,
+ background = md_theme_light_background,
+ onBackground = md_theme_light_onBackground,
+ surface = md_theme_light_surface,
+ onSurface = md_theme_light_onSurface,
+ surfaceVariant = md_theme_light_surfaceVariant,
+ onSurfaceVariant = md_theme_light_onSurfaceVariant,
+ outline = md_theme_light_outline,
+ inverseOnSurface = md_theme_light_inverseOnSurface,
+ inverseSurface = md_theme_light_inverseSurface,
+ inversePrimary = md_theme_light_inversePrimary,
+ surfaceTint = md_theme_light_surfaceTint,
+ outlineVariant = md_theme_light_outlineVariant,
+ scrim = md_theme_light_scrim,
+)
+
+
+val PinkDarkColors = darkColorScheme(
+ primary = md_theme_dark_primary,
+ onPrimary = md_theme_dark_onPrimary,
+ primaryContainer = md_theme_dark_primaryContainer,
+ onPrimaryContainer = md_theme_dark_onPrimaryContainer,
+ secondary = md_theme_dark_secondary,
+ onSecondary = md_theme_dark_onSecondary,
+ secondaryContainer = md_theme_dark_secondaryContainer,
+ onSecondaryContainer = md_theme_dark_onSecondaryContainer,
+ tertiary = md_theme_dark_tertiary,
+ onTertiary = md_theme_dark_onTertiary,
+ tertiaryContainer = md_theme_dark_tertiaryContainer,
+ onTertiaryContainer = md_theme_dark_onTertiaryContainer,
+ error = md_theme_dark_error,
+ errorContainer = md_theme_dark_errorContainer,
+ onError = md_theme_dark_onError,
+ onErrorContainer = md_theme_dark_onErrorContainer,
+ background = md_theme_dark_background,
+ onBackground = md_theme_dark_onBackground,
+ surface = md_theme_dark_surface,
+ onSurface = md_theme_dark_onSurface,
+ surfaceVariant = md_theme_dark_surfaceVariant,
+ onSurfaceVariant = md_theme_dark_onSurfaceVariant,
+ outline = md_theme_dark_outline,
+ inverseOnSurface = md_theme_dark_inverseOnSurface,
+ inverseSurface = md_theme_dark_inverseSurface,
+ inversePrimary = md_theme_dark_inversePrimary,
+ surfaceTint = md_theme_dark_surfaceTint,
+ outlineVariant = md_theme_dark_outlineVariant,
+ scrim = md_theme_dark_scrim,
+)
\ No newline at end of file
diff --git a/app/src/main/java/com/mk/sheets/compose/ui/theme/themes/purple/PurpleTheme.kt b/app/src/main/java/com/mk/sheets/compose/ui/theme/themes/purple/PurpleTheme.kt
new file mode 100644
index 00000000..88e49336
--- /dev/null
+++ b/app/src/main/java/com/mk/sheets/compose/ui/theme/themes/purple/PurpleTheme.kt
@@ -0,0 +1,134 @@
+
+import androidx.compose.material3.darkColorScheme
+import androidx.compose.material3.lightColorScheme
+import androidx.compose.ui.graphics.Color
+
+
+private val md_theme_light_primary = Color(0xFF744C9D)
+private val md_theme_light_onPrimary = Color(0xFFFFFFFF)
+private val md_theme_light_primaryContainer = Color(0xFFF0DBFF)
+private val md_theme_light_onPrimaryContainer = Color(0xFF2C0051)
+private val md_theme_light_secondary = Color(0xFF665A6F)
+private val md_theme_light_onSecondary = Color(0xFFFFFFFF)
+private val md_theme_light_secondaryContainer = Color(0xFFEDDDF6)
+private val md_theme_light_onSecondaryContainer = Color(0xFF21182A)
+private val md_theme_light_tertiary = Color(0xFF805158)
+private val md_theme_light_onTertiary = Color(0xFFFFFFFF)
+private val md_theme_light_tertiaryContainer = Color(0xFFFFD9DD)
+private val md_theme_light_onTertiaryContainer = Color(0xFF321017)
+private val md_theme_light_error = Color(0xFFBA1A1A)
+private val md_theme_light_errorContainer = Color(0xFFFFDAD6)
+private val md_theme_light_onError = Color(0xFFFFFFFF)
+private val md_theme_light_onErrorContainer = Color(0xFF410002)
+private val md_theme_light_background = Color(0xFFFFFBFF)
+private val md_theme_light_onBackground = Color(0xFF1D1B1E)
+private val md_theme_light_surface = Color(0xFFFFFBFF)
+private val md_theme_light_onSurface = Color(0xFF1D1B1E)
+private val md_theme_light_surfaceVariant = Color(0xFFE9DFEB)
+private val md_theme_light_onSurfaceVariant = Color(0xFF4A454E)
+private val md_theme_light_outline = Color(0xFF7C757E)
+private val md_theme_light_inverseOnSurface = Color(0xFFF5EFF4)
+private val md_theme_light_inverseSurface = Color(0xFF322F33)
+private val md_theme_light_inversePrimary = Color(0xFFDCB8FF)
+private val md_theme_light_shadow = Color(0xFF000000)
+private val md_theme_light_surfaceTint = Color(0xFF744C9D)
+private val md_theme_light_outlineVariant = Color(0xFFCCC4CE)
+private val md_theme_light_scrim = Color(0xFF000000)
+
+private val md_theme_dark_primary = Color(0xFFDCB8FF)
+private val md_theme_dark_onPrimary = Color(0xFF431A6B)
+private val md_theme_dark_primaryContainer = Color(0xFF5B3383)
+private val md_theme_dark_onPrimaryContainer = Color(0xFFF0DBFF)
+private val md_theme_dark_secondary = Color(0xFFD0C1DA)
+private val md_theme_dark_onSecondary = Color(0xFF362C3F)
+private val md_theme_dark_secondaryContainer = Color(0xFF4D4357)
+private val md_theme_dark_onSecondaryContainer = Color(0xFFEDDDF6)
+private val md_theme_dark_tertiary = Color(0xFFF3B7BE)
+private val md_theme_dark_onTertiary = Color(0xFF4B252B)
+private val md_theme_dark_tertiaryContainer = Color(0xFF653A41)
+private val md_theme_dark_onTertiaryContainer = Color(0xFFFFD9DD)
+private val md_theme_dark_error = Color(0xFFFFB4AB)
+private val md_theme_dark_errorContainer = Color(0xFF93000A)
+private val md_theme_dark_onError = Color(0xFF690005)
+private val md_theme_dark_onErrorContainer = Color(0xFFFFDAD6)
+private val md_theme_dark_background = Color(0xFF1D1B1E)
+private val md_theme_dark_onBackground = Color(0xFFE7E1E5)
+private val md_theme_dark_surface = Color(0xFF1D1B1E)
+private val md_theme_dark_onSurface = Color(0xFFE7E1E5)
+private val md_theme_dark_surfaceVariant = Color(0xFF4A454E)
+private val md_theme_dark_onSurfaceVariant = Color(0xFFCCC4CE)
+private val md_theme_dark_outline = Color(0xFF968E98)
+private val md_theme_dark_inverseOnSurface = Color(0xFF1D1B1E)
+private val md_theme_dark_inverseSurface = Color(0xFFE7E1E5)
+private val md_theme_dark_inversePrimary = Color(0xFF744C9D)
+private val md_theme_dark_shadow = Color(0xFF000000)
+private val md_theme_dark_surfaceTint = Color(0xFFDCB8FF)
+private val md_theme_dark_outlineVariant = Color(0xFF4A454E)
+private val md_theme_dark_scrim = Color(0xFF000000)
+
+private val seed = Color(0xFF744C9D)
+
+val PurpleLightColors = lightColorScheme(
+ primary = md_theme_light_primary,
+ onPrimary = md_theme_light_onPrimary,
+ primaryContainer = md_theme_light_primaryContainer,
+ onPrimaryContainer = md_theme_light_onPrimaryContainer,
+ secondary = md_theme_light_secondary,
+ onSecondary = md_theme_light_onSecondary,
+ secondaryContainer = md_theme_light_secondaryContainer,
+ onSecondaryContainer = md_theme_light_onSecondaryContainer,
+ tertiary = md_theme_light_tertiary,
+ onTertiary = md_theme_light_onTertiary,
+ tertiaryContainer = md_theme_light_tertiaryContainer,
+ onTertiaryContainer = md_theme_light_onTertiaryContainer,
+ error = md_theme_light_error,
+ errorContainer = md_theme_light_errorContainer,
+ onError = md_theme_light_onError,
+ onErrorContainer = md_theme_light_onErrorContainer,
+ background = md_theme_light_background,
+ onBackground = md_theme_light_onBackground,
+ surface = md_theme_light_surface,
+ onSurface = md_theme_light_onSurface,
+ surfaceVariant = md_theme_light_surfaceVariant,
+ onSurfaceVariant = md_theme_light_onSurfaceVariant,
+ outline = md_theme_light_outline,
+ inverseOnSurface = md_theme_light_inverseOnSurface,
+ inverseSurface = md_theme_light_inverseSurface,
+ inversePrimary = md_theme_light_inversePrimary,
+ surfaceTint = md_theme_light_surfaceTint,
+ outlineVariant = md_theme_light_outlineVariant,
+ scrim = md_theme_light_scrim,
+)
+
+
+val PurpleDarkColors = darkColorScheme(
+ primary = md_theme_dark_primary,
+ onPrimary = md_theme_dark_onPrimary,
+ primaryContainer = md_theme_dark_primaryContainer,
+ onPrimaryContainer = md_theme_dark_onPrimaryContainer,
+ secondary = md_theme_dark_secondary,
+ onSecondary = md_theme_dark_onSecondary,
+ secondaryContainer = md_theme_dark_secondaryContainer,
+ onSecondaryContainer = md_theme_dark_onSecondaryContainer,
+ tertiary = md_theme_dark_tertiary,
+ onTertiary = md_theme_dark_onTertiary,
+ tertiaryContainer = md_theme_dark_tertiaryContainer,
+ onTertiaryContainer = md_theme_dark_onTertiaryContainer,
+ error = md_theme_dark_error,
+ errorContainer = md_theme_dark_errorContainer,
+ onError = md_theme_dark_onError,
+ onErrorContainer = md_theme_dark_onErrorContainer,
+ background = md_theme_dark_background,
+ onBackground = md_theme_dark_onBackground,
+ surface = md_theme_dark_surface,
+ onSurface = md_theme_dark_onSurface,
+ surfaceVariant = md_theme_dark_surfaceVariant,
+ onSurfaceVariant = md_theme_dark_onSurfaceVariant,
+ outline = md_theme_dark_outline,
+ inverseOnSurface = md_theme_dark_inverseOnSurface,
+ inverseSurface = md_theme_dark_inverseSurface,
+ inversePrimary = md_theme_dark_inversePrimary,
+ surfaceTint = md_theme_dark_surfaceTint,
+ outlineVariant = md_theme_dark_outlineVariant,
+ scrim = md_theme_dark_scrim,
+)
\ No newline at end of file
diff --git a/buildSrc/src/main/java/App.kt b/buildSrc/src/main/java/App.kt
index 9b303860..b6169b9a 100644
--- a/buildSrc/src/main/java/App.kt
+++ b/buildSrc/src/main/java/App.kt
@@ -10,4 +10,5 @@ object App {
const val VERSION_NAME = "1.1.1"
const val TEST_INSTRUMENTATION_RUNNER = "androidx.test.runner.AndroidJUnitRunner"
+
}
\ No newline at end of file
diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt
index 6210464b..3f477c85 100644
--- a/buildSrc/src/main/java/Dependencies.kt
+++ b/buildSrc/src/main/java/Dependencies.kt
@@ -8,6 +8,8 @@ object Dependencies {
const val NAVIGATION_COMPOSE = "androidx.navigation:navigation-compose:${Versions.COMPOSE_NAVIGATION}"
object Test {
+ const val TEST_CORE = "androidx.test:core:${Versions.TEST_CORE}"
+ const val TEST_RUNNER = "androidx.test:runner:${Versions.TEST_RUNNER}"
const val JUNIT = "androidx.test.ext:junit:1.1.3"
const val ESPRESSO_CORE = "androidx.test.espresso:espresso-core:${Versions.ESPRESSO_CORE}"
}
diff --git a/buildSrc/src/main/java/Versions.kt b/buildSrc/src/main/java/Versions.kt
index 7679ea2a..3ec66ea5 100644
--- a/buildSrc/src/main/java/Versions.kt
+++ b/buildSrc/src/main/java/Versions.kt
@@ -6,8 +6,8 @@ object Versions {
// Compose
- const val COMPOSE_BOM = "2023.01.00"
- const val COMPOSE = "1.3.3"
+ const val COMPOSE_BOM = "2023.04.00"
+ const val COMPOSE = "1.4.1"
const val COMPOSE_COMPILER = "1.4.3"
// AndroidX
@@ -32,4 +32,6 @@ object Versions {
const val JUNIT = "4.13.2"
const val ESPRESSO_CORE = "3.4.0"
+ const val TEST_CORE = "1.5.0"
+ const val TEST_RUNNER = "1.5.2"
}
\ No newline at end of file
diff --git a/scripts/generate_image_grid.py b/scripts/generate_image_grid.py
new file mode 100644
index 00000000..2a5f1b90
--- /dev/null
+++ b/scripts/generate_image_grid.py
@@ -0,0 +1,75 @@
+import os
+from pathlib import Path
+import re
+import shutil
+
+from PIL import Image
+
+def get_image_categories(image_directory):
+ """
+ Get the image categories in the given directory, ignoring folders starting with "_".
+ :param image_directory: The directory containing the image categories.
+ :return: A list of image category names.
+ """
+ return [
+ category
+ for category in os.listdir(image_directory)
+ if os.path.isdir(os.path.join(image_directory, category)) and not category.startswith("_")
+ ]
+
+def generate_image_grid(image_directory):
+ """
+ Generate an image grid for the given image directory.
+ :param image_directory: The directory containing the image categories.
+ :return: A list of strings, each representing a line in the image grid.
+ """
+ categories = get_image_categories(image_directory)
+ output = []
+
+ for category in categories:
+ type_folder = image_directory / category
+ output.append(f"## {type_folder.name}\n")
+ output.append("| Light | Dark |\n")
+ output.append("| --- | --- |\n")
+
+ light_images = sorted((type_folder / "light").glob("*.png"))
+ dark_images = sorted((type_folder / "dark").glob("*.png"))
+
+ for light_image, dark_image in zip(light_images, dark_images):
+ output.append(f"| ![Light]({light_image}) | ![Dark]({dark_image}) |\n")
+
+ return output
+
+def update_readme(root_folder: Path, image_grids: str):
+ """
+ Update the README.md file with the given image grids.
+ :param root_folder: The root folder containing the README.md file.
+ :param image_grids: The image grids to include in the README.md file.
+ """
+ with open(root_folder / "README.md", "r", encoding="utf-8") as file:
+ content = file.read()
+
+ content = re.sub(
+ r".*",
+ f"\n{image_grids}",
+ content,
+ flags=re.DOTALL,
+ )
+
+ with open(root_folder / "README.md", "w", encoding="utf-8") as file:
+ file.write(content)
+
+def copy_readme_to_docs_res(root_folder: Path):
+ """
+ Copy the README.md file from the root folder to the docs/res directory.
+ :param root_folder: The root folder containing the README.md file.
+ """
+ source = root_folder / "README.md"
+ destination = root_folder / ".." / "docs" / "res" / "README.md"
+ shutil.copy2(source, destination)
+
+if __name__ == "__main__":
+ root_folder = Path("")
+ image_grids = "".join(generate_image_grid(root_folder))
+ update_readme(root_folder, image_grids)
+ copy_readme_to_docs_res(root_folder)