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 1Sample 2Sample 3
- -## Calendar Dialog / View -The calendar dialog / view allows you to pick a date, multiple dates or a range. -
- - - - - - - - - - - - - - - - - -
Sample 1Sample 2Sample 3
- - -## 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 1Sample 2
- - -## Duration Dialog / View -The duration dialog / view allows you to pick a duration time within the bounds of a time format. -
- - - - - - - - - - - - - - - -
Sample 1Sample 2
- -## 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 1Sample 2Sample 3
- - -## 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 1Sample 2Sample 3
- - -## 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 1Sample 2Sample 3Sample 4
- - -## Input Dialog / View -The input dialog / view allows you to build up a small form of various components to collect quickly information. -
- - - - - - - - - - - - - - - - - - - -
Sample 1Sample 2Sample 3Sample 4
- -## Emoji Dialog / View -The emoji dialog / view allows you to pick an emoji. -
- - - - - - - - - - - - - - - -
Sample 1Sample 2
- -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)