vibefast-cli 0.2.4 → 0.3.1
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/2/.claude/agents/architect.md +74 -0
- package/2/.claude/agents/convex-reviewer.md +267 -0
- package/2/.claude/agents/debug-detective.md +62 -0
- package/2/.claude/agents/learner.md +64 -0
- package/2/.claude/agents/perf-optimizer.md +71 -0
- package/2/.claude/agents/security-researcher.md +42 -0
- package/2/.claude/agents/tech-researcher.md +46 -0
- package/2/.claude/agents/ux-designer.md +45 -0
- package/2/.claude/commands/create-app-design.md +279 -0
- package/2/.claude/commands/create-prd-interactive.md +113 -0
- package/2/.claude/commands/create-prd.md +111 -0
- package/2/.claude/commands/create-tech-stack.md +345 -0
- package/2/.claude/commands/update-app-design.md +298 -0
- package/2/.claude/commands/update-project-structure.md +14 -0
- package/2/.claude/commands/update-tech-stack.md +325 -0
- package/2/.claude/docs/CONVEX_FEATURES_PLAN.md +249 -0
- package/2/.claude/docs/app-design-document.md +0 -0
- package/2/.claude/docs/project-status.md +25 -0
- package/2/.claude/docs/project-structure.md +7 -0
- package/2/.claude/docs/tech-stack.md +157 -0
- package/2/.claude/scripts/tree.sh +70 -0
- package/2/.claude/settings.json +30 -0
- package/2/.cursor/commands/code-review-high.md +190 -0
- package/2/.cursorignore +3 -0
- package/2/.github/ISSUE_TEMPLATE.md +13 -0
- package/2/.github/PULL_REQUEST_TEMPLATE.md +23 -0
- package/2/.github/actions/eas-build/action.yml +85 -0
- package/2/.github/actions/setup-jdk-generate-apk/action.yml +48 -0
- package/2/.github/actions/setup-node-pnpm-install/action.yml +29 -0
- package/2/.github/scripts/expo-doctor.sh +26 -0
- package/2/.github/workflows/compress-images.yml +48 -0
- package/2/.github/workflows/e2e-android-eas-build.yml +111 -0
- package/2/.github/workflows/e2e-android-maestro.yml +52 -0
- package/2/.github/workflows/e2e-android.yml +119 -0
- package/2/.github/workflows/eas-build-prod.yml +43 -0
- package/2/.github/workflows/eas-build-qa.yml +47 -0
- package/2/.github/workflows/expo-doctor.yml +61 -0
- package/2/.github/workflows/lint-ts.yml +49 -0
- package/2/.github/workflows/new-app-version.yml +65 -0
- package/2/.github/workflows/new-github-release.yml +34 -0
- package/2/.github/workflows/stale.yml +24 -0
- package/2/.github/workflows/test.yml +50 -0
- package/2/.github/workflows/type-check.yml +54 -0
- package/2/.husky/commit-msg +1 -0
- package/2/.husky/common.sh +8 -0
- package/2/.husky/post-merge +18 -0
- package/2/.husky/pre-commit +24 -0
- package/2/.prettierignore +14 -0
- package/2/.prettierrc.json +10 -0
- package/2/.vibefast/README.md +59 -0
- package/2/.vibefast/config.json +4 -0
- package/2/.vibefast/journal.json +234 -0
- package/2/.vibefast/starter.json +5 -0
- package/2/AGENTS.md +48 -0
- package/2/LICENSE +21 -0
- package/2/README.md +127 -0
- package/2/apps/native/__mocks__/bottom-sheet.js +6 -0
- package/2/apps/native/__mocks__/expo-router.js +16 -0
- package/2/apps/native/__mocks__/react-native-gesture-handler.ts +17 -0
- package/2/apps/native/app-env.d.ts +2 -0
- package/2/apps/native/app.config.ts +167 -0
- package/2/apps/native/assets/adaptive-icon.png +0 -0
- package/2/apps/native/assets/favicon.png +0 -0
- package/2/apps/native/assets/features/image-analyzer/front.jpg +0 -0
- package/2/apps/native/assets/features/image-analyzer/side.jpg +0 -0
- package/2/apps/native/assets/features/image-analyzer/threeQuarter.jpg +0 -0
- package/2/apps/native/assets/fonts/Inter.ttf +0 -0
- package/2/apps/native/assets/fonts/SF-Pro-Display-Bold.otf +0 -0
- package/2/apps/native/assets/fonts/SF-Pro-Display-Medium.otf +0 -0
- package/2/apps/native/assets/fonts/SF-Pro-Display-Regular.otf +0 -0
- package/2/apps/native/assets/fonts/SF-Pro-Display-Semibold.otf +0 -0
- package/2/apps/native/assets/fonts/SpaceMono-Regular.ttf +0 -0
- package/2/apps/native/assets/icon.png +0 -0
- package/2/apps/native/assets/images/cover-image.png +0 -0
- package/2/apps/native/assets/lottie-animations/onboarding-1.json +6504 -0
- package/2/apps/native/assets/lottie-animations/onboarding-2.json +1993 -0
- package/2/apps/native/assets/lottie-animations/onboarding-3.json +50159 -0
- package/2/apps/native/assets/lottie-animations/onboarding-4.json +735 -0
- package/2/apps/native/assets/lottie-animations/onboarding-6.json +2167 -0
- package/2/apps/native/assets/splash-icon.png +0 -0
- package/2/apps/native/babel.config.js +39 -0
- package/2/apps/native/eas.json +75 -0
- package/2/apps/native/env.js +196 -0
- package/2/apps/native/global.css +51 -0
- package/2/apps/native/index.ts +5 -0
- package/2/apps/native/jest-setup.ts +7 -0
- package/2/apps/native/jest.config.js +72 -0
- package/2/apps/native/metro.config.js +85 -0
- package/2/apps/native/nativewind-env.d.ts +1 -0
- package/2/apps/native/package.json +232 -0
- package/2/apps/native/scripts/DRY_RUN_REPORT.md +0 -0
- package/2/apps/native/scripts/QUICK_START.md +76 -0
- package/2/apps/native/scripts/README.md +187 -0
- package/2/apps/native/scripts/convex-setup.js +48 -0
- package/2/apps/native/scripts/download-vosk-model.mjs +121 -0
- package/2/apps/native/scripts/genrate-apk-and-install +39 -0
- package/2/apps/native/scripts/i18next-syntax-validation.js +23 -0
- package/2/apps/native/scripts/starter-setup.mjs +246 -0
- package/2/apps/native/src/api-client/auth.ts +68 -0
- package/2/apps/native/src/api-client/chatbot.ts +83 -0
- package/2/apps/native/src/api-client/client.ts +4 -0
- package/2/apps/native/src/api-client/image-analyzer.ts +62 -0
- package/2/apps/native/src/api-client/image-generator.ts +34 -0
- package/2/apps/native/src/api-client/index.ts +27 -0
- package/2/apps/native/src/api-client/payments.ts +44 -0
- package/2/apps/native/src/api-client/reporting.ts +29 -0
- package/2/apps/native/src/api-client/shared.ts +43 -0
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/_layout.tsx +166 -0
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/index.tsx +174 -0
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/profile.tsx +320 -0
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/settings.tsx +344 -0
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/_layout.tsx +198 -0
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/accordion.tsx +60 -0
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/advanced.tsx +24 -0
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/avatar.tsx +154 -0
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/badge-chips-toggle.tsx +81 -0
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/buttons.tsx +24 -0
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/charts.tsx +3 -0
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/date-picker.tsx +120 -0
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/file-picker.tsx +133 -0
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/gallery-video.tsx +119 -0
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/index.tsx +69 -0
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/inputs-stepper.tsx +78 -0
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/picker-dropdown.tsx +56 -0
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/popover-bottomsheet.tsx +229 -0
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/progress.tsx +38 -0
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/searchbar.tsx +70 -0
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/sliders.tsx +93 -0
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/spinner.tsx +80 -0
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/switch.tsx +47 -0
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/table.tsx +352 -0
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/tabs-timeline.tsx +122 -0
- package/2/apps/native/src/app/(root)/(protected)/_layout.tsx +143 -0
- package/2/apps/native/src/app/(root)/(protected)/analysis/[type]/_layout.tsx +5 -0
- package/2/apps/native/src/app/(root)/(protected)/analysis/[type]/analysis-options.tsx +50 -0
- package/2/apps/native/src/app/(root)/(protected)/analysis/[type]/camera.tsx +2 -0
- package/2/apps/native/src/app/(root)/(protected)/analysis/[type]/index.tsx +50 -0
- package/2/apps/native/src/app/(root)/(protected)/analysis/[type]/loading.tsx +50 -0
- package/2/apps/native/src/app/(root)/(protected)/analysis/[type]/results.tsx +2 -0
- package/2/apps/native/src/app/(root)/(protected)/analysis/[type]/trait-details.tsx +3 -0
- package/2/apps/native/src/app/(root)/(protected)/audio-recorder/index.tsx +5 -0
- package/2/apps/native/src/app/(root)/(protected)/charts/index.tsx +6 -0
- package/2/apps/native/src/app/(root)/(protected)/chatbot/index.tsx +2 -0
- package/2/apps/native/src/app/(root)/(protected)/image-generator/gallery.tsx +3 -0
- package/2/apps/native/src/app/(root)/(protected)/image-generator/index.tsx +3 -0
- package/2/apps/native/src/app/(root)/(protected)/paywall/index.tsx +74 -0
- package/2/apps/native/src/app/(root)/(protected)/paywall/local.tsx +25 -0
- package/2/apps/native/src/app/(root)/(protected)/paywall/remote.tsx +23 -0
- package/2/apps/native/src/app/(root)/(protected)/quick-actions-demo/index.tsx +32 -0
- package/2/apps/native/src/app/(root)/(protected)/quiz/index.tsx +47 -0
- package/2/apps/native/src/app/(root)/(protected)/test-wake-word.tsx +214 -0
- package/2/apps/native/src/app/(root)/(protected)/tracker-app/index.tsx +1 -0
- package/2/apps/native/src/app/(root)/(protected)/voice-bot/index.tsx +27 -0
- package/2/apps/native/src/app/(root)/(public)/(auth)/_layout.tsx +44 -0
- package/2/apps/native/src/app/(root)/(public)/(auth)/forgot-password.tsx +185 -0
- package/2/apps/native/src/app/(root)/(public)/(auth)/login.tsx +219 -0
- package/2/apps/native/src/app/(root)/(public)/(auth)/otp-verification.tsx +369 -0
- package/2/apps/native/src/app/(root)/(public)/(auth)/reset-password.tsx +247 -0
- package/2/apps/native/src/app/(root)/(public)/(auth)/signup.tsx +207 -0
- package/2/apps/native/src/app/(root)/(public)/_layout.tsx +60 -0
- package/2/apps/native/src/app/(root)/(public)/onboarding/demo-one.tsx +5 -0
- package/2/apps/native/src/app/(root)/(public)/onboarding/demo-two.tsx +52 -0
- package/2/apps/native/src/app/(root)/(public)/onboarding/index.tsx +82 -0
- package/2/apps/native/src/app/(root)/_layout.tsx +30 -0
- package/2/apps/native/src/app/+html.tsx +46 -0
- package/2/apps/native/src/app/[...messing].tsx +24 -0
- package/2/apps/native/src/app/_layout.tsx +56 -0
- package/2/apps/native/src/app/tsconfig.json +3 -0
- package/2/apps/native/src/components/advanced-ui/buttons/demo.tsx +19 -0
- package/2/apps/native/src/components/advanced-ui/buttons/glowing-button.tsx +366 -0
- package/2/apps/native/src/components/advanced-ui/chip/animated-chip.tsx +118 -0
- package/2/apps/native/src/components/advanced-ui/chip/chip.tsx +49 -0
- package/2/apps/native/src/components/advanced-ui/chip/demo.tsx +191 -0
- package/2/apps/native/src/components/advanced-ui/chip/types.ts +21 -0
- package/2/apps/native/src/components/advanced-ui/progress-bars/animated-progress-bar.tsx +182 -0
- package/2/apps/native/src/components/advanced-ui/progress-bars/dropdown-picker-page.tsx +124 -0
- package/2/apps/native/src/components/advanced-ui/progress-bars/progress-circle-page.tsx +111 -0
- package/2/apps/native/src/components/advanced-ui/progress-bars/progress-circle.tsx +223 -0
- package/2/apps/native/src/components/advanced-ui/sliders/swipe-slider-page.tsx +203 -0
- package/2/apps/native/src/components/advanced-ui/sliders/swipe-slider.tsx +266 -0
- package/2/apps/native/src/components/advanced-ui/stepper/children/button/stepper-button.tsx +96 -0
- package/2/apps/native/src/components/advanced-ui/stepper/children/button/types.ts +16 -0
- package/2/apps/native/src/components/advanced-ui/stepper/children/content/stepper-content.tsx +19 -0
- package/2/apps/native/src/components/advanced-ui/stepper/children/content/types.ts +6 -0
- package/2/apps/native/src/components/advanced-ui/stepper/children/value/stepper-value.tsx +43 -0
- package/2/apps/native/src/components/advanced-ui/stepper/children/value/types.ts +25 -0
- package/2/apps/native/src/components/advanced-ui/stepper/context/stepper-context.ts +19 -0
- package/2/apps/native/src/components/advanced-ui/stepper/context/types.ts +9 -0
- package/2/apps/native/src/components/advanced-ui/stepper/demo.tsx +346 -0
- package/2/apps/native/src/components/advanced-ui/stepper/index.ts +4 -0
- package/2/apps/native/src/components/advanced-ui/stepper/stepper.tsx +96 -0
- package/2/apps/native/src/components/advanced-ui/stepper/types.ts +13 -0
- package/2/apps/native/src/components/advanced-ui/switch/animated-switch.tsx +312 -0
- package/2/apps/native/src/components/advanced-ui/switch/demo.tsx +851 -0
- package/2/apps/native/src/components/advanced-ui/switch/types.ts +32 -0
- package/2/apps/native/src/components/advanced-ui/timeline/demo.tsx +444 -0
- package/2/apps/native/src/components/advanced-ui/timeline/timeline-view.tsx +355 -0
- package/2/apps/native/src/components/advanced-ui/timeline/types.ts +31 -0
- package/2/apps/native/src/components/analytics/navigation-tracker.tsx +10 -0
- package/2/apps/native/src/components/demo/advanced-ui-components.tsx +46 -0
- package/2/apps/native/src/components/demo/buttons-demo.tsx +56 -0
- package/2/apps/native/src/components/demo/colors-demo.tsx +52 -0
- package/2/apps/native/src/components/demo/dropdown-picker-demo.tsx +274 -0
- package/2/apps/native/src/components/demo/inputs-demo.tsx +99 -0
- package/2/apps/native/src/components/demo/notification-demo.tsx +434 -0
- package/2/apps/native/src/components/demo/title-demo.tsx +16 -0
- package/2/apps/native/src/components/demo/toast-demo.tsx +81 -0
- package/2/apps/native/src/components/demo/typography-demo.tsx +28 -0
- package/2/apps/native/src/components/performance/render-performance-monitor.tsx +36 -0
- package/2/apps/native/src/components/ui/accordion.tsx +138 -0
- package/2/apps/native/src/components/ui/avatar.tsx +66 -0
- package/2/apps/native/src/components/ui/badge.tsx +68 -0
- package/2/apps/native/src/components/ui/bottom-sheet.tsx +61 -0
- package/2/apps/native/src/components/ui/colors.js +290 -0
- package/2/apps/native/src/components/ui/core/button.tsx +317 -0
- package/2/apps/native/src/components/ui/core/card.tsx +40 -0
- package/2/apps/native/src/components/ui/core/checkbox.tsx +264 -0
- package/2/apps/native/src/components/ui/core/feature-button.tsx +162 -0
- package/2/apps/native/src/components/ui/core/focus-aware-status-bar.tsx +21 -0
- package/2/apps/native/src/components/ui/core/image.tsx +30 -0
- package/2/apps/native/src/components/ui/core/inputs/floating-text-input.tsx +369 -0
- package/2/apps/native/src/components/ui/core/inputs/input-otp.tsx +304 -0
- package/2/apps/native/src/components/ui/core/inputs/input.tsx +373 -0
- package/2/apps/native/src/components/ui/core/list.tsx +60 -0
- package/2/apps/native/src/components/ui/core/navigation/animated-header.tsx +87 -0
- package/2/apps/native/src/components/ui/core/navigation/screen-footer.tsx +67 -0
- package/2/apps/native/src/components/ui/core/overlays/dropdown.tsx +290 -0
- package/2/apps/native/src/components/ui/core/overlays/full-screen-loading.tsx +15 -0
- package/2/apps/native/src/components/ui/core/overlays/modal-keyboard-aware-scroll-view.tsx +46 -0
- package/2/apps/native/src/components/ui/core/overlays/modal.tsx +247 -0
- package/2/apps/native/src/components/ui/core/pagination-dots.tsx +231 -0
- package/2/apps/native/src/components/ui/core/pressable.tsx +48 -0
- package/2/apps/native/src/components/ui/core/progress-bar.tsx +47 -0
- package/2/apps/native/src/components/ui/core/progress.tsx +149 -0
- package/2/apps/native/src/components/ui/core/select.tsx +261 -0
- package/2/apps/native/src/components/ui/core/spinner.tsx +387 -0
- package/2/apps/native/src/components/ui/core/text.tsx +45 -0
- package/2/apps/native/src/components/ui/core/toast.tsx +190 -0
- package/2/apps/native/src/components/ui/custom-switch.tsx +90 -0
- package/2/apps/native/src/components/ui/date-time-picker.tsx +268 -0
- package/2/apps/native/src/components/ui/debug.ts +2 -0
- package/2/apps/native/src/components/ui/extras/debug-credit-tester.tsx +107 -0
- package/2/apps/native/src/components/ui/extras/debug-mmkv-state.tsx +53 -0
- package/2/apps/native/src/components/ui/extras/handle-error.ts +191 -0
- package/2/apps/native/src/components/ui/extras/hello-wave.tsx +70 -0
- package/2/apps/native/src/components/ui/extras/icon.tsx +36 -0
- package/2/apps/native/src/components/ui/extras/network-connectivity-wrapper.tsx +36 -0
- package/2/apps/native/src/components/ui/extras/offline-indicator.tsx +55 -0
- package/2/apps/native/src/components/ui/extras/social-login-buttons.tsx +296 -0
- package/2/apps/native/src/components/ui/file-picker.tsx +177 -0
- package/2/apps/native/src/components/ui/gallery.tsx +79 -0
- package/2/apps/native/src/components/ui/icons/apple.tsx +19 -0
- package/2/apps/native/src/components/ui/icons/arrow-right.tsx +26 -0
- package/2/apps/native/src/components/ui/icons/camera.tsx +26 -0
- package/2/apps/native/src/components/ui/icons/caret-down.tsx +20 -0
- package/2/apps/native/src/components/ui/icons/chevron-up.tsx +21 -0
- package/2/apps/native/src/components/ui/icons/claude.tsx +15 -0
- package/2/apps/native/src/components/ui/icons/copy.tsx +27 -0
- package/2/apps/native/src/components/ui/icons/deepseek.tsx +15 -0
- package/2/apps/native/src/components/ui/icons/download.tsx +32 -0
- package/2/apps/native/src/components/ui/icons/feed.tsx +12 -0
- package/2/apps/native/src/components/ui/icons/gemini.tsx +15 -0
- package/2/apps/native/src/components/ui/icons/github.tsx +30 -0
- package/2/apps/native/src/components/ui/icons/google.tsx +24 -0
- package/2/apps/native/src/components/ui/icons/groq.tsx +15 -0
- package/2/apps/native/src/components/ui/icons/home.tsx +19 -0
- package/2/apps/native/src/components/ui/icons/index.tsx +26 -0
- package/2/apps/native/src/components/ui/icons/language.tsx +33 -0
- package/2/apps/native/src/components/ui/icons/llama.tsx +15 -0
- package/2/apps/native/src/components/ui/icons/microphone.tsx +20 -0
- package/2/apps/native/src/components/ui/icons/mistral.tsx +22 -0
- package/2/apps/native/src/components/ui/icons/nutrition.tsx +15 -0
- package/2/apps/native/src/components/ui/icons/openai.tsx +15 -0
- package/2/apps/native/src/components/ui/icons/perplexity.tsx +22 -0
- package/2/apps/native/src/components/ui/icons/qwen.tsx +15 -0
- package/2/apps/native/src/components/ui/icons/rate.tsx +24 -0
- package/2/apps/native/src/components/ui/icons/report.tsx +20 -0
- package/2/apps/native/src/components/ui/icons/send-horizontal.tsx +26 -0
- package/2/apps/native/src/components/ui/icons/settings.tsx +12 -0
- package/2/apps/native/src/components/ui/icons/share.tsx +16 -0
- package/2/apps/native/src/components/ui/icons/square.tsx +9 -0
- package/2/apps/native/src/components/ui/icons/style.tsx +22 -0
- package/2/apps/native/src/components/ui/icons/support.tsx +27 -0
- package/2/apps/native/src/components/ui/icons/trash2.tsx +42 -0
- package/2/apps/native/src/components/ui/icons/user.tsx +12 -0
- package/2/apps/native/src/components/ui/icons/website.tsx +28 -0
- package/2/apps/native/src/components/ui/icons/wifi-off.tsx +17 -0
- package/2/apps/native/src/components/ui/index.tsx +14 -0
- package/2/apps/native/src/components/ui/nav-item.tsx +42 -0
- package/2/apps/native/src/components/ui/patterns/index.ts +16 -0
- package/2/apps/native/src/components/ui/picker.tsx +244 -0
- package/2/apps/native/src/components/ui/popover.tsx +313 -0
- package/2/apps/native/src/components/ui/primitives/index.ts +38 -0
- package/2/apps/native/src/components/ui/radio-group.tsx +47 -0
- package/2/apps/native/src/components/ui/searchbar.tsx +118 -0
- package/2/apps/native/src/components/ui/sheet.tsx +93 -0
- package/2/apps/native/src/components/ui/switch.tsx +37 -0
- package/2/apps/native/src/components/ui/table.tsx +296 -0
- package/2/apps/native/src/components/ui/tabs.tsx +115 -0
- package/2/apps/native/src/components/ui/toggle.tsx +50 -0
- package/2/apps/native/src/components/ui/utils.tsx +34 -0
- package/2/apps/native/src/components/ui/video.tsx +39 -0
- package/2/apps/native/src/core/analytics/analytics-service.ts +94 -0
- package/2/apps/native/src/core/analytics/index.ts +2 -0
- package/2/apps/native/src/core/analytics/posthog-analytics-adapter.ts +192 -0
- package/2/apps/native/src/core/auth/auth-service.ts +33 -0
- package/2/apps/native/src/core/auth/index.ts +1 -0
- package/2/apps/native/src/core/cache/__tests__/cache-service.test.ts +599 -0
- package/2/apps/native/src/core/cache/cache-service.ts +89 -0
- package/2/apps/native/src/core/cache/index.ts +45 -0
- package/2/apps/native/src/core/config/config.service.ts +153 -0
- package/2/apps/native/src/core/config/index.ts +2 -0
- package/2/apps/native/src/core/config/telemetry.ts +38 -0
- package/2/apps/native/src/core/local-notifications/local-notification-manager.ts +409 -0
- package/2/apps/native/src/core/logging/custom-transports.ts +126 -0
- package/2/apps/native/src/core/logging/index.ts +1 -0
- package/2/apps/native/src/core/logging/logger.ts +182 -0
- package/2/apps/native/src/core/navigation/deep-link-handler.ts +295 -0
- package/2/apps/native/src/core/navigation/navigation-types.ts +53 -0
- package/2/apps/native/src/core/payments/index.ts +1 -0
- package/2/apps/native/src/core/payments/payment-service.ts +32 -0
- package/2/apps/native/src/core/quick-actions/index.ts +2 -0
- package/2/apps/native/src/core/quick-actions/quick-actions-adapter.ts +54 -0
- package/2/apps/native/src/core/quick-actions/types.ts +29 -0
- package/2/apps/native/src/core/storage/index.ts +1 -0
- package/2/apps/native/src/core/storage/mmkv.ts +62 -0
- package/2/apps/native/src/core/storage/notification-storage.ts +312 -0
- package/2/apps/native/src/core/types/common.ts +0 -0
- package/2/apps/native/src/core/utils/convex-http-api.ts +30 -0
- package/2/apps/native/src/features/audio-recorder/components/audio-player.tsx +301 -0
- package/2/apps/native/src/features/audio-recorder/components/audio-recorder.tsx +373 -0
- package/2/apps/native/src/features/audio-recorder/components/audio-waveform.tsx +270 -0
- package/2/apps/native/src/features/audio-recorder/components/index.ts +4 -0
- package/2/apps/native/src/features/audio-recorder/components/recording-list.tsx +89 -0
- package/2/apps/native/src/features/audio-recorder/demo/audio-player-demo.tsx +66 -0
- package/2/apps/native/src/features/audio-recorder/demo/audio-recorder-cloud.tsx +68 -0
- package/2/apps/native/src/features/audio-recorder/demo/audio-recorder-interview.tsx +102 -0
- package/2/apps/native/src/features/audio-recorder/demo/basic.tsx +27 -0
- package/2/apps/native/src/features/audio-recorder/demo/index.ts +5 -0
- package/2/apps/native/src/features/audio-recorder/demo/with-recording-list-demo.tsx +82 -0
- package/2/apps/native/src/features/authentication/components/auth-watcher.tsx +115 -0
- package/2/apps/native/src/features/authentication/components/login-form.tsx +85 -0
- package/2/apps/native/src/features/authentication/services/__tests__/convex-auth.adapter.test.ts +399 -0
- package/2/apps/native/src/features/authentication/services/convex-auth.adapter.ts +497 -0
- package/2/apps/native/src/features/authentication/services/index.ts +2 -0
- package/2/apps/native/src/features/charts/README.md +185 -0
- package/2/apps/native/src/features/charts/app/preview.tsx +226 -0
- package/2/apps/native/src/features/charts/components/area-chart.tsx +43 -0
- package/2/apps/native/src/features/charts/components/bar-chart.tsx +146 -0
- package/2/apps/native/src/features/charts/components/candlestick-chart.tsx +199 -0
- package/2/apps/native/src/features/charts/components/chart-card.tsx +68 -0
- package/2/apps/native/src/features/charts/components/column-chart.tsx +146 -0
- package/2/apps/native/src/features/charts/components/doughnut-chart.tsx +260 -0
- package/2/apps/native/src/features/charts/components/index.ts +13 -0
- package/2/apps/native/src/features/charts/components/line-chart.tsx +311 -0
- package/2/apps/native/src/features/charts/components/radar-chart.tsx +183 -0
- package/2/apps/native/src/features/charts/components/radial-bar-chart.tsx +191 -0
- package/2/apps/native/src/features/charts/components/stacked-area-chart.tsx +268 -0
- package/2/apps/native/src/features/charts/components/stacked-bar-chart.tsx +325 -0
- package/2/apps/native/src/features/charts/data/mock-data.ts +186 -0
- package/2/apps/native/src/features/charts/types/index.ts +69 -0
- package/2/apps/native/src/features/chatbot/app/index.tsx +303 -0
- package/2/apps/native/src/features/chatbot/components/chat-header-buttons.tsx +60 -0
- package/2/apps/native/src/features/chatbot/components/chat-input-bar.tsx +470 -0
- package/2/apps/native/src/features/chatbot/components/chat-markdown.tsx +576 -0
- package/2/apps/native/src/features/chatbot/components/chat-message-bubble.tsx +247 -0
- package/2/apps/native/src/features/chatbot/components/chat-settings-modal.tsx +162 -0
- package/2/apps/native/src/features/chatbot/components/image-preview-list.tsx +116 -0
- package/2/apps/native/src/features/chatbot/components/markdown/code-block.tsx +166 -0
- package/2/apps/native/src/features/chatbot/components/markdown/index.ts +11 -0
- package/2/apps/native/src/features/chatbot/components/markdown/table-renderer.tsx +130 -0
- package/2/apps/native/src/features/chatbot/components/message-error-boundary.tsx +79 -0
- package/2/apps/native/src/features/chatbot/components/message-list.tsx +174 -0
- package/2/apps/native/src/features/chatbot/components/model-selector.tsx +284 -0
- package/2/apps/native/src/features/chatbot/components/report-content-modal.tsx +189 -0
- package/2/apps/native/src/features/chatbot/components/suggested-messages.tsx +68 -0
- package/2/apps/native/src/features/chatbot/constants/models.ts +21 -0
- package/2/apps/native/src/features/chatbot/constants/report-reasons.ts +10 -0
- package/2/apps/native/src/features/chatbot/hooks/use-attachment-cache.ts +144 -0
- package/2/apps/native/src/features/chatbot/hooks/use-chat-config.ts +665 -0
- package/2/apps/native/src/features/chatbot/hooks/use-chat-handlers.ts +360 -0
- package/2/apps/native/src/features/chatbot/hooks/use-chatbot-settings.ts +90 -0
- package/2/apps/native/src/features/chatbot/hooks/use-conversation.ts +80 -0
- package/2/apps/native/src/features/chatbot/hooks/use-image-picker.ts +123 -0
- package/2/apps/native/src/features/chatbot/hooks/use-keyboard-coordinator.ts +162 -0
- package/2/apps/native/src/features/chatbot/hooks/use-smart-scroll-manager.ts +214 -0
- package/2/apps/native/src/features/chatbot/models/index.ts +87 -0
- package/2/apps/native/src/features/chatbot/models/models.ts +163 -0
- package/2/apps/native/src/features/chatbot/models/providers.ts +63 -0
- package/2/apps/native/src/features/chatbot/models/types.ts +41 -0
- package/2/apps/native/src/features/chatbot/services/file-uploader.ts +239 -0
- package/2/apps/native/src/features/chatbot/services/message-handler-service.ts +181 -0
- package/2/apps/native/src/features/chatbot/types/index.ts +61 -0
- package/2/apps/native/src/features/chatbot/utils/chat-telemetry.ts +92 -0
- package/2/apps/native/src/features/image-analyzer/app/analysis-options-screen.tsx +304 -0
- package/2/apps/native/src/features/image-analyzer/app/camera.tsx +221 -0
- package/2/apps/native/src/features/image-analyzer/app/image-capture-screen.tsx +333 -0
- package/2/apps/native/src/features/image-analyzer/app/loading-screen.tsx +217 -0
- package/2/apps/native/src/features/image-analyzer/app/loading.tsx +194 -0
- package/2/apps/native/src/features/image-analyzer/app/results.tsx +137 -0
- package/2/apps/native/src/features/image-analyzer/app/trait-details.tsx +172 -0
- package/2/apps/native/src/features/image-analyzer/app/use-analysis-data.ts +143 -0
- package/2/apps/native/src/features/image-analyzer/app/use-results-screen.ts +151 -0
- package/2/apps/native/src/features/image-analyzer/components/results/achievement-badge.tsx +77 -0
- package/2/apps/native/src/features/image-analyzer/components/results/achievement-card.tsx +75 -0
- package/2/apps/native/src/features/image-analyzer/components/results/achievement-unlocked-modal.tsx +162 -0
- package/2/apps/native/src/features/image-analyzer/components/results/achievements-section.tsx +44 -0
- package/2/apps/native/src/features/image-analyzer/components/results/advice-list.tsx +42 -0
- package/2/apps/native/src/features/image-analyzer/components/results/circular-progress.tsx +233 -0
- package/2/apps/native/src/features/image-analyzer/components/results/content-card.tsx +38 -0
- package/2/apps/native/src/features/image-analyzer/components/results/error-state.tsx +42 -0
- package/2/apps/native/src/features/image-analyzer/components/results/index.ts +9 -0
- package/2/apps/native/src/features/image-analyzer/components/results/loading-state.tsx +26 -0
- package/2/apps/native/src/features/image-analyzer/components/results/profile-image.tsx +60 -0
- package/2/apps/native/src/features/image-analyzer/components/results/results-header.tsx +62 -0
- package/2/apps/native/src/features/image-analyzer/components/results/score-display.tsx +54 -0
- package/2/apps/native/src/features/image-analyzer/components/results/share-options-modal.tsx +110 -0
- package/2/apps/native/src/features/image-analyzer/components/results/traits-grid.tsx +74 -0
- package/2/apps/native/src/features/image-analyzer/config/analysis-config.ts +80 -0
- package/2/apps/native/src/features/image-analyzer/config/master-analysis-config.ts +157 -0
- package/2/apps/native/src/features/image-analyzer/hooks/index.ts +1 -0
- package/2/apps/native/src/features/image-analyzer/hooks/use-analysis.ts +37 -0
- package/2/apps/native/src/features/image-analyzer/hooks/use-image-analysis.ts +202 -0
- package/2/apps/native/src/features/image-analyzer/services/analysis-service.ts +262 -0
- package/2/apps/native/src/features/image-analyzer/services/share-service.ts +176 -0
- package/2/apps/native/src/features/image-analyzer/services/trait-details-service.ts +289 -0
- package/2/apps/native/src/features/image-generator/app/_layout.tsx +26 -0
- package/2/apps/native/src/features/image-generator/app/gallery.tsx +217 -0
- package/2/apps/native/src/features/image-generator/app/index.tsx +237 -0
- package/2/apps/native/src/features/image-generator/components/gallery-image.tsx +25 -0
- package/2/apps/native/src/features/image-generator/components/image-detail-modal.tsx +215 -0
- package/2/apps/native/src/features/image-generator/components/image-model-selector.tsx +210 -0
- package/2/apps/native/src/features/image-generator/components/image-placeholder.tsx +26 -0
- package/2/apps/native/src/features/image-generator/hooks/use-image-gallery.ts +71 -0
- package/2/apps/native/src/features/image-generator/hooks/use-image-generator-settings.ts +152 -0
- package/2/apps/native/src/features/image-generator/hooks/use-image-generator.ts +93 -0
- package/2/apps/native/src/features/image-generator/models/models.ts +66 -0
- package/2/apps/native/src/features/image-generator/services/image-gallery-service.ts +98 -0
- package/2/apps/native/src/features/image-generator/services/image-save-service.ts +121 -0
- package/2/apps/native/src/features/onboarding/analytics/index.ts +9 -0
- package/2/apps/native/src/features/onboarding/components/onboarding-with-analytics.tsx +141 -0
- package/2/apps/native/src/features/onboarding/components/onboarding.tsx +173 -0
- package/2/apps/native/src/features/onboarding/config/onboarding-flow-config.ts +189 -0
- package/2/apps/native/src/features/onboarding/demo-one/app/index.tsx +43 -0
- package/2/apps/native/src/features/onboarding/demo-one/data.ts +32 -0
- package/2/apps/native/src/features/onboarding/hooks/use-onboarding-analytics.ts +323 -0
- package/2/apps/native/src/features/onboarding/services/onboarding-analytics.ts +432 -0
- package/2/apps/native/src/features/payments/README.md +200 -0
- package/2/apps/native/src/features/payments/app/local-paywall.tsx +194 -0
- package/2/apps/native/src/features/payments/app/remote-paywall.tsx +79 -0
- package/2/apps/native/src/features/payments/components/payment-initializer.tsx +95 -0
- package/2/apps/native/src/features/payments/components/paywall-error-state.tsx +60 -0
- package/2/apps/native/src/features/payments/components/paywall-local-mode.tsx +116 -0
- package/2/apps/native/src/features/payments/components/paywall-product-card.tsx +133 -0
- package/2/apps/native/src/features/payments/components/paywall-remote-mode.tsx +146 -0
- package/2/apps/native/src/features/payments/hooks/use-entitlement.ts +63 -0
- package/2/apps/native/src/features/payments/index.ts +8 -0
- package/2/apps/native/src/features/payments/services/revenuecat-adapter.ts +407 -0
- package/2/apps/native/src/features/quick-actions/components/quick-actions-demo.tsx +139 -0
- package/2/apps/native/src/features/quick-actions/config/default-actions.ts +83 -0
- package/2/apps/native/src/features/quick-actions/hooks/use-quick-actions.ts +45 -0
- package/2/apps/native/src/features/quick-actions/index.ts +4 -0
- package/2/apps/native/src/features/quick-actions/utils/quick-actions-manager.ts +105 -0
- package/2/apps/native/src/features/quiz/components/question.tsx +67 -0
- package/2/apps/native/src/features/quiz/config.ts +11 -0
- package/2/apps/native/src/features/quiz/index.tsx +133 -0
- package/2/apps/native/src/features/settings/ui/debug-info.tsx +75 -0
- package/2/apps/native/src/features/settings/ui/dev-tools.tsx +1 -0
- package/2/apps/native/src/features/settings/ui/item.tsx +45 -0
- package/2/apps/native/src/features/settings/ui/items-container.tsx +23 -0
- package/2/apps/native/src/features/settings/ui/language-item.tsx +52 -0
- package/2/apps/native/src/features/settings/ui/notification-item.tsx +59 -0
- package/2/apps/native/src/features/settings/ui/theme-item.tsx +45 -0
- package/2/apps/native/src/features/tracker-app/app/index.tsx +108 -0
- package/2/apps/native/src/features/tracker-app/components/animated-number.tsx +102 -0
- package/2/apps/native/src/features/tracker-app/components/calorie-card.tsx +66 -0
- package/2/apps/native/src/features/tracker-app/components/circular-progress.tsx +97 -0
- package/2/apps/native/src/features/tracker-app/components/floating-add-button.tsx +27 -0
- package/2/apps/native/src/features/tracker-app/components/macro-card.tsx +80 -0
- package/2/apps/native/src/features/tracker-app/components/promo-banner.tsx +98 -0
- package/2/apps/native/src/features/tracker-app/components/recently-logged.tsx +64 -0
- package/2/apps/native/src/features/tracker-app/components/week-calendar.tsx +68 -0
- package/2/apps/native/src/features/vibefast-features.ts +42 -0
- package/2/apps/native/src/features/voice-bot/README.md +185 -0
- package/2/apps/native/src/features/voice-bot/components/conversation-status.tsx +76 -0
- package/2/apps/native/src/features/voice-bot/components/index.ts +4 -0
- package/2/apps/native/src/features/voice-bot/components/message-input.tsx +98 -0
- package/2/apps/native/src/features/voice-bot/components/voice-bot-screen.tsx +173 -0
- package/2/apps/native/src/features/voice-bot/components/voice-controls.tsx +73 -0
- package/2/apps/native/src/features/voice-bot/index.ts +3 -0
- package/2/apps/native/src/features/voice-bot/services/index.ts +1 -0
- package/2/apps/native/src/features/voice-bot/services/use-voice-bot.ts +161 -0
- package/2/apps/native/src/features/voice-bot/types.ts +29 -0
- package/2/apps/native/src/features/wake-word/components/index.ts +1 -0
- package/2/apps/native/src/features/wake-word/components/wake-word-indicator.tsx +61 -0
- package/2/apps/native/src/features/wake-word/constants.ts +10 -0
- package/2/apps/native/src/features/wake-word/hooks/use-wake-word.ts +181 -0
- package/2/apps/native/src/features/wake-word/index.ts +22 -0
- package/2/apps/native/src/features/wake-word/services/audio-session.ts +40 -0
- package/2/apps/native/src/features/wake-word/services/event-bus.ts +31 -0
- package/2/apps/native/src/features/wake-word/services/keywords.ts +88 -0
- package/2/apps/native/src/features/wake-word/services/wake-word-manager.ts +249 -0
- package/2/apps/native/src/features/wake-word/types.ts +22 -0
- package/2/apps/native/src/lib/env.js +13 -0
- package/2/apps/native/src/lib/hooks/index.tsx +6 -0
- package/2/apps/native/src/lib/hooks/use-device-identifier.tsx +80 -0
- package/2/apps/native/src/lib/hooks/use-gradual-animation.ts +28 -0
- package/2/apps/native/src/lib/hooks/use-is-first-time.tsx +25 -0
- package/2/apps/native/src/lib/hooks/use-navigation-analytics.ts +44 -0
- package/2/apps/native/src/lib/hooks/use-navigation-options.tsx +87 -0
- package/2/apps/native/src/lib/hooks/use-push-notifications.ts +250 -0
- package/2/apps/native/src/lib/hooks/use-responsive-size.tsx +37 -0
- package/2/apps/native/src/lib/hooks/use-selected-theme.tsx +38 -0
- package/2/apps/native/src/lib/hooks/use-viewport-lazy-loading.tsx +124 -0
- package/2/apps/native/src/lib/i18n/index.tsx +30 -0
- package/2/apps/native/src/lib/i18n/react-i18next.d.ts +9 -0
- package/2/apps/native/src/lib/i18n/resources.ts +25 -0
- package/2/apps/native/src/lib/i18n/types.ts +23 -0
- package/2/apps/native/src/lib/i18n/utils.tsx +112 -0
- package/2/apps/native/src/lib/index.tsx +3 -0
- package/2/apps/native/src/lib/state/auth-client-slice.ts +34 -0
- package/2/apps/native/src/lib/state/index.ts +1 -0
- package/2/apps/native/src/lib/storage.tsx +7 -0
- package/2/apps/native/src/lib/test-utils.tsx +43 -0
- package/2/apps/native/src/lib/use-theme-config.tsx +108 -0
- package/2/apps/native/src/lib/utils.ts +29 -0
- package/2/apps/native/src/polyfills.ts +61 -0
- package/2/apps/native/src/providers/convex-provider.tsx +31 -0
- package/2/apps/native/src/providers/index.tsx +6 -0
- package/2/apps/native/src/providers/notification-provider.tsx +168 -0
- package/2/apps/native/src/providers/posthog-provider.tsx +47 -0
- package/2/apps/native/src/providers/root-providers.tsx +46 -0
- package/2/apps/native/src/providers/sentry-provider.tsx +62 -0
- package/2/apps/native/src/providers/splash-screen-provider.tsx +122 -0
- package/2/apps/native/src/providers/theme-provider.tsx +67 -0
- package/2/apps/native/src/translations/ar.json +394 -0
- package/2/apps/native/src/translations/de.json +394 -0
- package/2/apps/native/src/translations/en.json +394 -0
- package/2/apps/native/src/translations/es.json +394 -0
- package/2/apps/native/src/translations/fr.json +394 -0
- package/2/apps/native/src/types/flash-list.d.ts +3 -0
- package/2/apps/native/src/types/index.ts +3 -0
- package/2/apps/native/src/types/react-native-reanimated.d.ts +5 -0
- package/2/apps/native/tailwind.config.js +57 -0
- package/2/apps/native/targets/widget/AppIntent.swift +46 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-20x20@1x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-20x20@2x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-20x20@3x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-29x29@1x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-29x29@2x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-29x29@3x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-40x40@1x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-40x40@2x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-40x40@3x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-60x60@2x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-60x60@3x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-76x76@1x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-76x76@2x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-83.5x83.5@2x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/Contents.json +122 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png +0 -0
- package/2/apps/native/targets/widget/CalorieTrackerWidget.swift +424 -0
- package/2/apps/native/targets/widget/HabitTrackerWidget.swift +305 -0
- package/2/apps/native/targets/widget/Info.plist +11 -0
- package/2/apps/native/targets/widget/WidgetLiveActivity.swift +75 -0
- package/2/apps/native/targets/widget/expo-target.config.js +10 -0
- package/2/apps/native/targets/widget/generated.entitlements +5 -0
- package/2/apps/native/targets/widget/index.swift +18 -0
- package/2/apps/native/targets/widget/widgets.swift +96 -0
- package/2/apps/native/tsconfig.json +88 -0
- package/2/apps/native/vitest.config.mts +14 -0
- package/2/apps/web/README.md +36 -0
- package/2/apps/web/app/favicon.ico +0 -0
- package/2/apps/web/app/globals.css +122 -0
- package/2/apps/web/app/layout.tsx +38 -0
- package/2/apps/web/app/page.tsx +35 -0
- package/2/apps/web/app/users/page.tsx +301 -0
- package/2/apps/web/components/AdminDashboard.tsx +336 -0
- package/2/apps/web/components/AppleLogo.tsx +15 -0
- package/2/apps/web/components/GitHubLogo.tsx +11 -0
- package/2/apps/web/components/GoogleLogo.tsx +23 -0
- package/2/apps/web/components/Layout.tsx +77 -0
- package/2/apps/web/components/ThemeToggle.tsx +23 -0
- package/2/apps/web/components/UserMenu.tsx +66 -0
- package/2/apps/web/components/auth/CodeInput.tsx +24 -0
- package/2/apps/web/components/auth/ResetPasswordWithEmailCode.tsx +85 -0
- package/2/apps/web/components/auth/SignInFormEmailCode.tsx +72 -0
- package/2/apps/web/components/auth/SignInFormEmailLink.tsx +81 -0
- package/2/apps/web/components/auth/SignInFormPassword.tsx +17 -0
- package/2/apps/web/components/auth/SignInFormPasswordAndCustomField.tsx +42 -0
- package/2/apps/web/components/auth/SignInFormPasswordAndResetViaCode.tsx +32 -0
- package/2/apps/web/components/auth/SignInFormPasswordAndVerifyViaCode.tsx +86 -0
- package/2/apps/web/components/auth/SignInFormPhoneCode.tsx +89 -0
- package/2/apps/web/components/auth/SignInFormsShowcase.tsx +64 -0
- package/2/apps/web/components/auth/SignInMethodDivider.tsx +17 -0
- package/2/apps/web/components/auth/SignInWithEmailCode.tsx +49 -0
- package/2/apps/web/components/auth/SignInWithOAuth.tsx +16 -0
- package/2/apps/web/components/auth/SignInWithPassword.tsx +100 -0
- package/2/apps/web/components/auth/oauth/SignInWithApple.tsx +27 -0
- package/2/apps/web/components/auth/oauth/SignInWithGitHub.tsx +27 -0
- package/2/apps/web/components/auth/oauth/SignInWithGoogle.tsx +27 -0
- package/2/apps/web/components/ui/button.tsx +60 -0
- package/2/apps/web/components/ui/card.tsx +92 -0
- package/2/apps/web/components/ui/dialog.tsx +143 -0
- package/2/apps/web/components/ui/dropdown-menu.tsx +257 -0
- package/2/apps/web/components/ui/input-otp.tsx +77 -0
- package/2/apps/web/components/ui/input.tsx +21 -0
- package/2/apps/web/components/ui/skeleton.tsx +13 -0
- package/2/apps/web/components/ui/tabs.tsx +66 -0
- package/2/apps/web/components/ui/toast.tsx +130 -0
- package/2/apps/web/components/ui/toaster.tsx +36 -0
- package/2/apps/web/components/ui/toggle-group.tsx +83 -0
- package/2/apps/web/components/ui/toggle.tsx +47 -0
- package/2/apps/web/components/ui/use-toast.ts +192 -0
- package/2/apps/web/components.json +22 -0
- package/2/apps/web/eslint.config.mjs +18 -0
- package/2/apps/web/lib/convex-provider.tsx +18 -0
- package/2/apps/web/lib/utils.ts +6 -0
- package/2/apps/web/next.config.ts +7 -0
- package/2/apps/web/package.json +46 -0
- package/2/apps/web/postcss.config.mjs +7 -0
- package/2/apps/web/public/file.svg +1 -0
- package/2/apps/web/public/globe.svg +1 -0
- package/2/apps/web/public/next.svg +1 -0
- package/2/apps/web/public/vercel.svg +1 -0
- package/2/apps/web/public/window.svg +1 -0
- package/2/apps/web/tsconfig.json +34 -0
- package/2/bts.jsonc +21 -0
- package/2/commitlint.config.js +1 -0
- package/2/eslint.config.mjs +182 -0
- package/2/lint-staged.config.js +16 -0
- package/2/package.json +64 -0
- package/2/packages/backend/.env.example +20 -0
- package/2/packages/backend/convex/README.md +90 -0
- package/2/packages/backend/convex/_generated/api.d.ts +2599 -0
- package/2/packages/backend/convex/_generated/api.js +23 -0
- package/2/packages/backend/convex/_generated/dataModel.d.ts +60 -0
- package/2/packages/backend/convex/_generated/server.d.ts +149 -0
- package/2/packages/backend/convex/_generated/server.js +90 -0
- package/2/packages/backend/convex/agents.ts +116 -0
- package/2/packages/backend/convex/auth.config.ts +8 -0
- package/2/packages/backend/convex/auth.ts +103 -0
- package/2/packages/backend/convex/authCustomEmailOtpProvider.ts +175 -0
- package/2/packages/backend/convex/authOtp.ts +144 -0
- package/2/packages/backend/convex/authPasswordReset.ts +367 -0
- package/2/packages/backend/convex/authPasswordResetActions.ts +150 -0
- package/2/packages/backend/convex/chatbot/index.ts +30 -0
- package/2/packages/backend/convex/chatbotAgent.ts +1085 -0
- package/2/packages/backend/convex/chatbotHistory.ts +307 -0
- package/2/packages/backend/convex/convex.config.ts +13 -0
- package/2/packages/backend/convex/deviceGrants.ts +58 -0
- package/2/packages/backend/convex/grantFunctions.ts +444 -0
- package/2/packages/backend/convex/http.ts +8 -0
- package/2/packages/backend/convex/imageAnalysis/index.ts +18 -0
- package/2/packages/backend/convex/imageAnalysisFunctions.ts +325 -0
- package/2/packages/backend/convex/imageGeneration/index.ts +12 -0
- package/2/packages/backend/convex/imageGeneratorFunctions.ts +290 -0
- package/2/packages/backend/convex/lib/ai/analysisConfigs.ts +257 -0
- package/2/packages/backend/convex/lib/ai/config.ts +71 -0
- package/2/packages/backend/convex/lib/ai/geminiAdapter.ts +43 -0
- package/2/packages/backend/convex/lib/ai/imageAnalysisAdapter.ts +200 -0
- package/2/packages/backend/convex/lib/ai/openaiAdapter.ts +43 -0
- package/2/packages/backend/convex/lib/ai/schemas.ts +79 -0
- package/2/packages/backend/convex/lib/config.ts +111 -0
- package/2/packages/backend/convex/lib/rateLimit.ts +100 -0
- package/2/packages/backend/convex/lib/telemetry.ts +29 -0
- package/2/packages/backend/convex/paymentFunctions.ts +119 -0
- package/2/packages/backend/convex/payments/index.ts +13 -0
- package/2/packages/backend/convex/pushNotificationFunctions.ts +342 -0
- package/2/packages/backend/convex/ragKnowledge.ts +714 -0
- package/2/packages/backend/convex/rateLimit.ts +13 -0
- package/2/packages/backend/convex/recordingFunctions.ts +98 -0
- package/2/packages/backend/convex/reportFunctions.ts +344 -0
- package/2/packages/backend/convex/reporting/index.ts +9 -0
- package/2/packages/backend/convex/router.ts +81 -0
- package/2/packages/backend/convex/schema.ts +237 -0
- package/2/packages/backend/convex/shared/email.ts +172 -0
- package/2/packages/backend/convex/shared/files.ts +96 -0
- package/2/packages/backend/convex/shared/index.ts +17 -0
- package/2/packages/backend/convex/shared/templates/PasswordResetEmail.tsx +72 -0
- package/2/packages/backend/convex/shared/templates/VerificationCodeEmail.tsx +65 -0
- package/2/packages/backend/convex/sharedUsers.ts +48 -0
- package/2/packages/backend/convex/tools/index.ts +18 -0
- package/2/packages/backend/convex/tools/knowledgeRetrieval.ts +92 -0
- package/2/packages/backend/convex/tools/tavilySearch.ts +83 -0
- package/2/packages/backend/convex/tools/userProfile.ts +72 -0
- package/2/packages/backend/convex/tsconfig.json +25 -0
- package/2/packages/backend/convex/users.ts +54 -0
- package/2/packages/backend/index.ts +20 -0
- package/2/packages/backend/package.json +32 -0
- package/2/packages/ui/README.md +63 -0
- package/2/packages/ui/index.ts +1 -0
- package/2/packages/ui/package.json +21 -0
- package/2/packages/ui/src/components/SharedButton.tsx +31 -0
- package/2/packages/ui/src/components/SharedCard.tsx +48 -0
- package/2/packages/ui/src/components/index.ts +2 -0
- package/2/packages/ui/tsconfig.json +10 -0
- package/2/pnpm-lock.yaml +23292 -0
- package/2/pnpm-workspace.yaml +3 -0
- package/2/scripts/i18next-syntax-validation.js +1 -0
- package/2/tsconfig.json +43 -0
- package/2/turbo.json +33 -0
- package/2/vercel.json +6 -0
- package/2/vf-agent/agent-teams/team-vibefast.yaml +14 -0
- package/2/vf-agent/agents/analyst.md +53 -0
- package/2/vf-agent/agents/architect.md +105 -0
- package/2/vf-agent/agents/dev.md +40 -0
- package/2/vf-agent/agents/orchestrator.md +181 -0
- package/2/vf-agent/agents/pm.md +48 -0
- package/2/vf-agent/agents/po.md +38 -0
- package/2/vf-agent/agents/qa.md +30 -0
- package/2/vf-agent/agents/sm.md +38 -0
- package/2/vf-agent/agents/ux-expert.md +33 -0
- package/2/vf-agent/checklists/po-master-checklist.md +73 -0
- package/2/vf-agent/checklists/story-dod-checklist.md +37 -0
- package/2/vf-agent/core-config.yaml +43 -0
- package/2/vf-agent/data/knowledge_base/backend/convex-advanced.md +43 -0
- package/2/vf-agent/data/knowledge_base/backend/convex-database.md +53 -0
- package/2/vf-agent/data/knowledge_base/backend/convex-main.md +65 -0
- package/2/vf-agent/data/knowledge_base/backend/full-guidelines.md +795 -0
- package/2/vf-agent/data/knowledge_base/coding-standards.md +253 -0
- package/2/vf-agent/data/knowledge_base/frontend/full-guidelines.md +254 -0
- package/2/vf-agent/data/knowledge_base/frontend/image-handling.md +48 -0
- package/2/vf-agent/data/knowledge_base/frontend/react-native-main.md +24 -0
- package/2/vf-agent/data/knowledge_base/frontend/ui-and-styling.md +169 -0
- package/2/vf-agent/data/knowledge_base/general-principles.md +26 -0
- package/2/vf-agent/data/knowledge_base/master-rulebook.md +42 -0
- package/2/vf-agent/data/knowledge_base/starter-docs/audio-recorder-reference.md +98 -0
- package/2/vf-agent/data/knowledge_base/starter-docs/authentication-reference.md +155 -0
- package/2/vf-agent/data/knowledge_base/starter-docs/charts-reference.md +149 -0
- package/2/vf-agent/data/knowledge_base/starter-docs/chatbot-reference.md +123 -0
- package/2/vf-agent/data/knowledge_base/starter-docs/feature-reference-index.md +211 -0
- package/2/vf-agent/data/knowledge_base/starter-docs/features-overview.md +221 -0
- package/2/vf-agent/data/knowledge_base/starter-docs/image-analyzer-reference.md +118 -0
- package/2/vf-agent/data/knowledge_base/starter-docs/image-generator-reference.md +110 -0
- package/2/vf-agent/data/knowledge_base/starter-docs/index.md +28 -0
- package/2/vf-agent/data/knowledge_base/starter-docs/onboarding-reference.md +96 -0
- package/2/vf-agent/data/knowledge_base/starter-docs/payments-reference.md +148 -0
- package/2/vf-agent/data/knowledge_base/starter-docs/prd.md +82 -0
- package/2/vf-agent/data/knowledge_base/starter-docs/push-notifications-reference.md +453 -0
- package/2/vf-agent/data/knowledge_base/starter-docs/quick-actions-reference.md +253 -0
- package/2/vf-agent/data/knowledge_base/starter-docs/quiz-reference.md +169 -0
- package/2/vf-agent/data/knowledge_base/starter-docs/settings-reference.md +146 -0
- package/2/vf-agent/data/knowledge_base/starter-docs/tech-stack.md +159 -0
- package/2/vf-agent/data/knowledge_base/starter-docs/tracker-app-reference.md +150 -0
- package/2/vf-agent/data/knowledge_base/starter-docs/unified-project-structure.md +98 -0
- package/2/vf-agent/data/knowledge_base/testing/backend-testing.md +54 -0
- package/2/vf-agent/data/knowledge_base/testing/frontend-testing.md +71 -0
- package/2/vf-agent/data/knowledge_base/testing/testing-strategy.md +31 -0
- package/2/vf-agent/tasks/advanced-elicitation.md +117 -0
- package/2/vf-agent/tasks/brownfield-create-epic.md +160 -0
- package/2/vf-agent/tasks/create-deep-research-prompt.md +278 -0
- package/2/vf-agent/tasks/create-doc.md +42 -0
- package/2/vf-agent/tasks/create-story.md +43 -0
- package/2/vf-agent/tasks/document-project.md +343 -0
- package/2/vf-agent/tasks/facilitate-brainstorming-session.md +136 -0
- package/2/vf-agent/tasks/index-docs.md +173 -0
- package/2/vf-agent/tasks/kb-mode-interaction.md +75 -0
- package/2/vf-agent/tasks/review-story.md +154 -0
- package/2/vf-agent/tasks/shard-doc.md +185 -0
- package/2/vf-agent/tasks/troubleshoot-issue.md +65 -0
- package/2/vf-agent/tasks/validate-next-story.md +47 -0
- package/2/vf-agent/templates/brainstorming-output-tmpl.yaml +156 -0
- package/2/vf-agent/templates/brownfield-architecture-tmpl.yaml +111 -0
- package/2/vf-agent/templates/brownfield-prd-tmpl.yaml +247 -0
- package/2/vf-agent/templates/competitor-analysis-tmpl.yaml +293 -0
- package/2/vf-agent/templates/market-research-tmpl.yaml +252 -0
- package/2/vf-agent/templates/project-brief-tmpl.yaml +221 -0
- package/2/vf-agent/templates/story-tmpl.yaml +143 -0
- package/BEFORE-AFTER.md +327 -0
- package/CHANGELOG.md +73 -0
- package/CLI-ROADMAP.md +415 -0
- package/COMMAND-REFERENCE.md +341 -0
- package/IMPLEMENTATION-STATUS.md +316 -0
- package/MANUAL-TEST-CHECKLIST.md +264 -0
- package/OPTIONS-GLOSSARY.md +308 -0
- package/PHASE-1-2-3-COMPLETE.md +435 -0
- package/PHASE-1-2-IMPLEMENTATION.md +280 -0
- package/PHASE-1-2-SUMMARY.md +183 -0
- package/QUICK-START.md +352 -0
- package/RECIPES-GUIDE.md +325 -0
- package/RELEASE-CHECKLIST.md +269 -0
- package/VF-INIT-FLOW.md +446 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +328 -66
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/checklist.d.ts.map +1 -1
- package/dist/commands/checklist.js +69 -5
- package/dist/commands/checklist.js.map +1 -1
- package/dist/commands/env.d.ts +3 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +130 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/health.d.ts +3 -0
- package/dist/commands/health.d.ts.map +1 -0
- package/dist/commands/health.js +214 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +436 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +36 -16
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +5 -0
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/remove.d.ts.map +1 -1
- package/dist/commands/remove.js +11 -0
- package/dist/commands/remove.js.map +1 -1
- package/dist/core/__tests__/detect.test.d.ts +2 -0
- package/dist/core/__tests__/detect.test.d.ts.map +1 -0
- package/dist/core/__tests__/detect.test.js +73 -0
- package/dist/core/__tests__/detect.test.js.map +1 -0
- package/dist/core/detect.d.ts +10 -0
- package/dist/core/detect.d.ts.map +1 -0
- package/dist/core/detect.js +58 -0
- package/dist/core/detect.js.map +1 -0
- package/dist/core/env.d.ts +24 -0
- package/dist/core/env.d.ts.map +1 -0
- package/dist/core/env.js +83 -0
- package/dist/core/env.js.map +1 -0
- package/dist/core/errors.d.ts +13 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +111 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/prompt.d.ts +46 -2
- package/dist/core/prompt.d.ts.map +1 -1
- package/dist/core/prompt.js +179 -15
- package/dist/core/prompt.js.map +1 -1
- package/dist/core/prompts.d.ts +23 -0
- package/dist/core/prompts.d.ts.map +1 -0
- package/dist/core/prompts.js +85 -0
- package/dist/core/prompts.js.map +1 -0
- package/dist/core/recipes.d.ts +31 -0
- package/dist/core/recipes.d.ts.map +1 -0
- package/dist/core/recipes.js +138 -0
- package/dist/core/recipes.js.map +1 -0
- package/dist/core/spinner.d.ts +20 -0
- package/dist/core/spinner.d.ts.map +1 -0
- package/dist/core/spinner.js +72 -0
- package/dist/core/spinner.js.map +1 -0
- package/dist/core/vosk.d.ts +7 -0
- package/dist/core/vosk.d.ts.map +1 -0
- package/dist/core/vosk.js +94 -0
- package/dist/core/vosk.js.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -1
- package/package.json +6 -1
- package/recipes/README.md +156 -0
- package/recipes/image-analysis/recipe.json +61 -0
- package/recipes/image-analysis@latest.zip +0 -0
- package/recipes/image-generator/recipe.json +7 -12
- package/recipes/posthog.json +46 -0
- package/recipes/revenuecat.json +43 -0
- package/recipes/sentry.json +46 -0
- package/recipes/voice-bot/recipe.json +10 -7
- package/recipes/wake-word/apps/native/assets/vosk-model/README.md +103 -0
- package/recipes/wake-word/apps/native/src/app/(root)/(protected)/test-wake-word.tsx +216 -0
- package/recipes/wake-word/apps/native/src/features/wake-word/components/index.ts +1 -0
- package/recipes/wake-word/apps/native/src/features/wake-word/components/wake-word-indicator.tsx +61 -0
- package/recipes/wake-word/apps/native/src/features/wake-word/constants.ts +10 -0
- package/recipes/wake-word/apps/native/src/features/wake-word/hooks/use-wake-word.ts +181 -0
- package/recipes/wake-word/apps/native/src/features/wake-word/index.ts +22 -0
- package/recipes/wake-word/apps/native/src/features/wake-word/services/audio-session.ts +40 -0
- package/recipes/wake-word/apps/native/src/features/wake-word/services/event-bus.ts +31 -0
- package/recipes/wake-word/apps/native/src/features/wake-word/services/keywords.ts +88 -0
- package/recipes/wake-word/apps/native/src/features/wake-word/services/wake-word-manager.ts +249 -0
- package/recipes/wake-word/apps/native/src/features/wake-word/types.ts +22 -0
- package/recipes/wake-word/recipe.json +50 -0
- package/recipes/wake-word/scripts/download-vosk-model.mjs +121 -0
- package/recipes/wake-word@latest.zip +0 -0
- package/scripts/sync-recipes.js +93 -0
- package/src/commands/add.ts +401 -68
- package/src/commands/checklist.ts +81 -6
- package/src/commands/env.ts +163 -0
- package/src/commands/health.ts +225 -0
- package/src/commands/init.ts +534 -0
- package/src/commands/list.ts +42 -16
- package/src/commands/login.ts +6 -0
- package/src/commands/remove.ts +12 -0
- package/src/core/__tests__/detect.test.ts +91 -0
- package/src/core/detect.ts +60 -0
- package/src/core/env.ts +109 -0
- package/src/core/errors.ts +122 -0
- package/src/core/prompt.ts +227 -16
- package/src/core/prompts.ts +115 -0
- package/src/core/recipes.ts +152 -0
- package/src/core/spinner.ts +87 -0
- package/src/core/vosk.ts +111 -0
- package/src/index.ts +50 -0
- package/test-locally.sh +145 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# UI & Styling Guidelines
|
|
2
|
+
|
|
3
|
+
## 0. Visual Design Fundamentals (CRITICAL)
|
|
4
|
+
|
|
5
|
+
### Soft, Harmonious Design
|
|
6
|
+
|
|
7
|
+
- **NEVER** use harsh contrasts: `border-black` on white or `border-white` on dark
|
|
8
|
+
- **ALWAYS** use soft borders: `border-neutral-200 dark:border-neutral-800`
|
|
9
|
+
- **Default rounding:** `rounded-lg` for cards, `rounded-md` for buttons
|
|
10
|
+
- **Soft text:** `text-neutral-900 dark:text-white` instead of pure black/white
|
|
11
|
+
|
|
12
|
+
### Theme-Aware Styling (MANDATORY)
|
|
13
|
+
|
|
14
|
+
**ALWAYS** style for both themes using `dark:` prefix:
|
|
15
|
+
|
|
16
|
+
```tsx
|
|
17
|
+
// ✅ CORRECT - Both themes covered
|
|
18
|
+
<Text className="text-neutral-800 dark:text-white">
|
|
19
|
+
<View className="bg-white dark:bg-gray-900 border border-neutral-200 dark:border-neutral-800">
|
|
20
|
+
|
|
21
|
+
// ❌ WRONG - Only light theme
|
|
22
|
+
<Text className="text-neutral-800">
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**Essential combinations:**
|
|
26
|
+
|
|
27
|
+
- Text: `text-neutral-800 dark:text-white` | `text-neutral-600 dark:text-neutral-300`
|
|
28
|
+
- Backgrounds: `bg-white dark:bg-gray-900` | `bg-neutral-50 dark:bg-neutral-800`
|
|
29
|
+
- Borders: `border-neutral-200 dark:border-neutral-800`
|
|
30
|
+
|
|
31
|
+
### Anti-Boring Design
|
|
32
|
+
|
|
33
|
+
When given creative freedom, add visual interest:
|
|
34
|
+
|
|
35
|
+
- **Accent colors:** `bg-blue-50 dark:bg-blue-900/20 border-l-4 border-blue-500`
|
|
36
|
+
- **Status colors:** Green (success), amber (warning), red (error), blue (info)
|
|
37
|
+
- **Avoid:** All-gray interfaces - use purposeful color for engagement
|
|
38
|
+
|
|
39
|
+
### Intentional Design (CRITICAL)
|
|
40
|
+
|
|
41
|
+
**Don't blindly apply rules everywhere.** Be purposeful:
|
|
42
|
+
|
|
43
|
+
- **Borders:** Only add when they serve a purpose (separation, emphasis, grouping)
|
|
44
|
+
- **Backgrounds:** Use sparingly - not every element needs a background color
|
|
45
|
+
- **Colors:** Each color should have meaning (brand, status, hierarchy)
|
|
46
|
+
- **Shadows:** Only for elevation/layering, not decoration
|
|
47
|
+
|
|
48
|
+
```tsx
|
|
49
|
+
// ✅ INTENTIONAL - Borders serve clear purposes
|
|
50
|
+
<View className="border-t border-neutral-200 dark:border-neutral-800 pt-4"> // Section divider
|
|
51
|
+
<View className="border border-red-200 bg-red-50 rounded-lg p-3"> // Error container
|
|
52
|
+
<TextInput className="border border-neutral-300 rounded-lg"> // Form field
|
|
53
|
+
|
|
54
|
+
// ❌ OVER-DESIGNED - Unnecessary borders everywhere
|
|
55
|
+
<Text className="border border-neutral-200 p-2">Just text</Text> // Why border this?
|
|
56
|
+
<View className="bg-neutral-50 border border-neutral-300"> // Too much visual noise
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Ask yourself:** "Why am I adding this border/background/color? What problem does it solve?"
|
|
60
|
+
|
|
61
|
+
### Mobile-First UX
|
|
62
|
+
|
|
63
|
+
- **Touch targets:** Minimum `min-h-11 min-w-11` (44px)
|
|
64
|
+
- **Screen padding:** `px-4` minimum, `gap-6` between sections
|
|
65
|
+
- **Typography scale:** `text-2xl` (titles) → `text-lg` (sections) → `text-base` (body) → `text-sm` (secondary)
|
|
66
|
+
|
|
67
|
+
## 1. Core Component Rules (MANDATORY)
|
|
68
|
+
|
|
69
|
+
### Button Usage
|
|
70
|
+
|
|
71
|
+
- **Button component:** Takes `label` prop, NEVER put `<Text>` inside
|
|
72
|
+
- **Button layouts:** Stack vertically for long text (3+ words), row only for short text
|
|
73
|
+
|
|
74
|
+
```tsx
|
|
75
|
+
// ✅ CORRECT
|
|
76
|
+
<Button label="Submit" onPress={handleSubmit} />
|
|
77
|
+
<View className="gap-4">
|
|
78
|
+
<Button label="Start New Project" />
|
|
79
|
+
<Button label="View All Projects" />
|
|
80
|
+
</View>
|
|
81
|
+
|
|
82
|
+
// ❌ WRONG
|
|
83
|
+
<Button><Text>Submit</Text></Button>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Component Library
|
|
87
|
+
|
|
88
|
+
- **MUST** use built-in components from `apps/native/src/components/ui/` (import via `@/components/ui`)
|
|
89
|
+
- **Pressable** for complex interactive elements (icons, multi-line, custom layouts)
|
|
90
|
+
- **Button** for simple text-only actions
|
|
91
|
+
|
|
92
|
+
## 2. Smart UX Patterns
|
|
93
|
+
|
|
94
|
+
### Dashboard Thinking
|
|
95
|
+
|
|
96
|
+
Add value-driven widgets when appropriate:
|
|
97
|
+
|
|
98
|
+
```tsx
|
|
99
|
+
// ✅ User-focused dashboard
|
|
100
|
+
<View className="gap-4">
|
|
101
|
+
<View className="flex-row gap-4">
|
|
102
|
+
<StatsCard title="Revenue" value="$12,450" trend="+15%" />
|
|
103
|
+
<StatsCard title="Users" value="1,284" trend="+8%" />
|
|
104
|
+
</View>
|
|
105
|
+
<ProgressCard title="Monthly Goal" current={75} total={100} />
|
|
106
|
+
</View>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Micro-Interactions & Feedback
|
|
110
|
+
|
|
111
|
+
```tsx
|
|
112
|
+
// Loading states - Use custom Spinner
|
|
113
|
+
{loading ? <Spinner variant="pulse" size="sm" /> : <Text>Submit</Text>}
|
|
114
|
+
|
|
115
|
+
// Success/Error - Use Toast notifications
|
|
116
|
+
toast.success('Saved successfully!');
|
|
117
|
+
toast.error('Failed to save');
|
|
118
|
+
|
|
119
|
+
// Touch feedback
|
|
120
|
+
<Pressable className="active:scale-95 active:bg-blue-600">
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Empty States
|
|
124
|
+
|
|
125
|
+
Never show blank screens:
|
|
126
|
+
|
|
127
|
+
```tsx
|
|
128
|
+
{
|
|
129
|
+
items.length === 0 ? (
|
|
130
|
+
<View className="flex-1 justify-center items-center px-8">
|
|
131
|
+
<Text className="text-4xl mb-4">📝</Text>
|
|
132
|
+
<Text className="text-lg font-semibold mb-2">No items yet</Text>
|
|
133
|
+
<Text className="text-neutral-600 dark:text-neutral-300 mb-6">
|
|
134
|
+
Start by creating your first item
|
|
135
|
+
</Text>
|
|
136
|
+
<Button label="Create First Item" onPress={handleCreate} />
|
|
137
|
+
</View>
|
|
138
|
+
) : (
|
|
139
|
+
<FlatList data={items} />
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## 3. Technical Requirements
|
|
145
|
+
|
|
146
|
+
### Styling
|
|
147
|
+
|
|
148
|
+
- **Primary:** NativeWind only, no inline styles
|
|
149
|
+
- **Spacing:** Use `gap-*` for flex containers, avoid `space-*`
|
|
150
|
+
- **Grid:** Not supported, use `flexbox` with wrapping
|
|
151
|
+
- **Theme colors:** Use `text-primary`, `bg-primary` for brand colors
|
|
152
|
+
- **Accessibility:** All interactive elements need `accessibilityRole`, `accessibilityLabel`
|
|
153
|
+
|
|
154
|
+
### Performance
|
|
155
|
+
|
|
156
|
+
- `SafeAreaView` or proper insets for screen layout
|
|
157
|
+
- `FlashList` optimization: `estimatedItemSize` for better performance
|
|
158
|
+
- Smooth interactions with proper touch targets and feedback
|
|
159
|
+
|
|
160
|
+
## Quick Reference
|
|
161
|
+
|
|
162
|
+
**Common Patterns:**
|
|
163
|
+
|
|
164
|
+
- Cards: `bg-white dark:bg-gray-800 rounded-xl p-6 shadow-sm border border-neutral-200 dark:border-neutral-700`
|
|
165
|
+
- Forms: Clear labels, validation feedback, proper keyboard types
|
|
166
|
+
- Lists: Pull-to-refresh, swipe actions, skeleton loading
|
|
167
|
+
- Navigation: Tab bar + stack, clear hierarchy
|
|
168
|
+
|
|
169
|
+
**Remember:** User requirements always override these suggestions. These guidelines apply when you have creative freedom to enhance the UX.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# General Principles & Philosophy
|
|
2
|
+
|
|
3
|
+
## Project Context
|
|
4
|
+
|
|
5
|
+
- **Project:** "vibefast" - A modular React Native Expo starter kit for AI-powered mobile applications.
|
|
6
|
+
- **Core Philosophy:** Modularity, AI-IDE friendliness, swappable services, developer efficiency, LLM-friendly codebase.
|
|
7
|
+
- **Repository Layout:** pnpm/Turborepo monorepo (`apps/native` for Expo, `packages/backend` for Convex, shared packages under `packages/*`).
|
|
8
|
+
- **Backend:** Convex (Auth, DB, Functions, Storage, Cron) packaged as `@vibefast/backend`.
|
|
9
|
+
- **Frontend:** React Native with Expo (`apps/native`).
|
|
10
|
+
|
|
11
|
+
## Core Principles
|
|
12
|
+
|
|
13
|
+
- **Modularity & DRY:** Prioritize iteration and modularization over code duplication. Components and services should be reusable and maintainable.
|
|
14
|
+
- **Clarity over Cleverness:** Write concise, readable, and technically sound TypeScript code.
|
|
15
|
+
- **Functional & Declarative:** Strongly prefer functional components (React) and declarative programming patterns. Avoid classes.
|
|
16
|
+
- **Abstraction:** External SDKs or vendor-specific logic (e.g., RevenueCat, AI providers) **MUST** be accessed only through adapter layers or dedicated service implementations. Core application logic should interact with our defined interfaces, not directly with vendor SDKs.
|
|
17
|
+
- **Atomic Commits:** Keep diffs atomic. Each commit or PR should represent one logical change.
|
|
18
|
+
- **Documentation:** Use JSDoc for every exported function, type, and prop interface. Maintain clear READMEs.
|
|
19
|
+
- **TypeScript Usage Guidelines:** - **Strict Mode:** All code **MUST** compile with `tsc --noEmit`. - **Types over Interfaces:** Prefer `type` for defining object shapes, props, etc., unless interface-specific features like declaration merging are needed. - **Avoid Enums:** Use `as const` objects for string or numeric literal unions:
|
|
20
|
+
```typescript
|
|
21
|
+
export const UserRoles = { Admin: 'ADMIN', User: 'USER' } as const;
|
|
22
|
+
export type UserRole = (typeof UserRoles)[keyof typeof UserRoles];
|
|
23
|
+
**Error Handling & Logging:**
|
|
24
|
+
- **Core Logging Service:** For all client-side logging, you **MUST** use the `Logger`from`apps/native/src/core/logging/`(via the`@/core/logging`alias). Do not use`console.log` directly in application logic outside of temporary debugging.
|
|
25
|
+
- **User-Friendly Messages:** In the UI, always provide clear, user-friendly error messages. Log detailed technical errors to the monitoring service (e.g., Sentry) for debugging, but do not expose stack traces or technical jargon to the user.
|
|
26
|
+
- **`try...catch`Blocks:** Avoid using`try...catch` for flow control. Use them for genuine exceptional circumstances or when wrapping external API calls that are expected to fail under certain conditions. Let errors propagate to a higher-level handler where appropriate. - **Backend Error Handling:** Catch any errors from third-party API calls within Convex actions. Return standardized error objects or messages to the client. Do not leak raw external API errors or sensitive information.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# VibeFast Master Rulebook
|
|
2
|
+
|
|
3
|
+
This is the central knowledge base for the VibeFast project. All agents MUST adhere to the principles and rules outlined in the documents linked below. This is the immutable source of truth for the VibeFast architecture and development standards.
|
|
4
|
+
|
|
5
|
+
## 1. Core Principles & Architecture
|
|
6
|
+
|
|
7
|
+
- **[General Philosophy & High-Level Principles](./general-principles.md)**
|
|
8
|
+
- **[Official Tech Stack](./starter-docs/tech-stack.md)**
|
|
9
|
+
- **[Unified Project Structure](./starter-docs/unified-project-structure.md)**
|
|
10
|
+
|
|
11
|
+
## 2. Universal Standards (Apply to both Frontend & Backend)
|
|
12
|
+
|
|
13
|
+
- **[Coding Style & Naming Conventions](./coding-standards.md)**
|
|
14
|
+
- **[Testing Guidelines](./testing-guidelines.md)**
|
|
15
|
+
- **[Image Handling Rules](./frontend/image-handling.md)**
|
|
16
|
+
|
|
17
|
+
## 3. Backend Development (Convex)
|
|
18
|
+
|
|
19
|
+
- **[Convex - Core Concepts](./backend/convex-main.md)** (Functions, Visibility, Validators, API Design)
|
|
20
|
+
- **[Convex - Database & Schema](./backend/convex-database.md)** (Schema, Queries, Mutations, Search)
|
|
21
|
+
- **[Convex - Advanced Features](./backend/convex-advanced.md)** (HTTP Actions, Scheduling, File Storage)
|
|
22
|
+
- **[Convex Full Guidelines](./backend/full-guidelines.md)** (Additional Convex-specific rules)
|
|
23
|
+
|
|
24
|
+
## 4. Frontend Development (React Native & Expo)
|
|
25
|
+
|
|
26
|
+
- **[React Native - Core Concepts](./frontend/react-native-main.md)** (State Management, Component Design)
|
|
27
|
+
- **[UI & Styling Guidelines](./frontend/ui-and-styling.md)** (NativeWind, Core UI Components, CRITICAL Button Rules)
|
|
28
|
+
- **[Image Handling Rules](./frontend/image-handling.md)**
|
|
29
|
+
- **[Frontend Guidelines](./frontend/full-guidelines.md)** (Additional React Native rules)
|
|
30
|
+
|
|
31
|
+
## 5. Testing Strategy
|
|
32
|
+
|
|
33
|
+
- **[Overall Testing Strategy](./testing/testing-strategy.md)**
|
|
34
|
+
- **[Frontend Testing Patterns (Jest & RNTL)](./testing/frontend-testing.md)**
|
|
35
|
+
- **[Backend Testing Patterns (Vitest)](./testing/backend-testing.md)**
|
|
36
|
+
|
|
37
|
+
## 6. Project Structure & Reference
|
|
38
|
+
|
|
39
|
+
- **[Starter Kit Documentation](./starter-docs/)**
|
|
40
|
+
- **[Feature Reference Index](./starter-docs/feature-reference-index.md)**
|
|
41
|
+
- **[Tech Stack Reference](./starter-docs/tech-stack.md)**
|
|
42
|
+
- **[Unified Project Structure](./starter-docs/unified-project-structure.md)**
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Audio Recorder Reference
|
|
2
|
+
|
|
3
|
+
> Frontend paths reference the Expo workspace (`apps/native/src/...`).
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The Audio Recorder feature provides a complete solution for capturing, storing, and playing back audio within the app. It leverages the powerful `expo-av` library for client-side recording and playback, and uses Convex for persistent storage and metadata management.
|
|
8
|
+
|
|
9
|
+
### Core Technologies
|
|
10
|
+
|
|
11
|
+
- **[Expo AV](https://docs.expo.dev/versions/latest/sdk/av/):** The core of the feature, used for accessing the device microphone, managing recording sessions, and playing back audio.
|
|
12
|
+
- **[Convex File Storage](https://docs.convex.dev/file-storage):** The recorded audio files are uploaded as blobs and stored securely in Convex.
|
|
13
|
+
- **[Convex Mutations & Queries](https://docs.convex.dev/functions):** Used to create, update, list, and delete recording metadata in the database.
|
|
14
|
+
- **[Moti](https://moti.fyi/):** Used for creating the smooth animations in the `AudioVisualizer` component.
|
|
15
|
+
|
|
16
|
+
## Getting Started
|
|
17
|
+
|
|
18
|
+
The Audio Recorder feature is ready to use out-of-the-box and does not require any external API keys. It will request microphone permissions from the user on first use.
|
|
19
|
+
|
|
20
|
+
### Audio Recording Flow
|
|
21
|
+
|
|
22
|
+
1. **User Initiates Recording:** The user presses the record button in the `AudioRecorderControls` component, which calls the `startRecording` function from the `useAudioRecorder` hook.
|
|
23
|
+
2. **Permissions & Setup:** The hook requests microphone permissions if not already granted and sets the `Audio` mode for recording.
|
|
24
|
+
3. **Recording State:** `expo-av` begins recording. The `useAudioRecorder` hook tracks the state, including duration and metering data for the visualizer.
|
|
25
|
+
4. **User Stops Recording:** The user presses the stop button, calling the `stopRecording` function.
|
|
26
|
+
5. **File Upload & Finalization:**
|
|
27
|
+
- The hook gets the local file URI of the completed recording.
|
|
28
|
+
- It first calls the `createRecordingDraft` Convex mutation to get a new `recordingId`.
|
|
29
|
+
- It then fetches the audio data from the local URI, creates a `Blob`, and uploads it to Convex File Storage using the `useUploadFile` hook.
|
|
30
|
+
- Once the file is uploaded, it calls the `finalizeRecording` mutation, updating the database record with the file's storage ID, final duration, and metering data.
|
|
31
|
+
6. **UI Update:** The `RecordingList` component, which uses the `useRecordingsList` hook, automatically updates to show the newly saved recording.
|
|
32
|
+
|
|
33
|
+
## Key Components & Hooks
|
|
34
|
+
|
|
35
|
+
### Core Components
|
|
36
|
+
|
|
37
|
+
- `AudioRecorderControls`: The main UI for starting, pausing, resuming, and stopping a recording.
|
|
38
|
+
- `RecordingList`: Displays a list of all the user's past recordings.
|
|
39
|
+
- `RecordingListItem`: Renders a single item in the list, containing the `AudioPlayer` and controls for renaming or deleting the recording.
|
|
40
|
+
- `AudioPlayer`: A component for playing back a recorded audio file, which includes an `AudioVisualizer`.
|
|
41
|
+
- `AudioVisualizer`: Displays the audio waveform or playback progress using animated bars.
|
|
42
|
+
- `Timer`: A simple component to display the recording or playback duration.
|
|
43
|
+
|
|
44
|
+
### Core Hooks
|
|
45
|
+
|
|
46
|
+
- `useAudioRecorder`: The primary hook for handling the entire recording process. It manages permissions, recording state (start, stop, pause, resume), and the logic for saving the final file to Convex.
|
|
47
|
+
- `useAudioPlayer`: A hook for managing the playback of a single audio file. It handles loading the sound, play/pause state, and tracking playback progress.
|
|
48
|
+
- `useRecordingsList`: A hook that fetches all of the user's recordings and provides the mutations for deleting or renaming them.
|
|
49
|
+
|
|
50
|
+
## How-To Guides
|
|
51
|
+
|
|
52
|
+
### 1. Change the Audio Quality
|
|
53
|
+
|
|
54
|
+
You can change the quality of the audio recordings by modifying the preset used in the `useAudioRecorder` hook.
|
|
55
|
+
|
|
56
|
+
**File to Edit:** `apps/native/src/features/audio-recorder/hooks/use-audio-recorder.ts`
|
|
57
|
+
|
|
58
|
+
```ts
|
|
59
|
+
// ... inside startRecording function
|
|
60
|
+
const { recording: newRecording } = await Audio.Recording.createAsync(
|
|
61
|
+
// Change preset here. Options: HIGH_QUALITY, LOW_QUALITY
|
|
62
|
+
Audio.RecordingOptionsPresets.LOW_QUALITY,
|
|
63
|
+
(status) => {
|
|
64
|
+
// ...
|
|
65
|
+
},
|
|
66
|
+
);
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 2. Customize the Visualizer
|
|
70
|
+
|
|
71
|
+
The `AudioVisualizer` can be easily customized.
|
|
72
|
+
|
|
73
|
+
**File to Edit:** `apps/native/src/features/audio-recorder/components/audio-visualizer.tsx`
|
|
74
|
+
|
|
75
|
+
- **Number of Bars:** Change the `NUM_BARS` constant to increase or decrease the resolution of the visualizer.
|
|
76
|
+
- **Bar Height:** Modify the `getBarHeight` function to change the sensitivity or maximum height of the bars.
|
|
77
|
+
- **Colors:** The colors are controlled by Tailwind CSS classes (`bg-primary`, `bg-muted-foreground`). You can change these to match your app's theme.
|
|
78
|
+
|
|
79
|
+
### 3. Add Transcription (Conceptual)
|
|
80
|
+
|
|
81
|
+
To add audio transcription:
|
|
82
|
+
|
|
83
|
+
1. **Create a New Action:** Create a new Convex `action` (e.g., `transcribeRecording`).
|
|
84
|
+
2. **Trigger the Action:** After a recording is successfully finalized, you could modify the `stopRecording` function in `useAudioRecorder` to call this new action, passing the `storageId` of the audio file.
|
|
85
|
+
3. **Backend Logic:**
|
|
86
|
+
- The `transcribeRecording` action would fetch the audio file from storage.
|
|
87
|
+
- It would then send the audio data to a third-party transcription service (e.g., OpenAI's Whisper API).
|
|
88
|
+
- Upon receiving the transcript, it would call an `internalMutation` to save the text to the corresponding recording's document in the database.
|
|
89
|
+
4. **Display Transcript:** Update the `RecordingListItem` to display the new transcript field if it exists.
|
|
90
|
+
|
|
91
|
+
## Backend (Convex)
|
|
92
|
+
|
|
93
|
+
- **`packages/backend/convex/recordingFunctions.ts`:** This file contains all the necessary database operations for the feature.
|
|
94
|
+
- `createRecordingDraft` (mutation): Creates a placeholder record to get an ID before the file upload begins.
|
|
95
|
+
- `finalizeRecording` (mutation): Updates the draft record with the final file URI, duration, and other metadata after the upload is complete.
|
|
96
|
+
- `deleteRecording` (mutation): Deletes a recording record from the database.
|
|
97
|
+
- `updateRecordingName` (mutation): Allows users to rename their recordings.
|
|
98
|
+
- `listRecordings` (query): Fetches all of a user's completed recordings.
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# Authentication Reference
|
|
2
|
+
|
|
3
|
+
> Frontend paths reference the Expo workspace (`apps/native/src/...`); backend paths reference `packages/backend/convex/...`.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The VibeFast starter kit provides a robust and secure authentication system out-of-the-box. It supports email/password, social sign-on (OAuth), and passwordless flows, built on a foundation of Convex and Auth0. This document serves as a comprehensive guide for developers to understand, use, and extend the authentication features.
|
|
8
|
+
|
|
9
|
+
### Core Technologies
|
|
10
|
+
|
|
11
|
+
- **[Convex](https://convex.dev):** Handles all backend logic, including user management, session control, and database interactions. The `@convex-dev/auth` package provides the core authentication primitives.
|
|
12
|
+
- **[Auth0](https://auth0.com):** Used as the primary OAuth provider to easily integrate social logins (Google, Apple, GitHub). It can be configured via environment variables.
|
|
13
|
+
- **[React Native / Expo](https://reactnative.dev):** The frontend is built with React Native and Expo, using custom hooks and components to interact with the authentication system.
|
|
14
|
+
- **[Zod](https://zod.dev):** Used for schema validation on all authentication forms, ensuring data integrity.
|
|
15
|
+
|
|
16
|
+
## Getting Started
|
|
17
|
+
|
|
18
|
+
The authentication feature is pre-configured and works out of the box. The primary setup required is adding your Auth0 and other OAuth provider credentials to your environment variables.
|
|
19
|
+
|
|
20
|
+
### Environment Variables
|
|
21
|
+
|
|
22
|
+
To enable social logins, you must configure the following variables in your `.env` file (e.g., `.env.local`):
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# Auth0 Credentials (for social login)
|
|
26
|
+
AUTH_AUTH0_DOMAIN="..."
|
|
27
|
+
AUTH_AUTH0_CLIENT_ID="..."
|
|
28
|
+
|
|
29
|
+
# OAuth Provider Credentials (used by Convex)
|
|
30
|
+
AUTH_GOOGLE_ID="..."
|
|
31
|
+
AUTH_APPLE_CLIENT_ID="..."
|
|
32
|
+
AUTH_GITHUB_ID="..."
|
|
33
|
+
|
|
34
|
+
# Convex Site URL (ensure this matches your deployment)
|
|
35
|
+
CONVEX_SITE_URL="http://localhost:8000"
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Authentication Flow
|
|
39
|
+
|
|
40
|
+
1. **UI Interaction:** The user interacts with components in `apps/native/src/features/authentication/components`, such as `SignInForm`, `SignUpForm`, or `OAuthProviders`.
|
|
41
|
+
2. **Hook-based Logic:** UI events trigger hooks like `useSignIn()` or `useSignUp()`. These hooks handle form state using `react-hook-form` and Zod schemas for validation.
|
|
42
|
+
3. **Convex Mutations:** The hooks call Convex mutations (e.g., `api.auth.signIn`).
|
|
43
|
+
4. **Session Management:** Upon successful authentication, Convex generates a session token. The `useAuthHandler` hook stores this token securely on the client using `convex.setAuth()`.
|
|
44
|
+
5. **Authenticated State:** The application state updates, and `useConditionalAuth` or `AuthConditionalRender` can be used to show/hide UI elements based on the user's authentication status.
|
|
45
|
+
|
|
46
|
+
## Key Components & Hooks
|
|
47
|
+
|
|
48
|
+
The authentication feature is modular and built for easy extension.
|
|
49
|
+
|
|
50
|
+
### Core Components
|
|
51
|
+
|
|
52
|
+
- `AuthConditionalRender`: A wrapper that conditionally renders child components based on whether the user is authenticated.
|
|
53
|
+
- `OAuthProviders`: Renders social login buttons (Apple, Google, GitHub) and handles the Auth0 `authorize` flow.
|
|
54
|
+
- `AuthFormContainer`, `AuthFormWrapper`, `AuthFormHeader`: UI components for building consistent authentication screens.
|
|
55
|
+
- `FormTextInput`: A `react-hook-form` integrated text input with built-in validation and error display.
|
|
56
|
+
|
|
57
|
+
### Core Hooks
|
|
58
|
+
|
|
59
|
+
- `useConditionalAuth()`: The primary hook to check if a user is currently authenticated. Returns `isAuthenticated` and `isLoading` booleans.
|
|
60
|
+
- `useSignIn()` / `useSignUp()`: Hooks that provide form management, validation, and submission logic for email/password sign-in and sign-up.
|
|
61
|
+
- `usePasswordReset()`: Provides `useForgotPassword` and `useResetPassword` for handling password recovery flows.
|
|
62
|
+
- `useAuthHandler()`: A crucial hook that orchestrates the post-authentication process, storing the session token and navigating the user to the appropriate next screen.
|
|
63
|
+
- `useAuthNavigation()`: Determines the next screen after a successful login (e.g., to the main app or to an email verification screen).
|
|
64
|
+
|
|
65
|
+
## How-To Guides
|
|
66
|
+
|
|
67
|
+
### 1. Check if a User is Logged In
|
|
68
|
+
|
|
69
|
+
Use the `useConditionalAuth` hook anywhere in your component tree.
|
|
70
|
+
|
|
71
|
+
```tsx
|
|
72
|
+
import { useConditionalAuth } from '@/features/authentication';
|
|
73
|
+
import { Text, View } from '@/components/ui';
|
|
74
|
+
|
|
75
|
+
function MyComponent() {
|
|
76
|
+
const { isAuthenticated, isLoading } = useConditionalAuth();
|
|
77
|
+
|
|
78
|
+
if (isLoading) {
|
|
79
|
+
return <Text>Loading...</Text>;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return (
|
|
83
|
+
<View>
|
|
84
|
+
{isAuthenticated ? (
|
|
85
|
+
<Text>Welcome, user!</Text>
|
|
86
|
+
) : (
|
|
87
|
+
<Text>Please sign in.</Text>
|
|
88
|
+
)}
|
|
89
|
+
</View>
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### 2. Protect a Route or Screen
|
|
95
|
+
|
|
96
|
+
While you can use `useConditionalAuth` to conditionally render UI, route protection is best handled at the layout level in Expo Router. You can create a layout that checks for authentication and redirects if necessary.
|
|
97
|
+
|
|
98
|
+
```tsx
|
|
99
|
+
// app/(protected)/_layout.tsx
|
|
100
|
+
import { useConditionalAuth } from '@/features/authentication';
|
|
101
|
+
import { Redirect, Slot } from 'expo-router';
|
|
102
|
+
import { FullScreenLoader } from '@/components/ui';
|
|
103
|
+
|
|
104
|
+
export default function ProtectedLayout() {
|
|
105
|
+
const { isAuthenticated, isLoading } = useConditionalAuth();
|
|
106
|
+
|
|
107
|
+
if (isLoading) {
|
|
108
|
+
return <FullScreenLoader />;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (!isAuthenticated) {
|
|
112
|
+
// Redirect to the sign-in screen
|
|
113
|
+
return <Redirect href="/(routes)/auth/sign-in" />;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return <Slot />;
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### 3. Add a New Social Provider
|
|
121
|
+
|
|
122
|
+
To add a new OAuth provider (e.g., Facebook):
|
|
123
|
+
|
|
124
|
+
1. **Add Provider to Auth0:** Configure the new provider in your Auth0 dashboard.
|
|
125
|
+
2. **Update `OAuthProviders.tsx`:** Add the new provider to the `providers` array and handle its `connection` name.
|
|
126
|
+
3. **Update Convex `auth.config.ts`:** If you were connecting directly through Convex, you would add the provider configuration here. With the current Auth0 setup, this is not necessary unless you are bypassing Auth0.
|
|
127
|
+
|
|
128
|
+
### 4. Customize User Schema
|
|
129
|
+
|
|
130
|
+
The user schema is defined in `packages/backend/convex/schema.ts`. To add a new field to the user document (e.g., `username`):
|
|
131
|
+
|
|
132
|
+
1. **Update Schema:**
|
|
133
|
+
```ts
|
|
134
|
+
// packages/backend/convex/schema.ts
|
|
135
|
+
export default defineSchema({
|
|
136
|
+
users: defineTable({
|
|
137
|
+
// ... existing fields
|
|
138
|
+
username: v.optional(v.string()),
|
|
139
|
+
}).index('by_email', ['email']),
|
|
140
|
+
// ... other tables
|
|
141
|
+
});
|
|
142
|
+
```
|
|
143
|
+
2. **Update Sign-Up Form:** Add the `username` field to the `SignUpSchema` in `apps/native/src/features/authentication/utils/auth-schemas.ts` and to the sign-up form component.
|
|
144
|
+
3. **Update Convex Function:** Modify the Convex function that creates the user to accept and store the new `username` field.
|
|
145
|
+
|
|
146
|
+
## Backend (Convex)
|
|
147
|
+
|
|
148
|
+
The backend logic resides in the `packages/backend/convex/` directory.
|
|
149
|
+
|
|
150
|
+
- **`auth.config.ts`:** Configures the authentication providers that Convex will trust.
|
|
151
|
+
- **`auth.ts`:** The core file for `@convex-dev/auth`. It initializes the `convexAuth` helper, which provides `auth`, `signIn`, `signOut`, etc. It also includes important callbacks like `afterUserCreatedOrUpdated` for handling side effects like initializing user credits.
|
|
152
|
+
- **`users.ts`:** Contains mutations and queries related to user data that are not directly part of the authentication flow itself, such as creating a user with initial device credits.
|
|
153
|
+
- **Password Reset & OTP:** Files like `authPasswordReset.ts` and `authOtp.ts` contain the logic for passwordless and password recovery flows.
|
|
154
|
+
|
|
155
|
+
By leveraging the `@convex-dev/auth` library, the backend code is kept minimal and declarative, while providing a powerful and secure foundation.
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# Charts Feature Reference
|
|
2
|
+
|
|
3
|
+
> Frontend paths reference the Expo workspace (`apps/native/src/...`).
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The Charts feature is a powerful, self-contained library for rendering animated and interactive charts in React Native. It provides a set of common chart types, including Bar, Line, Pie, and Donut charts, built with a focus on customizability and performance.
|
|
8
|
+
|
|
9
|
+
This feature is currently a **frontend-only** library. It comes with mock data to demonstrate the capabilities of each chart type. To use in a production scenario, you would provide your own data fetched from a backend like Convex.
|
|
10
|
+
|
|
11
|
+
### Core Technologies
|
|
12
|
+
|
|
13
|
+
- **[React Native SVG](https://github.com/react-native-svg/react-native-svg):** The fundamental library used to draw the shapes (lines, arcs, circles) that make up the charts.
|
|
14
|
+
- **[D3.js (d3-shape)](https://d3js.org/d3-shape):** A powerful library used for calculating the complex path data required for lines, areas, and pie chart arcs. The starter kit uses only the `d3-shape` module to keep the bundle size small.
|
|
15
|
+
- **[Reanimated 2](https://docs.swmansion.com/react-native-reanimated/):** Powers all the animations, from bars growing to their height to lines being drawn on the screen. This ensures the animations are smooth and performant.
|
|
16
|
+
|
|
17
|
+
## Getting Started
|
|
18
|
+
|
|
19
|
+
The chart components are ready to be used anywhere in your application. You can see a preview of all available charts on the `ChartPreviewScreen` located at `apps/native/src/features/charts/app/preview.tsx`.
|
|
20
|
+
|
|
21
|
+
To use a chart, import it and provide it with a `data` prop in the correct format.
|
|
22
|
+
|
|
23
|
+
### Basic Usage: Bar Chart
|
|
24
|
+
|
|
25
|
+
```tsx
|
|
26
|
+
import { BarChart, ChartCard } from '@/features/charts';
|
|
27
|
+
|
|
28
|
+
// Data format: an array of objects with id, label, and value.
|
|
29
|
+
const mySalesData = [
|
|
30
|
+
{ id: '1', label: 'Jan', value: 3500 },
|
|
31
|
+
{ id: '2', label: 'Feb', value: 4200 },
|
|
32
|
+
{ id: '3', label: 'Mar', value: 5300 },
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
function SalesDashboard() {
|
|
36
|
+
return (
|
|
37
|
+
<ChartCard title="Monthly Sales">
|
|
38
|
+
<BarChart data={mySalesData} height={250} />
|
|
39
|
+
</ChartCard>
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Chart Components
|
|
45
|
+
|
|
46
|
+
### 1. `BarChart`
|
|
47
|
+
|
|
48
|
+
- **Description:** A standard bar chart that can be rendered either vertically (default) or horizontally.
|
|
49
|
+
- **Key Props:**
|
|
50
|
+
- `data`: `Array<{ id, label, value, color? }>`
|
|
51
|
+
- `horizontal`: `boolean` - Renders bars horizontally if true.
|
|
52
|
+
- `barWidth`: `number` - Manually set the width of each bar.
|
|
53
|
+
- `gap`: `number` - The space between bars.
|
|
54
|
+
|
|
55
|
+
### 2. `LineChart`
|
|
56
|
+
|
|
57
|
+
- **Description:** A flexible line chart that can show trends over time. It supports curved lines, area fills, and data point dots.
|
|
58
|
+
- **Key Props:**
|
|
59
|
+
- `data`: `Array<number>` - An array of numerical values.
|
|
60
|
+
- `labels`: `Array<string>` - An array of labels for the x-axis.
|
|
61
|
+
- `curved`: `boolean` - Renders the line with a Catmull-Rom curve.
|
|
62
|
+
- `showArea`: `boolean` - Shows a filled area beneath the line.
|
|
63
|
+
- `showDots`: `boolean` - Shows a dot for each data point.
|
|
64
|
+
|
|
65
|
+
### 3. `PieChart`
|
|
66
|
+
|
|
67
|
+
- **Description:** A classic pie chart for showing proportions. It includes a legend and can handle presses on individual sections.
|
|
68
|
+
- **Key Props:**
|
|
69
|
+
- `data`: `Array<{ id, label, value, color? }>`
|
|
70
|
+
- `radius`: `number` - The outer radius of the pie.
|
|
71
|
+
- `showLegend`: `boolean` - Toggles the display of the legend below the chart.
|
|
72
|
+
- `onSectionPress`: `(item) => void` - A callback function when a pie slice is pressed.
|
|
73
|
+
|
|
74
|
+
### 4. `DonutChart`
|
|
75
|
+
|
|
76
|
+
- **Description:** A variant of the `PieChart` with a hole in the center. It is a wrapper around the `PieChart` component.
|
|
77
|
+
- **Key Props:**
|
|
78
|
+
- Accepts all `PieChart` props.
|
|
79
|
+
- `innerRadiusRatio`: `number` (from 0 to 1) - The size of the center hole as a percentage of the `radius`. Defaults to `0.6`.
|
|
80
|
+
|
|
81
|
+
### Wrapper Component
|
|
82
|
+
|
|
83
|
+
- **`ChartCard`:** A styled container card with a title and subtitle, designed to wrap any chart component for a consistent look and feel.
|
|
84
|
+
|
|
85
|
+
## How-To Guides
|
|
86
|
+
|
|
87
|
+
### 1. Provide Live Data
|
|
88
|
+
|
|
89
|
+
To use the charts with your own data, replace the mock data with data fetched from your Convex backend.
|
|
90
|
+
|
|
91
|
+
```tsx
|
|
92
|
+
import { useQuery } from 'convex/react';
|
|
93
|
+
import { api } from '@vibefast/backend/_generated/api';
|
|
94
|
+
import { BarChart, ChartCard } from '@/features/charts';
|
|
95
|
+
import { FullScreenLoader } from '@/components/ui';
|
|
96
|
+
|
|
97
|
+
function LiveSalesDashboard() {
|
|
98
|
+
// Assume you have a query `getSalesData` in `packages/backend/convex/sales.ts`
|
|
99
|
+
const salesData = useQuery(api.sales.getSalesData);
|
|
100
|
+
|
|
101
|
+
if (!salesData) {
|
|
102
|
+
return <FullScreenLoader />;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Ensure the fetched data is mapped to the format the chart expects
|
|
106
|
+
const chartData = salesData.map((sale) => ({
|
|
107
|
+
id: sale._id,
|
|
108
|
+
label: sale.month,
|
|
109
|
+
value: sale.revenue,
|
|
110
|
+
}));
|
|
111
|
+
|
|
112
|
+
return (
|
|
113
|
+
<ChartCard title="Live Monthly Sales">
|
|
114
|
+
<BarChart data={chartData} height={250} />
|
|
115
|
+
</ChartCard>
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### 2. Customize Chart Colors
|
|
121
|
+
|
|
122
|
+
You can override the default color palette by passing a `colors` array prop to the `BarChart` or `PieChart`.
|
|
123
|
+
|
|
124
|
+
```tsx
|
|
125
|
+
const myColors = ['#ff6384', '#36a2eb', '#ffce56'];
|
|
126
|
+
|
|
127
|
+
<PieChart data={myData} colors={myColors} />;
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
For the `LineChart`, you can customize individual elements:
|
|
131
|
+
|
|
132
|
+
```tsx
|
|
133
|
+
<LineChart
|
|
134
|
+
data={myData}
|
|
135
|
+
strokeColor="#ff6384"
|
|
136
|
+
fillColor="#ff638433" // Stroke color with some transparency
|
|
137
|
+
dotColor="#ff6384"
|
|
138
|
+
/>
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### 3. Create a New Chart Type
|
|
142
|
+
|
|
143
|
+
While the library provides common charts, you can use its building blocks to create new ones. The general process is:
|
|
144
|
+
|
|
145
|
+
1. **Create a new component file** in `apps/native/src/features/charts/components/`.
|
|
146
|
+
2. **Use React Native SVG** as the canvas for your chart.
|
|
147
|
+
3. **Use D3.js** if you need complex shape calculations.
|
|
148
|
+
4. **Use Reanimated** to animate the properties of your SVG elements (e.g., path length, position, size).
|
|
149
|
+
5. **Accept a `data` prop** and other configuration props to make your new chart reusable.
|