openuispec 0.2.10 → 0.2.12
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 +3 -1
- package/check/index.ts +17 -0
- package/cli/index.ts +21 -3
- package/cli/init.ts +224 -10
- package/docs/cli.md +13 -8
- package/docs/file-formats.md +36 -0
- package/docs/implementation-notes.md +7 -0
- package/drift/index.ts +281 -40
- package/mcp-server/index.ts +179 -119
- package/mcp-server/screenshot.ts +19 -4
- package/package.json +5 -2
- package/prepare/index.ts +155 -18
- package/schema/openuispec.schema.json +59 -0
- package/schema/semantic-lint.ts +25 -1
- package/scripts/take-all-screenshots.ts +507 -0
- package/spec/openuispec-v0.1.md +13 -0
- package/status/index.ts +72 -2
- package/examples/social-app/.mcp.json +0 -10
- package/examples/social-app/AGENTS.md +0 -124
- package/examples/social-app/CLAUDE.md +0 -124
- package/examples/social-app/backend/.gitkeep +0 -1
- package/examples/social-app/generated/android/social-app/app/.paparazzi-hashes.json +0 -3
- package/examples/social-app/generated/android/social-app/app/build.gradle.kts +0 -94
- package/examples/social-app/generated/android/social-app/app/src/main/AndroidManifest.xml +0 -26
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/AppContainer.kt +0 -20
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/MainActivity.kt +0 -35
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/SocialAppApplication.kt +0 -13
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/data/MockData.kt +0 -98
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/data/preferences/AppPreferences.kt +0 -19
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/data/preferences/DataStorePreferencesRepository.kt +0 -68
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/data/preferences/PreferencesRepository.kt +0 -15
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/model/Models.kt +0 -34
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/MainShell.kt +0 -390
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/components/Components.kt +0 -234
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/components/ContractPrimitives.kt +0 -641
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/navigation/RootComponent.kt +0 -113
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/ChatDetailScreen.kt +0 -212
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/CreatePostScreen.kt +0 -113
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/DiscoverScreen.kt +0 -137
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/EditProfileScreen.kt +0 -180
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/HomeFeedScreen.kt +0 -169
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/MessagesInboxScreen.kt +0 -85
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/NotificationsScreen.kt +0 -74
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/PostDetailScreen.kt +0 -293
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/ProfileSelfScreen.kt +0 -116
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/SearchResultsScreen.kt +0 -161
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/SettingsScreen.kt +0 -164
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/SettingsStore.kt +0 -95
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/screens/UserProfileScreen.kt +0 -123
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/theme/Color.kt +0 -33
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/theme/Shape.kt +0 -41
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/theme/Spacing.kt +0 -20
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/theme/Theme.kt +0 -82
- package/examples/social-app/generated/android/social-app/app/src/main/java/com/social/app/ui/theme/Type.kt +0 -60
- package/examples/social-app/generated/android/social-app/app/src/main/res/drawable/ic_launcher_foreground.xml +0 -9
- package/examples/social-app/generated/android/social-app/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +0 -5
- package/examples/social-app/generated/android/social-app/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +0 -5
- package/examples/social-app/generated/android/social-app/app/src/main/res/values/strings.xml +0 -91
- package/examples/social-app/generated/android/social-app/app/src/main/res/values/themes.xml +0 -10
- package/examples/social-app/generated/android/social-app/app/src/main/res/values-ru/strings.xml +0 -79
- package/examples/social-app/generated/android/social-app/app/src/main/res/values-uz/strings.xml +0 -79
- package/examples/social-app/generated/android/social-app/app/src/main/xml/AndroidManifest.xml +0 -23
- package/examples/social-app/generated/android/social-app/app/src/test/kotlin/com/social/app/screenshots/HomeFeedScreenshotTest.kt +0 -34
- package/examples/social-app/generated/android/social-app/build.gradle.kts +0 -7
- package/examples/social-app/generated/android/social-app/gradle/libs.versions.toml +0 -50
- package/examples/social-app/generated/android/social-app/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/examples/social-app/generated/android/social-app/gradle/wrapper/gradle-wrapper.properties +0 -8
- package/examples/social-app/generated/android/social-app/gradle.properties +0 -11
- package/examples/social-app/generated/android/social-app/gradlew +0 -248
- package/examples/social-app/generated/android/social-app/settings.gradle.kts +0 -27
- package/examples/social-app/generated/web/social-app/index.html +0 -12
- package/examples/social-app/generated/web/social-app/package-lock.json +0 -2517
- package/examples/social-app/generated/web/social-app/package.json +0 -27
- package/examples/social-app/generated/web/social-app/src/app/App.tsx +0 -58
- package/examples/social-app/generated/web/social-app/src/components/Shell.tsx +0 -259
- package/examples/social-app/generated/web/social-app/src/components/cards.tsx +0 -317
- package/examples/social-app/generated/web/social-app/src/components/ui.tsx +0 -340
- package/examples/social-app/generated/web/social-app/src/flows/CreatePostFlow.tsx +0 -86
- package/examples/social-app/generated/web/social-app/src/i18n.tsx +0 -59
- package/examples/social-app/generated/web/social-app/src/lib/icons.tsx +0 -85
- package/examples/social-app/generated/web/social-app/src/lib/tokens.ts +0 -70
- package/examples/social-app/generated/web/social-app/src/lib/utils.ts +0 -97
- package/examples/social-app/generated/web/social-app/src/locales/en.json +0 -67
- package/examples/social-app/generated/web/social-app/src/locales/ru.json +0 -67
- package/examples/social-app/generated/web/social-app/src/locales/uz.json +0 -67
- package/examples/social-app/generated/web/social-app/src/main.tsx +0 -16
- package/examples/social-app/generated/web/social-app/src/screens/ChatDetailScreen.tsx +0 -90
- package/examples/social-app/generated/web/social-app/src/screens/DiscoverScreen.tsx +0 -86
- package/examples/social-app/generated/web/social-app/src/screens/EditProfileScreen.tsx +0 -57
- package/examples/social-app/generated/web/social-app/src/screens/HomeFeedScreen.tsx +0 -103
- package/examples/social-app/generated/web/social-app/src/screens/MessagesInboxScreen.tsx +0 -52
- package/examples/social-app/generated/web/social-app/src/screens/NotificationsScreen.tsx +0 -41
- package/examples/social-app/generated/web/social-app/src/screens/PostDetailScreen.tsx +0 -115
- package/examples/social-app/generated/web/social-app/src/screens/ProfileSelfScreen.tsx +0 -57
- package/examples/social-app/generated/web/social-app/src/screens/ProfileUserScreen.tsx +0 -76
- package/examples/social-app/generated/web/social-app/src/screens/SearchResultsScreen.tsx +0 -96
- package/examples/social-app/generated/web/social-app/src/screens/SettingsScreen.tsx +0 -79
- package/examples/social-app/generated/web/social-app/src/state/store.ts +0 -592
- package/examples/social-app/generated/web/social-app/src/styles.css +0 -125
- package/examples/social-app/generated/web/social-app/src/vite-env.d.ts +0 -1
- package/examples/social-app/generated/web/social-app/tsconfig.json +0 -22
- package/examples/social-app/generated/web/social-app/tsconfig.node.json +0 -13
- package/examples/social-app/generated/web/social-app/tsconfig.node.tsbuildinfo +0 -1
- package/examples/social-app/generated/web/social-app/tsconfig.tsbuildinfo +0 -1
- package/examples/social-app/generated/web/social-app/vite.config.d.ts +0 -2
- package/examples/social-app/generated/web/social-app/vite.config.js +0 -6
- package/examples/social-app/generated/web/social-app/vite.config.ts +0 -7
- package/examples/social-app/package.json +0 -13
- package/examples/social-app/take-web-screenshots.ts +0 -97
- package/examples/taskflow/.codex/config.toml +0 -4
- package/examples/taskflow/.mcp.json +0 -10
- package/examples/taskflow/AGENTS.md +0 -124
- package/examples/taskflow/CLAUDE.md +0 -124
- package/examples/taskflow/backend/.gitkeep +0 -1
- package/examples/taskflow/generated/android/TaskFlow/README.md +0 -43
- package/examples/taskflow/generated/android/TaskFlow/app/build.gradle.kts +0 -76
- package/examples/taskflow/generated/android/TaskFlow/app/proguard-rules.pro +0 -1
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/AndroidManifest.xml +0 -21
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/MainActivity.kt +0 -19
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/TaskFlowApp.kt +0 -283
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/model/DomainModels.kt +0 -106
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/model/SampleData.kt +0 -57
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/components/Common.kt +0 -109
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/screens/HomeScreen.kt +0 -112
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/screens/ProjectsScreen.kt +0 -61
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/screens/SettingsScreen.kt +0 -82
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/screens/TaskDetailScreen.kt +0 -111
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/sheets/Sheets.kt +0 -77
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/theme/Color.kt +0 -30
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/theme/Theme.kt +0 -86
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/java/uz/rsteam/taskflow/ui/theme/Type.kt +0 -57
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/res/values/strings.xml +0 -155
- package/examples/taskflow/generated/android/TaskFlow/app/src/main/res/values/themes.xml +0 -4
- package/examples/taskflow/generated/android/TaskFlow/build.gradle.kts +0 -5
- package/examples/taskflow/generated/android/TaskFlow/gradle/gradle-daemon-jvm.properties +0 -12
- package/examples/taskflow/generated/android/TaskFlow/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/examples/taskflow/generated/android/TaskFlow/gradle/wrapper/gradle-wrapper.properties +0 -7
- package/examples/taskflow/generated/android/TaskFlow/gradle.properties +0 -4
- package/examples/taskflow/generated/android/TaskFlow/gradlew +0 -18
- package/examples/taskflow/generated/android/TaskFlow/gradlew.bat +0 -12
- package/examples/taskflow/generated/android/TaskFlow/settings.gradle.kts +0 -18
- package/examples/taskflow/generated/ios/TaskFlow/README.md +0 -21
- package/examples/taskflow/generated/ios/TaskFlow/Resources/en.lproj/Localizable.strings +0 -115
- package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/App/TaskFlowApp.swift +0 -24
- package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Components/AppChrome.swift +0 -150
- package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Flows/TaskEditorSheet.swift +0 -220
- package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Models/DomainModels.swift +0 -122
- package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Screens/CalendarView.swift +0 -21
- package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Screens/HomeView.swift +0 -201
- package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Screens/ProfileEditView.swift +0 -48
- package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Screens/ProjectDetailView.swift +0 -59
- package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Screens/ProjectsView.swift +0 -63
- package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Screens/SettingsView.swift +0 -85
- package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Screens/TaskDetailView.swift +0 -219
- package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Support/AppModel.swift +0 -320
- package/examples/taskflow/generated/ios/TaskFlow/Sources/TaskFlow/Support/AppSupport.swift +0 -41
- package/examples/taskflow/generated/ios/TaskFlow/project.yml +0 -31
- package/examples/taskflow/generated/web/TaskFlow/README.md +0 -19
- package/examples/taskflow/generated/web/TaskFlow/index.html +0 -12
- package/examples/taskflow/generated/web/TaskFlow/package-lock.json +0 -1908
- package/examples/taskflow/generated/web/TaskFlow/package.json +0 -24
- package/examples/taskflow/generated/web/TaskFlow/src/App.tsx +0 -58
- package/examples/taskflow/generated/web/TaskFlow/src/AppShell.tsx +0 -55
- package/examples/taskflow/generated/web/TaskFlow/src/components/Common.tsx +0 -82
- package/examples/taskflow/generated/web/TaskFlow/src/components/Modals.tsx +0 -191
- package/examples/taskflow/generated/web/TaskFlow/src/components/Nav.tsx +0 -41
- package/examples/taskflow/generated/web/TaskFlow/src/generated/messages.ts +0 -131
- package/examples/taskflow/generated/web/TaskFlow/src/hooks.ts +0 -25
- package/examples/taskflow/generated/web/TaskFlow/src/i18n.ts +0 -39
- package/examples/taskflow/generated/web/TaskFlow/src/locales.en.json +0 -111
- package/examples/taskflow/generated/web/TaskFlow/src/main.tsx +0 -13
- package/examples/taskflow/generated/web/TaskFlow/src/screens/HomeScreen.tsx +0 -111
- package/examples/taskflow/generated/web/TaskFlow/src/screens/ProjectsScreen.tsx +0 -82
- package/examples/taskflow/generated/web/TaskFlow/src/screens/SettingsScreens.tsx +0 -132
- package/examples/taskflow/generated/web/TaskFlow/src/screens/TaskDetail.tsx +0 -105
- package/examples/taskflow/generated/web/TaskFlow/src/store.ts +0 -216
- package/examples/taskflow/generated/web/TaskFlow/src/styles.css +0 -617
- package/examples/taskflow/generated/web/TaskFlow/src/types.ts +0 -64
- package/examples/taskflow/generated/web/TaskFlow/src/utils.ts +0 -78
- package/examples/taskflow/generated/web/TaskFlow/tsconfig.json +0 -21
- package/examples/taskflow/generated/web/TaskFlow/vite.config.ts +0 -6
- package/examples/todo-orbit/.codex/config.toml +0 -4
- package/examples/todo-orbit/.mcp.json +0 -10
- package/examples/todo-orbit/AGENTS.md +0 -124
- package/examples/todo-orbit/CLAUDE.md +0 -124
- package/examples/todo-orbit/backend/.gitkeep +0 -1
- package/examples/todo-orbit/generated/android/Todo Orbit/README.md +0 -14
- package/examples/todo-orbit/generated/android/Todo Orbit/app/build.gradle.kts +0 -58
- package/examples/todo-orbit/generated/android/Todo Orbit/app/proguard-rules.pro +0 -1
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/AndroidManifest.xml +0 -20
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/MainActivity.kt +0 -14
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/TodoOrbitApp.kt +0 -345
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/support/AppLogic.kt +0 -231
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/support/Models.kt +0 -169
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/support/Strings.kt +0 -8
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/components/CommonComponents.kt +0 -236
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/screens/AnalyticsScreen.kt +0 -193
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/screens/SettingsScreen.kt +0 -102
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/screens/TasksScreen.kt +0 -347
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/sheets/EditorSheets.kt +0 -347
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/java/uz/rsteam/todoorbit/ui/theme/TodoOrbitTheme.kt +0 -59
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/res/values/strings.xml +0 -149
- package/examples/todo-orbit/generated/android/Todo Orbit/app/src/main/res/values-ru/strings.xml +0 -155
- package/examples/todo-orbit/generated/android/Todo Orbit/build.gradle.kts +0 -4
- package/examples/todo-orbit/generated/android/Todo Orbit/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/examples/todo-orbit/generated/android/Todo Orbit/gradle/wrapper/gradle-wrapper.properties +0 -7
- package/examples/todo-orbit/generated/android/Todo Orbit/gradle.properties +0 -4
- package/examples/todo-orbit/generated/android/Todo Orbit/gradlew +0 -248
- package/examples/todo-orbit/generated/android/Todo Orbit/gradlew.bat +0 -93
- package/examples/todo-orbit/generated/android/Todo Orbit/settings.gradle.kts +0 -18
- package/examples/todo-orbit/generated/ios/Todo Orbit/.screenshot-uitest/Sources/ScreenshotUITest.swift +0 -36
- package/examples/todo-orbit/generated/ios/Todo Orbit/README.md +0 -29
- package/examples/todo-orbit/generated/ios/Todo Orbit/Resources/en.lproj/Localizable.strings +0 -119
- package/examples/todo-orbit/generated/ios/Todo Orbit/Resources/ru.lproj/Localizable.strings +0 -119
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/App/TodoOrbitApp.swift +0 -50
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Components/OrbitChrome.swift +0 -204
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Components/SchedulePreviewView.swift +0 -126
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Components/TrendChartView.swift +0 -70
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Flows/RecurringRuleSheet.swift +0 -126
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Flows/TaskEditorSheet.swift +0 -61
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Models/DomainModels.swift +0 -238
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Screens/AnalyticsView.swift +0 -94
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Screens/SettingsView.swift +0 -76
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Screens/TasksHomeView.swift +0 -364
- package/examples/todo-orbit/generated/ios/Todo Orbit/Sources/TodoOrbit/Support/AppModel.swift +0 -324
- package/examples/todo-orbit/generated/ios/Todo Orbit/TodoOrbit.xcodeproj/project.pbxproj +0 -439
- package/examples/todo-orbit/generated/ios/Todo Orbit/TodoOrbit.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
- package/examples/todo-orbit/generated/ios/Todo Orbit/TodoOrbit.xcodeproj/xcshareddata/xcschemes/TodoOrbit.xcscheme +0 -89
- package/examples/todo-orbit/generated/ios/Todo Orbit/project.yml +0 -32
- package/examples/todo-orbit/generated/web/Todo Orbit/index.html +0 -16
- package/examples/todo-orbit/generated/web/Todo Orbit/package-lock.json +0 -1087
- package/examples/todo-orbit/generated/web/Todo Orbit/package.json +0 -24
- package/examples/todo-orbit/generated/web/Todo Orbit/src/App.tsx +0 -2167
- package/examples/todo-orbit/generated/web/Todo Orbit/src/main.tsx +0 -13
- package/examples/todo-orbit/generated/web/Todo Orbit/src/styles.css +0 -926
- package/examples/todo-orbit/generated/web/Todo Orbit/tsconfig.json +0 -19
- package/examples/todo-orbit/generated/web/Todo Orbit/vite.config.ts +0 -6
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
package com.social.app.ui.screens
|
|
2
|
-
|
|
3
|
-
import androidx.compose.foundation.layout.Arrangement
|
|
4
|
-
import androidx.compose.foundation.layout.Column
|
|
5
|
-
import androidx.compose.foundation.layout.fillMaxSize
|
|
6
|
-
import androidx.compose.foundation.layout.padding
|
|
7
|
-
import androidx.compose.foundation.rememberScrollState
|
|
8
|
-
import androidx.compose.foundation.verticalScroll
|
|
9
|
-
import androidx.compose.material.icons.Icons
|
|
10
|
-
import androidx.compose.material.icons.automirrored.filled.ArrowBack
|
|
11
|
-
import androidx.compose.material.icons.filled.Edit
|
|
12
|
-
import androidx.compose.material3.ExperimentalMaterial3Api
|
|
13
|
-
import androidx.compose.material3.Icon
|
|
14
|
-
import androidx.compose.material3.IconButton
|
|
15
|
-
import androidx.compose.material3.MaterialTheme
|
|
16
|
-
import androidx.compose.material3.Scaffold
|
|
17
|
-
import androidx.compose.material3.Text
|
|
18
|
-
import androidx.compose.material3.TopAppBar
|
|
19
|
-
import androidx.compose.material3.TopAppBarDefaults
|
|
20
|
-
import androidx.compose.runtime.Composable
|
|
21
|
-
import androidx.compose.runtime.DisposableEffect
|
|
22
|
-
import androidx.compose.runtime.getValue
|
|
23
|
-
import androidx.compose.runtime.mutableStateOf
|
|
24
|
-
import androidx.compose.runtime.remember
|
|
25
|
-
import androidx.compose.runtime.rememberCoroutineScope
|
|
26
|
-
import androidx.compose.runtime.setValue
|
|
27
|
-
import androidx.compose.ui.Modifier
|
|
28
|
-
import androidx.compose.ui.res.stringResource
|
|
29
|
-
import com.arkivanov.mvikotlin.core.store.StoreFactory
|
|
30
|
-
import com.arkivanov.mvikotlin.extensions.coroutines.stateFlow
|
|
31
|
-
import com.social.app.R
|
|
32
|
-
import com.social.app.data.preferences.PreferencesRepository
|
|
33
|
-
import com.social.app.data.preferences.ThemeMode
|
|
34
|
-
import com.social.app.ui.components.ActionTriggerButton
|
|
35
|
-
import com.social.app.ui.components.ActionTriggerVariant
|
|
36
|
-
import com.social.app.ui.components.ChipOption
|
|
37
|
-
import com.social.app.ui.components.ContractConfirmationDialog
|
|
38
|
-
import com.social.app.ui.components.ContractSectionHeader
|
|
39
|
-
import com.social.app.ui.components.ContractSelectField
|
|
40
|
-
import com.social.app.ui.components.ContractToggleField
|
|
41
|
-
import com.social.app.ui.theme.Spacing
|
|
42
|
-
import androidx.compose.runtime.collectAsState
|
|
43
|
-
|
|
44
|
-
@OptIn(ExperimentalMaterial3Api::class)
|
|
45
|
-
@Composable
|
|
46
|
-
fun SettingsScreen(
|
|
47
|
-
onBackClick: () -> Unit,
|
|
48
|
-
onEditProfileClick: () -> Unit,
|
|
49
|
-
preferencesRepository: PreferencesRepository,
|
|
50
|
-
storeFactory: StoreFactory,
|
|
51
|
-
) {
|
|
52
|
-
val storeScope = rememberCoroutineScope()
|
|
53
|
-
val store =
|
|
54
|
-
remember(preferencesRepository, storeFactory) {
|
|
55
|
-
SettingsStoreFactory(
|
|
56
|
-
storeFactory = storeFactory,
|
|
57
|
-
preferencesRepository = preferencesRepository,
|
|
58
|
-
).create()
|
|
59
|
-
}
|
|
60
|
-
DisposableEffect(store) {
|
|
61
|
-
onDispose(store::dispose)
|
|
62
|
-
}
|
|
63
|
-
val stateFlow = remember(store, storeScope) { store.stateFlow(storeScope) }
|
|
64
|
-
val state by stateFlow.collectAsState()
|
|
65
|
-
val preferences = state.preferences
|
|
66
|
-
var themeExpanded by remember { mutableStateOf(false) }
|
|
67
|
-
var showLogoutDialog by remember { mutableStateOf(false) }
|
|
68
|
-
|
|
69
|
-
val themeOptions =
|
|
70
|
-
listOf(
|
|
71
|
-
ChipOption("system", stringResource(R.string.settings_theme_system)),
|
|
72
|
-
ChipOption("light", stringResource(R.string.settings_theme_light)),
|
|
73
|
-
ChipOption("dark", stringResource(R.string.settings_theme_dark)),
|
|
74
|
-
)
|
|
75
|
-
|
|
76
|
-
Scaffold(
|
|
77
|
-
topBar = {
|
|
78
|
-
TopAppBar(
|
|
79
|
-
title = { Text(stringResource(R.string.nav_settings)) },
|
|
80
|
-
navigationIcon = {
|
|
81
|
-
IconButton(onClick = onBackClick) {
|
|
82
|
-
Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null)
|
|
83
|
-
}
|
|
84
|
-
},
|
|
85
|
-
colors = TopAppBarDefaults.topAppBarColors(containerColor = MaterialTheme.colorScheme.surface)
|
|
86
|
-
)
|
|
87
|
-
}
|
|
88
|
-
) { padding ->
|
|
89
|
-
Column(
|
|
90
|
-
modifier = Modifier
|
|
91
|
-
.fillMaxSize()
|
|
92
|
-
.padding(padding)
|
|
93
|
-
.padding(horizontal = Spacing.MD)
|
|
94
|
-
.verticalScroll(rememberScrollState())
|
|
95
|
-
.padding(bottom = Spacing.XL),
|
|
96
|
-
verticalArrangement = Arrangement.spacedBy(Spacing.SM),
|
|
97
|
-
) {
|
|
98
|
-
ContractSectionHeader(stringResource(R.string.settings_appearance))
|
|
99
|
-
ContractSelectField(
|
|
100
|
-
label = stringResource(R.string.settings_theme),
|
|
101
|
-
selectedLabel = themeOptions.first { it.value == preferences.themeMode.storageValue }.label,
|
|
102
|
-
expanded = themeExpanded,
|
|
103
|
-
onExpandedChange = { themeExpanded = it },
|
|
104
|
-
options = themeOptions,
|
|
105
|
-
onOptionSelected = {
|
|
106
|
-
store.accept(SettingsStore.Intent.SelectTheme(ThemeMode.fromStorageValue(it.value)))
|
|
107
|
-
},
|
|
108
|
-
)
|
|
109
|
-
|
|
110
|
-
ContractSectionHeader(stringResource(R.string.settings_notifications))
|
|
111
|
-
ContractToggleField(
|
|
112
|
-
label = stringResource(R.string.settings_push_notifications),
|
|
113
|
-
checked = preferences.pushNotifications,
|
|
114
|
-
onCheckedChange = {
|
|
115
|
-
store.accept(SettingsStore.Intent.SetPushNotifications(it))
|
|
116
|
-
},
|
|
117
|
-
)
|
|
118
|
-
ContractToggleField(
|
|
119
|
-
label = stringResource(R.string.settings_message_previews),
|
|
120
|
-
checked = preferences.messagePreviews,
|
|
121
|
-
onCheckedChange = {
|
|
122
|
-
store.accept(SettingsStore.Intent.SetMessagePreviews(it))
|
|
123
|
-
},
|
|
124
|
-
)
|
|
125
|
-
|
|
126
|
-
ContractSectionHeader(stringResource(R.string.settings_language))
|
|
127
|
-
ContractToggleField(
|
|
128
|
-
label = stringResource(R.string.settings_auto_translate),
|
|
129
|
-
checked = preferences.autoTranslate,
|
|
130
|
-
onCheckedChange = {
|
|
131
|
-
store.accept(SettingsStore.Intent.SetAutoTranslate(it))
|
|
132
|
-
},
|
|
133
|
-
)
|
|
134
|
-
|
|
135
|
-
ContractSectionHeader(stringResource(R.string.settings_account))
|
|
136
|
-
Column(verticalArrangement = Arrangement.spacedBy(Spacing.SM)) {
|
|
137
|
-
ActionTriggerButton(
|
|
138
|
-
text = stringResource(R.string.settings_edit_profile),
|
|
139
|
-
onClick = onEditProfileClick,
|
|
140
|
-
variant = ActionTriggerVariant.Secondary,
|
|
141
|
-
fullWidth = false,
|
|
142
|
-
icon = { Icon(Icons.Default.Edit, contentDescription = null) },
|
|
143
|
-
)
|
|
144
|
-
ActionTriggerButton(
|
|
145
|
-
text = stringResource(R.string.settings_logout),
|
|
146
|
-
onClick = { showLogoutDialog = true },
|
|
147
|
-
variant = ActionTriggerVariant.Destructive,
|
|
148
|
-
fullWidth = false,
|
|
149
|
-
)
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
if (showLogoutDialog) {
|
|
155
|
-
ContractConfirmationDialog(
|
|
156
|
-
title = stringResource(R.string.settings_logout),
|
|
157
|
-
message = stringResource(R.string.settings_logout_confirm),
|
|
158
|
-
confirmLabel = stringResource(R.string.settings_logout),
|
|
159
|
-
dismissLabel = stringResource(R.string.common_cancel),
|
|
160
|
-
onConfirm = { showLogoutDialog = false },
|
|
161
|
-
onDismiss = { showLogoutDialog = false },
|
|
162
|
-
)
|
|
163
|
-
}
|
|
164
|
-
}
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
package com.social.app.ui.screens
|
|
2
|
-
|
|
3
|
-
import com.arkivanov.mvikotlin.core.store.Reducer
|
|
4
|
-
import com.arkivanov.mvikotlin.core.store.Store
|
|
5
|
-
import com.arkivanov.mvikotlin.core.store.StoreFactory
|
|
6
|
-
import com.arkivanov.mvikotlin.core.store.SimpleBootstrapper
|
|
7
|
-
import com.arkivanov.mvikotlin.extensions.coroutines.CoroutineExecutor
|
|
8
|
-
import com.social.app.data.preferences.AppPreferences
|
|
9
|
-
import com.social.app.data.preferences.PreferencesRepository
|
|
10
|
-
import com.social.app.data.preferences.ThemeMode
|
|
11
|
-
import kotlinx.coroutines.launch
|
|
12
|
-
|
|
13
|
-
interface SettingsStore : Store<SettingsStore.Intent, SettingsStore.State, Nothing> {
|
|
14
|
-
sealed interface Intent {
|
|
15
|
-
data class SelectTheme(val themeMode: ThemeMode) : Intent
|
|
16
|
-
|
|
17
|
-
data class SetPushNotifications(val enabled: Boolean) : Intent
|
|
18
|
-
|
|
19
|
-
data class SetMessagePreviews(val enabled: Boolean) : Intent
|
|
20
|
-
|
|
21
|
-
data class SetAutoTranslate(val enabled: Boolean) : Intent
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
data class State(
|
|
25
|
-
val preferences: AppPreferences = AppPreferences(),
|
|
26
|
-
)
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
class SettingsStoreFactory(
|
|
30
|
-
private val storeFactory: StoreFactory,
|
|
31
|
-
private val preferencesRepository: PreferencesRepository,
|
|
32
|
-
) {
|
|
33
|
-
fun create(): SettingsStore =
|
|
34
|
-
object : SettingsStore,
|
|
35
|
-
Store<SettingsStore.Intent, SettingsStore.State, Nothing> by storeFactory.create(
|
|
36
|
-
name = "SettingsStore",
|
|
37
|
-
initialState = SettingsStore.State(),
|
|
38
|
-
bootstrapper = SimpleBootstrapper(Action.ObservePreferences),
|
|
39
|
-
executorFactory = ::ExecutorImpl,
|
|
40
|
-
reducer = ReducerImpl,
|
|
41
|
-
) {}
|
|
42
|
-
|
|
43
|
-
private sealed interface Action {
|
|
44
|
-
data object ObservePreferences : Action
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
private sealed interface Message {
|
|
48
|
-
data class PreferencesLoaded(val preferences: AppPreferences) : Message
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
private inner class ExecutorImpl :
|
|
52
|
-
CoroutineExecutor<SettingsStore.Intent, Action, SettingsStore.State, Message, Nothing>() {
|
|
53
|
-
override fun executeAction(action: Action) {
|
|
54
|
-
when (action) {
|
|
55
|
-
Action.ObservePreferences ->
|
|
56
|
-
scope.launch {
|
|
57
|
-
preferencesRepository.preferences.collect { preferences ->
|
|
58
|
-
dispatch(Message.PreferencesLoaded(preferences))
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
override fun executeIntent(intent: SettingsStore.Intent) {
|
|
65
|
-
when (intent) {
|
|
66
|
-
is SettingsStore.Intent.SelectTheme ->
|
|
67
|
-
scope.launch {
|
|
68
|
-
preferencesRepository.updateThemeMode(intent.themeMode)
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
is SettingsStore.Intent.SetPushNotifications ->
|
|
72
|
-
scope.launch {
|
|
73
|
-
preferencesRepository.updatePushNotifications(intent.enabled)
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
is SettingsStore.Intent.SetMessagePreviews ->
|
|
77
|
-
scope.launch {
|
|
78
|
-
preferencesRepository.updateMessagePreviews(intent.enabled)
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
is SettingsStore.Intent.SetAutoTranslate ->
|
|
82
|
-
scope.launch {
|
|
83
|
-
preferencesRepository.updateAutoTranslate(intent.enabled)
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
private object ReducerImpl : Reducer<SettingsStore.State, Message> {
|
|
90
|
-
override fun SettingsStore.State.reduce(msg: Message): SettingsStore.State =
|
|
91
|
-
when (msg) {
|
|
92
|
-
is Message.PreferencesLoaded -> copy(preferences = msg.preferences)
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
@@ -1,123 +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.automirrored.filled.ArrowBack
|
|
11
|
-
import androidx.compose.material3.ExperimentalMaterial3Api
|
|
12
|
-
import androidx.compose.material3.Icon
|
|
13
|
-
import androidx.compose.material3.IconButton
|
|
14
|
-
import androidx.compose.material3.MaterialTheme
|
|
15
|
-
import androidx.compose.material3.Scaffold
|
|
16
|
-
import androidx.compose.material3.Text
|
|
17
|
-
import androidx.compose.material3.TopAppBar
|
|
18
|
-
import androidx.compose.material3.TopAppBarDefaults
|
|
19
|
-
import androidx.compose.runtime.Composable
|
|
20
|
-
import androidx.compose.runtime.getValue
|
|
21
|
-
import androidx.compose.runtime.mutableStateOf
|
|
22
|
-
import androidx.compose.runtime.remember
|
|
23
|
-
import androidx.compose.runtime.setValue
|
|
24
|
-
import androidx.compose.ui.Alignment
|
|
25
|
-
import androidx.compose.ui.Modifier
|
|
26
|
-
import androidx.compose.ui.res.stringResource
|
|
27
|
-
import com.social.app.R
|
|
28
|
-
import com.social.app.data.MockData
|
|
29
|
-
import com.social.app.ui.components.ActionTriggerVariant
|
|
30
|
-
import com.social.app.ui.components.ContractListCard
|
|
31
|
-
import com.social.app.ui.components.ContractSectionHeader
|
|
32
|
-
import com.social.app.ui.components.PostItem
|
|
33
|
-
import com.social.app.ui.components.ProfileHeroCard
|
|
34
|
-
import com.social.app.ui.theme.Spacing
|
|
35
|
-
|
|
36
|
-
@OptIn(ExperimentalMaterial3Api::class)
|
|
37
|
-
@Composable
|
|
38
|
-
fun UserProfileScreen(
|
|
39
|
-
userId: String,
|
|
40
|
-
onBackClick: () -> Unit,
|
|
41
|
-
onPostClick: (String) -> Unit
|
|
42
|
-
) {
|
|
43
|
-
val user = MockData.users.find { it.id == userId } ?: MockData.users[1]
|
|
44
|
-
val userPosts = MockData.posts.filter { it.authorId == user.id }
|
|
45
|
-
var isFollowing by remember(user.id) { mutableStateOf(user.isFollowed) }
|
|
46
|
-
|
|
47
|
-
Scaffold(
|
|
48
|
-
modifier = Modifier.fillMaxSize(),
|
|
49
|
-
topBar = {
|
|
50
|
-
TopAppBar(
|
|
51
|
-
title = { Text(user.displayName) },
|
|
52
|
-
navigationIcon = {
|
|
53
|
-
IconButton(onClick = onBackClick) {
|
|
54
|
-
Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null)
|
|
55
|
-
}
|
|
56
|
-
},
|
|
57
|
-
colors = TopAppBarDefaults.topAppBarColors(containerColor = MaterialTheme.colorScheme.surface)
|
|
58
|
-
)
|
|
59
|
-
}
|
|
60
|
-
) { padding ->
|
|
61
|
-
LazyColumn(
|
|
62
|
-
modifier = Modifier
|
|
63
|
-
.fillMaxSize()
|
|
64
|
-
.padding(padding)
|
|
65
|
-
) {
|
|
66
|
-
item {
|
|
67
|
-
ProfileHeroCard(
|
|
68
|
-
title = user.displayName,
|
|
69
|
-
subtitle = "@${user.handle}",
|
|
70
|
-
body = user.bio,
|
|
71
|
-
avatarUrl = user.avatarUrl,
|
|
72
|
-
modifier = Modifier
|
|
73
|
-
.fillMaxWidth()
|
|
74
|
-
.padding(Spacing.MD),
|
|
75
|
-
actionLabel =
|
|
76
|
-
if (isFollowing) {
|
|
77
|
-
stringResource(R.string.profile_following)
|
|
78
|
-
} else {
|
|
79
|
-
stringResource(R.string.profile_follow_button)
|
|
80
|
-
},
|
|
81
|
-
actionVariant = if (isFollowing) ActionTriggerVariant.Secondary else ActionTriggerVariant.Primary,
|
|
82
|
-
onActionClick = { isFollowing = !isFollowing },
|
|
83
|
-
)
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
item {
|
|
87
|
-
ContractSectionHeader(stringResource(R.string.profile_posts_header))
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
if (userPosts.isEmpty()) {
|
|
91
|
-
item {
|
|
92
|
-
Box(
|
|
93
|
-
modifier =
|
|
94
|
-
Modifier
|
|
95
|
-
.fillMaxWidth()
|
|
96
|
-
.padding(horizontal = Spacing.MD, vertical = Spacing.SM),
|
|
97
|
-
contentAlignment = Alignment.Center,
|
|
98
|
-
) {
|
|
99
|
-
ContractListCard(
|
|
100
|
-
title = stringResource(R.string.profile_no_posts_user),
|
|
101
|
-
)
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
} else {
|
|
105
|
-
items(userPosts) { post ->
|
|
106
|
-
PostItem(
|
|
107
|
-
authorName = post.authorName,
|
|
108
|
-
authorHandle = post.authorHandle,
|
|
109
|
-
authorAvatar = post.authorAvatar,
|
|
110
|
-
body = post.body,
|
|
111
|
-
likeCount = post.likeCount,
|
|
112
|
-
commentCount = post.commentCount,
|
|
113
|
-
timestamp = post.timestamp,
|
|
114
|
-
mediaUrl = post.mediaUrl,
|
|
115
|
-
onLikeClick = {},
|
|
116
|
-
onAuthorClick = {},
|
|
117
|
-
onCommentClick = { onPostClick(post.id) },
|
|
118
|
-
)
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
package com.social.app.ui.theme
|
|
2
|
-
|
|
3
|
-
import androidx.compose.ui.graphics.Color
|
|
4
|
-
|
|
5
|
-
val BrandPrimary = Color(0xFF1C1B1A)
|
|
6
|
-
val OnBrandPrimary = Color(0xFFFFFFFF)
|
|
7
|
-
val BrandAccent = Color(0xFF5B52A3)
|
|
8
|
-
val OnBrandAccent = Color(0xFFFFFFFF)
|
|
9
|
-
|
|
10
|
-
val SurfacePrimary = Color(0xFFFAF8F5)
|
|
11
|
-
val SurfaceSecondary = Color(0xFFF3F0EB)
|
|
12
|
-
val SurfaceTertiary = Color(0xFFEBE7E0)
|
|
13
|
-
|
|
14
|
-
val TextPrimary = Color(0xFF1C1B1A)
|
|
15
|
-
val TextSecondary = Color(0xFF6B6966)
|
|
16
|
-
val TextTertiary = Color(0xFF9E9A95)
|
|
17
|
-
|
|
18
|
-
val SemanticSuccess = Color(0xFF2D9D5E)
|
|
19
|
-
val SemanticWarning = Color(0xFFD4920E)
|
|
20
|
-
val SemanticDanger = Color(0xFFD43B3B)
|
|
21
|
-
val SemanticInfo = Color(0xFF3B82D4)
|
|
22
|
-
|
|
23
|
-
val BorderDefault = Color(0xFFE0DCD6)
|
|
24
|
-
val BorderStrong = Color(0xFFC5C0B8)
|
|
25
|
-
|
|
26
|
-
val DarkSurfacePrimary = Color(0xFF1A1A1A)
|
|
27
|
-
val DarkSurfaceSecondary = Color(0xFF262626)
|
|
28
|
-
val DarkSurfaceTertiary = Color(0xFF363636)
|
|
29
|
-
val DarkTextPrimary = Color(0xFFFAFAFA)
|
|
30
|
-
val DarkTextSecondary = Color(0xFFA6A6A6)
|
|
31
|
-
val DarkTextTertiary = Color(0xFF6B6B6B)
|
|
32
|
-
val DarkBorderDefault = Color(0xFF4A4A4A)
|
|
33
|
-
val DarkBorderStrong = Color(0xFF666666)
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
package com.social.app.ui.theme
|
|
2
|
-
|
|
3
|
-
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
4
|
-
import androidx.compose.ui.unit.dp
|
|
5
|
-
|
|
6
|
-
object Shapes {
|
|
7
|
-
val RoundedCapPrimary = RoundedCornerShape(
|
|
8
|
-
topStart = 2.dp,
|
|
9
|
-
topEnd = 24.dp,
|
|
10
|
-
bottomEnd = 2.dp,
|
|
11
|
-
bottomStart = 24.dp
|
|
12
|
-
)
|
|
13
|
-
|
|
14
|
-
val RoundedCapSecondary = RoundedCornerShape(
|
|
15
|
-
topStart = 24.dp,
|
|
16
|
-
topEnd = 2.dp,
|
|
17
|
-
bottomEnd = 24.dp,
|
|
18
|
-
bottomStart = 2.dp
|
|
19
|
-
)
|
|
20
|
-
|
|
21
|
-
val CardShape = RoundedCornerShape(
|
|
22
|
-
topStart = 3.dp,
|
|
23
|
-
topEnd = 20.dp,
|
|
24
|
-
bottomEnd = 3.dp,
|
|
25
|
-
bottomStart = 20.dp
|
|
26
|
-
)
|
|
27
|
-
|
|
28
|
-
val HeroShape = RoundedCornerShape(
|
|
29
|
-
topStart = 3.dp,
|
|
30
|
-
topEnd = 24.dp,
|
|
31
|
-
bottomEnd = 3.dp,
|
|
32
|
-
bottomStart = 24.dp
|
|
33
|
-
)
|
|
34
|
-
|
|
35
|
-
val SheetShape = RoundedCornerShape(
|
|
36
|
-
topStart = 24.dp,
|
|
37
|
-
topEnd = 24.dp,
|
|
38
|
-
bottomStart = 0.dp,
|
|
39
|
-
bottomEnd = 0.dp
|
|
40
|
-
)
|
|
41
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
package com.social.app.ui.theme
|
|
2
|
-
|
|
3
|
-
import androidx.compose.ui.unit.dp
|
|
4
|
-
|
|
5
|
-
object Spacing {
|
|
6
|
-
val None = 0.dp
|
|
7
|
-
val XXS = 2.dp
|
|
8
|
-
val XS = 4.dp
|
|
9
|
-
val SM = 8.dp
|
|
10
|
-
val MD = 16.dp
|
|
11
|
-
val LG = 24.dp
|
|
12
|
-
val XL = 32.dp
|
|
13
|
-
val XXL = 48.dp
|
|
14
|
-
|
|
15
|
-
val PageMarginHorizontal = MD
|
|
16
|
-
val PageMarginVertical = MD
|
|
17
|
-
val CardPadding = MD
|
|
18
|
-
val SectionGap = LG
|
|
19
|
-
val ListItemGap = SM
|
|
20
|
-
}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
package com.social.app.ui.theme
|
|
2
|
-
|
|
3
|
-
import android.app.Activity
|
|
4
|
-
import android.os.Build
|
|
5
|
-
import androidx.compose.foundation.isSystemInDarkTheme
|
|
6
|
-
import androidx.compose.material3.MaterialTheme
|
|
7
|
-
import androidx.compose.material3.darkColorScheme
|
|
8
|
-
import androidx.compose.material3.dynamicDarkColorScheme
|
|
9
|
-
import androidx.compose.material3.dynamicLightColorScheme
|
|
10
|
-
import androidx.compose.material3.lightColorScheme
|
|
11
|
-
import androidx.compose.runtime.Composable
|
|
12
|
-
import androidx.compose.runtime.SideEffect
|
|
13
|
-
import androidx.compose.ui.graphics.toArgb
|
|
14
|
-
import androidx.compose.ui.platform.LocalContext
|
|
15
|
-
import androidx.compose.ui.platform.LocalView
|
|
16
|
-
import androidx.core.view.WindowCompat
|
|
17
|
-
import com.social.app.data.preferences.ThemeMode
|
|
18
|
-
|
|
19
|
-
private val DarkColorScheme = darkColorScheme(
|
|
20
|
-
primary = BrandPrimary,
|
|
21
|
-
onPrimary = OnBrandPrimary,
|
|
22
|
-
secondary = BrandAccent,
|
|
23
|
-
onSecondary = OnBrandAccent,
|
|
24
|
-
background = DarkSurfacePrimary,
|
|
25
|
-
surface = DarkSurfacePrimary,
|
|
26
|
-
onSurface = DarkTextPrimary,
|
|
27
|
-
onBackground = DarkTextPrimary,
|
|
28
|
-
surfaceVariant = DarkSurfaceSecondary,
|
|
29
|
-
onSurfaceVariant = DarkTextSecondary,
|
|
30
|
-
outline = DarkBorderDefault,
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
private val LightColorScheme = lightColorScheme(
|
|
34
|
-
primary = BrandPrimary,
|
|
35
|
-
onPrimary = OnBrandPrimary,
|
|
36
|
-
secondary = BrandAccent,
|
|
37
|
-
onSecondary = OnBrandAccent,
|
|
38
|
-
background = SurfacePrimary,
|
|
39
|
-
surface = SurfacePrimary,
|
|
40
|
-
onSurface = TextPrimary,
|
|
41
|
-
onBackground = TextPrimary,
|
|
42
|
-
surfaceVariant = SurfaceSecondary,
|
|
43
|
-
onSurfaceVariant = TextSecondary,
|
|
44
|
-
outline = BorderDefault,
|
|
45
|
-
)
|
|
46
|
-
|
|
47
|
-
@Composable
|
|
48
|
-
fun SocialAppTheme(
|
|
49
|
-
themeMode: ThemeMode = ThemeMode.System,
|
|
50
|
-
// Dynamic color is available on Android 12+
|
|
51
|
-
dynamicColor: Boolean = false,
|
|
52
|
-
content: @Composable () -> Unit
|
|
53
|
-
) {
|
|
54
|
-
val systemDarkTheme = isSystemInDarkTheme()
|
|
55
|
-
val darkTheme =
|
|
56
|
-
when (themeMode) {
|
|
57
|
-
ThemeMode.System -> systemDarkTheme
|
|
58
|
-
ThemeMode.Light -> false
|
|
59
|
-
ThemeMode.Dark -> true
|
|
60
|
-
}
|
|
61
|
-
val colorScheme = when {
|
|
62
|
-
dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
|
|
63
|
-
val context = LocalContext.current
|
|
64
|
-
if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
|
|
65
|
-
}
|
|
66
|
-
darkTheme -> DarkColorScheme
|
|
67
|
-
else -> LightColorScheme
|
|
68
|
-
}
|
|
69
|
-
val view = LocalView.current
|
|
70
|
-
if (!view.isInEditMode) {
|
|
71
|
-
SideEffect {
|
|
72
|
-
val window = (view.context as Activity).window
|
|
73
|
-
WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = !darkTheme
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
MaterialTheme(
|
|
78
|
-
colorScheme = colorScheme,
|
|
79
|
-
typography = Typography,
|
|
80
|
-
content = content
|
|
81
|
-
)
|
|
82
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
package com.social.app.ui.theme
|
|
2
|
-
|
|
3
|
-
import androidx.compose.material3.Typography
|
|
4
|
-
import androidx.compose.ui.text.TextStyle
|
|
5
|
-
import androidx.compose.ui.text.font.FontFamily
|
|
6
|
-
import androidx.compose.ui.text.font.FontWeight
|
|
7
|
-
import androidx.compose.ui.unit.sp
|
|
8
|
-
|
|
9
|
-
private val AppFontFamily = FontFamily.SansSerif
|
|
10
|
-
|
|
11
|
-
val Typography = Typography(
|
|
12
|
-
displayLarge = TextStyle(
|
|
13
|
-
fontFamily = AppFontFamily,
|
|
14
|
-
fontWeight = FontWeight.Bold,
|
|
15
|
-
fontSize = 32.sp,
|
|
16
|
-
lineHeight = 38.4.sp
|
|
17
|
-
),
|
|
18
|
-
headlineLarge = TextStyle(
|
|
19
|
-
fontFamily = AppFontFamily,
|
|
20
|
-
fontWeight = FontWeight.SemiBold,
|
|
21
|
-
fontSize = 24.sp,
|
|
22
|
-
lineHeight = 31.2.sp
|
|
23
|
-
),
|
|
24
|
-
headlineMedium = TextStyle(
|
|
25
|
-
fontFamily = AppFontFamily,
|
|
26
|
-
fontWeight = FontWeight.SemiBold,
|
|
27
|
-
fontSize = 20.sp,
|
|
28
|
-
lineHeight = 26.sp
|
|
29
|
-
),
|
|
30
|
-
headlineSmall = TextStyle(
|
|
31
|
-
fontFamily = AppFontFamily,
|
|
32
|
-
fontWeight = FontWeight.SemiBold,
|
|
33
|
-
fontSize = 16.sp,
|
|
34
|
-
lineHeight = 22.4.sp
|
|
35
|
-
),
|
|
36
|
-
bodyLarge = TextStyle(
|
|
37
|
-
fontFamily = AppFontFamily,
|
|
38
|
-
fontWeight = FontWeight.Normal,
|
|
39
|
-
fontSize = 16.sp,
|
|
40
|
-
lineHeight = 24.sp
|
|
41
|
-
),
|
|
42
|
-
bodyMedium = TextStyle(
|
|
43
|
-
fontFamily = AppFontFamily,
|
|
44
|
-
fontWeight = FontWeight.Normal,
|
|
45
|
-
fontSize = 14.sp,
|
|
46
|
-
lineHeight = 21.sp
|
|
47
|
-
),
|
|
48
|
-
labelSmall = TextStyle(
|
|
49
|
-
fontFamily = AppFontFamily,
|
|
50
|
-
fontWeight = FontWeight.Normal,
|
|
51
|
-
fontSize = 12.sp,
|
|
52
|
-
lineHeight = 16.8.sp
|
|
53
|
-
),
|
|
54
|
-
labelLarge = TextStyle(
|
|
55
|
-
fontFamily = AppFontFamily,
|
|
56
|
-
fontWeight = FontWeight.SemiBold,
|
|
57
|
-
fontSize = 16.sp,
|
|
58
|
-
lineHeight = 16.sp
|
|
59
|
-
)
|
|
60
|
-
)
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
2
|
-
android:width="108dp"
|
|
3
|
-
android:height="108dp"
|
|
4
|
-
android:viewportWidth="108"
|
|
5
|
-
android:viewportHeight="108">
|
|
6
|
-
<path
|
|
7
|
-
android:fillColor="#FFFFFF"
|
|
8
|
-
android:pathData="M31,31h46v46h-46z" />
|
|
9
|
-
</vector>
|