@momo-kits/native-kits 0.167.1-beta.3 → 0.167.1-beta.3-debug

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/build.gradle.kts +11 -0
  2. package/compose/build.gradle.kts +190 -0
  3. package/compose/build.gradle.kts.backup +190 -0
  4. package/compose/compose.podspec +47 -0
  5. package/compose/src/androidMain/kotlin/vn/momo/kits/const/HostFont.android.kt +19 -0
  6. package/compose/src/androidMain/kotlin/vn/momo/kits/navigation/ScrollToTop.android.kt +6 -0
  7. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/BackGesture.android.kt +12 -0
  8. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/OsFontScale.android.kt +7 -0
  9. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +151 -0
  10. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +52 -0
  11. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +124 -0
  12. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +183 -0
  13. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +207 -0
  14. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +39 -0
  15. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +86 -0
  16. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +76 -0
  17. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +76 -0
  18. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +293 -0
  19. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +33 -0
  20. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +831 -0
  21. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Localize.kt +269 -0
  22. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +110 -0
  23. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +378 -0
  24. package/compose/src/commonMain/kotlin/vn/momo/kits/application/WidgetContainer.kt +56 -0
  25. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +69 -0
  26. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +157 -0
  27. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +82 -0
  28. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +32 -0
  29. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +338 -0
  30. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +175 -0
  31. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +356 -0
  32. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +113 -0
  33. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +89 -0
  34. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +128 -0
  35. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +209 -0
  36. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +542 -0
  37. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +49 -0
  38. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +76 -0
  39. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +125 -0
  40. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +231 -0
  41. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +189 -0
  42. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +475 -0
  43. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +114 -0
  44. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +266 -0
  45. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +240 -0
  46. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +223 -0
  47. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +264 -0
  48. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +185 -0
  49. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +343 -0
  50. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +108 -0
  51. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +56 -0
  52. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +41 -0
  53. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +84 -0
  54. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +40 -0
  55. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +328 -0
  56. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +97 -0
  57. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +310 -0
  58. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +59 -0
  59. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +87 -0
  60. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +21 -0
  61. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +90 -0
  62. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +323 -0
  63. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +220 -0
  64. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +473 -0
  65. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +122 -0
  66. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +199 -0
  67. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +91 -0
  68. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +552 -0
  69. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +88 -0
  70. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +125 -0
  71. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +207 -0
  72. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +498 -0
  73. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +176 -0
  74. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +182 -0
  75. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +193 -0
  76. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +29 -0
  77. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +234 -0
  78. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +188 -0
  79. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +325 -0
  80. package/compose/src/commonMain/kotlin/vn/momo/kits/const/HostFont.kt +16 -0
  81. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitDesignSystem.kt +18 -0
  82. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitFontScale.kt +22 -0
  83. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +12 -0
  84. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +16 -0
  85. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +188 -0
  86. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +296 -0
  87. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +52 -0
  88. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +38 -0
  89. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +39 -0
  90. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +52 -0
  91. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +66 -0
  92. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +11 -0
  93. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +104 -0
  94. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +48 -0
  95. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +51 -0
  96. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +299 -0
  97. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/HostBackGestureBridge.kt +58 -0
  98. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +129 -0
  99. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +106 -0
  100. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +201 -0
  101. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +393 -0
  102. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ScrollToTop.kt +8 -0
  103. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +595 -0
  104. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackTransition.kt +148 -0
  105. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/SwipeBackHaptic.kt +35 -0
  106. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +175 -0
  107. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +225 -0
  108. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +86 -0
  109. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +169 -0
  110. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +358 -0
  111. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +83 -0
  112. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderJourney.kt +106 -0
  113. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderLocation.kt +75 -0
  114. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +309 -0
  115. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +37 -0
  116. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +364 -0
  117. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +132 -0
  118. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +127 -0
  119. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/BackGesture.kt +12 -0
  120. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +91 -0
  121. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/OsFontScale.kt +9 -0
  122. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +71 -0
  123. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +1329 -0
  124. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +55 -0
  125. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +15 -0
  126. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +105 -0
  127. package/compose/src/iosMain/kotlin/vn/momo/kits/const/HostFont.ios.kt +40 -0
  128. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/HostBackGesture.ios.kt +45 -0
  129. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +32 -0
  130. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/BackGesture.ios.kt +38 -0
  131. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/OsFontScale.ios.kt +66 -0
  132. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +213 -0
  133. package/gradle/libs.versions.toml +69 -0
  134. package/gradle/wrapper/gradle-wrapper.jar +0 -0
  135. package/gradle/wrapper/gradle-wrapper.properties +8 -0
  136. package/gradle.properties +26 -0
  137. package/gradlew +252 -0
  138. package/gradlew.bat +94 -0
  139. package/ios-demo/README.md +120 -0
  140. package/package.json +1 -1
  141. package/settings.gradle.kts +64 -0
@@ -0,0 +1,125 @@
1
+ package vn.momo.kits.components
2
+
3
+ import androidx.compose.foundation.border
4
+ import androidx.compose.foundation.text.InlineTextContent
5
+ import androidx.compose.runtime.Composable
6
+ import androidx.compose.runtime.remember
7
+ import androidx.compose.ui.Modifier
8
+ import androidx.compose.ui.graphics.Color
9
+ import androidx.compose.ui.text.AnnotatedString
10
+ import androidx.compose.ui.text.TextLayoutResult
11
+ import androidx.compose.ui.text.TextStyle
12
+ import androidx.compose.ui.text.style.TextAlign
13
+ import androidx.compose.ui.text.style.TextDecoration
14
+ import androidx.compose.ui.text.style.TextOverflow
15
+ import androidx.compose.ui.unit.TextUnit
16
+ import androidx.compose.ui.unit.dp
17
+ import vn.momo.kits.application.IsShowBaseLineDebug
18
+ import vn.momo.kits.const.*
19
+ import vn.momo.kits.modifier.conditional
20
+ import vn.momo.kits.modifier.setAutomationId
21
+
22
+ @Composable
23
+ fun Text(
24
+ text: String,
25
+ color: Color? = null,
26
+ style: TextStyle = Typography.bodyDefaultRegular,
27
+ textAlign: TextAlign? = TextAlign.Start,
28
+ modifier: Modifier = Modifier,
29
+ maxLines: Int = Int.MAX_VALUE,
30
+ overflow: TextOverflow = TextOverflow.Clip,
31
+ textDecoration: TextDecoration? = null,
32
+ onTextLayout: ((TextLayoutResult) -> Unit)? = null,
33
+ fontFamily: String? = null,
34
+ minLines: Int = 1,
35
+ letterSpacing: TextUnit = TextUnit.Unspecified,
36
+ softWrap: Boolean = true,
37
+ accessibilityId: String? = null,
38
+ inlineContent: Map<String, InlineTextContent> = mapOf(),
39
+ ) {
40
+ Text(
41
+ text = AnnotatedString(text),
42
+ color = color,
43
+ style = style,
44
+ textAlign = textAlign,
45
+ modifier = modifier,
46
+ maxLines = maxLines,
47
+ overflow = overflow,
48
+ textDecoration = textDecoration,
49
+ onTextLayout = onTextLayout,
50
+ fontFamily = fontFamily,
51
+ minLines = minLines,
52
+ letterSpacing = letterSpacing,
53
+ softWrap = softWrap,
54
+ accessibilityId = accessibilityId,
55
+ inlineContent = inlineContent
56
+ )
57
+ }
58
+
59
+
60
+ @Composable
61
+ fun Text(
62
+ text: AnnotatedString,
63
+ color: Color? = null,
64
+ style: TextStyle = Typography.bodyDefaultRegular,
65
+ textAlign: TextAlign? = TextAlign.Start,
66
+ modifier: Modifier = Modifier,
67
+ maxLines: Int = Int.MAX_VALUE,
68
+ overflow: TextOverflow = TextOverflow.Clip,
69
+ textDecoration: TextDecoration? = null,
70
+ onTextLayout: ((TextLayoutResult) -> Unit)? = null,
71
+ fontFamily: String? = null,
72
+ minLines: Int = 1,
73
+ letterSpacing: TextUnit = TextUnit.Unspecified,
74
+ softWrap: Boolean = true,
75
+ accessibilityId: String? = null,
76
+ inlineContent: Map<String, InlineTextContent> = mapOf(),
77
+ ) {
78
+ // Cache theme access to avoid repeated lookups
79
+ val theme = AppTheme.current
80
+
81
+ val fontSize = scaleSize(style.fontSize)
82
+ val lineHeight = scaleSize(style.lineHeight)
83
+ val font = getFontFamily(fontFamily ?: theme.font, style.fontWeight)
84
+
85
+ // Memoize color calculation
86
+ val textColor = remember(color, theme) {
87
+ color ?: theme.colors.text.default
88
+ }
89
+
90
+ // Memoize style copy operation
91
+ val optimizedStyle = remember(style) {
92
+ style.copy(
93
+ fontWeight = null,
94
+ lineHeight = if (lineHeight.value.isFinite() && lineHeight.value > 0) lineHeight else style.lineHeight
95
+ )
96
+ }
97
+
98
+ // Memoize automation ID
99
+ val automationId = remember(accessibilityId, text) {
100
+ accessibilityId ?: text
101
+ }
102
+
103
+ // on/off baseline config value, default will be false
104
+
105
+ androidx.compose.material3.Text(
106
+ modifier = modifier.conditional(IsShowBaseLineDebug){
107
+ border(1.dp, Colors.blue_03)
108
+ }.setAutomationId(automationId.toString()),
109
+ text = text,
110
+ color = textColor,
111
+ style = optimizedStyle,
112
+ textAlign = textAlign,
113
+ fontSize = fontSize,
114
+ fontFamily = font,
115
+ maxLines = maxLines,
116
+ softWrap = softWrap,
117
+ letterSpacing = letterSpacing,
118
+ minLines = minLines,
119
+ textDecoration = textDecoration,
120
+ onTextLayout = onTextLayout ?: {},
121
+ overflow = overflow,
122
+ inlineContent = inlineContent
123
+ )
124
+ }
125
+
@@ -0,0 +1,207 @@
1
+ package vn.momo.kits.components
2
+
3
+ import androidx.compose.foundation.background
4
+ import androidx.compose.foundation.border
5
+ import androidx.compose.foundation.clickable
6
+ import androidx.compose.foundation.layout.*
7
+ import androidx.compose.foundation.shape.RoundedCornerShape
8
+ import androidx.compose.runtime.Composable
9
+ import androidx.compose.ui.Alignment
10
+ import androidx.compose.ui.Modifier
11
+ import androidx.compose.ui.graphics.Color
12
+ import androidx.compose.ui.text.TextStyle
13
+ import androidx.compose.ui.text.font.FontWeight
14
+ import androidx.compose.ui.unit.dp
15
+ import androidx.compose.ui.unit.sp
16
+ import vn.momo.kits.application.IsShowBaseLineDebug
17
+ import vn.momo.kits.const.AppTheme
18
+ import vn.momo.kits.const.Colors
19
+ import vn.momo.kits.const.Spacing
20
+ import vn.momo.kits.const.Typography
21
+ import vn.momo.kits.modifier.conditional
22
+
23
+ enum class TitleType { Card, Section }
24
+ enum class TitleSize { Small, Medium, Large }
25
+ enum class IconAlign { Top, Center, Bottom }
26
+ enum class ButtonSize { Small, Large }
27
+
28
+ @Composable
29
+ fun Title(
30
+ title: String,
31
+ type: TitleType = TitleType.Section,
32
+ size: TitleSize = TitleSize.Medium,
33
+ icon: String? = null,
34
+ iconColor: Color? = null,
35
+ iconAlign: IconAlign = IconAlign.Top,
36
+ showRightAction: Boolean = false,
37
+ showTrailingAction: Boolean = false,
38
+ badgeLabel: String? = null,
39
+ buttonTitle: String? = null,
40
+ buttonSize: ButtonSize = ButtonSize.Small,
41
+ onPressRightAction: () -> Unit = {},
42
+ onPressTrailingAction: () -> Unit = {},
43
+ textOnly: Boolean = false,
44
+ description: String? = null,
45
+ modifier: Modifier = Modifier
46
+ ) {
47
+ val theme = AppTheme.current
48
+ val textStyle: TextStyle = when (type) {
49
+ TitleType.Card -> when (size) {
50
+ TitleSize.Small -> TextStyle(fontSize = 14.sp, lineHeight = 20.sp, fontWeight = FontWeight.Bold)
51
+ TitleSize.Medium -> TextStyle(fontSize = 16.sp, lineHeight = 22.sp, fontWeight = FontWeight.Bold)
52
+ TitleSize.Large -> TextStyle(fontSize = 18.sp, lineHeight = 26.sp, fontWeight = FontWeight.Bold)
53
+ }
54
+
55
+ TitleType.Section -> when (size) {
56
+ TitleSize.Small -> TextStyle(
57
+ fontSize = 16.sp,
58
+ lineHeight = 24.sp,
59
+ fontWeight = FontWeight.Bold
60
+ )
61
+
62
+ TitleSize.Medium -> TextStyle(
63
+ fontSize = 18.sp,
64
+ lineHeight = 26.sp,
65
+ fontWeight = FontWeight.Bold
66
+ )
67
+
68
+ TitleSize.Large -> TextStyle(
69
+ fontSize = 20.sp,
70
+ lineHeight = 28.sp,
71
+ fontWeight = FontWeight.Bold
72
+ )
73
+ }
74
+ }
75
+
76
+ if (textOnly) {
77
+ Text(
78
+ text = title,
79
+ style = textStyle,
80
+ modifier = modifier
81
+ )
82
+ return
83
+ }
84
+
85
+ Row(
86
+ modifier = modifier
87
+ .fillMaxWidth()
88
+ .height(IntrinsicSize.Min)
89
+ .conditional(IsShowBaseLineDebug) {
90
+ border(1.dp, Colors.blue_03)
91
+ }
92
+ // react-kits' Title root is `styles.wrapper` = `{flexDirection:'row'}`
93
+ // plus, for a SECTION only, `marginTop: Spacing.S` (foundations/Title
94
+ // index.tsx). It has no padding at all, so the 8dp box here inset every
95
+ // title by 8dp against the web render.
96
+ .padding(top = if (type == TitleType.Section) Spacing.S else 0.dp),
97
+ verticalAlignment = Alignment.CenterVertically
98
+ ) {
99
+ icon?.let {
100
+ Column(
101
+ modifier = Modifier.fillMaxHeight().padding(end = Spacing.S),
102
+ verticalArrangement = when (iconAlign) {
103
+ IconAlign.Top -> Arrangement.Top
104
+ IconAlign.Center -> Arrangement.Center
105
+ IconAlign.Bottom -> Arrangement.Bottom
106
+ },
107
+ ) {
108
+ // Icon
109
+ Icon(
110
+ source = it,
111
+ color = iconColor ?: theme.colors.text.default,
112
+ modifier = Modifier.size(24.dp)
113
+ )
114
+ }
115
+ }
116
+
117
+ Column(
118
+ modifier = Modifier.weight(1f)
119
+ ) {
120
+ Row(
121
+ verticalAlignment = Alignment.CenterVertically
122
+ ) {
123
+ Row(
124
+ verticalAlignment = Alignment.CenterVertically,
125
+ modifier = if (showTrailingAction) Modifier else Modifier.weight(1f),
126
+ ) {
127
+ Text(
128
+ text = title,
129
+ style = textStyle,
130
+ maxLines = if (showTrailingAction || badgeLabel != null) 1 else 2,
131
+ )
132
+
133
+ // Badge
134
+ badgeLabel?.let {
135
+ Spacer(modifier = Modifier.width(4.dp))
136
+ Badge(
137
+ label = it
138
+ )
139
+ }
140
+
141
+ }
142
+
143
+ // Trailing action (icon)
144
+ if (showTrailingAction && !showRightAction) {
145
+ Spacer(modifier = Modifier.width(8.dp))
146
+ Box(
147
+ modifier = Modifier
148
+ .size(24.dp)
149
+ .background(
150
+ color = if (type == TitleType.Section) Colors.black_06.copy(0.6f) else Colors.black_06.copy(
151
+ 0.3f
152
+ ),
153
+ shape = RoundedCornerShape(12.dp)
154
+ )
155
+ .clickable { onPressTrailingAction() },
156
+ contentAlignment = Alignment.Center
157
+ ) {
158
+ Icon(
159
+ source = "arrow_chevron_right_small",
160
+ size = 18.dp
161
+ )
162
+ }
163
+ }
164
+ }
165
+
166
+ // Description
167
+ description?.let {
168
+ Spacer(modifier = Modifier.height(4.dp))
169
+ Text(
170
+ text = it,
171
+ style = Typography.descriptionDefaultRegular,
172
+ color = theme.colors.text.secondary
173
+ )
174
+ }
175
+ }
176
+
177
+ // Right action (button or icon)
178
+ if (showRightAction && !showTrailingAction) {
179
+ Spacer(modifier = Modifier.width(8.dp))
180
+ if (buttonTitle != null) {
181
+ Text(
182
+ text = buttonTitle,
183
+ style = if (buttonSize === ButtonSize.Small) Typography.actionXsBold else Typography.actionSBold,
184
+ color = theme.colors.primary,
185
+ modifier = Modifier.clickable { onPressRightAction() }
186
+ )
187
+ } else {
188
+ Box(
189
+ modifier = Modifier
190
+ .size(24.dp)
191
+ .background(
192
+ color = Colors.pink_03.copy(alpha = 0.1f),
193
+ shape = RoundedCornerShape(12.dp)
194
+ )
195
+ .clickable { onPressRightAction() },
196
+ contentAlignment = Alignment.Center
197
+ ) {
198
+ Icon(
199
+ source = "arrow_chevron_right_small",
200
+ modifier = Modifier.size(22.dp),
201
+ color = theme.colors.primary
202
+ )
203
+ }
204
+ }
205
+ }
206
+ }
207
+ }