openuispec 0.2.9 → 0.2.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/cli/index.ts +80 -2
- package/cli/init.ts +23 -8
- package/docs/cli.md +42 -7
- package/drift/index.ts +41 -15
- package/mcp-server/index.ts +247 -117
- package/mcp-server/screenshot-android.ts +185 -44
- package/mcp-server/screenshot-ios.ts +242 -30
- package/mcp-server/screenshot.ts +96 -1
- package/package.json +5 -2
- package/prepare/index.ts +16 -0
- package/scripts/take-all-screenshots.ts +507 -0
- package/status/index.ts +2 -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 -26
- 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 -400
- package/examples/todo-orbit/generated/ios/Todo Orbit/TodoOrbit.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
- package/examples/todo-orbit/generated/ios/Todo Orbit/project.yml +0 -25
- 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,216 +0,0 @@
|
|
|
1
|
-
import { create } from "zustand";
|
|
2
|
-
import type { Preferences, Project, ProjectDraft, Task, TaskDraft, User } from "./types";
|
|
3
|
-
import { addDays, daysAgo, parseTags } from "./utils";
|
|
4
|
-
|
|
5
|
-
type AppState = {
|
|
6
|
-
user: User;
|
|
7
|
-
users: User[];
|
|
8
|
-
preferences: Preferences;
|
|
9
|
-
projects: Project[];
|
|
10
|
-
tasks: Task[];
|
|
11
|
-
searchQuery: string;
|
|
12
|
-
activeFilter: "all" | "today" | "upcoming" | "done";
|
|
13
|
-
selectedTaskId?: string;
|
|
14
|
-
setSearchQuery: (value: string) => void;
|
|
15
|
-
setActiveFilter: (value: "all" | "today" | "upcoming" | "done") => void;
|
|
16
|
-
setSelectedTaskId: (value?: string) => void;
|
|
17
|
-
setTheme: (value: Preferences["theme"]) => void;
|
|
18
|
-
updatePreferences: (patch: Partial<Preferences>) => void;
|
|
19
|
-
updateProfile: (patch: Pick<User, "name" | "email">) => void;
|
|
20
|
-
createTask: (draft: TaskDraft) => Task;
|
|
21
|
-
updateTask: (taskId: string, draft: TaskDraft) => void;
|
|
22
|
-
toggleTask: (taskId: string) => void;
|
|
23
|
-
deleteTask: (taskId: string) => void;
|
|
24
|
-
assignTask: (taskId: string, userId: string) => void;
|
|
25
|
-
createProject: (draft: ProjectDraft) => void;
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
const sampleUser: User = {
|
|
29
|
-
id: "user-1",
|
|
30
|
-
name: "Maya Hart",
|
|
31
|
-
firstName: "Maya",
|
|
32
|
-
email: "maya@taskflow.app"
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
const teamUsers: User[] = [
|
|
36
|
-
sampleUser,
|
|
37
|
-
{ id: "user-2", name: "Luca Park", firstName: "Luca", email: "luca@taskflow.app" },
|
|
38
|
-
{ id: "user-3", name: "Noah Singh", firstName: "Noah", email: "noah@taskflow.app" }
|
|
39
|
-
];
|
|
40
|
-
|
|
41
|
-
const sampleProjects: Project[] = [
|
|
42
|
-
{ id: "proj-1", name: "Product Launch", color: "#5B4FE8", icon: "rocket", taskCount: 3 },
|
|
43
|
-
{ id: "proj-2", name: "Ops Cleanup", color: "#E8634F", icon: "briefcase", taskCount: 2 },
|
|
44
|
-
{ id: "proj-3", name: "Brand Refresh", color: "#2D9D5E", icon: "star", taskCount: 1 }
|
|
45
|
-
];
|
|
46
|
-
|
|
47
|
-
const sampleTasks: Task[] = [
|
|
48
|
-
{
|
|
49
|
-
id: "task-1",
|
|
50
|
-
title: "Ship onboarding copy review",
|
|
51
|
-
description: "Review the final onboarding text with product and legal before release.",
|
|
52
|
-
status: "in_progress",
|
|
53
|
-
priority: "high",
|
|
54
|
-
dueDate: addDays(0),
|
|
55
|
-
projectId: "proj-1",
|
|
56
|
-
tags: ["launch", "copy"],
|
|
57
|
-
createdAt: daysAgo(3),
|
|
58
|
-
updatedAt: daysAgo(0),
|
|
59
|
-
assignee: teamUsers[1],
|
|
60
|
-
attachment: {
|
|
61
|
-
source: "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4",
|
|
62
|
-
mediaType: "video",
|
|
63
|
-
title: "Launch teaser draft"
|
|
64
|
-
}
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
id: "task-2",
|
|
68
|
-
title: "Audit due-date reminder logic",
|
|
69
|
-
description: "Check notification timing against the reminder preference spec.",
|
|
70
|
-
status: "todo",
|
|
71
|
-
priority: "urgent",
|
|
72
|
-
dueDate: addDays(2),
|
|
73
|
-
projectId: "proj-2",
|
|
74
|
-
tags: ["notifications", "qa"],
|
|
75
|
-
createdAt: daysAgo(2),
|
|
76
|
-
updatedAt: daysAgo(1)
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
id: "task-3",
|
|
80
|
-
title: "Warm theme polish pass",
|
|
81
|
-
description: "Tune the warm theme tinting against the token ranges.",
|
|
82
|
-
status: "done",
|
|
83
|
-
priority: "medium",
|
|
84
|
-
dueDate: daysAgo(1),
|
|
85
|
-
projectId: "proj-3",
|
|
86
|
-
tags: ["design"],
|
|
87
|
-
createdAt: daysAgo(6),
|
|
88
|
-
updatedAt: daysAgo(1),
|
|
89
|
-
assignee: teamUsers[2]
|
|
90
|
-
},
|
|
91
|
-
{
|
|
92
|
-
id: "task-4",
|
|
93
|
-
title: "Prepare project import CSV",
|
|
94
|
-
description: "Gather migration rows for the first customer workspace.",
|
|
95
|
-
status: "todo",
|
|
96
|
-
priority: "low",
|
|
97
|
-
dueDate: addDays(4),
|
|
98
|
-
projectId: "proj-2",
|
|
99
|
-
tags: ["ops", "data"],
|
|
100
|
-
createdAt: daysAgo(1),
|
|
101
|
-
updatedAt: daysAgo(1),
|
|
102
|
-
assignee: sampleUser
|
|
103
|
-
}
|
|
104
|
-
];
|
|
105
|
-
|
|
106
|
-
export const useAppStore = create<AppState>((set, get) => ({
|
|
107
|
-
user: sampleUser,
|
|
108
|
-
users: teamUsers,
|
|
109
|
-
preferences: {
|
|
110
|
-
theme: "system",
|
|
111
|
-
defaultPriority: "medium",
|
|
112
|
-
notificationsEnabled: true,
|
|
113
|
-
remindersEnabled: true
|
|
114
|
-
},
|
|
115
|
-
projects: sampleProjects,
|
|
116
|
-
tasks: sampleTasks,
|
|
117
|
-
searchQuery: "",
|
|
118
|
-
activeFilter: "today",
|
|
119
|
-
selectedTaskId: sampleTasks[0]?.id,
|
|
120
|
-
setSearchQuery: (value) => set({ searchQuery: value }),
|
|
121
|
-
setActiveFilter: (value) => set({ activeFilter: value }),
|
|
122
|
-
setSelectedTaskId: (value) => set({ selectedTaskId: value }),
|
|
123
|
-
setTheme: (value) => set((state) => ({ preferences: { ...state.preferences, theme: value } })),
|
|
124
|
-
updatePreferences: (patch) => set((state) => ({ preferences: { ...state.preferences, ...patch } })),
|
|
125
|
-
updateProfile: (patch) =>
|
|
126
|
-
set((state) => ({
|
|
127
|
-
user: {
|
|
128
|
-
...state.user,
|
|
129
|
-
...patch,
|
|
130
|
-
firstName: patch.name ? patch.name.split(" ")[0] ?? patch.name : state.user.firstName
|
|
131
|
-
}
|
|
132
|
-
})),
|
|
133
|
-
createTask: (draft) => {
|
|
134
|
-
const created: Task = {
|
|
135
|
-
id: `task-${Date.now()}`,
|
|
136
|
-
title: draft.title,
|
|
137
|
-
description: draft.description || undefined,
|
|
138
|
-
status: "todo",
|
|
139
|
-
priority: draft.priority,
|
|
140
|
-
dueDate: draft.dueDate || undefined,
|
|
141
|
-
projectId: draft.projectId || undefined,
|
|
142
|
-
tags: parseTags(draft.tags),
|
|
143
|
-
createdAt: new Date().toISOString(),
|
|
144
|
-
updatedAt: new Date().toISOString(),
|
|
145
|
-
assignee: draft.assignToSelf ? get().user : undefined
|
|
146
|
-
};
|
|
147
|
-
set((state) => ({ tasks: [created, ...state.tasks], selectedTaskId: created.id }));
|
|
148
|
-
syncProjectCounts(set, get);
|
|
149
|
-
return created;
|
|
150
|
-
},
|
|
151
|
-
updateTask: (taskId, draft) => {
|
|
152
|
-
set((state) => ({
|
|
153
|
-
tasks: state.tasks.map((task) =>
|
|
154
|
-
task.id === taskId
|
|
155
|
-
? {
|
|
156
|
-
...task,
|
|
157
|
-
title: draft.title,
|
|
158
|
-
description: draft.description || undefined,
|
|
159
|
-
priority: draft.priority,
|
|
160
|
-
dueDate: draft.dueDate || undefined,
|
|
161
|
-
projectId: draft.projectId || undefined,
|
|
162
|
-
tags: parseTags(draft.tags),
|
|
163
|
-
assignee: draft.assignToSelf ? state.user : task.assignee,
|
|
164
|
-
updatedAt: new Date().toISOString()
|
|
165
|
-
}
|
|
166
|
-
: task
|
|
167
|
-
)
|
|
168
|
-
}));
|
|
169
|
-
syncProjectCounts(set, get);
|
|
170
|
-
},
|
|
171
|
-
toggleTask: (taskId) => {
|
|
172
|
-
set((state) => ({
|
|
173
|
-
tasks: state.tasks.map((task) =>
|
|
174
|
-
task.id === taskId
|
|
175
|
-
? { ...task, status: task.status === "done" ? "todo" : "done", updatedAt: new Date().toISOString() }
|
|
176
|
-
: task
|
|
177
|
-
)
|
|
178
|
-
}));
|
|
179
|
-
},
|
|
180
|
-
deleteTask: (taskId) => {
|
|
181
|
-
set((state) => ({
|
|
182
|
-
tasks: state.tasks.filter((task) => task.id !== taskId),
|
|
183
|
-
selectedTaskId:
|
|
184
|
-
state.selectedTaskId === taskId ? state.tasks.find((task) => task.id !== taskId)?.id : state.selectedTaskId
|
|
185
|
-
}));
|
|
186
|
-
syncProjectCounts(set, get);
|
|
187
|
-
},
|
|
188
|
-
assignTask: (taskId, userId) => {
|
|
189
|
-
set((state) => ({
|
|
190
|
-
tasks: state.tasks.map((task) =>
|
|
191
|
-
task.id === taskId ? { ...task, assignee: state.users.find((user) => user.id === userId) } : task
|
|
192
|
-
)
|
|
193
|
-
}));
|
|
194
|
-
},
|
|
195
|
-
createProject: (draft) => {
|
|
196
|
-
set((state) => ({
|
|
197
|
-
projects: [
|
|
198
|
-
...state.projects,
|
|
199
|
-
{ id: `proj-${Date.now()}`, name: draft.name, color: draft.color, icon: draft.icon, taskCount: 0 }
|
|
200
|
-
]
|
|
201
|
-
}));
|
|
202
|
-
}
|
|
203
|
-
}));
|
|
204
|
-
|
|
205
|
-
function syncProjectCounts(
|
|
206
|
-
set: (partial: Partial<AppState> | ((state: AppState) => Partial<AppState>)) => void,
|
|
207
|
-
get: () => AppState
|
|
208
|
-
) {
|
|
209
|
-
const tasks = get().tasks;
|
|
210
|
-
set((state) => ({
|
|
211
|
-
projects: state.projects.map((project) => ({
|
|
212
|
-
...project,
|
|
213
|
-
taskCount: tasks.filter((task) => task.projectId === project.id).length
|
|
214
|
-
}))
|
|
215
|
-
}));
|
|
216
|
-
}
|