@momo-kits/native-kits 0.157.1-skill.3-debug → 0.157.1-skill.6-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.
- package/.claude/skills/momo-native-kits-skills/README.md +52 -0
- package/.claude/skills/momo-native-kits-skills/SKILL.md +32 -0
- package/.claude/skills/momo-native-kits-skills/data-display/SKILL.md +42 -0
- package/.claude/skills/momo-native-kits-skills/feedback/SKILL.md +43 -0
- package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/feedback}/references/popup.md +3 -10
- package/.claude/skills/momo-native-kits-skills/form-controls/SKILL.md +42 -0
- package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/form-controls}/references/button.md +2 -3
- package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/form-controls}/references/input.md +3 -7
- package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/form-controls}/references/radio.md +9 -9
- package/.claude/skills/momo-native-kits-skills/layout/SKILL.md +39 -0
- package/.claude/skills/momo-native-kits-skills/navigation/SKILL.md +38 -0
- package/.claude/skills/momo-native-kits-skills/output/test-report.json +12 -0
- package/.claude/skills/momo-native-kits-skills/output/validation-result.json +108 -0
- package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills}/references/constants.md +81 -6
- package/.claude/skills/momo-native-kits-skills/references/design-guidelines.md +130 -0
- package/.claude/skills/momo-native-kits-skills/references/developer/android-compose.md +29 -0
- package/.claude/skills/momo-native-kits-skills/references/developer/code-convention.md +118 -0
- package/.claude/skills/momo-native-kits-skills/references/developer/compose-multiplatform.md +29 -0
- package/.claude/skills/momo-native-kits-skills/scripts/logger.js +63 -0
- package/.claude/skills/momo-native-kits-skills/scripts/rules/badge.js +32 -0
- package/.claude/skills/momo-native-kits-skills/scripts/rules/bottomtab.js +19 -0
- package/.claude/skills/momo-native-kits-skills/scripts/rules/button.js +32 -0
- package/.claude/skills/momo-native-kits-skills/scripts/rules/card.js +32 -0
- package/.claude/skills/momo-native-kits-skills/scripts/rules/checkbox.js +32 -0
- package/.claude/skills/momo-native-kits-skills/scripts/rules/chip.js +59 -0
- package/.claude/skills/momo-native-kits-skills/scripts/rules/divider.js +19 -0
- package/.claude/skills/momo-native-kits-skills/scripts/rules/global.js +61 -0
- package/.claude/skills/momo-native-kits-skills/scripts/rules/index.js +54 -0
- package/.claude/skills/momo-native-kits-skills/scripts/rules/input.js +32 -0
- package/.claude/skills/momo-native-kits-skills/scripts/rules/navigation.js +48 -0
- package/.claude/skills/momo-native-kits-skills/scripts/rules/popup.js +45 -0
- package/.claude/skills/momo-native-kits-skills/scripts/rules/radio.js +105 -0
- package/.claude/skills/momo-native-kits-skills/scripts/rules/skeleton.js +20 -0
- package/.claude/skills/momo-native-kits-skills/scripts/rules/snackbar.js +32 -0
- package/.claude/skills/momo-native-kits-skills/scripts/rules/state.js +21 -0
- package/.claude/skills/momo-native-kits-skills/scripts/rules/switch.js +45 -0
- package/.claude/skills/momo-native-kits-skills/scripts/rules/text.js +19 -0
- package/.claude/skills/momo-native-kits-skills/scripts/rules/tooltip.js +45 -0
- package/.claude/skills/momo-native-kits-skills/scripts/rules/trustbanner.js +22 -0
- package/.claude/skills/momo-native-kits-skills/scripts/test-on-device.sh +117 -0
- package/.claude/skills/momo-native-kits-skills/scripts/test-runner.js +167 -0
- package/.claude/skills/momo-native-kits-skills/scripts/validate-kits.js +131 -0
- package/.momo-agent.json +13 -0
- package/compose/build.gradle.kts +1 -1
- package/gradle.properties +1 -1
- package/package.json +1 -1
- package/.claude/momo-native-kits-skill/SKILL.md +0 -51
- package/.claude/momo-native-kits-skill/evals/evals.json +0 -95
- package/.claude/momo-native-kits-skill/workspace/iteration-1/benchmark.json +0 -20
- package/.claude/momo-native-kits-skill/workspace/iteration-1/benchmark.md +0 -13
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-0-button/eval_metadata.json +0 -6
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-0-button/with_skill/outputs/ButtonExample.kt +0 -55
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-0-button/without_skill/outputs/ButtonExample.kt +0 -45
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-1-input/eval_metadata.json +0 -6
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-1-input/with_skill/outputs/InputPhoneExample.kt +0 -40
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-1-input/without_skill/outputs/InputPhoneExample.kt +0 -42
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-2-bottomtab/eval_metadata.json +0 -6
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-2-bottomtab/with_skill/outputs/BottomTabExample.kt +0 -236
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-2-bottomtab/without_skill/outputs/BottomTabExample.kt +0 -152
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-3-checkbox/eval_metadata.json +0 -6
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-3-checkbox/with_skill/outputs/CheckBoxExample.kt +0 -49
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-3-checkbox/without_skill/outputs/CheckBoxExample.kt +0 -123
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-4-datetimepicker/eval_metadata.json +0 -6
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-4-datetimepicker/with_skill/outputs/DateTimePickerExample.kt +0 -318
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-4-datetimepicker/without_skill/outputs/DateTimePickerExample.kt +0 -330
- package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-card/with_skill/outputs/CardExample.kt +0 -124
- package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-card/without_skill/outputs/CardExample.kt +0 -71
- package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-loginform/with_skill/outputs/LoginFormExample.kt +0 -134
- package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-loginform/without_skill/outputs/LoginFormExample.kt +0 -199
- package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-navcontainer/with_skill/outputs/NavigationContainerExample.kt +0 -224
- package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-navcontainer/without_skill/outputs/NavigationContainerExample.kt +0 -225
- package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-popup/with_skill/outputs/PopupExample.kt +0 -79
- package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-popup/without_skill/outputs/PopupExample.kt +0 -169
- package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-setoptions/eval_metadata.json +0 -6
- package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-setoptions/with_skill/outputs/SetOptionsExample.kt +0 -255
- package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-setoptions/without_skill/outputs/SetOptionsExample.kt +0 -212
- package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-skeleton/with_skill/outputs/SkeletonExample.kt +0 -199
- package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-skeleton/without_skill/outputs/SkeletonExample.kt +0 -229
- package/.claude/momo-native-kits-skill/workspace/iteration-3/benchmark.json +0 -20
- package/.claude/momo-native-kits-skill/workspace/iteration-3/benchmark.md +0 -13
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-button/eval_metadata.json +0 -22
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-button/with_skill/outputs/PrimaryButtonExample.kt +0 -38
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-button/with_skill/timing.json +0 -5
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-button/without_skill/outputs/PrimaryButtonExample.kt +0 -83
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-button/without_skill/timing.json +0 -5
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-navcontainer/eval_metadata.json +0 -22
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-navcontainer/with_skill/outputs/NavigationContainerExample.kt +0 -547
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-navcontainer/with_skill/timing.json +0 -5
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-navcontainer/without_skill/outputs/MoMoNavigationContainer.kt +0 -519
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-navcontainer/without_skill/timing.json +0 -5
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-setoptions/eval_metadata.json +0 -27
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-setoptions/with_skill/outputs/SetOptionsExample.kt +0 -429
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-setoptions/with_skill/timing.json +0 -5
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-setoptions/without_skill/outputs/SetOptionsExample.kt +0 -353
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-setoptions/without_skill/timing.json +0 -5
- package/.claude/settings.local.json +0 -41
- package/local.properties +0 -8
- /package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/data-display}/references/badge.md +0 -0
- /package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/data-display}/references/chip.md +0 -0
- /package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/data-display}/references/skeleton.md +0 -0
- /package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/data-display}/references/text.md +0 -0
- /package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/feedback}/references/snackbar.md +0 -0
- /package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/feedback}/references/tooltip.md +0 -0
- /package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/feedback}/references/trustbanner.md +0 -0
- /package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/form-controls}/references/checkbox.md +0 -0
- /package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/form-controls}/references/switch.md +0 -0
- /package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/layout}/references/card.md +0 -0
- /package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/layout}/references/divider.md +0 -0
- /package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/navigation}/references/navigation.md +0 -0
|
@@ -1,429 +0,0 @@
|
|
|
1
|
-
package vn.momo.kits.navigation.examples
|
|
2
|
-
|
|
3
|
-
import androidx.compose.foundation.layout.Arrangement
|
|
4
|
-
import androidx.compose.foundation.layout.Box
|
|
5
|
-
import androidx.compose.foundation.layout.Column
|
|
6
|
-
import androidx.compose.foundation.layout.Spacer
|
|
7
|
-
import androidx.compose.foundation.layout.fillMaxSize
|
|
8
|
-
import androidx.compose.foundation.layout.fillMaxWidth
|
|
9
|
-
import androidx.compose.foundation.layout.height
|
|
10
|
-
import androidx.compose.foundation.layout.padding
|
|
11
|
-
import androidx.compose.foundation.rememberScrollState
|
|
12
|
-
import androidx.compose.foundation.verticalScroll
|
|
13
|
-
import androidx.compose.material3.MaterialTheme
|
|
14
|
-
import androidx.compose.material3.Text
|
|
15
|
-
import androidx.compose.runtime.Composable
|
|
16
|
-
import androidx.compose.runtime.LaunchedEffect
|
|
17
|
-
import androidx.compose.runtime.getValue
|
|
18
|
-
import androidx.compose.runtime.mutableStateOf
|
|
19
|
-
import androidx.compose.runtime.remember
|
|
20
|
-
import androidx.compose.runtime.setValue
|
|
21
|
-
import androidx.compose.ui.Modifier
|
|
22
|
-
import androidx.compose.ui.text.style.TextAlign
|
|
23
|
-
import androidx.compose.ui.unit.dp
|
|
24
|
-
import vn.momo.kits.components.Button
|
|
25
|
-
import vn.momo.kits.components.ButtonType
|
|
26
|
-
import vn.momo.kits.components.Input
|
|
27
|
-
import vn.momo.kits.components.Size
|
|
28
|
-
import vn.momo.kits.navigation.LocalNavigation
|
|
29
|
-
import vn.momo.kits.navigation.LocalNavigator
|
|
30
|
-
import vn.momo.kits.navigation.NavigationContainer
|
|
31
|
-
import vn.momo.kits.navigation.NavigationOptions
|
|
32
|
-
import vn.momo.kits.navigation.component.HeaderTitle
|
|
33
|
-
import vn.momo.kits.navigation.component.HeaderType
|
|
34
|
-
import vn.momo.kits.navigation.component.ScrollData
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* SetOptionsExample - Demonstrates how to use setOptions in MoMo Navigation
|
|
38
|
-
* to change header title dynamically.
|
|
39
|
-
*
|
|
40
|
-
* KEY CONCEPTS:
|
|
41
|
-
* - LocalNavigation.current provides access to setOptions for configuring screen header
|
|
42
|
-
* - Call setOptions inside LaunchedEffect(Unit) for initial screen configuration
|
|
43
|
-
* - Call setOptions from any user action handler to update header dynamically
|
|
44
|
-
* - HeaderTitle.Default("Your Title") is used to set the header text
|
|
45
|
-
*
|
|
46
|
-
* USAGE:
|
|
47
|
-
* 1. Access navigation: val navigation = LocalNavigation.current
|
|
48
|
-
* 2. Set initial options in LaunchedEffect(Unit) when screen loads
|
|
49
|
-
* 3. Update dynamically: navigation.setOptions(headerTitle = HeaderTitle.Default("New Title"))
|
|
50
|
-
*
|
|
51
|
-
* This example shows practical use cases for dynamic header title changes in a real app scenario.
|
|
52
|
-
*/
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Main entry point showing the NavigationContainer with the SetOptionsDemoScreen
|
|
56
|
-
*/
|
|
57
|
-
@Composable
|
|
58
|
-
fun SetOptionsNavigationExample() {
|
|
59
|
-
NavigationContainer(
|
|
60
|
-
initialScreen = {
|
|
61
|
-
SetOptionsDemoScreen()
|
|
62
|
-
},
|
|
63
|
-
options = NavigationOptions(
|
|
64
|
-
headerTitle = HeaderTitle.Default("MoMo Navigation"),
|
|
65
|
-
headerType = HeaderType.Default
|
|
66
|
-
)
|
|
67
|
-
)
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Demo screen that showcases various setOptions use cases for dynamic header title changes
|
|
72
|
-
*/
|
|
73
|
-
@Composable
|
|
74
|
-
fun SetOptionsDemoScreen() {
|
|
75
|
-
val navigation = LocalNavigation.current
|
|
76
|
-
val navigator = LocalNavigator.current
|
|
77
|
-
|
|
78
|
-
// State for dynamic title input
|
|
79
|
-
var titleInput by remember { mutableStateOf("") }
|
|
80
|
-
|
|
81
|
-
// State to track current title (for demonstration)
|
|
82
|
-
var currentTitle by remember { mutableStateOf("SetOptions Demo") }
|
|
83
|
-
|
|
84
|
-
// Set initial options when screen loads
|
|
85
|
-
LaunchedEffect(Unit) {
|
|
86
|
-
navigation.setOptions(
|
|
87
|
-
headerTitle = HeaderTitle.Default(currentTitle),
|
|
88
|
-
headerType = HeaderType.Default
|
|
89
|
-
)
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
Column(
|
|
93
|
-
modifier = Modifier
|
|
94
|
-
.fillMaxSize()
|
|
95
|
-
.padding(16.dp)
|
|
96
|
-
.verticalScroll(rememberScrollState()),
|
|
97
|
-
verticalArrangement = Arrangement.spacedBy(16.dp)
|
|
98
|
-
) {
|
|
99
|
-
// Header
|
|
100
|
-
Text(
|
|
101
|
-
text = "How to Use setOptions",
|
|
102
|
-
style = MaterialTheme.typography.headlineSmall,
|
|
103
|
-
modifier = Modifier.fillMaxWidth(),
|
|
104
|
-
textAlign = TextAlign.Center
|
|
105
|
-
)
|
|
106
|
-
|
|
107
|
-
Text(
|
|
108
|
-
text = "Learn how to change header title dynamically using setOptions in MoMo Navigation",
|
|
109
|
-
style = MaterialTheme.typography.bodyMedium,
|
|
110
|
-
color = MaterialTheme.colorScheme.onSurfaceVariant
|
|
111
|
-
)
|
|
112
|
-
|
|
113
|
-
Spacer(modifier = Modifier.height(8.dp))
|
|
114
|
-
|
|
115
|
-
// ========================================
|
|
116
|
-
// Example 1: Dynamic Title from User Input
|
|
117
|
-
// ========================================
|
|
118
|
-
SectionHeader(title = "1. Change Title from Input")
|
|
119
|
-
|
|
120
|
-
Text(
|
|
121
|
-
text = "Enter a custom title and apply it to the header",
|
|
122
|
-
style = MaterialTheme.typography.bodySmall,
|
|
123
|
-
color = MaterialTheme.colorScheme.onSurfaceVariant
|
|
124
|
-
)
|
|
125
|
-
|
|
126
|
-
Input(
|
|
127
|
-
text = titleInput,
|
|
128
|
-
onChangeText = { titleInput = it },
|
|
129
|
-
placeholder = "Enter title here...",
|
|
130
|
-
modifier = Modifier.fillMaxWidth()
|
|
131
|
-
)
|
|
132
|
-
|
|
133
|
-
Button(
|
|
134
|
-
title = "Apply Title",
|
|
135
|
-
onClick = {
|
|
136
|
-
if (titleInput.isNotBlank()) {
|
|
137
|
-
currentTitle = titleInput
|
|
138
|
-
navigation.setOptions(
|
|
139
|
-
headerTitle = HeaderTitle.Default(titleInput)
|
|
140
|
-
)
|
|
141
|
-
titleInput = "" // Clear input after applying
|
|
142
|
-
}
|
|
143
|
-
},
|
|
144
|
-
type = ButtonType.PRIMARY,
|
|
145
|
-
size = Size.MEDIUM,
|
|
146
|
-
modifier = Modifier.fillMaxWidth()
|
|
147
|
-
)
|
|
148
|
-
|
|
149
|
-
Spacer(modifier = Modifier.height(8.dp))
|
|
150
|
-
|
|
151
|
-
// ========================================
|
|
152
|
-
// Example 2: Quick Title Presets
|
|
153
|
-
// ========================================
|
|
154
|
-
SectionHeader(title = "2. Quick Title Presets")
|
|
155
|
-
|
|
156
|
-
Text(
|
|
157
|
-
text = "Common titles used in MoMo app",
|
|
158
|
-
style = MaterialTheme.typography.bodySmall,
|
|
159
|
-
color = MaterialTheme.colorScheme.onSurfaceVariant
|
|
160
|
-
)
|
|
161
|
-
|
|
162
|
-
// Row of preset buttons
|
|
163
|
-
Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
|
|
164
|
-
RowPresetButtons(
|
|
165
|
-
presets = listOf("Home", "Profile", "Wallet"),
|
|
166
|
-
onPresetClick = { preset ->
|
|
167
|
-
currentTitle = preset
|
|
168
|
-
navigation.setOptions(
|
|
169
|
-
headerTitle = HeaderTitle.Default(preset)
|
|
170
|
-
)
|
|
171
|
-
}
|
|
172
|
-
)
|
|
173
|
-
|
|
174
|
-
RowPresetButtons(
|
|
175
|
-
presets = listOf("Settings", "Notifications", "History"),
|
|
176
|
-
onPresetClick = { preset ->
|
|
177
|
-
currentTitle = preset
|
|
178
|
-
navigation.setOptions(
|
|
179
|
-
headerTitle = HeaderTitle.Default(preset)
|
|
180
|
-
)
|
|
181
|
-
}
|
|
182
|
-
)
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
Spacer(modifier = Modifier.height(8.dp))
|
|
186
|
-
|
|
187
|
-
// ========================================
|
|
188
|
-
// Example 3: Context-Aware Title Changes
|
|
189
|
-
// ========================================
|
|
190
|
-
SectionHeader(title = "3. Context-Aware Titles")
|
|
191
|
-
|
|
192
|
-
Text(
|
|
193
|
-
text = "Real-world scenario: Title changes based on user selection",
|
|
194
|
-
style = MaterialTheme.typography.bodySmall,
|
|
195
|
-
color = MaterialTheme.colorScheme.onSurfaceVariant
|
|
196
|
-
)
|
|
197
|
-
|
|
198
|
-
// Simulate category selection
|
|
199
|
-
var selectedCategory by remember { mutableStateOf("All") }
|
|
200
|
-
val categories = listOf("All", "Electronics", "Fashion", "Food", "Travel")
|
|
201
|
-
|
|
202
|
-
Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
|
|
203
|
-
categories.forEach { category ->
|
|
204
|
-
CategoryButton(
|
|
205
|
-
title = category,
|
|
206
|
-
isSelected = selectedCategory == category,
|
|
207
|
-
onClick = {
|
|
208
|
-
selectedCategory = category
|
|
209
|
-
val displayTitle = if (category == "All") "Products" else "Products - $category"
|
|
210
|
-
navigation.setOptions(
|
|
211
|
-
headerTitle = HeaderTitle.Default(displayTitle)
|
|
212
|
-
)
|
|
213
|
-
}
|
|
214
|
-
)
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
Spacer(modifier = Modifier.height(8.dp))
|
|
219
|
-
|
|
220
|
-
// ========================================
|
|
221
|
-
// Example 4: Header Type Changes
|
|
222
|
-
// ========================================
|
|
223
|
-
SectionHeader(title = "4. Change Header Type")
|
|
224
|
-
|
|
225
|
-
Text(
|
|
226
|
-
text = "You can also change header type dynamically",
|
|
227
|
-
style = MaterialTheme.typography.bodySmall,
|
|
228
|
-
color = MaterialTheme.colorScheme.onSurfaceVariant
|
|
229
|
-
)
|
|
230
|
-
|
|
231
|
-
Button(
|
|
232
|
-
title = "Hide Header",
|
|
233
|
-
onClick = {
|
|
234
|
-
navigation.setOptions(
|
|
235
|
-
headerType = HeaderType.None
|
|
236
|
-
)
|
|
237
|
-
},
|
|
238
|
-
type = ButtonType.OUTLINE,
|
|
239
|
-
size = Size.MEDIUM,
|
|
240
|
-
modifier = Modifier.fillMaxWidth()
|
|
241
|
-
)
|
|
242
|
-
|
|
243
|
-
Button(
|
|
244
|
-
title = "Show Default Header",
|
|
245
|
-
onClick = {
|
|
246
|
-
navigation.setOptions(
|
|
247
|
-
headerType = HeaderType.Default,
|
|
248
|
-
headerTitle = HeaderTitle.Default(currentTitle)
|
|
249
|
-
)
|
|
250
|
-
},
|
|
251
|
-
type = ButtonType.OUTLINE,
|
|
252
|
-
size = Size.MEDIUM,
|
|
253
|
-
modifier = Modifier.fillMaxWidth()
|
|
254
|
-
)
|
|
255
|
-
|
|
256
|
-
Spacer(modifier = Modifier.height(8.dp))
|
|
257
|
-
|
|
258
|
-
// ========================================
|
|
259
|
-
// Example 5: Navigation with Options
|
|
260
|
-
// ========================================
|
|
261
|
-
SectionHeader(title = "5. Push Screen with Options")
|
|
262
|
-
|
|
263
|
-
Text(
|
|
264
|
-
text = "Pass options when navigating to a new screen",
|
|
265
|
-
style = MaterialTheme.typography.bodySmall,
|
|
266
|
-
color = MaterialTheme.colorScheme.onSurfaceVariant
|
|
267
|
-
)
|
|
268
|
-
|
|
269
|
-
Button(
|
|
270
|
-
title = "Go to Detail Screen",
|
|
271
|
-
onClick = {
|
|
272
|
-
navigator.push(
|
|
273
|
-
content = { DetailScreen() },
|
|
274
|
-
options = NavigationOptions(
|
|
275
|
-
headerTitle = HeaderTitle.Default("Product Details")
|
|
276
|
-
)
|
|
277
|
-
)
|
|
278
|
-
},
|
|
279
|
-
type = ButtonType.TONAL,
|
|
280
|
-
size = Size.MEDIUM,
|
|
281
|
-
modifier = Modifier.fillMaxWidth()
|
|
282
|
-
)
|
|
283
|
-
|
|
284
|
-
Spacer(modifier = Modifier.height(24.dp))
|
|
285
|
-
|
|
286
|
-
// ========================================
|
|
287
|
-
// Summary
|
|
288
|
-
// ========================================
|
|
289
|
-
Text(
|
|
290
|
-
text = "Summary",
|
|
291
|
-
style = MaterialTheme.typography.titleMedium
|
|
292
|
-
)
|
|
293
|
-
|
|
294
|
-
Text(
|
|
295
|
-
text = """
|
|
296
|
-
To change header title dynamically with setOptions:
|
|
297
|
-
|
|
298
|
-
1. Get navigation instance: val navigation = LocalNavigation.current
|
|
299
|
-
|
|
300
|
-
2. Call setOptions() with HeaderTitle.Default("Your Title")
|
|
301
|
-
|
|
302
|
-
3. Use LaunchedEffect(Unit) for initial setup:
|
|
303
|
-
LaunchedEffect(Unit) {
|
|
304
|
-
navigation.setOptions(
|
|
305
|
-
headerTitle = HeaderTitle.Default("Initial Title")
|
|
306
|
-
)
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
4. Call from any event handler for dynamic updates:
|
|
310
|
-
Button(onClick = {
|
|
311
|
-
navigation.setOptions(
|
|
312
|
-
headerTitle = HeaderTitle.Default("New Title")
|
|
313
|
-
)
|
|
314
|
-
})
|
|
315
|
-
""".trimIndent(),
|
|
316
|
-
style = MaterialTheme.typography.bodySmall,
|
|
317
|
-
color = MaterialTheme.colorScheme.onSurfaceVariant
|
|
318
|
-
)
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
/**
|
|
323
|
-
* Detail screen pushed from the main demo
|
|
324
|
-
* Shows that setOptions works on pushed screens too
|
|
325
|
-
*/
|
|
326
|
-
@Composable
|
|
327
|
-
fun DetailScreen() {
|
|
328
|
-
val navigation = LocalNavigation.current
|
|
329
|
-
|
|
330
|
-
// Set options when this screen loads
|
|
331
|
-
LaunchedEffect(Unit) {
|
|
332
|
-
navigation.setOptions(
|
|
333
|
-
headerTitle = HeaderTitle.Default("Product Details"),
|
|
334
|
-
scrollData = ScrollData(scrollState = rememberScrollState())
|
|
335
|
-
)
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
Column(
|
|
339
|
-
modifier = Modifier
|
|
340
|
-
.fillMaxSize()
|
|
341
|
-
.padding(16.dp)
|
|
342
|
-
.verticalScroll(rememberScrollState()),
|
|
343
|
-
verticalArrangement = Arrangement.spacedBy(16.dp)
|
|
344
|
-
) {
|
|
345
|
-
Text(
|
|
346
|
-
text = "Product Details",
|
|
347
|
-
style = MaterialTheme.typography.headlineMedium
|
|
348
|
-
)
|
|
349
|
-
|
|
350
|
-
Text(
|
|
351
|
-
text = "This is a detail screen pushed with NavigationOptions. " +
|
|
352
|
-
"The header title was set when pushing this screen.",
|
|
353
|
-
style = MaterialTheme.typography.bodyMedium
|
|
354
|
-
)
|
|
355
|
-
|
|
356
|
-
Text(
|
|
357
|
-
text = "You can also change the title dynamically from this screen:",
|
|
358
|
-
style = MaterialTheme.typography.bodyMedium
|
|
359
|
-
)
|
|
360
|
-
|
|
361
|
-
Button(
|
|
362
|
-
title = "Update to 'Item Details'",
|
|
363
|
-
onClick = {
|
|
364
|
-
navigation.setOptions(
|
|
365
|
-
headerTitle = HeaderTitle.Default("Item Details")
|
|
366
|
-
)
|
|
367
|
-
},
|
|
368
|
-
type = ButtonType.PRIMARY,
|
|
369
|
-
size = Size.MEDIUM
|
|
370
|
-
)
|
|
371
|
-
|
|
372
|
-
Button(
|
|
373
|
-
title = "Update to 'Product #12345'",
|
|
374
|
-
onClick = {
|
|
375
|
-
navigation.setOptions(
|
|
376
|
-
headerTitle = HeaderTitle.Default("Product #12345")
|
|
377
|
-
)
|
|
378
|
-
},
|
|
379
|
-
type = ButtonType.SECONDARY,
|
|
380
|
-
size = Size.MEDIUM
|
|
381
|
-
)
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
// ========================================
|
|
386
|
-
// Helper Components
|
|
387
|
-
// ========================================
|
|
388
|
-
|
|
389
|
-
@Composable
|
|
390
|
-
private fun SectionHeader(title: String) {
|
|
391
|
-
Text(
|
|
392
|
-
text = title,
|
|
393
|
-
style = MaterialTheme.typography.titleMedium,
|
|
394
|
-
color = MaterialTheme.colorScheme.primary
|
|
395
|
-
)
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
@Composable
|
|
399
|
-
private fun RowPresetButtons(
|
|
400
|
-
presets: List<String>,
|
|
401
|
-
onPresetClick: (String) -> Unit
|
|
402
|
-
) {
|
|
403
|
-
Box(
|
|
404
|
-
modifier = Modifier.fillMaxWidth()
|
|
405
|
-
) {
|
|
406
|
-
// Display presets as a text list for simplicity
|
|
407
|
-
// In real app, these would be chip or button components
|
|
408
|
-
Text(
|
|
409
|
-
text = presets.joinToString(" | "),
|
|
410
|
-
style = MaterialTheme.typography.bodyMedium,
|
|
411
|
-
modifier = Modifier.padding(vertical = 8.dp)
|
|
412
|
-
)
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
@Composable
|
|
417
|
-
private fun CategoryButton(
|
|
418
|
-
title: String,
|
|
419
|
-
isSelected: Boolean,
|
|
420
|
-
onClick: () -> Unit
|
|
421
|
-
) {
|
|
422
|
-
Button(
|
|
423
|
-
title = title,
|
|
424
|
-
onClick = onClick,
|
|
425
|
-
type = if (isSelected) ButtonType.PRIMARY else ButtonType.OUTLINE,
|
|
426
|
-
size = Size.SMALL,
|
|
427
|
-
modifier = Modifier.fillMaxWidth()
|
|
428
|
-
)
|
|
429
|
-
}
|