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.
- package/README.md +17 -5
- package/cli/init.ts +21 -3
- package/examples/social-app/.mcp.json +10 -0
- package/examples/social-app/AGENTS.md +114 -0
- package/examples/social-app/CLAUDE.md +114 -0
- package/examples/social-app/README.md +19 -0
- package/examples/social-app/backend/.gitkeep +1 -0
- package/examples/social-app/generated/android/social-app/app/build.gradle.kts +92 -0
- package/examples/social-app/generated/android/social-app/app/src/main/AndroidManifest.xml +26 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/AppContainer.kt +20 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/MainActivity.kt +35 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/SocialAppApplication.kt +13 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/data/MockData.kt +98 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/data/preferences/AppPreferences.kt +19 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/data/preferences/DataStorePreferencesRepository.kt +68 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/data/preferences/PreferencesRepository.kt +15 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/model/Models.kt +34 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/MainShell.kt +390 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/components/Components.kt +234 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/components/ContractPrimitives.kt +641 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/navigation/RootComponent.kt +113 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/ChatDetailScreen.kt +212 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/CreatePostScreen.kt +113 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/DiscoverScreen.kt +137 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/EditProfileScreen.kt +180 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/HomeFeedScreen.kt +157 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/MessagesInboxScreen.kt +85 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/NotificationsScreen.kt +74 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/PostDetailScreen.kt +293 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/ProfileSelfScreen.kt +116 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/SearchResultsScreen.kt +161 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/SettingsScreen.kt +164 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/SettingsStore.kt +95 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/UserProfileScreen.kt +123 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/theme/Color.kt +33 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/theme/Shape.kt +41 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/theme/Spacing.kt +20 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/theme/Theme.kt +82 -0
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/theme/Type.kt +60 -0
- package/examples/social-app/generated/android/social-app/app/src/main/res/drawable/ic_launcher_foreground.xml +9 -0
- package/examples/social-app/generated/android/social-app/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/examples/social-app/generated/android/social-app/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
- package/examples/social-app/generated/android/social-app/app/src/main/res/values/strings.xml +91 -0
- package/examples/social-app/generated/android/social-app/app/src/main/res/values/themes.xml +10 -0
- package/examples/social-app/generated/android/social-app/app/src/main/res/values-ru/strings.xml +79 -0
- package/examples/social-app/generated/android/social-app/app/src/main/res/values-uz/strings.xml +79 -0
- package/examples/social-app/generated/android/social-app/app/src/main/xml/AndroidManifest.xml +23 -0
- package/examples/social-app/generated/android/social-app/build.gradle.kts +6 -0
- package/examples/social-app/generated/android/social-app/gradle/libs.versions.toml +48 -0
- package/examples/social-app/generated/android/social-app/gradle/wrapper/gradle-wrapper.properties +8 -0
- package/examples/social-app/generated/android/social-app/gradle.properties +11 -0
- package/examples/social-app/generated/android/social-app/gradlew +25 -0
- package/examples/social-app/generated/android/social-app/settings.gradle.kts +23 -0
- package/examples/social-app/generated/web/social-app/index.html +12 -0
- package/examples/social-app/generated/web/social-app/package-lock.json +2517 -0
- package/examples/social-app/generated/web/social-app/package.json +27 -0
- package/examples/social-app/generated/web/social-app/src/app/App.tsx +58 -0
- package/examples/social-app/generated/web/social-app/src/components/Shell.tsx +259 -0
- package/examples/social-app/generated/web/social-app/src/components/cards.tsx +317 -0
- package/examples/social-app/generated/web/social-app/src/components/ui.tsx +340 -0
- package/examples/social-app/generated/web/social-app/src/flows/CreatePostFlow.tsx +86 -0
- package/examples/social-app/generated/web/social-app/src/i18n.tsx +59 -0
- package/examples/social-app/generated/web/social-app/src/lib/icons.tsx +85 -0
- package/examples/social-app/generated/web/social-app/src/lib/tokens.ts +70 -0
- package/examples/social-app/generated/web/social-app/src/lib/utils.ts +97 -0
- package/examples/social-app/generated/web/social-app/src/locales/en.json +67 -0
- package/examples/social-app/generated/web/social-app/src/locales/ru.json +67 -0
- package/examples/social-app/generated/web/social-app/src/locales/uz.json +67 -0
- package/examples/social-app/generated/web/social-app/src/main.tsx +16 -0
- package/examples/social-app/generated/web/social-app/src/screens/ChatDetailScreen.tsx +90 -0
- package/examples/social-app/generated/web/social-app/src/screens/DiscoverScreen.tsx +86 -0
- package/examples/social-app/generated/web/social-app/src/screens/EditProfileScreen.tsx +57 -0
- package/examples/social-app/generated/web/social-app/src/screens/HomeFeedScreen.tsx +103 -0
- package/examples/social-app/generated/web/social-app/src/screens/MessagesInboxScreen.tsx +52 -0
- package/examples/social-app/generated/web/social-app/src/screens/NotificationsScreen.tsx +41 -0
- package/examples/social-app/generated/web/social-app/src/screens/PostDetailScreen.tsx +115 -0
- package/examples/social-app/generated/web/social-app/src/screens/ProfileSelfScreen.tsx +57 -0
- package/examples/social-app/generated/web/social-app/src/screens/ProfileUserScreen.tsx +76 -0
- package/examples/social-app/generated/web/social-app/src/screens/SearchResultsScreen.tsx +96 -0
- package/examples/social-app/generated/web/social-app/src/screens/SettingsScreen.tsx +79 -0
- package/examples/social-app/generated/web/social-app/src/state/store.ts +592 -0
- package/examples/social-app/generated/web/social-app/src/styles.css +124 -0
- package/examples/social-app/generated/web/social-app/src/vite-env.d.ts +1 -0
- package/examples/social-app/generated/web/social-app/tsconfig.json +22 -0
- package/examples/social-app/generated/web/social-app/tsconfig.node.json +13 -0
- package/examples/social-app/generated/web/social-app/tsconfig.node.tsbuildinfo +1 -0
- package/examples/social-app/generated/web/social-app/tsconfig.tsbuildinfo +1 -0
- package/examples/social-app/generated/web/social-app/vite.config.d.ts +2 -0
- package/examples/social-app/generated/web/social-app/vite.config.js +6 -0
- package/examples/social-app/generated/web/social-app/vite.config.ts +7 -0
- package/examples/social-app/openuispec/README.md +56 -0
- package/examples/social-app/openuispec/contracts/.gitkeep +0 -0
- package/examples/social-app/openuispec/contracts/action_trigger.yaml +104 -0
- package/examples/social-app/openuispec/contracts/collection.yaml +43 -0
- package/examples/social-app/openuispec/contracts/data_display.yaml +47 -0
- package/examples/social-app/openuispec/contracts/feedback.yaml +49 -0
- package/examples/social-app/openuispec/contracts/input_field.yaml +41 -0
- package/examples/social-app/openuispec/contracts/nav_container.yaml +34 -0
- package/examples/social-app/openuispec/contracts/surface.yaml +41 -0
- package/examples/social-app/openuispec/flows/.gitkeep +0 -0
- package/examples/social-app/openuispec/flows/create_post.yaml +66 -0
- package/examples/social-app/openuispec/locales/.gitkeep +0 -0
- package/examples/social-app/openuispec/locales/en.json +67 -0
- package/examples/social-app/openuispec/locales/ru.json +67 -0
- package/examples/social-app/openuispec/locales/uz.json +67 -0
- package/examples/social-app/openuispec/openuispec.yaml +214 -0
- package/examples/social-app/openuispec/platform/.gitkeep +0 -0
- package/examples/social-app/openuispec/platform/android.yaml +30 -0
- package/examples/social-app/openuispec/platform/ios.yaml +19 -0
- package/examples/social-app/openuispec/platform/web.yaml +23 -0
- package/examples/social-app/openuispec/screens/.gitkeep +0 -0
- package/examples/social-app/openuispec/screens/chat_detail.yaml +53 -0
- package/examples/social-app/openuispec/screens/discover.yaml +78 -0
- package/examples/social-app/openuispec/screens/edit_profile.yaml +78 -0
- package/examples/social-app/openuispec/screens/home_feed.yaml +138 -0
- package/examples/social-app/openuispec/screens/messages_inbox.yaml +43 -0
- package/examples/social-app/openuispec/screens/notifications.yaml +29 -0
- package/examples/social-app/openuispec/screens/post_detail.yaml +86 -0
- package/examples/social-app/openuispec/screens/profile_self.yaml +53 -0
- package/examples/social-app/openuispec/screens/profile_user.yaml +60 -0
- package/examples/social-app/openuispec/screens/search_results.yaml +62 -0
- package/examples/social-app/openuispec/screens/settings.yaml +99 -0
- package/examples/social-app/openuispec/tokens/.gitkeep +0 -0
- package/examples/social-app/openuispec/tokens/color.yaml +76 -0
- package/examples/social-app/openuispec/tokens/elevation.yaml +31 -0
- package/examples/social-app/openuispec/tokens/icons.yaml +147 -0
- package/examples/social-app/openuispec/tokens/layout.yaml +37 -0
- package/examples/social-app/openuispec/tokens/motion.yaml +28 -0
- package/examples/social-app/openuispec/tokens/spacing.yaml +19 -0
- package/examples/social-app/openuispec/tokens/themes.yaml +31 -0
- package/examples/social-app/openuispec/tokens/typography.yaml +50 -0
- package/examples/social-app/package.json +12 -0
- package/examples/taskflow/openuispec/openuispec.yaml +2 -0
- package/examples/todo-orbit/openuispec/openuispec.yaml +2 -0
- package/mcp-server/index.ts +200 -10
- package/package.json +1 -1
- package/schema/openuispec.schema.json +7 -0
- 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 }
|
|
File without changes
|
|
@@ -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
|
|
File without changes
|
|
@@ -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
|
|
File without changes
|
|
@@ -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: "" }
|