openuispec 0.2.9 → 0.2.11

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 (232) hide show
  1. package/README.md +3 -1
  2. package/cli/index.ts +80 -2
  3. package/cli/init.ts +23 -8
  4. package/docs/cli.md +42 -7
  5. package/drift/index.ts +41 -15
  6. package/mcp-server/index.ts +247 -117
  7. package/mcp-server/screenshot-android.ts +185 -44
  8. package/mcp-server/screenshot-ios.ts +242 -30
  9. package/mcp-server/screenshot.ts +96 -1
  10. package/package.json +5 -2
  11. package/prepare/index.ts +16 -0
  12. package/scripts/take-all-screenshots.ts +507 -0
  13. package/status/index.ts +2 -2
  14. package/examples/social-app/.mcp.json +0 -10
  15. package/examples/social-app/AGENTS.md +0 -124
  16. package/examples/social-app/CLAUDE.md +0 -124
  17. package/examples/social-app/backend/.gitkeep +0 -1
  18. package/examples/social-app/generated/android/social-app/app/.paparazzi-hashes.json +0 -3
  19. package/examples/social-app/generated/android/social-app/app/build.gradle.kts +0 -94
  20. package/examples/social-app/generated/android/social-app/app/src/main/AndroidManifest.xml +0 -26
  21. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/AppContainer.kt +0 -20
  22. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/MainActivity.kt +0 -35
  23. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/SocialAppApplication.kt +0 -13
  24. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/data/MockData.kt +0 -98
  25. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/data/preferences/AppPreferences.kt +0 -19
  26. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/data/preferences/DataStorePreferencesRepository.kt +0 -68
  27. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/data/preferences/PreferencesRepository.kt +0 -15
  28. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/model/Models.kt +0 -34
  29. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/MainShell.kt +0 -390
  30. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/components/Components.kt +0 -234
  31. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/components/ContractPrimitives.kt +0 -641
  32. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/navigation/RootComponent.kt +0 -113
  33. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/ChatDetailScreen.kt +0 -212
  34. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/CreatePostScreen.kt +0 -113
  35. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/DiscoverScreen.kt +0 -137
  36. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/EditProfileScreen.kt +0 -180
  37. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/HomeFeedScreen.kt +0 -169
  38. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/MessagesInboxScreen.kt +0 -85
  39. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/NotificationsScreen.kt +0 -74
  40. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/PostDetailScreen.kt +0 -293
  41. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/ProfileSelfScreen.kt +0 -116
  42. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/SearchResultsScreen.kt +0 -161
  43. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/SettingsScreen.kt +0 -164
  44. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/SettingsStore.kt +0 -95
  45. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/UserProfileScreen.kt +0 -123
  46. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/theme/Color.kt +0 -33
  47. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/theme/Shape.kt +0 -41
  48. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/theme/Spacing.kt +0 -20
  49. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/theme/Theme.kt +0 -82
  50. package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/theme/Type.kt +0 -60
  51. package/examples/social-app/generated/android/social-app/app/src/main/res/drawable/ic_launcher_foreground.xml +0 -9
  52. package/examples/social-app/generated/android/social-app/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +0 -5
  53. package/examples/social-app/generated/android/social-app/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +0 -5
  54. package/examples/social-app/generated/android/social-app/app/src/main/res/values/strings.xml +0 -91
  55. package/examples/social-app/generated/android/social-app/app/src/main/res/values/themes.xml +0 -10
  56. package/examples/social-app/generated/android/social-app/app/src/main/res/values-ru/strings.xml +0 -79
  57. package/examples/social-app/generated/android/social-app/app/src/main/res/values-uz/strings.xml +0 -79
  58. package/examples/social-app/generated/android/social-app/app/src/main/xml/AndroidManifest.xml +0 -23
  59. package/examples/social-app/generated/android/social-app/app/src/test/kotlin/com/social/app/screenshots/HomeFeedScreenshotTest.kt +0 -34
  60. package/examples/social-app/generated/android/social-app/build.gradle.kts +0 -7
  61. package/examples/social-app/generated/android/social-app/gradle/libs.versions.toml +0 -50
  62. package/examples/social-app/generated/android/social-app/gradle/wrapper/gradle-wrapper.jar +0 -0
  63. package/examples/social-app/generated/android/social-app/gradle/wrapper/gradle-wrapper.properties +0 -8
  64. package/examples/social-app/generated/android/social-app/gradle.properties +0 -11
  65. package/examples/social-app/generated/android/social-app/gradlew +0 -248
  66. package/examples/social-app/generated/android/social-app/settings.gradle.kts +0 -27
  67. package/examples/social-app/generated/web/social-app/index.html +0 -12
  68. package/examples/social-app/generated/web/social-app/package-lock.json +0 -2517
  69. package/examples/social-app/generated/web/social-app/package.json +0 -27
  70. package/examples/social-app/generated/web/social-app/src/app/App.tsx +0 -58
  71. package/examples/social-app/generated/web/social-app/src/components/Shell.tsx +0 -259
  72. package/examples/social-app/generated/web/social-app/src/components/cards.tsx +0 -317
  73. package/examples/social-app/generated/web/social-app/src/components/ui.tsx +0 -340
  74. package/examples/social-app/generated/web/social-app/src/flows/CreatePostFlow.tsx +0 -86
  75. package/examples/social-app/generated/web/social-app/src/i18n.tsx +0 -59
  76. package/examples/social-app/generated/web/social-app/src/lib/icons.tsx +0 -85
  77. package/examples/social-app/generated/web/social-app/src/lib/tokens.ts +0 -70
  78. package/examples/social-app/generated/web/social-app/src/lib/utils.ts +0 -97
  79. package/examples/social-app/generated/web/social-app/src/locales/en.json +0 -67
  80. package/examples/social-app/generated/web/social-app/src/locales/ru.json +0 -67
  81. package/examples/social-app/generated/web/social-app/src/locales/uz.json +0 -67
  82. package/examples/social-app/generated/web/social-app/src/main.tsx +0 -16
  83. package/examples/social-app/generated/web/social-app/src/screens/ChatDetailScreen.tsx +0 -90
  84. package/examples/social-app/generated/web/social-app/src/screens/DiscoverScreen.tsx +0 -86
  85. package/examples/social-app/generated/web/social-app/src/screens/EditProfileScreen.tsx +0 -57
  86. package/examples/social-app/generated/web/social-app/src/screens/HomeFeedScreen.tsx +0 -103
  87. package/examples/social-app/generated/web/social-app/src/screens/MessagesInboxScreen.tsx +0 -52
  88. package/examples/social-app/generated/web/social-app/src/screens/NotificationsScreen.tsx +0 -41
  89. package/examples/social-app/generated/web/social-app/src/screens/PostDetailScreen.tsx +0 -115
  90. package/examples/social-app/generated/web/social-app/src/screens/ProfileSelfScreen.tsx +0 -57
  91. package/examples/social-app/generated/web/social-app/src/screens/ProfileUserScreen.tsx +0 -76
  92. package/examples/social-app/generated/web/social-app/src/screens/SearchResultsScreen.tsx +0 -96
  93. package/examples/social-app/generated/web/social-app/src/screens/SettingsScreen.tsx +0 -79
  94. package/examples/social-app/generated/web/social-app/src/state/store.ts +0 -592
  95. package/examples/social-app/generated/web/social-app/src/styles.css +0 -125
  96. package/examples/social-app/generated/web/social-app/src/vite-env.d.ts +0 -1
  97. package/examples/social-app/generated/web/social-app/tsconfig.json +0 -22
  98. package/examples/social-app/generated/web/social-app/tsconfig.node.json +0 -13
  99. package/examples/social-app/generated/web/social-app/tsconfig.node.tsbuildinfo +0 -1
  100. package/examples/social-app/generated/web/social-app/tsconfig.tsbuildinfo +0 -1
  101. package/examples/social-app/generated/web/social-app/vite.config.d.ts +0 -2
  102. package/examples/social-app/generated/web/social-app/vite.config.js +0 -6
  103. package/examples/social-app/generated/web/social-app/vite.config.ts +0 -7
  104. package/examples/social-app/package.json +0 -13
  105. package/examples/social-app/take-web-screenshots.ts +0 -97
  106. package/examples/taskflow/.codex/config.toml +0 -4
  107. package/examples/taskflow/.mcp.json +0 -10
  108. package/examples/taskflow/AGENTS.md +0 -124
  109. package/examples/taskflow/CLAUDE.md +0 -124
  110. package/examples/taskflow/backend/.gitkeep +0 -1
  111. package/examples/taskflow/generated/android/TaskFlow/README.md +0 -43
  112. package/examples/taskflow/generated/android/TaskFlow/app/build.gradle.kts +0 -76
  113. package/examples/taskflow/generated/android/TaskFlow/app/proguard-rules.pro +0 -1
  114. package/examples/taskflow/generated/android/TaskFlow/app/src/main/AndroidManifest.xml +0 -21
  115. package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/MainActivity.kt +0 -19
  116. package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/TaskFlowApp.kt +0 -283
  117. package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/model/DomainModels.kt +0 -106
  118. package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/model/SampleData.kt +0 -57
  119. package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/components/Common.kt +0 -109
  120. package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/screens/HomeScreen.kt +0 -112
  121. package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/screens/ProjectsScreen.kt +0 -61
  122. package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/screens/SettingsScreen.kt +0 -82
  123. package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/screens/TaskDetailScreen.kt +0 -111
  124. package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/sheets/Sheets.kt +0 -77
  125. package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/theme/Color.kt +0 -30
  126. package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/theme/Theme.kt +0 -86
  127. package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/theme/Type.kt +0 -57
  128. package/examples/taskflow/generated/android/TaskFlow/app/src/main/res/values/strings.xml +0 -155
  129. package/examples/taskflow/generated/android/TaskFlow/app/src/main/res/values/themes.xml +0 -4
  130. package/examples/taskflow/generated/android/TaskFlow/build.gradle.kts +0 -5
  131. package/examples/taskflow/generated/android/TaskFlow/gradle/gradle-daemon-jvm.properties +0 -12
  132. package/examples/taskflow/generated/android/TaskFlow/gradle/wrapper/gradle-wrapper.jar +0 -0
  133. package/examples/taskflow/generated/android/TaskFlow/gradle/wrapper/gradle-wrapper.properties +0 -7
  134. package/examples/taskflow/generated/android/TaskFlow/gradle.properties +0 -4
  135. package/examples/taskflow/generated/android/TaskFlow/gradlew +0 -18
  136. package/examples/taskflow/generated/android/TaskFlow/gradlew.bat +0 -12
  137. package/examples/taskflow/generated/android/TaskFlow/settings.gradle.kts +0 -18
  138. package/examples/taskflow/generated/ios/TaskFlow/README.md +0 -21
  139. package/examples/taskflow/generated/ios/TaskFlow/Resources/en.lproj/Localizable.strings +0 -115
  140. package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/App/TaskFlowApp.swift +0 -24
  141. package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Components/AppChrome.swift +0 -150
  142. package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Flows/TaskEditorSheet.swift +0 -220
  143. package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Models/DomainModels.swift +0 -122
  144. package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Screens/CalendarView.swift +0 -21
  145. package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Screens/HomeView.swift +0 -201
  146. package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Screens/ProfileEditView.swift +0 -48
  147. package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Screens/ProjectDetailView.swift +0 -59
  148. package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Screens/ProjectsView.swift +0 -63
  149. package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Screens/SettingsView.swift +0 -85
  150. package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Screens/TaskDetailView.swift +0 -219
  151. package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Support/AppModel.swift +0 -320
  152. package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Support/AppSupport.swift +0 -41
  153. package/examples/taskflow/generated/ios/TaskFlow/project.yml +0 -26
  154. package/examples/taskflow/generated/web/TaskFlow/README.md +0 -19
  155. package/examples/taskflow/generated/web/TaskFlow/index.html +0 -12
  156. package/examples/taskflow/generated/web/TaskFlow/package-lock.json +0 -1908
  157. package/examples/taskflow/generated/web/TaskFlow/package.json +0 -24
  158. package/examples/taskflow/generated/web/TaskFlow/src/App.tsx +0 -58
  159. package/examples/taskflow/generated/web/TaskFlow/src/AppShell.tsx +0 -55
  160. package/examples/taskflow/generated/web/TaskFlow/src/components/Common.tsx +0 -82
  161. package/examples/taskflow/generated/web/TaskFlow/src/components/Modals.tsx +0 -191
  162. package/examples/taskflow/generated/web/TaskFlow/src/components/Nav.tsx +0 -41
  163. package/examples/taskflow/generated/web/TaskFlow/src/generated/messages.ts +0 -131
  164. package/examples/taskflow/generated/web/TaskFlow/src/hooks.ts +0 -25
  165. package/examples/taskflow/generated/web/TaskFlow/src/i18n.ts +0 -39
  166. package/examples/taskflow/generated/web/TaskFlow/src/locales.en.json +0 -111
  167. package/examples/taskflow/generated/web/TaskFlow/src/main.tsx +0 -13
  168. package/examples/taskflow/generated/web/TaskFlow/src/screens/HomeScreen.tsx +0 -111
  169. package/examples/taskflow/generated/web/TaskFlow/src/screens/ProjectsScreen.tsx +0 -82
  170. package/examples/taskflow/generated/web/TaskFlow/src/screens/SettingsScreens.tsx +0 -132
  171. package/examples/taskflow/generated/web/TaskFlow/src/screens/TaskDetail.tsx +0 -105
  172. package/examples/taskflow/generated/web/TaskFlow/src/store.ts +0 -216
  173. package/examples/taskflow/generated/web/TaskFlow/src/styles.css +0 -617
  174. package/examples/taskflow/generated/web/TaskFlow/src/types.ts +0 -64
  175. package/examples/taskflow/generated/web/TaskFlow/src/utils.ts +0 -78
  176. package/examples/taskflow/generated/web/TaskFlow/tsconfig.json +0 -21
  177. package/examples/taskflow/generated/web/TaskFlow/vite.config.ts +0 -6
  178. package/examples/todo-orbit/.codex/config.toml +0 -4
  179. package/examples/todo-orbit/.mcp.json +0 -10
  180. package/examples/todo-orbit/AGENTS.md +0 -124
  181. package/examples/todo-orbit/CLAUDE.md +0 -124
  182. package/examples/todo-orbit/backend/.gitkeep +0 -1
  183. package/examples/todo-orbit/generated/android/Todo Orbit/README.md +0 -14
  184. package/examples/todo-orbit/generated/android/Todo Orbit/app/build.gradle.kts +0 -58
  185. package/examples/todo-orbit/generated/android/Todo Orbit/app/proguard-rules.pro +0 -1
  186. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/AndroidManifest.xml +0 -20
  187. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/MainActivity.kt +0 -14
  188. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/TodoOrbitApp.kt +0 -345
  189. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/support/AppLogic.kt +0 -231
  190. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/support/Models.kt +0 -169
  191. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/support/Strings.kt +0 -8
  192. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/components/CommonComponents.kt +0 -236
  193. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/screens/AnalyticsScreen.kt +0 -193
  194. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/screens/SettingsScreen.kt +0 -102
  195. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/screens/TasksScreen.kt +0 -347
  196. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/sheets/EditorSheets.kt +0 -347
  197. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/theme/TodoOrbitTheme.kt +0 -59
  198. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/res/values/strings.xml +0 -149
  199. package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/res/values-ru/strings.xml +0 -155
  200. package/examples/todo-orbit/generated/android/Todo Orbit/build.gradle.kts +0 -4
  201. package/examples/todo-orbit/generated/android/Todo Orbit/gradle/wrapper/gradle-wrapper.jar +0 -0
  202. package/examples/todo-orbit/generated/android/Todo Orbit/gradle/wrapper/gradle-wrapper.properties +0 -7
  203. package/examples/todo-orbit/generated/android/Todo Orbit/gradle.properties +0 -4
  204. package/examples/todo-orbit/generated/android/Todo Orbit/gradlew +0 -248
  205. package/examples/todo-orbit/generated/android/Todo Orbit/gradlew.bat +0 -93
  206. package/examples/todo-orbit/generated/android/Todo Orbit/settings.gradle.kts +0 -18
  207. package/examples/todo-orbit/generated/ios/Todo Orbit/.screenshot-uitest/Sources/ScreenshotUITest.swift +0 -36
  208. package/examples/todo-orbit/generated/ios/Todo Orbit/README.md +0 -29
  209. package/examples/todo-orbit/generated/ios/Todo Orbit/Resources/en.lproj/Localizable.strings +0 -119
  210. package/examples/todo-orbit/generated/ios/Todo Orbit/Resources/ru.lproj/Localizable.strings +0 -119
  211. package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/App/TodoOrbitApp.swift +0 -50
  212. package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Components/OrbitChrome.swift +0 -204
  213. package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Components/SchedulePreviewView.swift +0 -126
  214. package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Components/TrendChartView.swift +0 -70
  215. package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Flows/RecurringRuleSheet.swift +0 -126
  216. package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Flows/TaskEditorSheet.swift +0 -61
  217. package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Models/DomainModels.swift +0 -238
  218. package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Screens/AnalyticsView.swift +0 -94
  219. package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Screens/SettingsView.swift +0 -76
  220. package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Screens/TasksHomeView.swift +0 -364
  221. package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Support/AppModel.swift +0 -324
  222. package/examples/todo-orbit/generated/ios/Todo Orbit/TodoOrbit.xcodeproj/project.pbxproj +0 -400
  223. package/examples/todo-orbit/generated/ios/Todo Orbit/TodoOrbit.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  224. package/examples/todo-orbit/generated/ios/Todo Orbit/project.yml +0 -25
  225. package/examples/todo-orbit/generated/web/Todo Orbit/index.html +0 -16
  226. package/examples/todo-orbit/generated/web/Todo Orbit/package-lock.json +0 -1087
  227. package/examples/todo-orbit/generated/web/Todo Orbit/package.json +0 -24
  228. package/examples/todo-orbit/generated/web/Todo Orbit/src/App.tsx +0 -2167
  229. package/examples/todo-orbit/generated/web/Todo Orbit/src/main.tsx +0 -13
  230. package/examples/todo-orbit/generated/web/Todo Orbit/src/styles.css +0 -926
  231. package/examples/todo-orbit/generated/web/Todo Orbit/tsconfig.json +0 -19
  232. package/examples/todo-orbit/generated/web/Todo Orbit/vite.config.ts +0 -6
@@ -1,293 +0,0 @@
1
- package com.social.app.ui.screens
2
-
3
- import androidx.compose.foundation.clickable
4
- import androidx.compose.foundation.layout.Arrangement
5
- import androidx.compose.foundation.layout.Column
6
- import androidx.compose.foundation.layout.PaddingValues
7
- import androidx.compose.foundation.layout.Row
8
- import androidx.compose.foundation.layout.fillMaxSize
9
- import androidx.compose.foundation.layout.fillMaxWidth
10
- import androidx.compose.foundation.layout.heightIn
11
- import androidx.compose.foundation.layout.imePadding
12
- import androidx.compose.foundation.layout.padding
13
- import androidx.compose.foundation.layout.size
14
- import androidx.compose.foundation.lazy.LazyColumn
15
- import androidx.compose.foundation.lazy.items
16
- import androidx.compose.material.icons.Icons
17
- import androidx.compose.material.icons.automirrored.filled.ArrowBack
18
- import androidx.compose.material.icons.filled.Send
19
- import androidx.compose.material.icons.outlined.ChatBubbleOutline
20
- import androidx.compose.material.icons.outlined.FavoriteBorder
21
- import androidx.compose.material3.ExperimentalMaterial3Api
22
- import androidx.compose.material3.Icon
23
- import androidx.compose.material3.IconButton
24
- import androidx.compose.material3.IconButtonDefaults
25
- import androidx.compose.material3.MaterialTheme
26
- import androidx.compose.material3.Scaffold
27
- import androidx.compose.material3.SnackbarHostState
28
- import androidx.compose.material3.Surface
29
- import androidx.compose.material3.Text
30
- import androidx.compose.material3.TopAppBar
31
- import androidx.compose.material3.TopAppBarDefaults
32
- import androidx.compose.runtime.Composable
33
- import androidx.compose.runtime.getValue
34
- import androidx.compose.runtime.mutableStateOf
35
- import androidx.compose.runtime.remember
36
- import androidx.compose.runtime.rememberCoroutineScope
37
- import androidx.compose.runtime.setValue
38
- import androidx.compose.ui.Alignment
39
- import androidx.compose.ui.Modifier
40
- import androidx.compose.ui.layout.ContentScale
41
- import androidx.compose.ui.res.stringResource
42
- import androidx.compose.ui.unit.dp
43
- import coil3.compose.AsyncImage
44
- import com.social.app.R
45
- import com.social.app.data.MockData
46
- import com.social.app.ui.components.ActionTriggerButton
47
- import com.social.app.ui.components.ActionTriggerVariant
48
- import com.social.app.ui.components.ContractListCard
49
- import com.social.app.ui.components.ContractSectionHeader
50
- import com.social.app.ui.components.ContractSnackbarHost
51
- import com.social.app.ui.components.ContractTextField
52
- import com.social.app.ui.theme.Shapes
53
- import com.social.app.ui.theme.Spacing
54
- import kotlinx.coroutines.delay
55
- import kotlinx.coroutines.launch
56
-
57
- private data class CommentItem(
58
- val authorId: String,
59
- val authorName: String,
60
- val authorAvatar: String?,
61
- val body: String,
62
- val timestamp: String,
63
- )
64
-
65
- @OptIn(ExperimentalMaterial3Api::class)
66
- @Composable
67
- fun PostDetailScreen(
68
- postId: String,
69
- onBackClick: () -> Unit,
70
- onUserClick: (String) -> Unit,
71
- ) {
72
- val post = MockData.posts.find { it.id == postId } ?: MockData.posts[0]
73
- val comments =
74
- remember(postId) {
75
- listOf(
76
- CommentItem(
77
- authorId = "u_9921",
78
- authorName = "Elara Vance",
79
- authorAvatar = MockData.users.find { it.id == "u_9921" }?.avatarUrl,
80
- body = "The framing on this is excellent. That early-morning light is doing a lot of work.",
81
- timestamp = "18m ago",
82
- ),
83
- CommentItem(
84
- authorId = "u_4432",
85
- authorName = "Kai Nakamura",
86
- authorAvatar = MockData.users.find { it.id == "u_4432" }?.avatarUrl,
87
- body = "You captured the quiet before the rush really well.",
88
- timestamp = "42m ago",
89
- ),
90
- CommentItem(
91
- authorId = "user_me",
92
- authorName = "Rustam Abdurahmonov",
93
- authorAvatar = MockData.users.find { it.id == "user_me" }?.avatarUrl,
94
- body = "Appreciate it. The empty room was the whole reason I stopped in.",
95
- timestamp = "1h ago",
96
- ),
97
- )
98
- }
99
- var commentText by remember { mutableStateOf("") }
100
- val snackbarHostState = remember { SnackbarHostState() }
101
- val scope = rememberCoroutineScope()
102
- val commentSentLabel = stringResource(R.string.post_comment_sent)
103
-
104
- Scaffold(
105
- snackbarHost = { ContractSnackbarHost(hostState = snackbarHostState) },
106
- topBar = {
107
- TopAppBar(
108
- title = { Text(post.authorName) },
109
- navigationIcon = {
110
- IconButton(onClick = onBackClick) {
111
- Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null)
112
- }
113
- },
114
- colors = TopAppBarDefaults.topAppBarColors(containerColor = MaterialTheme.colorScheme.surface),
115
- )
116
- },
117
- bottomBar = {
118
- Surface(
119
- tonalElevation = 2.dp,
120
- modifier = Modifier.imePadding(),
121
- ) {
122
- Row(
123
- modifier =
124
- Modifier
125
- .fillMaxWidth()
126
- .padding(Spacing.MD),
127
- verticalAlignment = Alignment.CenterVertically,
128
- ) {
129
- ContractTextField(
130
- value = commentText,
131
- onValueChange = { commentText = it },
132
- modifier = Modifier.weight(1f),
133
- label = stringResource(R.string.post_comment_placeholder),
134
- placeholder = stringResource(R.string.post_comment_placeholder),
135
- singleLine = false,
136
- maxLines = 4,
137
- trailingAction = {
138
- IconButton(
139
- onClick = {
140
- commentText = ""
141
- scope.launch {
142
- snackbarHostState.currentSnackbarData?.dismiss()
143
- snackbarHostState.showSnackbar(message = commentSentLabel)
144
- }
145
- scope.launch {
146
- delay(3000)
147
- snackbarHostState.currentSnackbarData?.dismiss()
148
- }
149
- },
150
- enabled = commentText.isNotBlank(),
151
- colors =
152
- IconButtonDefaults.iconButtonColors(
153
- contentColor = MaterialTheme.colorScheme.primary,
154
- ),
155
- ) {
156
- Icon(Icons.Default.Send, contentDescription = null)
157
- }
158
- },
159
- )
160
- }
161
- }
162
- },
163
- ) { padding ->
164
- LazyColumn(
165
- modifier =
166
- Modifier
167
- .fillMaxSize()
168
- .padding(padding),
169
- contentPadding = PaddingValues(bottom = Spacing.MD),
170
- verticalArrangement = Arrangement.spacedBy(Spacing.SM),
171
- ) {
172
- item {
173
- Surface(
174
- modifier =
175
- Modifier
176
- .fillMaxWidth()
177
- .padding(horizontal = Spacing.MD, vertical = Spacing.SM)
178
- .clickable { onUserClick(post.authorId) },
179
- shape = Shapes.HeroShape,
180
- color = MaterialTheme.colorScheme.surfaceVariant,
181
- ) {
182
- Column(
183
- modifier =
184
- Modifier
185
- .fillMaxWidth()
186
- .padding(Spacing.LG),
187
- verticalArrangement = Arrangement.spacedBy(Spacing.MD),
188
- ) {
189
- Row(
190
- horizontalArrangement = Arrangement.spacedBy(Spacing.SM),
191
- verticalAlignment = Alignment.CenterVertically,
192
- ) {
193
- Surface(
194
- modifier = Modifier.size(52.dp),
195
- shape = Shapes.RoundedCapPrimary,
196
- color = MaterialTheme.colorScheme.surface,
197
- ) {
198
- if (post.authorAvatar != null) {
199
- AsyncImage(
200
- model = post.authorAvatar,
201
- contentDescription = post.authorName,
202
- modifier = Modifier.fillMaxSize(),
203
- contentScale = ContentScale.Crop,
204
- )
205
- }
206
- }
207
- Column {
208
- Text(post.authorName, style = MaterialTheme.typography.headlineLarge)
209
- Text(
210
- text = "@${post.authorHandle}",
211
- style = MaterialTheme.typography.bodyMedium,
212
- color = MaterialTheme.colorScheme.onSurfaceVariant,
213
- )
214
- }
215
- }
216
-
217
- Text(
218
- text = post.body,
219
- style = MaterialTheme.typography.bodyLarge,
220
- color = MaterialTheme.colorScheme.onSurface,
221
- )
222
-
223
- if (post.mediaUrl != null) {
224
- AsyncImage(
225
- model = post.mediaUrl,
226
- contentDescription = null,
227
- modifier =
228
- Modifier
229
- .fillMaxWidth()
230
- .heightIn(max = 400.dp),
231
- contentScale = ContentScale.Crop,
232
- )
233
- }
234
-
235
- Row(
236
- horizontalArrangement = Arrangement.spacedBy(Spacing.LG),
237
- verticalAlignment = Alignment.CenterVertically,
238
- ) {
239
- Row(
240
- horizontalArrangement = Arrangement.spacedBy(Spacing.XS),
241
- verticalAlignment = Alignment.CenterVertically,
242
- ) {
243
- Icon(Icons.Outlined.FavoriteBorder, contentDescription = null, modifier = Modifier.size(20.dp))
244
- Text(post.likeCount.toString(), style = MaterialTheme.typography.labelLarge)
245
- }
246
- Row(
247
- horizontalArrangement = Arrangement.spacedBy(Spacing.XS),
248
- verticalAlignment = Alignment.CenterVertically,
249
- ) {
250
- Icon(Icons.Outlined.ChatBubbleOutline, contentDescription = null, modifier = Modifier.size(20.dp))
251
- Text(post.commentCount.toString(), style = MaterialTheme.typography.labelLarge)
252
- }
253
- }
254
- }
255
- }
256
- }
257
-
258
- item {
259
- ActionTriggerButton(
260
- text = stringResource(R.string.post_like_action),
261
- onClick = {},
262
- modifier = Modifier.padding(horizontal = Spacing.MD),
263
- variant = ActionTriggerVariant.Secondary,
264
- icon = { Icon(Icons.Outlined.FavoriteBorder, contentDescription = null) },
265
- )
266
- }
267
-
268
- item {
269
- ContractSectionHeader(stringResource(R.string.post_comments_header))
270
- }
271
-
272
- if (comments.isEmpty()) {
273
- item {
274
- ContractListCard(
275
- title = stringResource(R.string.post_no_comments),
276
- modifier = Modifier.padding(horizontal = Spacing.MD),
277
- )
278
- }
279
- } else {
280
- items(comments) { comment ->
281
- ContractListCard(
282
- title = comment.authorName,
283
- body = comment.body,
284
- trailing = comment.timestamp,
285
- avatarUrl = comment.authorAvatar,
286
- modifier = Modifier.padding(horizontal = Spacing.MD),
287
- onClick = { onUserClick(comment.authorId) },
288
- )
289
- }
290
- }
291
- }
292
- }
293
- }
@@ -1,116 +0,0 @@
1
- package com.social.app.ui.screens
2
-
3
- import androidx.compose.foundation.layout.Box
4
- import androidx.compose.foundation.layout.fillMaxSize
5
- import androidx.compose.foundation.layout.fillMaxWidth
6
- import androidx.compose.foundation.layout.padding
7
- import androidx.compose.foundation.lazy.LazyColumn
8
- import androidx.compose.foundation.lazy.items
9
- import androidx.compose.material.icons.Icons
10
- import androidx.compose.material.icons.filled.Edit
11
- import androidx.compose.material.icons.filled.Settings
12
- import androidx.compose.material3.CenterAlignedTopAppBar
13
- import androidx.compose.material3.ExperimentalMaterial3Api
14
- import androidx.compose.material3.Icon
15
- import androidx.compose.material3.IconButton
16
- import androidx.compose.material3.MaterialTheme
17
- import androidx.compose.material3.Scaffold
18
- import androidx.compose.material3.Text
19
- import androidx.compose.material3.TopAppBarDefaults
20
- import androidx.compose.runtime.Composable
21
- import androidx.compose.ui.Alignment
22
- import androidx.compose.ui.Modifier
23
- import androidx.compose.ui.res.stringResource
24
- import com.social.app.R
25
- import com.social.app.data.MockData
26
- import com.social.app.ui.components.ActionTriggerVariant
27
- import com.social.app.ui.components.ContractListCard
28
- import com.social.app.ui.components.ContractSectionHeader
29
- import com.social.app.ui.components.PostItem
30
- import com.social.app.ui.components.ProfileHeroCard
31
- import com.social.app.ui.theme.Spacing
32
-
33
- @OptIn(ExperimentalMaterial3Api::class)
34
- @Composable
35
- fun ProfileSelfScreen(
36
- onEditProfileClick: () -> Unit,
37
- onPostClick: (String) -> Unit,
38
- onSettingsClick: () -> Unit
39
- ) {
40
- val user = MockData.users.find { it.id == "user_me" } ?: MockData.users[0]
41
- val userPosts = MockData.posts.filter { it.authorId == user.id }
42
-
43
- Scaffold(
44
- modifier = Modifier.fillMaxSize(),
45
- topBar = {
46
- CenterAlignedTopAppBar(
47
- title = { Text(stringResource(R.string.nav_profile)) },
48
- actions = {
49
- IconButton(onClick = onSettingsClick) {
50
- Icon(Icons.Default.Settings, contentDescription = stringResource(R.string.nav_settings))
51
- }
52
- },
53
- colors = TopAppBarDefaults.centerAlignedTopAppBarColors(
54
- containerColor = MaterialTheme.colorScheme.surface
55
- )
56
- )
57
- }
58
- ) { padding ->
59
- LazyColumn(
60
- modifier = Modifier
61
- .fillMaxSize()
62
- .padding(padding)
63
- ) {
64
- item {
65
- ProfileHeroCard(
66
- title = user.displayName,
67
- subtitle = "@${user.handle}",
68
- body = user.bio,
69
- avatarUrl = user.avatarUrl,
70
- modifier = Modifier
71
- .fillMaxWidth()
72
- .padding(Spacing.MD),
73
- actionLabel = stringResource(R.string.profile_edit_button),
74
- actionVariant = ActionTriggerVariant.Secondary,
75
- actionIcon = { Icon(Icons.Default.Edit, contentDescription = null) },
76
- onActionClick = onEditProfileClick,
77
- )
78
- }
79
-
80
- item {
81
- ContractSectionHeader(stringResource(R.string.profile_posts_header))
82
- }
83
-
84
- if (userPosts.isEmpty()) {
85
- item {
86
- Box(
87
- modifier =
88
- Modifier
89
- .fillMaxWidth()
90
- .padding(horizontal = Spacing.MD, vertical = Spacing.SM),
91
- contentAlignment = Alignment.Center,
92
- ) {
93
- ContractListCard(
94
- title = stringResource(R.string.profile_no_posts_self),
95
- )
96
- }
97
- }
98
- } else {
99
- items(userPosts) { post ->
100
- PostItem(
101
- authorName = post.authorName,
102
- authorHandle = post.authorHandle,
103
- body = post.body,
104
- likeCount = post.likeCount,
105
- commentCount = post.commentCount,
106
- timestamp = post.timestamp,
107
- mediaUrl = post.mediaUrl,
108
- onLikeClick = {},
109
- onAuthorClick = {},
110
- onCommentClick = { onPostClick(post.id) },
111
- )
112
- }
113
- }
114
- }
115
- }
116
- }
@@ -1,161 +0,0 @@
1
- package com.social.app.ui.screens
2
-
3
- import androidx.compose.foundation.layout.Arrangement
4
- import androidx.compose.foundation.layout.fillMaxSize
5
- import androidx.compose.foundation.layout.padding
6
- import androidx.compose.foundation.lazy.LazyColumn
7
- import androidx.compose.foundation.lazy.items
8
- import androidx.compose.material.icons.Icons
9
- import androidx.compose.material.icons.automirrored.filled.ArrowBack
10
- import androidx.compose.material.icons.filled.Search
11
- import androidx.compose.material3.ExperimentalMaterial3Api
12
- import androidx.compose.material3.Icon
13
- import androidx.compose.material3.IconButton
14
- import androidx.compose.material3.Scaffold
15
- import androidx.compose.material3.Text
16
- import androidx.compose.material3.TopAppBar
17
- import androidx.compose.material3.TopAppBarDefaults
18
- import androidx.compose.runtime.Composable
19
- import androidx.compose.runtime.getValue
20
- import androidx.compose.runtime.mutableStateOf
21
- import androidx.compose.runtime.remember
22
- import androidx.compose.runtime.setValue
23
- import androidx.compose.ui.Modifier
24
- import androidx.compose.ui.res.stringResource
25
- import com.social.app.R
26
- import com.social.app.data.MockData
27
- import com.social.app.ui.components.ChipOption
28
- import com.social.app.ui.components.CompactResultRow
29
- import com.social.app.ui.components.ContractChipRow
30
- import com.social.app.ui.components.ContractTextField
31
- import com.social.app.ui.components.PostItem
32
- import com.social.app.ui.theme.Spacing
33
-
34
- @OptIn(ExperimentalMaterial3Api::class)
35
- @Composable
36
- fun SearchResultsScreen(
37
- query: String,
38
- initialTab: String = "posts",
39
- onBackClick: () -> Unit,
40
- onPostClick: (String) -> Unit,
41
- onUserClick: (String) -> Unit
42
- ) {
43
- var searchQuery by remember { mutableStateOf(query) }
44
- var activeTab by remember { mutableStateOf(initialTab) }
45
-
46
- Scaffold(
47
- topBar = {
48
- TopAppBar(
49
- title = { Text(stringResource(R.string.search_placeholder)) },
50
- navigationIcon = {
51
- IconButton(onClick = onBackClick) {
52
- Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null)
53
- }
54
- },
55
- colors = TopAppBarDefaults.topAppBarColors(containerColor = androidx.compose.material3.MaterialTheme.colorScheme.surface)
56
- )
57
- }
58
- ) { padding ->
59
- LazyColumn(
60
- modifier = Modifier
61
- .fillMaxSize()
62
- .padding(padding),
63
- verticalArrangement = Arrangement.spacedBy(Spacing.SM),
64
- ) {
65
- item {
66
- ContractTextField(
67
- value = searchQuery,
68
- onValueChange = { searchQuery = it },
69
- modifier = Modifier.padding(horizontal = Spacing.MD, vertical = Spacing.SM),
70
- label = stringResource(R.string.search_placeholder),
71
- placeholder = stringResource(R.string.search_placeholder),
72
- leadingIcon = { Icon(Icons.Default.Search, contentDescription = null) },
73
- )
74
- }
75
-
76
- item {
77
- ContractChipRow(
78
- options =
79
- listOf(
80
- ChipOption("posts", stringResource(R.string.search_tab_posts)),
81
- ChipOption("people", stringResource(R.string.search_tab_people)),
82
- ChipOption("tags", stringResource(R.string.search_tab_tags)),
83
- ),
84
- selectedValue = activeTab,
85
- onSelect = { activeTab = it.value },
86
- )
87
- }
88
-
89
- when (activeTab) {
90
- "posts" -> {
91
- if (MockData.posts.isEmpty()) {
92
- item {
93
- Text(
94
- text = stringResource(R.string.search_no_results),
95
- modifier = Modifier.padding(horizontal = Spacing.MD, vertical = Spacing.XL),
96
- )
97
- }
98
- } else {
99
- items(MockData.posts) { post ->
100
- PostItem(
101
- authorName = post.authorName,
102
- authorHandle = post.authorHandle,
103
- authorAvatar = post.authorAvatar,
104
- body = post.body,
105
- likeCount = post.likeCount,
106
- commentCount = post.commentCount,
107
- timestamp = post.timestamp,
108
- mediaUrl = post.mediaUrl,
109
- onLikeClick = {},
110
- onCommentClick = { onPostClick(post.id) },
111
- onAuthorClick = { onUserClick(post.authorId) }
112
- )
113
- }
114
- }
115
- }
116
- "people" -> {
117
- val people = MockData.users
118
- if (people.isEmpty()) {
119
- item {
120
- Text(
121
- text = stringResource(R.string.search_no_results),
122
- modifier = Modifier.padding(horizontal = Spacing.MD, vertical = Spacing.XL),
123
- )
124
- }
125
- } else {
126
- items(people) { user ->
127
- val linkedPostId = MockData.posts.find { it.authorId == user.id }?.id ?: MockData.posts.firstOrNull()?.id
128
- CompactResultRow(
129
- title = user.displayName,
130
- subtitle = "@${user.handle}",
131
- avatarUrl = user.avatarUrl,
132
- onClick = { linkedPostId?.let(onPostClick) },
133
- )
134
- }
135
- }
136
- }
137
- "tags" -> {
138
- val tags = MockData.trends
139
- if (tags.isEmpty()) {
140
- item {
141
- Text(
142
- text = stringResource(R.string.search_no_results),
143
- modifier = Modifier.padding(horizontal = Spacing.MD, vertical = Spacing.XL),
144
- )
145
- }
146
- } else {
147
- items(tags) { trend ->
148
- val linkedPostId = MockData.posts.firstOrNull()?.id
149
- CompactResultRow(
150
- title = "#${trend.label}",
151
- subtitle = trend.postCount.toString(),
152
- avatarUrl = null,
153
- onClick = { linkedPostId?.let(onPostClick) },
154
- )
155
- }
156
- }
157
- }
158
- }
159
- }
160
- }
161
- }