openuispec 0.1.44 → 0.1.46

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 (134) hide show
  1. package/README.md +79 -55
  2. package/cli/init.ts +14 -3
  3. package/examples/social-app/.mcp.json +10 -0
  4. package/examples/social-app/AGENTS.md +105 -0
  5. package/examples/social-app/CLAUDE.md +105 -0
  6. package/examples/social-app/README.md +19 -0
  7. package/examples/social-app/backend/.gitkeep +1 -0
  8. package/examples/social-app/generated/android/social-app/app/build.gradle.kts +92 -0
  9. package/examples/social-app/generated/android/social-app/app/src/main/AndroidManifest.xml +26 -0
  10. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/AppContainer.kt +20 -0
  11. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/MainActivity.kt +35 -0
  12. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/SocialAppApplication.kt +13 -0
  13. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/data/MockData.kt +98 -0
  14. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/data/preferences/AppPreferences.kt +19 -0
  15. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/data/preferences/DataStorePreferencesRepository.kt +68 -0
  16. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/data/preferences/PreferencesRepository.kt +15 -0
  17. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/model/Models.kt +34 -0
  18. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/MainShell.kt +390 -0
  19. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/components/Components.kt +234 -0
  20. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/components/ContractPrimitives.kt +641 -0
  21. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/navigation/RootComponent.kt +113 -0
  22. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/ChatDetailScreen.kt +212 -0
  23. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/CreatePostScreen.kt +113 -0
  24. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/DiscoverScreen.kt +137 -0
  25. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/EditProfileScreen.kt +180 -0
  26. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/HomeFeedScreen.kt +157 -0
  27. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/MessagesInboxScreen.kt +85 -0
  28. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/NotificationsScreen.kt +74 -0
  29. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/PostDetailScreen.kt +293 -0
  30. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/ProfileSelfScreen.kt +116 -0
  31. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/SearchResultsScreen.kt +161 -0
  32. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/SettingsScreen.kt +162 -0
  33. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/SettingsStore.kt +95 -0
  34. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/UserProfileScreen.kt +123 -0
  35. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/theme/Color.kt +33 -0
  36. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/theme/Shape.kt +41 -0
  37. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/theme/Spacing.kt +20 -0
  38. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/theme/Theme.kt +82 -0
  39. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/theme/Type.kt +60 -0
  40. package/examples/social-app/generated/android/social-app/app/src/main/res/drawable/ic_launcher_foreground.xml +9 -0
  41. package/examples/social-app/generated/android/social-app/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
  42. package/examples/social-app/generated/android/social-app/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
  43. package/examples/social-app/generated/android/social-app/app/src/main/res/values/strings.xml +91 -0
  44. package/examples/social-app/generated/android/social-app/app/src/main/res/values/themes.xml +10 -0
  45. package/examples/social-app/generated/android/social-app/app/src/main/res/values-ru/strings.xml +79 -0
  46. package/examples/social-app/generated/android/social-app/app/src/main/res/values-uz/strings.xml +79 -0
  47. package/examples/social-app/generated/android/social-app/app/src/main/xml/AndroidManifest.xml +23 -0
  48. package/examples/social-app/generated/android/social-app/build.gradle.kts +6 -0
  49. package/examples/social-app/generated/android/social-app/gradle/libs.versions.toml +48 -0
  50. package/examples/social-app/generated/android/social-app/gradle/wrapper/gradle-wrapper.properties +8 -0
  51. package/examples/social-app/generated/android/social-app/gradle.properties +11 -0
  52. package/examples/social-app/generated/android/social-app/gradlew +25 -0
  53. package/examples/social-app/generated/android/social-app/settings.gradle.kts +23 -0
  54. package/examples/social-app/generated/web/social-app/index.html +12 -0
  55. package/examples/social-app/generated/web/social-app/package-lock.json +2517 -0
  56. package/examples/social-app/generated/web/social-app/package.json +27 -0
  57. package/examples/social-app/generated/web/social-app/src/app/App.tsx +58 -0
  58. package/examples/social-app/generated/web/social-app/src/components/Shell.tsx +247 -0
  59. package/examples/social-app/generated/web/social-app/src/components/cards.tsx +317 -0
  60. package/examples/social-app/generated/web/social-app/src/components/ui.tsx +328 -0
  61. package/examples/social-app/generated/web/social-app/src/flows/CreatePostFlow.tsx +86 -0
  62. package/examples/social-app/generated/web/social-app/src/i18n.tsx +59 -0
  63. package/examples/social-app/generated/web/social-app/src/lib/icons.tsx +85 -0
  64. package/examples/social-app/generated/web/social-app/src/lib/tokens.ts +70 -0
  65. package/examples/social-app/generated/web/social-app/src/lib/utils.ts +97 -0
  66. package/examples/social-app/generated/web/social-app/src/locales/en.json +67 -0
  67. package/examples/social-app/generated/web/social-app/src/locales/ru.json +67 -0
  68. package/examples/social-app/generated/web/social-app/src/locales/uz.json +67 -0
  69. package/examples/social-app/generated/web/social-app/src/main.tsx +16 -0
  70. package/examples/social-app/generated/web/social-app/src/screens/ChatDetailScreen.tsx +90 -0
  71. package/examples/social-app/generated/web/social-app/src/screens/DiscoverScreen.tsx +86 -0
  72. package/examples/social-app/generated/web/social-app/src/screens/EditProfileScreen.tsx +57 -0
  73. package/examples/social-app/generated/web/social-app/src/screens/HomeFeedScreen.tsx +113 -0
  74. package/examples/social-app/generated/web/social-app/src/screens/MessagesInboxScreen.tsx +52 -0
  75. package/examples/social-app/generated/web/social-app/src/screens/NotificationsScreen.tsx +41 -0
  76. package/examples/social-app/generated/web/social-app/src/screens/PostDetailScreen.tsx +115 -0
  77. package/examples/social-app/generated/web/social-app/src/screens/ProfileSelfScreen.tsx +57 -0
  78. package/examples/social-app/generated/web/social-app/src/screens/ProfileUserScreen.tsx +76 -0
  79. package/examples/social-app/generated/web/social-app/src/screens/SearchResultsScreen.tsx +96 -0
  80. package/examples/social-app/generated/web/social-app/src/screens/SettingsScreen.tsx +77 -0
  81. package/examples/social-app/generated/web/social-app/src/state/store.ts +592 -0
  82. package/examples/social-app/generated/web/social-app/src/styles.css +124 -0
  83. package/examples/social-app/generated/web/social-app/src/vite-env.d.ts +1 -0
  84. package/examples/social-app/generated/web/social-app/tsconfig.json +22 -0
  85. package/examples/social-app/generated/web/social-app/tsconfig.node.json +13 -0
  86. package/examples/social-app/generated/web/social-app/tsconfig.node.tsbuildinfo +1 -0
  87. package/examples/social-app/generated/web/social-app/tsconfig.tsbuildinfo +1 -0
  88. package/examples/social-app/generated/web/social-app/vite.config.d.ts +2 -0
  89. package/examples/social-app/generated/web/social-app/vite.config.js +6 -0
  90. package/examples/social-app/generated/web/social-app/vite.config.ts +7 -0
  91. package/examples/social-app/openuispec/README.md +56 -0
  92. package/examples/social-app/openuispec/contracts/.gitkeep +0 -0
  93. package/examples/social-app/openuispec/contracts/action_trigger.yaml +73 -0
  94. package/examples/social-app/openuispec/contracts/collection.yaml +43 -0
  95. package/examples/social-app/openuispec/contracts/data_display.yaml +47 -0
  96. package/examples/social-app/openuispec/contracts/feedback.yaml +49 -0
  97. package/examples/social-app/openuispec/contracts/input_field.yaml +41 -0
  98. package/examples/social-app/openuispec/contracts/nav_container.yaml +34 -0
  99. package/examples/social-app/openuispec/contracts/surface.yaml +41 -0
  100. package/examples/social-app/openuispec/flows/.gitkeep +0 -0
  101. package/examples/social-app/openuispec/flows/create_post.yaml +66 -0
  102. package/examples/social-app/openuispec/locales/.gitkeep +0 -0
  103. package/examples/social-app/openuispec/locales/en.json +67 -0
  104. package/examples/social-app/openuispec/locales/ru.json +67 -0
  105. package/examples/social-app/openuispec/locales/uz.json +67 -0
  106. package/examples/social-app/openuispec/openuispec.yaml +214 -0
  107. package/examples/social-app/openuispec/platform/.gitkeep +0 -0
  108. package/examples/social-app/openuispec/platform/android.yaml +30 -0
  109. package/examples/social-app/openuispec/platform/ios.yaml +19 -0
  110. package/examples/social-app/openuispec/platform/web.yaml +23 -0
  111. package/examples/social-app/openuispec/screens/.gitkeep +0 -0
  112. package/examples/social-app/openuispec/screens/chat_detail.yaml +53 -0
  113. package/examples/social-app/openuispec/screens/discover.yaml +78 -0
  114. package/examples/social-app/openuispec/screens/edit_profile.yaml +78 -0
  115. package/examples/social-app/openuispec/screens/home_feed.yaml +123 -0
  116. package/examples/social-app/openuispec/screens/messages_inbox.yaml +43 -0
  117. package/examples/social-app/openuispec/screens/notifications.yaml +29 -0
  118. package/examples/social-app/openuispec/screens/post_detail.yaml +86 -0
  119. package/examples/social-app/openuispec/screens/profile_self.yaml +53 -0
  120. package/examples/social-app/openuispec/screens/profile_user.yaml +60 -0
  121. package/examples/social-app/openuispec/screens/search_results.yaml +62 -0
  122. package/examples/social-app/openuispec/screens/settings.yaml +94 -0
  123. package/examples/social-app/openuispec/tokens/.gitkeep +0 -0
  124. package/examples/social-app/openuispec/tokens/color.yaml +76 -0
  125. package/examples/social-app/openuispec/tokens/elevation.yaml +31 -0
  126. package/examples/social-app/openuispec/tokens/icons.yaml +147 -0
  127. package/examples/social-app/openuispec/tokens/layout.yaml +37 -0
  128. package/examples/social-app/openuispec/tokens/motion.yaml +28 -0
  129. package/examples/social-app/openuispec/tokens/spacing.yaml +19 -0
  130. package/examples/social-app/openuispec/tokens/themes.yaml +31 -0
  131. package/examples/social-app/openuispec/tokens/typography.yaml +50 -0
  132. package/examples/social-app/package.json +12 -0
  133. package/mcp-server/index.ts +69 -0
  134. package/package.json +1 -1
@@ -0,0 +1,234 @@
1
+ package com.social.app.ui.components
2
+
3
+ import androidx.compose.foundation.BorderStroke
4
+ import androidx.compose.foundation.background
5
+ import androidx.compose.foundation.clickable
6
+ import androidx.compose.foundation.layout.*
7
+ import androidx.compose.foundation.lazy.LazyRow
8
+ import androidx.compose.foundation.lazy.items
9
+ import androidx.compose.material.icons.Icons
10
+ import androidx.compose.material.icons.filled.*
11
+ import androidx.compose.material.icons.outlined.*
12
+ import androidx.compose.material3.*
13
+ import androidx.compose.runtime.Composable
14
+ import androidx.compose.ui.Alignment
15
+ import androidx.compose.ui.Modifier
16
+ import androidx.compose.ui.draw.clip
17
+ import androidx.compose.ui.graphics.Color
18
+ import androidx.compose.ui.layout.ContentScale
19
+ import androidx.compose.ui.unit.dp
20
+ import coil3.compose.AsyncImage
21
+ import com.social.app.ui.theme.Shapes
22
+ import com.social.app.ui.theme.Spacing
23
+
24
+ @Composable
25
+ fun StoryItem(
26
+ name: String,
27
+ imageUrl: String?,
28
+ onClick: () -> Unit
29
+ ) {
30
+ Column(
31
+ horizontalAlignment = Alignment.CenterHorizontally,
32
+ modifier = Modifier
33
+ .padding(end = Spacing.ListItemGap)
34
+ .clickable { onClick() }
35
+ ) {
36
+ Box(
37
+ modifier = Modifier
38
+ .size(64.dp)
39
+ .clip(Shapes.RoundedCapPrimary)
40
+ .background(MaterialTheme.colorScheme.surfaceVariant)
41
+ ) {
42
+ if (imageUrl != null) {
43
+ AsyncImage(
44
+ model = imageUrl,
45
+ contentDescription = null,
46
+ modifier = Modifier.fillMaxSize(),
47
+ contentScale = ContentScale.Crop
48
+ )
49
+ } else {
50
+ Icon(
51
+ Icons.Default.Person,
52
+ contentDescription = null,
53
+ modifier = Modifier.align(Alignment.Center)
54
+ )
55
+ }
56
+ }
57
+ Spacer(modifier = Modifier.height(Spacing.XS))
58
+ Text(
59
+ text = name,
60
+ style = MaterialTheme.typography.labelSmall,
61
+ maxLines = 1,
62
+ color = MaterialTheme.colorScheme.onSurface
63
+ )
64
+ }
65
+ }
66
+
67
+ @OptIn(ExperimentalMaterial3Api::class)
68
+ @Composable
69
+ fun FilterChipRow(
70
+ selectedFilter: String,
71
+ onFilterSelected: (String) -> Unit
72
+ ) {
73
+ val filters = listOf("all", "following", "popular")
74
+ LazyRow(
75
+ contentPadding = PaddingValues(horizontal = Spacing.MD),
76
+ horizontalArrangement = Arrangement.spacedBy(Spacing.SM)
77
+ ) {
78
+ items(filters) { filter ->
79
+ FilterChip(
80
+ selected = selectedFilter == filter,
81
+ onClick = { onFilterSelected(filter) },
82
+ label = { Text(filter.replaceFirstChar { it.uppercase() }) },
83
+ shape = Shapes.RoundedCapPrimary,
84
+ colors = FilterChipDefaults.filterChipColors(
85
+ selectedContainerColor = MaterialTheme.colorScheme.secondary,
86
+ selectedLabelColor = MaterialTheme.colorScheme.onSecondary
87
+ ),
88
+ border = FilterChipDefaults.filterChipBorder(
89
+ enabled = true,
90
+ selected = selectedFilter == filter,
91
+ borderColor = MaterialTheme.colorScheme.outline,
92
+ selectedBorderColor = Color.Transparent
93
+ )
94
+ )
95
+ }
96
+ }
97
+ }
98
+
99
+ @Composable
100
+ fun PostItem(
101
+ authorName: String,
102
+ authorHandle: String,
103
+ authorAvatar: String? = null,
104
+ body: String,
105
+ likeCount: Int,
106
+ commentCount: Int,
107
+ timestamp: String,
108
+ mediaUrl: String? = null,
109
+ onAuthorClick: () -> Unit = {},
110
+ onLikeClick: () -> Unit = {},
111
+ onCommentClick: () -> Unit = {}
112
+ ) {
113
+ Card(
114
+ modifier = Modifier
115
+ .fillMaxWidth()
116
+ .padding(horizontal = Spacing.MD, vertical = Spacing.XS),
117
+ shape = Shapes.CardShape,
118
+ colors = CardDefaults.cardColors(
119
+ containerColor = MaterialTheme.colorScheme.surfaceVariant
120
+ ),
121
+ border = BorderStroke(1.dp, MaterialTheme.colorScheme.outline)
122
+ ) {
123
+ Column(modifier = Modifier.padding(Spacing.MD)) {
124
+ Row(
125
+ verticalAlignment = Alignment.CenterVertically,
126
+ modifier = Modifier.clickable { onAuthorClick() }
127
+ ) {
128
+ Box(
129
+ modifier = Modifier
130
+ .size(40.dp)
131
+ .clip(Shapes.RoundedCapPrimary)
132
+ .background(MaterialTheme.colorScheme.surface)
133
+ ) {
134
+ if (authorAvatar != null) {
135
+ AsyncImage(
136
+ model = authorAvatar,
137
+ contentDescription = null,
138
+ modifier = Modifier.fillMaxSize(),
139
+ contentScale = ContentScale.Crop
140
+ )
141
+ } else {
142
+ Icon(
143
+ Icons.Default.Person,
144
+ contentDescription = null,
145
+ modifier = Modifier.align(Alignment.Center)
146
+ )
147
+ }
148
+ }
149
+ Spacer(modifier = Modifier.width(Spacing.SM))
150
+ Column {
151
+ Text(
152
+ text = authorName,
153
+ style = MaterialTheme.typography.headlineSmall,
154
+ color = MaterialTheme.colorScheme.onSurface
155
+ )
156
+ Text(
157
+ text = "@$authorHandle",
158
+ style = MaterialTheme.typography.bodyMedium,
159
+ color = MaterialTheme.colorScheme.onSurfaceVariant
160
+ )
161
+ }
162
+ Spacer(modifier = Modifier.weight(1f))
163
+ Text(
164
+ text = timestamp,
165
+ style = MaterialTheme.typography.labelSmall,
166
+ color = MaterialTheme.colorScheme.onSurfaceVariant
167
+ )
168
+ }
169
+
170
+ Spacer(modifier = Modifier.height(Spacing.SM))
171
+ Text(
172
+ text = body,
173
+ style = MaterialTheme.typography.bodyLarge,
174
+ color = MaterialTheme.colorScheme.onSurface
175
+ )
176
+
177
+ if (mediaUrl != null) {
178
+ Spacer(modifier = Modifier.height(Spacing.MD))
179
+ AsyncImage(
180
+ model = mediaUrl,
181
+ contentDescription = null,
182
+ modifier = Modifier
183
+ .fillMaxWidth()
184
+ .heightIn(max = 300.dp)
185
+ .clip(Shapes.CardShape)
186
+ .clickable { onCommentClick() }, // Open detail on image click too
187
+ contentScale = ContentScale.Crop
188
+ )
189
+ }
190
+
191
+ Spacer(modifier = Modifier.height(Spacing.MD))
192
+ Row(
193
+ horizontalArrangement = Arrangement.spacedBy(Spacing.LG),
194
+ verticalAlignment = Alignment.CenterVertically
195
+ ) {
196
+ Row(
197
+ verticalAlignment = Alignment.CenterVertically,
198
+ modifier = Modifier.clickable { onLikeClick() }
199
+ ) {
200
+ Icon(
201
+ Icons.Outlined.FavoriteBorder,
202
+ contentDescription = "Like",
203
+ modifier = Modifier.size(20.dp)
204
+ )
205
+ Spacer(modifier = Modifier.width(Spacing.XS))
206
+ Text(text = likeCount.toString(), style = MaterialTheme.typography.bodyMedium)
207
+ }
208
+ Row(
209
+ verticalAlignment = Alignment.CenterVertically,
210
+ modifier = Modifier.clickable { onCommentClick() }
211
+ ) {
212
+ Icon(
213
+ Icons.Outlined.ChatBubbleOutline,
214
+ contentDescription = "Comment",
215
+ modifier = Modifier.size(20.dp)
216
+ )
217
+ Spacer(modifier = Modifier.width(Spacing.XS))
218
+ Text(text = commentCount.toString(), style = MaterialTheme.typography.bodyMedium)
219
+ }
220
+ Icon(
221
+ Icons.Outlined.Share,
222
+ contentDescription = "Share",
223
+ modifier = Modifier.size(20.dp).clickable { }
224
+ )
225
+ Spacer(modifier = Modifier.weight(1f))
226
+ Icon(
227
+ Icons.Outlined.BookmarkBorder,
228
+ contentDescription = "Save",
229
+ modifier = Modifier.size(20.dp).clickable { }
230
+ )
231
+ }
232
+ }
233
+ }
234
+ }