openuispec 0.1.45 → 0.1.47

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 (138) hide show
  1. package/README.md +17 -5
  2. package/cli/init.ts +21 -3
  3. package/examples/social-app/.mcp.json +10 -0
  4. package/examples/social-app/AGENTS.md +114 -0
  5. package/examples/social-app/CLAUDE.md +114 -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 +164 -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 +259 -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 +340 -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 +103 -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 +79 -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 +104 -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 +138 -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 +99 -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/examples/taskflow/openuispec/openuispec.yaml +2 -0
  134. package/examples/todo-orbit/openuispec/openuispec.yaml +2 -0
  135. package/mcp-server/index.ts +200 -10
  136. package/package.json +1 -1
  137. package/schema/openuispec.schema.json +7 -0
  138. package/spec/openuispec-v0.1.md +13 -0
@@ -0,0 +1,66 @@
1
+ create_post:
2
+ semantic: "Single-step flow to compose and publish a new post"
3
+ entry: "compose"
4
+
5
+ screens:
6
+ compose:
7
+ screen_inline:
8
+ semantic: "Post composition form with text, media, and audience selection"
9
+
10
+ state:
11
+ body: { type: string, default: "" }
12
+ media: { type: string, default: "" }
13
+ audience: { type: string, default: "public" }
14
+
15
+ layout:
16
+ type: scroll_vertical
17
+ sections:
18
+ - id: form
19
+ form_id: "post_form"
20
+ children:
21
+ - contract: input_field
22
+ input_type: text
23
+ props:
24
+ label: "$t:create_post.body_placeholder"
25
+ value: "state.body"
26
+ multiline: true
27
+ max_length: 4000
28
+ data_binding: "form.body"
29
+
30
+ - contract: input_field
31
+ input_type: select
32
+ props:
33
+ label: "$t:create_post.audience"
34
+ value: "state.audience"
35
+ options:
36
+ - { value: "public", label: "$t:create_post.audience_public" }
37
+ - { value: "followers", label: "$t:create_post.audience_followers" }
38
+ data_binding: "form.audience"
39
+
40
+ - id: media_bar
41
+ contract: action_trigger
42
+ variant: secondary
43
+ props:
44
+ label: "$t:create_post.add_image"
45
+ icon: "image"
46
+ action:
47
+ type: share
48
+ content: "media_picker"
49
+
50
+ - id: publish_button
51
+ contract: action_trigger
52
+ variant: primary
53
+ props:
54
+ label: "$t:create_post.publish"
55
+ full_width: true
56
+ action:
57
+ type: sequence
58
+ actions:
59
+ - type: api_call
60
+ endpoint: "api.posts.create"
61
+ body:
62
+ body: "form.body"
63
+ media: "form.media"
64
+ audience: "form.audience"
65
+ - { type: feedback, variant: toast, message: "$t:create_post.success" }
66
+ - { type: dismiss }
@@ -0,0 +1,67 @@
1
+ {
2
+ "$locale": "en",
3
+ "$direction": "ltr",
4
+ "nav.home": "Home",
5
+ "nav.discover": "Discover",
6
+ "nav.create": "Create",
7
+ "nav.notifications": "Notifications",
8
+ "nav.profile": "Profile",
9
+ "home.filter_all": "All",
10
+ "home.filter_following": "Following",
11
+ "home.filter_popular": "Popular",
12
+ "home.empty_feed": "No posts yet. Follow people to see their posts here.",
13
+ "discover.search_placeholder": "Search posts, people, tags…",
14
+ "discover.trending": "Trending",
15
+ "discover.popular_tags": "Popular Tags",
16
+ "discover.suggested_creators": "Suggested Creators",
17
+ "search.placeholder": "Search…",
18
+ "search.tab_posts": "Posts",
19
+ "search.tab_people": "People",
20
+ "search.tab_tags": "Tags",
21
+ "search.no_results": "No results found.",
22
+ "post.comments_header": "Comments",
23
+ "post.no_comments": "No comments yet. Be the first to comment.",
24
+ "post.comment_placeholder": "Write a comment…",
25
+ "post.comment_sent": "Comment posted.",
26
+ "post.like_action": "Like",
27
+ "profile.edit_button": "Edit Profile",
28
+ "profile.follow_button": "Follow",
29
+ "profile.posts_header": "Posts",
30
+ "profile.no_posts_self": "You haven't posted anything yet.",
31
+ "profile.no_posts_user": "This user hasn't posted anything yet.",
32
+ "edit_profile.avatar": "Profile Photo",
33
+ "edit_profile.display_name": "Display Name",
34
+ "edit_profile.handle": "Username",
35
+ "edit_profile.bio": "Bio",
36
+ "edit_profile.website": "Website",
37
+ "edit_profile.save": "Save Changes",
38
+ "edit_profile.saved": "Profile updated.",
39
+ "notifications.empty": "No notifications yet.",
40
+ "messages.search_placeholder": "Search conversations…",
41
+ "messages.empty_inbox": "No conversations yet.",
42
+ "chat.message_placeholder": "Type a message…",
43
+ "chat.empty_thread": "Start the conversation.",
44
+ "create_post.body_placeholder": "What's on your mind?",
45
+ "create_post.audience": "Audience",
46
+ "create_post.audience_public": "Public",
47
+ "create_post.audience_followers": "Followers Only",
48
+ "create_post.add_image": "Add Image",
49
+ "create_post.take_photo": "Take Photo",
50
+ "create_post.publish": "Publish",
51
+ "create_post.success": "Post published!",
52
+ "settings.appearance": "Appearance",
53
+ "settings.theme": "Theme",
54
+ "settings.theme_system": "System",
55
+ "settings.theme_light": "Light",
56
+ "settings.theme_dark": "Dark",
57
+ "settings.notifications": "Notifications",
58
+ "settings.push_notifications": "Push Notifications",
59
+ "settings.message_previews": "Message Previews",
60
+ "settings.language": "Language",
61
+ "settings.auto_translate": "Auto-translate Posts",
62
+ "settings.account": "Account",
63
+ "settings.edit_profile": "Edit Profile",
64
+ "settings.logout": "Log Out",
65
+ "settings.logout_confirm": "Are you sure you want to log out?",
66
+ "common.cancel": "Cancel"
67
+ }
@@ -0,0 +1,67 @@
1
+ {
2
+ "$locale": "ru",
3
+ "$direction": "ltr",
4
+ "nav.home": "Главная",
5
+ "nav.discover": "Обзор",
6
+ "nav.create": "Создать",
7
+ "nav.notifications": "Уведомления",
8
+ "nav.profile": "Профиль",
9
+ "home.filter_all": "Все",
10
+ "home.filter_following": "Подписки",
11
+ "home.filter_popular": "Популярное",
12
+ "home.empty_feed": "Пока нет записей. Подпишитесь на людей, чтобы видеть их публикации.",
13
+ "discover.search_placeholder": "Поиск записей, людей, тегов…",
14
+ "discover.trending": "В тренде",
15
+ "discover.popular_tags": "Популярные теги",
16
+ "discover.suggested_creators": "Рекомендуемые авторы",
17
+ "search.placeholder": "Поиск…",
18
+ "search.tab_posts": "Записи",
19
+ "search.tab_people": "Люди",
20
+ "search.tab_tags": "Теги",
21
+ "search.no_results": "Ничего не найдено.",
22
+ "post.comments_header": "Комментарии",
23
+ "post.no_comments": "Пока нет комментариев. Будьте первым.",
24
+ "post.comment_placeholder": "Написать комментарий…",
25
+ "post.comment_sent": "Комментарий опубликован.",
26
+ "post.like_action": "Нравится",
27
+ "profile.edit_button": "Редактировать",
28
+ "profile.follow_button": "Подписаться",
29
+ "profile.posts_header": "Записи",
30
+ "profile.no_posts_self": "У вас пока нет записей.",
31
+ "profile.no_posts_user": "У этого пользователя пока нет записей.",
32
+ "edit_profile.avatar": "Фото профиля",
33
+ "edit_profile.display_name": "Имя",
34
+ "edit_profile.handle": "Имя пользователя",
35
+ "edit_profile.bio": "О себе",
36
+ "edit_profile.website": "Сайт",
37
+ "edit_profile.save": "Сохранить",
38
+ "edit_profile.saved": "Профиль обновлён.",
39
+ "notifications.empty": "Пока нет уведомлений.",
40
+ "messages.search_placeholder": "Поиск переписок…",
41
+ "messages.empty_inbox": "Пока нет переписок.",
42
+ "chat.message_placeholder": "Написать сообщение…",
43
+ "chat.empty_thread": "Начните разговор.",
44
+ "create_post.body_placeholder": "Что у вас нового?",
45
+ "create_post.audience": "Аудитория",
46
+ "create_post.audience_public": "Все",
47
+ "create_post.audience_followers": "Только подписчики",
48
+ "create_post.add_image": "Добавить фото",
49
+ "create_post.take_photo": "Сделать фото",
50
+ "create_post.publish": "Опубликовать",
51
+ "create_post.success": "Запись опубликована!",
52
+ "settings.appearance": "Оформление",
53
+ "settings.theme": "Тема",
54
+ "settings.theme_system": "Системная",
55
+ "settings.theme_light": "Светлая",
56
+ "settings.theme_dark": "Тёмная",
57
+ "settings.notifications": "Уведомления",
58
+ "settings.push_notifications": "Push-уведомления",
59
+ "settings.message_previews": "Превью сообщений",
60
+ "settings.language": "Язык",
61
+ "settings.auto_translate": "Автоперевод записей",
62
+ "settings.account": "Аккаунт",
63
+ "settings.edit_profile": "Редактировать профиль",
64
+ "settings.logout": "Выйти",
65
+ "settings.logout_confirm": "Вы уверены, что хотите выйти?",
66
+ "common.cancel": "Отмена"
67
+ }
@@ -0,0 +1,67 @@
1
+ {
2
+ "$locale": "uz",
3
+ "$direction": "ltr",
4
+ "nav.home": "Bosh sahifa",
5
+ "nav.discover": "Kashfiyot",
6
+ "nav.create": "Yaratish",
7
+ "nav.notifications": "Bildirishnomalar",
8
+ "nav.profile": "Profil",
9
+ "home.filter_all": "Hammasi",
10
+ "home.filter_following": "Obunalar",
11
+ "home.filter_popular": "Ommabop",
12
+ "home.empty_feed": "Hozircha postlar yoʻq. Postlarini koʻrish uchun odamlarga obuna boʻling.",
13
+ "discover.search_placeholder": "Postlar, odamlar, teglar qidirish…",
14
+ "discover.trending": "Trendda",
15
+ "discover.popular_tags": "Ommabop teglar",
16
+ "discover.suggested_creators": "Tavsiya etilgan mualliflar",
17
+ "search.placeholder": "Qidirish…",
18
+ "search.tab_posts": "Postlar",
19
+ "search.tab_people": "Odamlar",
20
+ "search.tab_tags": "Teglar",
21
+ "search.no_results": "Hech narsa topilmadi.",
22
+ "post.comments_header": "Izohlar",
23
+ "post.no_comments": "Hozircha izohlar yoʻq. Birinchi boʻling.",
24
+ "post.comment_placeholder": "Izoh yozish…",
25
+ "post.comment_sent": "Izoh joʻnatildi.",
26
+ "post.like_action": "Yoqtirish",
27
+ "profile.edit_button": "Tahrirlash",
28
+ "profile.follow_button": "Obuna boʻlish",
29
+ "profile.posts_header": "Postlar",
30
+ "profile.no_posts_self": "Sizda hozircha postlar yoʻq.",
31
+ "profile.no_posts_user": "Bu foydalanuvchida hozircha postlar yoʻq.",
32
+ "edit_profile.avatar": "Profil rasmi",
33
+ "edit_profile.display_name": "Ism",
34
+ "edit_profile.handle": "Foydalanuvchi nomi",
35
+ "edit_profile.bio": "Bio",
36
+ "edit_profile.website": "Veb-sayt",
37
+ "edit_profile.save": "Saqlash",
38
+ "edit_profile.saved": "Profil yangilandi.",
39
+ "notifications.empty": "Hozircha bildirishnomalar yoʻq.",
40
+ "messages.search_placeholder": "Suhbatlarni qidirish…",
41
+ "messages.empty_inbox": "Hozircha suhbatlar yoʻq.",
42
+ "chat.message_placeholder": "Xabar yozish…",
43
+ "chat.empty_thread": "Suhbatni boshlang.",
44
+ "create_post.body_placeholder": "Nima yangiliklar?",
45
+ "create_post.audience": "Auditoriya",
46
+ "create_post.audience_public": "Hamma",
47
+ "create_post.audience_followers": "Faqat obunachilar",
48
+ "create_post.add_image": "Rasm qoʻshish",
49
+ "create_post.take_photo": "Suratga olish",
50
+ "create_post.publish": "Eʼlon qilish",
51
+ "create_post.success": "Post eʼlon qilindi!",
52
+ "settings.appearance": "Koʻrinish",
53
+ "settings.theme": "Mavzu",
54
+ "settings.theme_system": "Tizim",
55
+ "settings.theme_light": "Yorugʻ",
56
+ "settings.theme_dark": "Qorongʻu",
57
+ "settings.notifications": "Bildirishnomalar",
58
+ "settings.push_notifications": "Push-bildirishnomalar",
59
+ "settings.message_previews": "Xabar koʻrinishi",
60
+ "settings.language": "Til",
61
+ "settings.auto_translate": "Postlarni avtotarjima qilish",
62
+ "settings.account": "Hisob",
63
+ "settings.edit_profile": "Profilni tahrirlash",
64
+ "settings.logout": "Chiqish",
65
+ "settings.logout_confirm": "Chiqishga ishonchingiz komilmi?",
66
+ "common.cancel": "Bekor qilish"
67
+ }
@@ -0,0 +1,214 @@
1
+ # social-app — OpenUISpec v0.1
2
+ spec_version: "0.1"
3
+
4
+ project:
5
+ name: "social-app"
6
+ description: ""
7
+
8
+ includes:
9
+ tokens: "./tokens/"
10
+ contracts: "./contracts/"
11
+ screens: "./screens/"
12
+ flows: "./flows/"
13
+ platform: "./platform/"
14
+ locales: "./locales/"
15
+
16
+ i18n:
17
+ default_locale: "en"
18
+ supported_locales: [en, ru, uz]
19
+ fallback_strategy: "default"
20
+
21
+ generation:
22
+ targets: [ios, android, web]
23
+ # output_dir: # Optional: map targets to code directories
24
+ # ios: "../ios-app/" # relative to this file
25
+ # android: "../android-app/"
26
+ # web: "../web-ui/"
27
+ code_roots:
28
+ backend: "../backend/" # Required when api.endpoints are declared
29
+ output_format:
30
+ ios: { language: swift, framework: swiftui, min_version: "17.0" }
31
+ android: { language: kotlin, framework: compose, min_sdk: 26 }
32
+ web: { language: typescript, framework: react, bundler: vite }
33
+
34
+ data_model:
35
+ user:
36
+ id: { type: string, required: true }
37
+ handle: { type: string, required: true }
38
+ display_name: { type: string, required: true }
39
+ avatar_url: { type: string }
40
+ bio: { type: string }
41
+
42
+ post:
43
+ id: { type: string, required: true }
44
+ author_id: { type: string, required: true }
45
+ body: { type: string, required: true, max_length: 4000 }
46
+ media_url: { type: string }
47
+ media_type: { type: string, values: [image, video] }
48
+ like_count: { type: integer, default: 0 }
49
+ comment_count: { type: integer, default: 0 }
50
+ published_at: { type: string, format: date-time, required: true }
51
+
52
+ comment:
53
+ id: { type: string, required: true }
54
+ post_id: { type: string, required: true }
55
+ author_id: { type: string, required: true }
56
+ body: { type: string, required: true, max_length: 1200 }
57
+ created_at: { type: string, format: date-time, required: true }
58
+
59
+ story:
60
+ id: { type: string, required: true }
61
+ author_id: { type: string, required: true }
62
+ preview_url: { type: string }
63
+ active: { type: boolean, default: true }
64
+
65
+ conversation:
66
+ id: { type: string, required: true }
67
+ title: { type: string }
68
+ unread_count: { type: integer, default: 0 }
69
+
70
+ notification:
71
+ id: { type: string, required: true }
72
+ type: { type: string, required: true }
73
+ actor_id: { type: string }
74
+ post_id: { type: string }
75
+ created_at: { type: string, format: date-time, required: true }
76
+
77
+ preference:
78
+ theme: { type: string, values: [system, light, dark], default: system }
79
+ push_notifications: { type: boolean, default: true }
80
+ message_previews: { type: boolean, default: true }
81
+ auto_translate: { type: boolean, default: false }
82
+
83
+ api:
84
+ base_url: "/api/v1"
85
+ auth: "bearer_token"
86
+ endpoints:
87
+ feed:
88
+ list:
89
+ method: GET
90
+ path: "/feed"
91
+ params: [filter, search, cursor]
92
+ stories:
93
+ method: GET
94
+ path: "/feed/stories"
95
+ summary:
96
+ method: GET
97
+ path: "/feed/summary"
98
+
99
+ discover:
100
+ creators:
101
+ method: GET
102
+ path: "/discover/creators"
103
+ trends:
104
+ method: GET
105
+ path: "/discover/trends"
106
+ tags:
107
+ method: GET
108
+ path: "/discover/tags"
109
+ search:
110
+ method: GET
111
+ path: "/search"
112
+ params: [query, tab]
113
+
114
+ posts:
115
+ getById:
116
+ method: GET
117
+ path: "/posts/:id"
118
+ params: [id]
119
+ comments:
120
+ method: GET
121
+ path: "/posts/:id/comments"
122
+ params: [id]
123
+ create:
124
+ method: POST
125
+ path: "/posts"
126
+ body:
127
+ body: string
128
+ media: string
129
+ audience: string
130
+ tags: array
131
+ toggleLike:
132
+ method: POST
133
+ path: "/posts/:id/likes/toggle"
134
+ params: [id]
135
+ save:
136
+ method: POST
137
+ path: "/posts/:id/save"
138
+ params: [id]
139
+
140
+ notifications:
141
+ unreadCount:
142
+ method: GET
143
+ path: "/notifications/unread-count"
144
+ list:
145
+ method: GET
146
+ path: "/notifications"
147
+ markRead:
148
+ method: POST
149
+ path: "/notifications/:id/read"
150
+ params: [id]
151
+
152
+ profiles:
153
+ me:
154
+ method: GET
155
+ path: "/profiles/me"
156
+ getById:
157
+ method: GET
158
+ path: "/profiles/:id"
159
+ params: [id]
160
+ posts:
161
+ method: GET
162
+ path: "/profiles/:id/posts"
163
+ params: [id]
164
+ myPosts:
165
+ method: GET
166
+ path: "/profiles/me/posts"
167
+ follow:
168
+ method: POST
169
+ path: "/profiles/:id/follow"
170
+ params: [id]
171
+ updateMe:
172
+ method: PATCH
173
+ path: "/profiles/me"
174
+ body:
175
+ display_name: string
176
+ handle: string
177
+ bio: string
178
+ website: string
179
+
180
+ messages:
181
+ list:
182
+ method: GET
183
+ path: "/messages/conversations"
184
+ params: [search]
185
+ getById:
186
+ method: GET
187
+ path: "/messages/conversations/:id"
188
+ params: [id]
189
+ thread:
190
+ method: GET
191
+ path: "/messages/conversations/:id/messages"
192
+ params: [id]
193
+ send:
194
+ method: POST
195
+ path: "/messages/conversations/:id/messages"
196
+ params: [id]
197
+ body:
198
+ body: string
199
+ start:
200
+ method: POST
201
+ path: "/messages/conversations"
202
+ body:
203
+ user_id: string
204
+
205
+ preferences:
206
+ get:
207
+ method: GET
208
+ path: "/preferences"
209
+ update:
210
+ method: PATCH
211
+ path: "/preferences"
212
+ body:
213
+ key: string
214
+ value: string
@@ -0,0 +1,30 @@
1
+ android:
2
+ framework: compose
3
+ generation:
4
+ naming: Kotlin conventions
5
+ architecture: decompose
6
+ state: mvikotlin
7
+ preferences: datastore
8
+ database: none
9
+ di: metro
10
+ dependencies:
11
+ - material3
12
+ - activity-compose
13
+ - decompose
14
+ - decompose-compose
15
+ - essenty-lifecycle
16
+ - essenty-instance-keeper
17
+ - mvikotlin
18
+ - mvikotlin-main
19
+ - mvikotlin-logging
20
+ - datastore-preferences
21
+ - datastore-core
22
+ - metro
23
+ - metro-compose
24
+ stack_confirmation:
25
+ status: confirmed
26
+ source: user
27
+ confirmed_at: 2026-03-15T15:22:41.488Z
28
+ language: kotlin
29
+ min_sdk: 26
30
+ target_sdk: 35
@@ -0,0 +1,19 @@
1
+ ios:
2
+ framework: swiftui
3
+ generation:
4
+ imports:
5
+ - SwiftUI
6
+ - Foundation
7
+ naming: Swift conventions
8
+ architecture: native swiftui
9
+ state: "@Observable / @State"
10
+ persistence: swiftdata
11
+ di: none
12
+ dependencies:
13
+ - swiftdata
14
+ stack_confirmation:
15
+ status: confirmed
16
+ source: user
17
+ confirmed_at: 2026-03-15T15:22:39.936Z
18
+ language: swift
19
+ min_version: "17.0"
@@ -0,0 +1,23 @@
1
+ web:
2
+ framework: react
3
+ generation:
4
+ bundler: vite
5
+ naming: framework conventions
6
+ runtime: frontend_only
7
+ css: tailwind
8
+ routing: react_router
9
+ state: zustand
10
+ storage_backend: none
11
+ dependencies:
12
+ - vite
13
+ - typescript
14
+ - react
15
+ - react-dom
16
+ - tailwindcss
17
+ - react-router
18
+ - zustand
19
+ stack_confirmation:
20
+ status: confirmed
21
+ source: user
22
+ confirmed_at: 2026-03-15T15:22:42.766Z
23
+ language: typescript
@@ -0,0 +1,53 @@
1
+ chat_detail:
2
+ semantic: "Single conversation thread with message input"
3
+ status: draft
4
+
5
+ params:
6
+ conversation_id: { type: string, required: true }
7
+
8
+ data:
9
+ conversation:
10
+ source: "api.messages.getById"
11
+ params: { id: "params.conversation_id" }
12
+ messages:
13
+ source: "api.messages.thread"
14
+ params: { id: "params.conversation_id" }
15
+ loading: { skeleton: true, count: 10 }
16
+ empty: { message: "$t:chat.empty_thread" }
17
+
18
+ state:
19
+ message_text: { type: string, default: "" }
20
+
21
+ layout:
22
+ type: scroll_vertical
23
+ sections:
24
+ - id: message_list
25
+ contract: collection
26
+ variant: chat_thread
27
+ props:
28
+ data: "messages"
29
+ item_contract: data_display
30
+ item_props_map:
31
+ title: "item.sender.display_name"
32
+ body: "item.body"
33
+ metadata:
34
+ timestamp: "{item.created_at | format:time}"
35
+ is_mine: "{item.is_mine}"
36
+
37
+ - id: message_input
38
+ contract: input_field
39
+ input_type: text
40
+ props:
41
+ label: "$t:chat.message_placeholder"
42
+ value: "state.message_text"
43
+ multiline: true
44
+ trailing_action:
45
+ icon: "send"
46
+ action:
47
+ type: sequence
48
+ actions:
49
+ - type: api_call
50
+ endpoint: "api.messages.send"
51
+ params: { id: "params.conversation_id" }
52
+ body: { body: "state.message_text" }
53
+ - { type: set_state, key: "message_text", value: "" }