@momo-kits/native-kits 0.157.5-debug → 0.158.1-beta.1-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 (139) hide show
  1. package/.claude/settings.local.json +11 -0
  2. package/.claude/skills/design-system/SKILL.md +88 -0
  3. package/.claude/skills/design-system/references/components/avatar.md +134 -0
  4. package/.claude/skills/design-system/references/components/badge.md +127 -0
  5. package/.claude/skills/design-system/references/components/bottom-tab.md +177 -0
  6. package/.claude/skills/design-system/references/components/bottomsheet.md +170 -0
  7. package/.claude/skills/design-system/references/components/button.md +206 -0
  8. package/.claude/skills/design-system/references/components/carousel.md +117 -0
  9. package/.claude/skills/design-system/references/components/checkbox.md +98 -0
  10. package/.claude/skills/design-system/references/components/chip.md +146 -0
  11. package/.claude/skills/design-system/references/components/collapse.md +120 -0
  12. package/.claude/skills/design-system/references/components/date-picker.md +119 -0
  13. package/.claude/skills/design-system/references/components/divider.md +84 -0
  14. package/.claude/skills/design-system/references/components/icon.md +130 -0
  15. package/.claude/skills/design-system/references/components/image.md +81 -0
  16. package/.claude/skills/design-system/references/components/information.md +107 -0
  17. package/.claude/skills/design-system/references/components/input-dropdown.md +138 -0
  18. package/.claude/skills/design-system/references/components/input-money.md +157 -0
  19. package/.claude/skills/design-system/references/components/input-otp.md +132 -0
  20. package/.claude/skills/design-system/references/components/input-phone-number.md +140 -0
  21. package/.claude/skills/design-system/references/components/input-search.md +124 -0
  22. package/.claude/skills/design-system/references/components/input-text-area.md +133 -0
  23. package/.claude/skills/design-system/references/components/input.md +152 -0
  24. package/.claude/skills/design-system/references/components/loader.md +87 -0
  25. package/.claude/skills/design-system/references/components/pagination.md +105 -0
  26. package/.claude/skills/design-system/references/components/popup-notify.md +128 -0
  27. package/.claude/skills/design-system/references/components/progress-info.md +114 -0
  28. package/.claude/skills/design-system/references/components/radio.md +86 -0
  29. package/.claude/skills/design-system/references/components/rating.md +126 -0
  30. package/.claude/skills/design-system/references/components/skeleton.md +120 -0
  31. package/.claude/skills/design-system/references/components/slider.md +141 -0
  32. package/.claude/skills/design-system/references/components/snackbar.md +97 -0
  33. package/.claude/skills/design-system/references/components/stepper.md +100 -0
  34. package/.claude/skills/design-system/references/components/steps.md +91 -0
  35. package/.claude/skills/design-system/references/components/suggest-action.md +95 -0
  36. package/.claude/skills/design-system/references/components/swipe.md +121 -0
  37. package/.claude/skills/design-system/references/components/switch.md +98 -0
  38. package/.claude/skills/design-system/references/components/tab-view.md +120 -0
  39. package/.claude/skills/design-system/references/components/tag.md +118 -0
  40. package/.claude/skills/design-system/references/components/text.md +151 -0
  41. package/.claude/skills/design-system/references/components/toast.md +99 -0
  42. package/.claude/skills/design-system/references/components/tooltip.md +138 -0
  43. package/.claude/skills/design-system/references/components/top-nav-miniapp.md +94 -0
  44. package/.claude/skills/design-system/references/components/top-nav.md +226 -0
  45. package/.claude/skills/design-system/references/components/uploader.md +115 -0
  46. package/.claude/skills/design-system/references/navigation/bottom-tab.md +131 -0
  47. package/.claude/skills/design-system/references/navigation/bottomsheet.md +161 -0
  48. package/.claude/skills/design-system/references/navigation/modal.md +133 -0
  49. package/.claude/skills/design-system/references/navigation/navigation-options.md +225 -0
  50. package/.claude/skills/design-system/references/navigation/navigator.md +111 -0
  51. package/.claude/skills/design-system/references/navigation/setup.md +134 -0
  52. package/.claude/skills/design-system/references/navigation/stack.md +128 -0
  53. package/.claude/skills/design-system/references/spec-convention.md +80 -0
  54. package/.claude/skills/design-system/references/tokens/colors.md +131 -0
  55. package/.claude/skills/design-system/references/tokens/spacing-radius.md +144 -0
  56. package/.claude/skills/design-system/references/tokens/theme.md +125 -0
  57. package/.claude/skills/design-system/references/tokens/typography.md +135 -0
  58. package/.claude/skills/design-system-kits/SKILL.md +102 -0
  59. package/.claude/skills/design-system-kits/references/code-convention.md +118 -0
  60. package/.claude/skills/design-system-kits/references/components/avatar.md +45 -0
  61. package/.claude/skills/design-system-kits/references/components/badge.md +27 -0
  62. package/.claude/skills/design-system-kits/references/components/button.md +65 -0
  63. package/.claude/skills/design-system-kits/references/components/carousel.md +51 -0
  64. package/.claude/skills/design-system-kits/references/components/checkbox.md +39 -0
  65. package/.claude/skills/design-system-kits/references/components/chip.md +54 -0
  66. package/.claude/skills/design-system-kits/references/components/collapse.md +63 -0
  67. package/.claude/skills/design-system-kits/references/components/date-picker.md +36 -0
  68. package/.claude/skills/design-system-kits/references/components/divider.md +21 -0
  69. package/.claude/skills/design-system-kits/references/components/icon.md +382 -0
  70. package/.claude/skills/design-system-kits/references/components/image.md +62 -0
  71. package/.claude/skills/design-system-kits/references/components/information.md +61 -0
  72. package/.claude/skills/design-system-kits/references/components/input-dropdown.md +92 -0
  73. package/.claude/skills/design-system-kits/references/components/input-money.md +128 -0
  74. package/.claude/skills/design-system-kits/references/components/input-otp.md +85 -0
  75. package/.claude/skills/design-system-kits/references/components/input-phone-number.md +96 -0
  76. package/.claude/skills/design-system-kits/references/components/input-search.md +127 -0
  77. package/.claude/skills/design-system-kits/references/components/input-text-area.md +100 -0
  78. package/.claude/skills/design-system-kits/references/components/input.md +126 -0
  79. package/.claude/skills/design-system-kits/references/components/loader.md +41 -0
  80. package/.claude/skills/design-system-kits/references/components/pagination.md +47 -0
  81. package/.claude/skills/design-system-kits/references/components/popup-notify.md +69 -0
  82. package/.claude/skills/design-system-kits/references/components/popup-promotion.md +35 -0
  83. package/.claude/skills/design-system-kits/references/components/progress-info.md +55 -0
  84. package/.claude/skills/design-system-kits/references/components/radio.md +42 -0
  85. package/.claude/skills/design-system-kits/references/components/rating.md +36 -0
  86. package/.claude/skills/design-system-kits/references/components/skeleton.md +25 -0
  87. package/.claude/skills/design-system-kits/references/components/slider.md +53 -0
  88. package/.claude/skills/design-system-kits/references/components/snackbar.md +52 -0
  89. package/.claude/skills/design-system-kits/references/components/stepper.md +46 -0
  90. package/.claude/skills/design-system-kits/references/components/steps.md +57 -0
  91. package/.claude/skills/design-system-kits/references/components/suggest-action.md +44 -0
  92. package/.claude/skills/design-system-kits/references/components/swipe.md +44 -0
  93. package/.claude/skills/design-system-kits/references/components/switch.md +43 -0
  94. package/.claude/skills/design-system-kits/references/components/tab-view.md +56 -0
  95. package/.claude/skills/design-system-kits/references/components/tag.md +50 -0
  96. package/.claude/skills/design-system-kits/references/components/text.md +56 -0
  97. package/.claude/skills/design-system-kits/references/components/toast.md +51 -0
  98. package/.claude/skills/design-system-kits/references/components/tooltip.md +95 -0
  99. package/.claude/skills/design-system-kits/references/components/uploader.md +48 -0
  100. package/.claude/skills/design-system-kits/references/design-spec-structure.md +356 -0
  101. package/.claude/skills/design-system-kits/references/design-spec-to-code.md +596 -0
  102. package/.claude/skills/design-system-kits/references/navigation/bottom-tab.md +155 -0
  103. package/.claude/skills/design-system-kits/references/navigation/bottomsheet.md +94 -0
  104. package/.claude/skills/design-system-kits/references/navigation/modal.md +125 -0
  105. package/.claude/skills/design-system-kits/references/navigation/navigation-options.md +430 -0
  106. package/.claude/skills/design-system-kits/references/navigation/navigator.md +177 -0
  107. package/.claude/skills/design-system-kits/references/navigation/setup.md +94 -0
  108. package/.claude/skills/design-system-kits/references/navigation/stack.md +152 -0
  109. package/.claude/skills/design-system-kits/references/screen-layout-rule.md +125 -0
  110. package/.claude/skills/design-system-kits/references/tokens/colors.md +183 -0
  111. package/.claude/skills/design-system-kits/references/tokens/spacing-radius.md +45 -0
  112. package/.claude/skills/design-system-kits/references/tokens/theme.md +97 -0
  113. package/.claude/skills/design-system-kits/references/tokens/typography.md +105 -0
  114. package/.claude/skills/vibe-design/SKILL.md +306 -0
  115. package/compose/build.gradle.kts +1 -1
  116. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +7 -0
  117. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +157 -0
  118. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +123 -0
  119. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +224 -0
  120. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +108 -0
  121. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +2 -2
  122. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +338 -0
  123. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +87 -0
  124. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +348 -0
  125. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +256 -0
  126. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +494 -0
  127. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +131 -0
  128. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +215 -0
  129. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +531 -0
  130. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +192 -0
  131. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +3 -0
  132. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +5 -2
  133. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +2 -11
  134. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +5 -1
  135. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +12 -0
  136. package/gradle.properties +1 -1
  137. package/ios/Popup/PopupPromotion.swift +2 -2
  138. package/local.properties +8 -0
  139. package/package.json +1 -1
@@ -0,0 +1,152 @@
1
+ # Stack Screen Configuration
2
+
3
+ ## React Native — Screen Component
4
+
5
+ The `Screen` component from `@momo-kits/foundation` is the outermost container for every screen. It manages the header, scroll, keyboard avoidance, safe areas, and grid layout.
6
+
7
+ ### Screen Props
8
+
9
+ | Prop | Type | Default | Description |
10
+ |------|------|---------|-------------|
11
+ | `navigation` | `Navigation` | — | Navigation object (injected by NavigationContainer) |
12
+ | `scrollable` | `boolean` | — | Enable scrollable content |
13
+ | `headerType` | `HeaderType` | `'default'` | `'default'` \| `'extended'` \| `'none'` |
14
+ | `animatedHeader` | `AnimatedHeader` | — | Object: `{ headerTintColor?, component?, headerTitle? }` — collapses on scroll |
15
+ | `headerComponent` | `ReactNode` | — | Custom header component |
16
+ | `footerComponent` | `ReactNode` | — | Sticky footer component |
17
+ | `backgroundColor` | `string` | — | Screen background color |
18
+ | `enableKeyboardAvoidingView` | `boolean` | — | Wrap content in KeyboardAvoidingView |
19
+ | `keyboardVerticalOffset` | `number` | auto | Override keyboard avoiding offset |
20
+ | `floatingButtonProps` | `FloatingButtonProps` | — | `{ icon, label, onPress, container? }` |
21
+ | `scrollViewProps` | `ScrollViewProps` | — | Pass-through props for underlying ScrollView |
22
+ | `layoutOffset` | `-8 \| -24 \| -56` | `-56` | Card offset overlap with header banner |
23
+ | `headerRightWidth` | `0 \| 73 \| 110 \| number` | `73` | Width of the right header area |
24
+ | `useGridLayout` | `boolean` | `true` | Apply auto grid spacing to children |
25
+ | `inputSearchProps` | `SearchHeaderProps` | — | Animated search header config |
26
+ | `inputSearchRef` | `Ref<InputRef>` | — | Ref for the search input |
27
+ | `animatedValue` | `Animated.Value` | auto | Inject a custom animated value |
28
+ | `useShadowHeader` | `boolean` | `true` | Header shadow |
29
+ | `headerBackground` | `string` | — | Custom header background image |
30
+ | `trackingParams` | `ScreenTrackingParams` | — | `{ value1?, value2? }` for auto tracking |
31
+
32
+ ### ScreenRef (imperative methods)
33
+
34
+ ```tsx
35
+ import { Screen, ScreenRef } from '@momo-kits/foundation';
36
+
37
+ const screenRef = useRef<ScreenRef>(null);
38
+
39
+ <Screen ref={screenRef} navigation={navigation} scrollable headerType="default">
40
+ {/* content */}
41
+ </Screen>
42
+
43
+ // Dynamically update header options
44
+ screenRef.current?.setOptions({
45
+ headerTitle: 'New Title',
46
+ hiddenBack: false,
47
+ headerRight: { useShortcut: true },
48
+ });
49
+
50
+ // Show/update search header
51
+ screenRef.current?.setSearchHeader({
52
+ placeholder: 'Search...',
53
+ onChangeText: setQuery,
54
+ });
55
+ ```
56
+
57
+ ### HeaderType
58
+
59
+ | Value | Description |
60
+ |-------|-------------|
61
+ | `'default'` | Standard header with title + back button |
62
+ | `'extended'` | Taller header, supports search and collapse animation |
63
+ | `'none'` | No header rendered |
64
+
65
+ ### AnimatedHeader
66
+
67
+ ```tsx
68
+ animatedHeader={{
69
+ headerTintColor: '#FFFFFF',
70
+ headerTitle: 'Animated Title', // string | HeaderTitleProps
71
+ component: (props) => <CustomBanner {...props} />,
72
+ }}
73
+ ```
74
+
75
+ ### FloatingButtonProps
76
+
77
+ | Prop | Type | Description |
78
+ |------|------|-------------|
79
+ | `icon` | `string \| ReactNode` | FAB icon (required) |
80
+ | `label` | `string` | FAB label (required) |
81
+ | `onPress` | `() => void` | Click handler (required) |
82
+ | `container` | `ReactNode` | Optional custom container |
83
+
84
+ ---
85
+
86
+ ## Compose — Screen-level Configuration
87
+
88
+ Use `LazyColumn` + `rememberLazyListState()` as the preferred scrollable — triggers header collapse via `ScrollData(scrollState = lazyListState)`.
89
+
90
+ ```kotlin
91
+ import vn.momo.kits.navigation.LocalNavigation
92
+ import vn.momo.kits.navigation.LocalNavigator
93
+ import vn.momo.kits.navigation.ScrollData
94
+ import androidx.compose.foundation.lazy.LazyColumn
95
+ import androidx.compose.foundation.lazy.rememberLazyListState
96
+
97
+ @Composable
98
+ fun MyScreen() {
99
+ val navigation = LocalNavigation.current
100
+ val navigator = LocalNavigator.current
101
+ val lazyListState = rememberLazyListState()
102
+
103
+ LaunchedEffect(Unit) {
104
+ navigation.setOptions(
105
+ headerTitle = HeaderTitle.Default("Screen Title"),
106
+ headerType = HeaderType.Default(),
107
+ headerRight = HeaderRight.Toolkit(),
108
+ hiddenBack = false,
109
+ scrollData = ScrollData(scrollState = lazyListState),
110
+ footerComponent = { FooterContent() },
111
+ floatingButtonProps = FloatingButtonProps(icon = "ic_plus", label = "Add", onClick = { }),
112
+ )
113
+ }
114
+
115
+ LazyColumn(state = lazyListState) {
116
+ // content
117
+ }
118
+ }
119
+ ```
120
+
121
+ ### setOptions params
122
+
123
+ ```kotlin
124
+ navigation.setOptions(
125
+ headerTitle: HeaderTitle,
126
+ headerType: HeaderType,
127
+ headerRight: HeaderRight,
128
+ hiddenBack: Boolean,
129
+ scrollData: ScrollData,
130
+ backgroundColor: Color?,
131
+ tintColor: Color?,
132
+ footerComponent: @Composable () -> Unit,
133
+ floatingButtonProps: FloatingButtonProps?,
134
+ onBackHandler: (() -> Unit)?,
135
+ )
136
+ ```
137
+
138
+ ### HeaderType Options
139
+
140
+ - `HeaderType.Default()` — standard header with title + back button
141
+ - `HeaderType.Extended()` — larger header (supports `inputSearchProps` for animated search)
142
+ - `HeaderType.Animated()` — collapses on scroll
143
+ - `HeaderType.None` — no header
144
+
145
+ ### ScrollData
146
+
147
+ ```kotlin
148
+ ScrollData(scrollable = true)
149
+ ScrollData(scrollState = lazyListState) // triggers header collapse
150
+ ```
151
+
152
+ Use `LazyColumn` + `rememberLazyListState()` as preferred scrollable.
@@ -0,0 +1,125 @@
1
+ # Screen Layout Rules
2
+
3
+ How `Screen` manages spacing, grid, and content layout in React Native and Compose.
4
+
5
+ ---
6
+
7
+ ## useGridLayout (React Native)
8
+
9
+ `Screen` has a `useGridLayout` prop (default: `true`) that controls whether the screen automatically applies grid-based spacing to its body and children.
10
+
11
+ | `useGridLayout` | Behavior |
12
+ |-----------------|----------|
13
+ | `true` (default) | Screen **automatically constrains** spacing — body padding, Section/Card margins, Item gutters are all managed by the grid system. You do **not** add manual padding/margin to Section, Card, or Item. |
14
+ | `false` | Screen does **not** apply automatic spacing. Each element (Section, Card, Item, View) must define its own padding, margin, and gap explicitly. Use this when you need full manual control over layout. |
15
+
16
+ ### When to use `useGridLayout={true}` (default)
17
+
18
+ - Standard screens with Section/Card/Item layout
19
+ - Design spec screens — the grid system matches design tokens automatically
20
+ - Most screens in the app — this is the recommended default
21
+
22
+ ### When to use `useGridLayout={false}`
23
+
24
+ - Custom layouts that don't follow the Section/Card/Item pattern
25
+ - Full-bleed content (edge-to-edge images, maps, video players)
26
+ - Screens where you need pixel-perfect manual control over every spacing value
27
+ - Embedding third-party components that manage their own layout
28
+
29
+ ```tsx
30
+ // Default: grid layout ON — spacing is automatic
31
+ <Screen navigation={navigation} scrollable>
32
+ <Section>
33
+ <Item>{/* auto-spaced by grid */}</Item>
34
+ </Section>
35
+ <Card>
36
+ <Item>{/* auto-spaced by grid */}</Item>
37
+ </Card>
38
+ </Screen>
39
+
40
+ // Grid layout OFF — you control all spacing
41
+ <Screen navigation={navigation} scrollable useGridLayout={false}>
42
+ <View style={{ padding: Spacing.L }}>
43
+ {/* manual spacing everywhere */}
44
+ </View>
45
+ </Screen>
46
+ ```
47
+
48
+ ---
49
+
50
+ ## Screen Layout Hierarchy (React Native)
51
+
52
+ `Section` and `Card` are **siblings** (same level) under `Screen` — never nest one inside the other.
53
+
54
+ ```
55
+ Screen
56
+ ├── Section > Item (margin container — no background/elevation)
57
+ ├── Card > Item (elevated container with background + optional shadow)
58
+ ```
59
+
60
+ ```tsx
61
+ import { Screen, Section, Card, Item } from '@momo-kits/foundation';
62
+
63
+ <Screen navigation={navigation} scrollable headerType="default">
64
+ <Section>
65
+ <Item widthSpan={12}>{/* full width */}</Item>
66
+ <Item widthSpan={6}>{/* half width */}</Item>
67
+ </Section>
68
+ <Card>
69
+ <Item widthSpan={12}>{/* elevated content */}</Item>
70
+ </Card>
71
+ </Screen>
72
+ ```
73
+
74
+ - **Screen**: Outermost container (header, scroll, keyboard, safe areas). See `navigation/stack.md` for full props.
75
+ - **Section**: Margin container (12px margin, gutter 12px) — contains `Item` directly
76
+ - **Card**: Elevated container (background + optional shadow, gutter 8px) — contains `Item` directly
77
+ - **Item**: Grid item, `widthSpan` 1-12 (12 = full width)
78
+ - **Section and Card are siblings** — both are direct children of Screen, never nested
79
+
80
+ ---
81
+
82
+ ## Section Props
83
+
84
+ | Prop | Type | Default | Description |
85
+ |------|------|---------|-------------|
86
+ | `expanded` | `boolean` | `false` | Display in expanded state |
87
+ | `useMargin` | `boolean` | `true` | Apply 12px horizontal margin |
88
+ | `backgroundImage` | `string` | — | Background image source |
89
+
90
+ Grid context: `numberOfColumns` (12), `gutterSize` (12px), `sizePerSpan`, `getSizeSpan(span)`.
91
+
92
+ ---
93
+
94
+ ## Card Props
95
+
96
+ | Prop | Type | Default | Description |
97
+ |------|------|---------|-------------|
98
+ | `useShadow` | `boolean` | `false` | Show card shadow |
99
+ | `backgroundImage` | `string` | — | Background image source |
100
+
101
+ Grid context: `numberOfColumns` (12), `gutterSize` (8px), `sizePerSpan`, `getSizeSpan(span)`.
102
+
103
+ ---
104
+
105
+ ## Item Props
106
+
107
+ ```tsx
108
+ <Item widthSpan={6} heightSpan={2} style={viewStyle} />
109
+ ```
110
+
111
+ `widthSpan` and `heightSpan` accept values 1-12.
112
+
113
+ ---
114
+
115
+ ## Automatic Spacing Summary
116
+
117
+ When `useGridLayout={true}` (default), the Screen applies:
118
+
119
+ | Container | Horizontal margin | Gutter (gap between Items) | Background |
120
+ |-----------|-------------------|---------------------------|------------|
121
+ | **Section** | 12px (when `useMargin={true}`) | 12px | None (transparent) |
122
+ | **Card** | 12px | 8px | Surface color + optional shadow |
123
+ | **Item** | Auto (from grid) | Auto (from grid) | None |
124
+
125
+ The body itself gets automatic vertical spacing between Section/Card blocks. You do **not** need to add `marginTop`/`marginBottom` between siblings — the grid handles it.
@@ -0,0 +1,183 @@
1
+ # Colors Reference
2
+
3
+ Both platforms share identical color token names and values.
4
+
5
+ ## Import
6
+
7
+ | Platform | Import |
8
+ |----------|--------|
9
+ | React Native | `import { Colors } from '@momo-kits/foundation'` |
10
+ | Compose | `import vn.momo.kits.const.Colors` |
11
+
12
+ Usage is identical: `Colors.pink_03`, `Colors.black_17`, etc.
13
+
14
+ ---
15
+
16
+ ## Grayscale (black_01 – black_20)
17
+
18
+ | Token | Hex | Notes |
19
+ |-------|-----|-------|
20
+ | `black_01` | #FFFFFF | White |
21
+ | `black_02` | #F9F9F9 | |
22
+ | `black_03` | #F0F0F0 | Border disable |
23
+ | `black_04` | #E8E8E8 | Border default |
24
+ | `black_05` | #E5E5E5 | |
25
+ | `black_06` | #D8D8D8 | |
26
+ | `black_07` | #CCCCCC | |
27
+ | `black_08` | #C6C6C6 | Text disable |
28
+ | `black_09` | #B9B9B9 | |
29
+ | `black_10` | #A0A0A0 | |
30
+ | `black_11` | #878787 | |
31
+ | `black_12` | #727272 | Text hint |
32
+ | `black_13` | #646464 | |
33
+ | `black_14` | #565656 | |
34
+ | `black_15` | #484848 | Text secondary |
35
+ | `black_16` | #404040 | |
36
+ | `black_17` | #303233 | Text default |
37
+ | `black_18` | #242424 | |
38
+ | `black_19` | #18191A | |
39
+ | `black_20` | #000000 | Black |
40
+
41
+ ---
42
+
43
+ ## Brand Color Families
44
+
45
+ Each family has 11 tint levels: **01** (darkest) → **11** (lightest). Levels 07–11 are suitable for backgrounds and containers.
46
+
47
+ ### pink — Brand / primary
48
+
49
+ | Token | Hex | Token | Hex |
50
+ |-------|-----|-------|-----|
51
+ | `pink_01` | #BC2678 | `pink_07` | #F7ACD5 |
52
+ | `pink_02` | #D42A87 | `pink_08` | #FBD5EA |
53
+ | `pink_03` | #EB2F96 | `pink_09` | #FDEAF4 |
54
+ | `pink_04` | #ED43A0 | `pink_10` | #FEF4FA |
55
+ | `pink_05` | #EF59AB | `pink_11` | #FEF8FC |
56
+ | `pink_06` | #F382C0 | | |
57
+
58
+ Special: `pink_MoMo_Branding` = #A50064
59
+
60
+ ### violet — Accents, special features
61
+
62
+ | Token | Hex | Token | Hex |
63
+ |-------|-----|-------|-----|
64
+ | `violet_01` | #7822C0 | `violet_07` | #D5AAF9 |
65
+ | `violet_02` | #8726D8 | `violet_08` | #EAD4FC |
66
+ | `violet_03` | #962AF0 | `violet_09` | #F4E9FD |
67
+ | `violet_04` | #A03FF1 | `violet_10` | #FAF4FE |
68
+ | `violet_05` | #AB55F3 | `violet_11` | #FCF8FE |
69
+ | `violet_06` | #C07FF6 | `violet_11_stroke` | #DFE1E5 |
70
+
71
+ ### indigo — Accents
72
+
73
+ | Token | Hex | Token | Hex |
74
+ |-------|-----|-------|-----|
75
+ | `indigo_01` | #3E3CCC | `indigo_07` | #B8B7FF |
76
+ | `indigo_02` | #4644E6 | `indigo_08` | #DCDBFF |
77
+ | `indigo_03` | #4E4BFF | `indigo_09` | #EDEDFF |
78
+ | `indigo_04` | #5F5DFF | `indigo_10` | #F6F6FF |
79
+ | `indigo_05` | #716FFF | `indigo_11` | #F9F9FF |
80
+ | `indigo_06` | #9593FF | | |
81
+
82
+ ### blue — Interactive
83
+
84
+ | Token | Hex | Token | Hex |
85
+ |-------|-----|-------|-----|
86
+ | `blue_01` | #0062CC | `blue_07` | #99CAFF |
87
+ | `blue_02` | #006EE6 | `blue_08` | #CCE4FF |
88
+ | `blue_03` | #007AFF | `blue_09` | #E5F1FF |
89
+ | `blue_04` | #1987FF | `blue_10` | #F2F8FF |
90
+ | `blue_05` | #3395FF | `blue_11` | #F7FBFF |
91
+ | `blue_06` | #66AFFF | | |
92
+
93
+ ### mint — Highlight
94
+
95
+ | Token | Hex | Token | Hex |
96
+ |-------|-----|-------|-----|
97
+ | `mint_01` | #0F9B9B | `mint_07` | #A1E7E7 |
98
+ | `mint_02` | #11AFAF | `mint_08` | #D0F3F3 |
99
+ | `mint_03` | #13C2C2 | `mint_09` | #E7F8F8 |
100
+ | `mint_04` | #2AC8C8 | `mint_10` | #F3FCFC |
101
+ | `mint_05` | #42CECE | `mint_11` | #F8FDFD |
102
+ | `mint_06` | #71DADA | | |
103
+
104
+ ### green — Success
105
+
106
+ | Token | Hex | Token | Hex |
107
+ |-------|-----|-------|-----|
108
+ | `green_01` | #2A9F47 | `green_07` | #AEE9BD |
109
+ | `green_02` | #2FB350 | `green_08` | #D6F4DE |
110
+ | `green_03` | #34C759 | `green_09` | #EAF9EE |
111
+ | `green_04` | #48CC69 | `green_10` | #F5FCF6 |
112
+ | `green_05` | #5DD27A | `green_11` | #F9FDFA |
113
+ | `green_06` | #85DD9B | | |
114
+
115
+ ### lime — Accents
116
+
117
+ | Token | Hex | Token | Hex |
118
+ |-------|-----|-------|-----|
119
+ | `lime_01` | #80AE0E | `lime_07` | #D9F0A0 |
120
+ | `lime_02` | #90C30F | `lime_08` | #ECF7CF |
121
+ | `lime_03` | #A0D911 | `lime_09` | #F5FBE7 |
122
+ | `lime_04` | #A9DC28 | `lime_10` | #FAFDF3 |
123
+ | `lime_05` | #B3E141 | `lime_11` | #FCFEF8 |
124
+ | `lime_06` | #C6E870 | | |
125
+
126
+ ### yellow — Accents
127
+
128
+ | Token | Hex | Token | Hex |
129
+ |-------|-----|-------|-----|
130
+ | `yellow_01` | #CCA300 | `yellow_07` | #FFEB99 |
131
+ | `yellow_02` | #E6B800 | `yellow_08` | #FFF5CC |
132
+ | `yellow_03` | #FFCC00 | `yellow_09` | #FFF9E5 |
133
+ | `yellow_04` | #FFD119 | `yellow_10` | #FFFCF2 |
134
+ | `yellow_05` | #FFD633 | `yellow_11` | #FFFDF7 |
135
+ | `yellow_06` | #FFE066 | | |
136
+
137
+ ### gold — Gold accents
138
+
139
+ | Token | Hex | Token | Hex |
140
+ |-------|-----|-------|-----|
141
+ | `gold_01` | #C87012 | `gold_07` | #FDD1A2 |
142
+ | `gold_02` | #E17E14 | `gold_08` | #FEE8D0 |
143
+ | `gold_03` | #FA8C16 | `gold_09` | #FEF3E7 |
144
+ | `gold_04` | #FA972D | `gold_10` | #FFF9F3 |
145
+ | `gold_05` | #FBA345 | `gold_11` | #FEFBF8 |
146
+ | `gold_06` | #FCBA73 | | |
147
+
148
+ ### orange — Warning
149
+
150
+ | Token | Hex | Token | Hex |
151
+ |-------|-----|-------|-----|
152
+ | `orange_01` | #C84316 | `orange_07` | #FDBBA4 |
153
+ | `orange_02` | #E14C19 | `orange_08` | #FEDDD2 |
154
+ | `orange_03` | #FA541C | `orange_09` | #FEEDE8 |
155
+ | `orange_04` | #FA6532 | `orange_10` | #FFF6F3 |
156
+ | `orange_05` | #FB7649 | `orange_11` | #FEFAF8 |
157
+ | `orange_06` | #FC9877 | | |
158
+
159
+ ### red — Error / danger
160
+
161
+ | Token | Hex | Token | Hex |
162
+ |-------|-----|-------|-----|
163
+ | `red_01` | #C41B24 | `red_07` | #FBA7AB |
164
+ | `red_02` | #DD1F29 | `red_08` | #FDD3D5 |
165
+ | `red_03` | #F5222D | `red_09` | #FEE8EA |
166
+ | `red_04` | #F63842 | `red_10` | #FEF4F4 |
167
+ | `red_05` | #F74E57 | `red_11` | #FEF8F8 |
168
+ | `red_06` | #F97A81 | | |
169
+
170
+ ### Quick Usage
171
+
172
+ - Brand: `Colors.pink_03`
173
+ - Interactive links/buttons: `Colors.blue_03`
174
+ - Error/danger: `Colors.red_03`
175
+ - Success: `Colors.green_03`
176
+ - Warning: `Colors.orange_03`
177
+ - Highlight: `Colors.mint_03`
178
+
179
+ ---
180
+
181
+ ## Rule
182
+
183
+ **Never hardcode hex values.** Always use `Colors.*` tokens for consistency across themes and platforms.
@@ -0,0 +1,45 @@
1
+ # Spacing & Radius Reference
2
+
3
+ ## Spacing
4
+
5
+ | Token | Value | RN Type | Compose Type |
6
+ |-------|-------|---------|-------------|
7
+ | `Spacing.XXS` | 2 | number | Dp |
8
+ | `Spacing.XS` | 4 | number | Dp |
9
+ | `Spacing.S` | 8 | number | Dp |
10
+ | `Spacing.M` | 12 | number | Dp |
11
+ | `Spacing.L` | 16 | number | Dp |
12
+ | `Spacing.XL` | 24 | number | Dp |
13
+ | `Spacing.XXL` | 32 | number | Dp |
14
+ | `Spacing.Size3XL` | 48 | number | Dp |
15
+ | `Spacing.Size4XL` | 56 | number | Dp |
16
+ | `Spacing.Size5XL` | 64 | number | Dp |
17
+
18
+ ### Import
19
+
20
+ | Platform | Import |
21
+ |----------|--------|
22
+ | React Native | `import { Spacing } from '@momo-kits/foundation'` |
23
+ | Compose | `import vn.momo.kits.const.Spacing` |
24
+
25
+ > **Note:** Compose `Spacing.L`, `Spacing.M`, `Spacing.S` are already `Dp` values — do NOT call `.dp` on them.
26
+
27
+ ---
28
+
29
+ ## Radius
30
+
31
+ | Token | Value | Use for |
32
+ |-------|-------|---------|
33
+ | `Radius.XXS` | 2 | Subtle rounding |
34
+ | `Radius.XS` | 4 | Small elements |
35
+ | `Radius.S` | 8 | Cards, inputs |
36
+ | `Radius.M` | 12 | Medium containers |
37
+ | `Radius.L` | 16 | Modals, sheets |
38
+ | `Radius.XL` | 24 | Pills, chips |
39
+
40
+ ### Import
41
+
42
+ | Platform | Import |
43
+ |----------|--------|
44
+ | React Native | `import { Radius } from '@momo-kits/foundation'` |
45
+ | Compose | `import vn.momo.kits.const.Radius` |
@@ -0,0 +1,97 @@
1
+ # Theme Reference
2
+
3
+ The theme system provides semantic color mappings for light/dark mode support.
4
+
5
+ ## Accessing Theme
6
+
7
+ | Platform | Access |
8
+ |----------|--------|
9
+ | React Native | `const { theme } = useContext(ApplicationContext)` |
10
+ | Compose | `val theme = AppTheme.current` |
11
+
12
+ Both expose an identical structure:
13
+
14
+ ```
15
+ theme.colors.primary → Color (pink_03 light / pink_04 dark)
16
+ theme.colors.secondary → Color
17
+ theme.colors.gradient → Color
18
+ theme.colors.background.default / .surface / .tonal / .pressed / .selected / .disable
19
+ theme.colors.text.default / .secondary / .hint / .disable
20
+ theme.colors.border.default / .disable
21
+ theme.colors.success.primary / .secondary / .container
22
+ theme.colors.warning.primary / .secondary / .container
23
+ theme.colors.error.primary / .secondary / .container
24
+ theme.colors.highlight.primary / .secondary / .container
25
+ theme.colors.interactive.primary / .secondary / .container
26
+ ```
27
+
28
+ ---
29
+
30
+ ## Light Theme (defaultTheme)
31
+
32
+ | Path | Value |
33
+ |------|-------|
34
+ | `primary` | `pink_03` (#EB2F96) |
35
+ | `secondary` | `pink_07` |
36
+ | `gradient` | #FDCADE |
37
+ | `background.default` | #F2F2F6 |
38
+ | `background.surface` | `black_01` (white) |
39
+ | `background.tonal` | `pink_09` |
40
+ | `background.pressed` | #DFDFE6 |
41
+ | `background.selected` | `pink_10` |
42
+ | `background.disable` | #EBEBF2 |
43
+ | `text.default` | `black_17` (#303233) |
44
+ | `text.secondary` | `black_15` (#484848) |
45
+ | `text.hint` | `black_12` (#727272) |
46
+ | `text.disable` | `black_08` (#C6C6C6) |
47
+ | `border.default` | `black_04` (#E8E8E8) |
48
+ | `border.disable` | `black_02` (#F9F9F9) |
49
+ | `success` | `green_03` / `green_07` / `green_08` |
50
+ | `warning` | `orange_03` / `orange_07` / `orange_08` |
51
+ | `error` | `red_03` / `red_07` / `red_08` |
52
+ | `highlight` | `mint_03` / `mint_07` / `mint_08` |
53
+ | `interactive` | `blue_03` / `blue_07` / `blue_08` |
54
+
55
+ ---
56
+
57
+ ## Dark Theme (darkTheme)
58
+
59
+ | Path | Value |
60
+ |------|-------|
61
+ | `primary` | `pink_04` |
62
+ | `secondary` | `pink_08` |
63
+ | `gradient` | #FDCADE |
64
+ | `background.default` | #121212 |
65
+ | `background.surface` | #1E1E1E |
66
+ | `background.tonal` | `pink_10` |
67
+ | `background.pressed` | #1A1A1A |
68
+ | `background.selected` | `pink_11` |
69
+ | `background.disable` | #303030 |
70
+ | `text.default` | White |
71
+ | `text.secondary` | #B0B0B0 |
72
+ | `text.hint` | #727272 |
73
+ | `text.disable` | #505050 |
74
+ | `border.default` | #2A2A2A |
75
+ | `border.disable` | #242424 |
76
+
77
+ Success, warning, error, highlight, and interactive colors are the same in both themes.
78
+
79
+ ---
80
+
81
+ ## Compose Theme Data Structures
82
+
83
+ ```kotlin
84
+ data class Theme(dark: Boolean, colors: ColorScheme, font: String, assets: ThemeAssets)
85
+ data class ColorScheme(primary, secondary, gradient: Color, background: Background, text: TextColors, border: BorderColors, success/warning/error/highlight/interactive: ColorSet)
86
+ data class Background(default, surface, tonal, pressed, selected, disable: Color)
87
+ data class TextColors(default, secondary, hint, disable: Color)
88
+ data class BorderColors(default, disable: Color)
89
+ data class ColorSet(primary, secondary, container: Color)
90
+ data class ThemeAssets(headerBackground: String?)
91
+ ```
92
+
93
+ ---
94
+
95
+ ## Best Practice
96
+
97
+ Always prefer `theme.colors.*` over direct `Colors.*` tokens so the UI automatically adapts to light/dark mode.