From 12f437ee7381d242909efd922184b19d13a6c56c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bo=C5=99ek=20Leikep?= Date: Tue, 26 Sep 2023 15:47:28 +0200 Subject: [PATCH] Added the Coupon component. --- .../BaselineProfileGenerator.kt | 1 + .../catalog/semantics/MainScreenSemantics.kt | 1 + .../compose/catalog/CatalogApplication.kt | 2 + .../orbit/compose/catalog/Destinations.kt | 85 ++++++----- .../compose/catalog/screens/CouponScreen.kt | 105 +++++++++++++ .../compose/catalog/screens/MainScreen.kt | 1 + component-status.yaml | 2 + docs/03-components/08-visuals/coupon.md | 74 +++++++++ .../kiwi/orbit/compose/ui/controls/Coupon.kt | 141 ++++++++++++++++++ .../kiwi/orbit/compose/ui/ScreenshotTest.kt | 6 + .../orbit/compose/ui/controls/CouponTest.kt | 29 ++++ ...orbit.compose.ui_ScreenshotTest_coupon.png | 3 + ...t.compose.ui_ScreenshotTest_coupon_big.png | 3 + ....compose.ui_ScreenshotTest_coupon_dark.png | 3 + 14 files changed, 415 insertions(+), 41 deletions(-) create mode 100644 catalog/src/main/java/kiwi/orbit/compose/catalog/screens/CouponScreen.kt create mode 100644 docs/03-components/08-visuals/coupon.md create mode 100644 ui/src/androidMain/kotlin/kiwi/orbit/compose/ui/controls/Coupon.kt create mode 100644 ui/src/androidUnitTest/kotlin/kiwi/orbit/compose/ui/controls/CouponTest.kt create mode 100644 ui/src/test/snapshots/images/kiwi.orbit.compose.ui_ScreenshotTest_coupon.png create mode 100644 ui/src/test/snapshots/images/kiwi.orbit.compose.ui_ScreenshotTest_coupon_big.png create mode 100644 ui/src/test/snapshots/images/kiwi.orbit.compose.ui_ScreenshotTest_coupon_dark.png diff --git a/baselineprofile/src/main/kotlin/kiwi/orbit/baselineprofile/BaselineProfileGenerator.kt b/baselineprofile/src/main/kotlin/kiwi/orbit/baselineprofile/BaselineProfileGenerator.kt index 7285d4c95..9ad54e635 100644 --- a/baselineprofile/src/main/kotlin/kiwi/orbit/baselineprofile/BaselineProfileGenerator.kt +++ b/baselineprofile/src/main/kotlin/kiwi/orbit/baselineprofile/BaselineProfileGenerator.kt @@ -78,6 +78,7 @@ internal class BaselineProfileGenerator { profileSubScreen(MainScreenSemantics.CheckboxItemTag) profileSubScreen(MainScreenSemantics.ChoiceTileItemTag) profileSubScreen(MainScreenSemantics.CollapseItemTag) + profileSubScreen(MainScreenSemantics.CouponItemTag) profileSubScreen(MainScreenSemantics.DialogItemTag) { device.findObject(By.res(DialogScreenSemantics.OrbitDialogButtonTag)) .clickAndWait(Until.newWindow(), TIMEOUT) diff --git a/catalog/semantics/src/main/kotlin/kiwi/orbit/compose/catalog/semantics/MainScreenSemantics.kt b/catalog/semantics/src/main/kotlin/kiwi/orbit/compose/catalog/semantics/MainScreenSemantics.kt index 6f80430a5..c5c30980b 100644 --- a/catalog/semantics/src/main/kotlin/kiwi/orbit/compose/catalog/semantics/MainScreenSemantics.kt +++ b/catalog/semantics/src/main/kotlin/kiwi/orbit/compose/catalog/semantics/MainScreenSemantics.kt @@ -16,6 +16,7 @@ object MainScreenSemantics { const val CheckboxItemTag = "main_screen_checkbox_item" const val ChoiceTileItemTag = "main_screen_choice_tile_item" const val CollapseItemTag = "main_screen_collapse_item" + const val CouponItemTag = "main_screen_coupon_item" const val DialogItemTag = "main_screen_dialog_item" const val EmptyStateItemTag = "main_screen_empty_state_item" const val KeyValueItemTag = "main_screen_key_value_item" diff --git a/catalog/src/main/java/kiwi/orbit/compose/catalog/CatalogApplication.kt b/catalog/src/main/java/kiwi/orbit/compose/catalog/CatalogApplication.kt index 30cf8c701..5d5bf4189 100644 --- a/catalog/src/main/java/kiwi/orbit/compose/catalog/CatalogApplication.kt +++ b/catalog/src/main/java/kiwi/orbit/compose/catalog/CatalogApplication.kt @@ -40,6 +40,7 @@ import kiwi.orbit.compose.catalog.screens.CheckboxScreen import kiwi.orbit.compose.catalog.screens.ChoiceTileScreen import kiwi.orbit.compose.catalog.screens.CollapseScreen import kiwi.orbit.compose.catalog.screens.ColorsScreen +import kiwi.orbit.compose.catalog.screens.CouponScreen import kiwi.orbit.compose.catalog.screens.DialogMaterialDatePicker import kiwi.orbit.compose.catalog.screens.DialogMaterialTimePicker import kiwi.orbit.compose.catalog.screens.DialogsMaterialDialog @@ -129,6 +130,7 @@ private fun NavGraph( composable { CheckboxScreen(navController::navigateUp) } composable { ChoiceTileScreen(navController::navigateUp) } composable { CollapseScreen(navController::navigateUp) } + composable { CouponScreen(navController::navigateUp) } composable { DialogsScreen(navController) } dialog { DialogMaterialTimePicker(navController) } dialog { DialogMaterialDatePicker(navController) } diff --git a/catalog/src/main/java/kiwi/orbit/compose/catalog/Destinations.kt b/catalog/src/main/java/kiwi/orbit/compose/catalog/Destinations.kt index 4511c982f..0d25040ca 100644 --- a/catalog/src/main/java/kiwi/orbit/compose/catalog/Destinations.kt +++ b/catalog/src/main/java/kiwi/orbit/compose/catalog/Destinations.kt @@ -8,131 +8,134 @@ import kotlinx.serialization.Serializable sealed interface Destinations : Destination { @Serializable - object Main : Destinations + data object Main : Destinations @Serializable - object Colors : Destinations + data object Colors : Destinations @Serializable - object Icons : Destinations + data object Icons : Destinations @Serializable - object Illustrations : Destinations + data object Illustrations : Destinations @Serializable - object Typography : Destinations + data object Typography : Destinations @Serializable - object Alert : Destinations + data object Alert : Destinations @Serializable - object Badge : Destinations + data object Badge : Destinations @Serializable - object BadgeList : Destinations + data object BadgeList : Destinations @Serializable - object Button : Destinations + data object Button : Destinations @Serializable - object Card : Destinations + data object Card : Destinations @Serializable - object Checkbox : Destinations + data object Checkbox : Destinations @Serializable - object ChoiceTile : Destinations + data object ChoiceTile : Destinations @Serializable - object Collapse : Destinations + data object Collapse : Destinations @Serializable - object Dialog : Destinations + data object Coupon : Destinations @Serializable - object DialogMaterial : Destinations + data object Dialog : Destinations @Serializable - object DialogMaterialTimePicker : Destinations, ResultDestination { + data object DialogMaterial : Destinations + + @Serializable + data object DialogMaterialTimePicker : Destinations, ResultDestination { @Serializable data class Result(val time: LocalTime) } @Serializable - object DialogMaterialDatePicker : Destinations, ResultDestination { + data object DialogMaterialDatePicker : Destinations, ResultDestination { @Serializable data class Result(val date: LocalDate) } @Serializable - object DialogOrbit : Destinations + data object DialogOrbit : Destinations @Serializable - object EmptyState : Destinations + data object EmptyState : Destinations @Serializable - object KeyValue : Destinations + data object KeyValue : Destinations @Serializable - object LinearProgressIndicator : Destination + data object LinearProgressIndicator : Destination @Serializable - object List : Destinations + data object List : Destinations @Serializable - object ListChoice : Destinations + data object ListChoice : Destinations @Serializable - object Loading : Destinations + data object Loading : Destinations @Serializable - object Radio : Destinations + data object Radio : Destinations @Serializable - object PillButton : Destinations + data object PillButton : Destinations @Serializable - object Seat : Destinations + data object Seat : Destinations @Serializable - object SegmentedSwitch : Destinations + data object SegmentedSwitch : Destinations @Serializable - object SelectField : Destinations + data object SelectField : Destinations @Serializable - object Slider : Destinations + data object Slider : Destinations @Serializable - object Stepper : Destinations + data object Stepper : Destinations @Serializable - object SurfaceCard : Destinations + data object SurfaceCard : Destinations @Serializable - object Switch : Destinations + data object Switch : Destinations @Serializable - object Tabs : Destinations + data object Tabs : Destinations @Serializable - object Tag : Destinations + data object Tag : Destinations @Serializable - object TextField : Destinations + data object TextField : Destinations @Serializable - object Tile : Destinations + data object Tile : Destinations @Serializable - object TileGroup : Destinations + data object TileGroup : Destinations @Serializable - object Timeline : Destinations + data object Timeline : Destinations @Serializable - object Toast : Destinations + data object Toast : Destinations @Serializable - object TopAppBar : Destinations + data object TopAppBar : Destinations } diff --git a/catalog/src/main/java/kiwi/orbit/compose/catalog/screens/CouponScreen.kt b/catalog/src/main/java/kiwi/orbit/compose/catalog/screens/CouponScreen.kt new file mode 100644 index 000000000..40cf41d86 --- /dev/null +++ b/catalog/src/main/java/kiwi/orbit/compose/catalog/screens/CouponScreen.kt @@ -0,0 +1,105 @@ +package kiwi.orbit.compose.catalog.screens + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import kiwi.orbit.compose.catalog.AppTheme +import kiwi.orbit.compose.catalog.semantics.SubScreenSemantics +import kiwi.orbit.compose.icons.Icons +import kiwi.orbit.compose.ui.controls.Coupon +import kiwi.orbit.compose.ui.controls.Scaffold +import kiwi.orbit.compose.ui.controls.Text +import kiwi.orbit.compose.ui.controls.ToastHostState +import kiwi.orbit.compose.ui.controls.TopAppBar +import kotlinx.coroutines.launch + +@Composable +internal fun CouponScreen( + onNavigateUp: () -> Unit, +) { + val toastHostState = remember { ToastHostState() } + val coroutineScope = rememberCoroutineScope() + + Scaffold( + modifier = Modifier.testTag(SubScreenSemantics.Tag), + topBar = { + TopAppBar( + title = { Text("Coupon") }, + onNavigateUp = onNavigateUp, + ) + }, + toastHostState = toastHostState, + ) { contentPadding -> + Box( + modifier = Modifier + .fillMaxSize() + .verticalScroll(rememberScrollState()) + .padding(contentPadding), + ) { + CouponScreenInner( + onCouponCopied = { + coroutineScope.launch { + toastHostState.showToast("Copied to clipboard!") { Icons.Copy } + } + }, + ) + } + } +} + +@Composable +private fun CouponScreenInner( + onCouponCopied: () -> Unit, +) { + Column( + modifier = Modifier.padding(16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp), + ) { + Row( + horizontalArrangement = Arrangement.spacedBy(4.dp), + ) { + Text( + text = "Your coupon:", + modifier = Modifier.alignByBaseline(), + ) + Coupon( + code = "hxt3b81f", + onCopied = null, + modifier = Modifier.alignByBaseline(), + ) + } + Row( + horizontalArrangement = Arrangement.spacedBy(4.dp), + ) { + Text( + text = "Copy your coupon:", + modifier = Modifier.alignByBaseline(), + ) + Coupon( + code = "hxt3b81f", + onCopied = onCouponCopied, + modifier = Modifier.alignByBaseline(), + ) + } + } +} + +@Preview +@Composable +private fun CouponScreenPreview() { + AppTheme { + CouponScreen(onNavigateUp = {}) + } +} diff --git a/catalog/src/main/java/kiwi/orbit/compose/catalog/screens/MainScreen.kt b/catalog/src/main/java/kiwi/orbit/compose/catalog/screens/MainScreen.kt index 776b668aa..50e6cc021 100644 --- a/catalog/src/main/java/kiwi/orbit/compose/catalog/screens/MainScreen.kt +++ b/catalog/src/main/java/kiwi/orbit/compose/catalog/screens/MainScreen.kt @@ -94,6 +94,7 @@ internal fun MainScreen( MenuItem("Checkbox", MIcons.CheckBox, Semantics.CheckboxItemTag) { Destinations.Checkbox }, MenuItem("Choice Tile", MIcons.Ballot, Semantics.ChoiceTileItemTag) { Destinations.ChoiceTile }, MenuItem("Collapse", Icons.ChevronDown, Semantics.CollapseItemTag) { Destinations.Collapse }, + MenuItem("Coupon", Icons.PromoCode, Semantics.CouponItemTag) { Destinations.Coupon }, MenuItem("Dialog", Icons.Chat, Semantics.DialogItemTag) { Destinations.Dialog }, MenuItem("EmptyState", MIcons.SignalWifiOff, Semantics.EmptyStateItemTag) { Destinations.EmptyState }, MenuItem("KeyValue", MIcons.DragHandle, Semantics.KeyValueItemTag) { Destinations.KeyValue }, diff --git a/component-status.yaml b/component-status.yaml index 680db99e0..d08dea48a 100644 --- a/component-status.yaml +++ b/component-status.yaml @@ -22,6 +22,8 @@ android: Released - component: CountryFlag android: Released +- component: Coupon + android: Released - component: Dialog android: Released - component: EmptyState diff --git a/docs/03-components/08-visuals/coupon.md b/docs/03-components/08-visuals/coupon.md new file mode 100644 index 000000000..821a5e51a --- /dev/null +++ b/docs/03-components/08-visuals/coupon.md @@ -0,0 +1,74 @@ +--- +title: Android +--- + +## Overview + +`Coupon` is a simple component used for highlighting coupons / promo codes. + +- [`Coupon`](https://kiwicom.github.io/orbit-compose/ui/kiwi.orbit.compose.ui.controls/-coupon.html) + +## Usage + +`Coupon` has `code` parameter that will be converted to uppercase and wrapped in a dashed border. + +If you provide `onCopied` callback, the component will copy the displayed code to clipboard on long click. +You should provide adequate feedback to the user in reaction to this action. To disable this functionality, +pass `null` to the parameter. + +```kotlin +@Composable +fun Example() { + Column { + Row( + horizontalArrangement = Arrangement.spacedBy(4.dp), + ) { + Text( + text = "Your coupon:", + modifier = Modifier.alignByBaseline(), + ) + Coupon( + code = "hxt3b81f", + onCopied = null, + modifier = Modifier.alignByBaseline(), + ) + } + Row( + horizontalArrangement = Arrangement.spacedBy(4.dp), + ) { + Text( + text = "Copy your coupon:", + modifier = Modifier.alignByBaseline(), + ) + Coupon( + code = "hxt3b81f", + onCopied = { + coroutineScope.launch { + toastHostState.showToast("Copied to clipboard!") { Icons.Copy } + } + }, + modifier = Modifier.alignByBaseline(), + ) + } + } +} +``` + +## UI Testing + +Add `testTag` to the component to test its properties. + +```kotlin +composeTestRule.setContent { + Coupon( + code = "hxt3b81f", + onCopied = null, + modifier = Modifier.testTag("coupon"), + ) +} +composeTestRule.onNodeWithTag("coupon").assertTextEquals("HXT3B81F") +``` + +## Customization + +`Coupon` appearance is not customizable. diff --git a/ui/src/androidMain/kotlin/kiwi/orbit/compose/ui/controls/Coupon.kt b/ui/src/androidMain/kotlin/kiwi/orbit/compose/ui/controls/Coupon.kt new file mode 100644 index 000000000..23cb9cad6 --- /dev/null +++ b/ui/src/androidMain/kotlin/kiwi/orbit/compose/ui/controls/Coupon.kt @@ -0,0 +1,141 @@ +package kiwi.orbit.compose.ui.controls + +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.LocalIndication +import androidx.compose.foundation.combinedClickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.drawWithCache +import androidx.compose.ui.geometry.CornerRadius +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.geometry.Size +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.PathEffect +import androidx.compose.ui.graphics.drawscope.Stroke +import androidx.compose.ui.platform.LocalClipboardManager +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import kiwi.orbit.compose.ui.OrbitTheme +import kiwi.orbit.compose.ui.controls.internal.Preview +import kiwi.orbit.compose.ui.foundation.ContentEmphasis + +/** + * Simple component used for highlighting coupons / promo codes. + * + * The [code] you provide will be converted to uppercase and wrapped in a dashed border. + * + * If you provide [onCopied] callback, the component will copy the displayed code to clipboard on long click. + * You should provide adequate feedback to the user in reaction to this action. To disable this functionality, + * pass null to the parameter. + */ +@OptIn(ExperimentalFoundationApi::class) +@Composable +public fun Coupon( + code: String, + onCopied: (() -> Unit)?, + modifier: Modifier = Modifier, + interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, +) { + val uppercaseCode = remember(code) { code.uppercase() } + val clipboardManager = LocalClipboardManager.current + + Text( + text = uppercaseCode, + style = OrbitTheme.typography.title6.copy(fontFeatureSettings = "tnum"), + modifier = modifier + .dashedBorder( + color = OrbitTheme.colors.surface.strong, + strokeWidth = 1.dp, + strokeLength = 2.dp, + cornerRadius = 6.dp, + ) + .clip(RoundedCornerShape(6.dp)) + .combinedClickable( + interactionSource = interactionSource, + indication = LocalIndication.current, + enabled = onCopied != null, + onLongClick = { + clipboardManager.setText(AnnotatedString(uppercaseCode)) + onCopied?.invoke() + }, + onClick = {}, // just long click copies + ) + .padding(horizontal = 4.dp, vertical = 2.dp), + ) +} + +private fun Modifier.dashedBorder( + color: Color, + strokeWidth: Dp = 1.dp, + strokeLength: Dp = 8.dp, + cornerRadius: Dp = 0.dp, +): Modifier = drawWithCache { + val strokeWidthPx = strokeWidth.toPx() + val strokeLengthPx = strokeLength.toPx() + + @Suppress("NAME_SHADOWING") + val cornerRadius = CornerRadius(cornerRadius.toPx()) + + val topLeft = Offset(strokeWidthPx / 2f, strokeWidthPx / 2f) + val size = Size(size.width - strokeWidthPx, size.height - strokeWidthPx) + val style = Stroke( + width = strokeWidthPx, + pathEffect = PathEffect.dashPathEffect(floatArrayOf(strokeLengthPx, strokeLengthPx)), + ) + + onDrawBehind { drawRoundRect(color, topLeft, size, cornerRadius, style) } +} + +@Preview +@Composable +internal fun CouponPreview() { + Preview { + Row( + horizontalArrangement = Arrangement.spacedBy(4.dp), + ) { + Text( + text = "Your coupon:", + modifier = Modifier.alignByBaseline(), + ) + Coupon( + code = "hxt3b81f", + onCopied = null, + modifier = Modifier.alignByBaseline(), + ) + } + Row( + horizontalArrangement = Arrangement.spacedBy(4.dp), + ) { + var copied by remember { mutableStateOf(false) } + Text( + text = "Copy your coupon:", + modifier = Modifier.alignByBaseline(), + ) + Coupon( + code = "hxt3b81f", + onCopied = { copied = true }, + modifier = Modifier.alignByBaseline(), + ) + if (copied) { + Text( + text = "Copied to clipboard!", + modifier = Modifier.alignByBaseline(), + emphasis = ContentEmphasis.Minor, + style = OrbitTheme.typography.bodySmall, + ) + } + } + } +} diff --git a/ui/src/androidUnitTest/kotlin/kiwi/orbit/compose/ui/ScreenshotTest.kt b/ui/src/androidUnitTest/kotlin/kiwi/orbit/compose/ui/ScreenshotTest.kt index 06ea01ea0..563de4d0d 100644 --- a/ui/src/androidUnitTest/kotlin/kiwi/orbit/compose/ui/ScreenshotTest.kt +++ b/ui/src/androidUnitTest/kotlin/kiwi/orbit/compose/ui/ScreenshotTest.kt @@ -36,6 +36,7 @@ import kiwi.orbit.compose.ui.controls.CircularProgressIndicatorPreview import kiwi.orbit.compose.ui.controls.ClickableFieldPreview import kiwi.orbit.compose.ui.controls.CollapsePreview import kiwi.orbit.compose.ui.controls.CountryFlagPreview +import kiwi.orbit.compose.ui.controls.CouponPreview import kiwi.orbit.compose.ui.controls.DialogPreview import kiwi.orbit.compose.ui.controls.EmptyStatePreview import kiwi.orbit.compose.ui.controls.IconPreview @@ -220,6 +221,11 @@ internal class ScreenshotTest { } } + @Test + fun coupon() { + snapshot { CouponPreview() } + } + @Test fun dialog() { snapshot { DialogPreview() } diff --git a/ui/src/androidUnitTest/kotlin/kiwi/orbit/compose/ui/controls/CouponTest.kt b/ui/src/androidUnitTest/kotlin/kiwi/orbit/compose/ui/controls/CouponTest.kt new file mode 100644 index 000000000..1b0ac298f --- /dev/null +++ b/ui/src/androidUnitTest/kotlin/kiwi/orbit/compose/ui/controls/CouponTest.kt @@ -0,0 +1,29 @@ +package kiwi.orbit.compose.ui.controls + +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.test.assertTextEquals +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithTag +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner + +@RunWith(RobolectricTestRunner::class) +internal class CouponTest { + @get:Rule + val composeTestRule = createComposeRule() + + @Test + fun testBasics() { + composeTestRule.setContent { + Coupon( + code = "hxt3b81f", + onCopied = null, + modifier = Modifier.testTag("coupon"), + ) + } + composeTestRule.onNodeWithTag("coupon").assertTextEquals("HXT3B81F") + } +} diff --git a/ui/src/test/snapshots/images/kiwi.orbit.compose.ui_ScreenshotTest_coupon.png b/ui/src/test/snapshots/images/kiwi.orbit.compose.ui_ScreenshotTest_coupon.png new file mode 100644 index 000000000..232e0cc83 --- /dev/null +++ b/ui/src/test/snapshots/images/kiwi.orbit.compose.ui_ScreenshotTest_coupon.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d72ac835adb53f7413a47594065a7e1537774954d441f2494ea2c5543804056 +size 12566 diff --git a/ui/src/test/snapshots/images/kiwi.orbit.compose.ui_ScreenshotTest_coupon_big.png b/ui/src/test/snapshots/images/kiwi.orbit.compose.ui_ScreenshotTest_coupon_big.png new file mode 100644 index 000000000..41cd2f481 --- /dev/null +++ b/ui/src/test/snapshots/images/kiwi.orbit.compose.ui_ScreenshotTest_coupon_big.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0e09af6c08caa993fc6fc506ddd34dd6c72ee1a582394bff403c66cbeb9604ff +size 21046 diff --git a/ui/src/test/snapshots/images/kiwi.orbit.compose.ui_ScreenshotTest_coupon_dark.png b/ui/src/test/snapshots/images/kiwi.orbit.compose.ui_ScreenshotTest_coupon_dark.png new file mode 100644 index 000000000..9c543ff0a --- /dev/null +++ b/ui/src/test/snapshots/images/kiwi.orbit.compose.ui_ScreenshotTest_coupon_dark.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0165961f481676c618c0fa08d6f5a6bebd7c5258c1ab75865cd25ec09aff1faf +size 12618