Care redesign salman#17
Merged
Merged
Conversation
Add a self-contained web demo for the PetFolio Care redesign (HTML entry, React JSX: care_screen.jsx and ios-frame.jsx) plus multiple screenshot/assets under PetFolio Redesign/Care Redesign. Update Flutter code to reflect the redesign: lib/features/care/presentation/screens/care_screen.dart, lib/features/care/presentation/widgets/gamified_care_ui.dart and lib/features/pet_profile/presentation/screens/manage_pets_screen.dart. Also update android/gradle.properties, progress.md, and add a local .claude settings entry. This provides assets and an interactive preview for the new Care UI and gamification tweaks.
Polish the Care feature UI and badge/trophy experience. Key changes: - Revamped Trophy Room: replaced grid with a horizontal PageView slider and new trophy card layout, improved progress/owned states, icons and animations. - Introduced custom badge painter and refined medal disc visuals, sheen animation, shadows and sizing tweaks. - Updated badge catalog text, emojis and descriptions to friendlier copy; added progress hint helper. - Tweaked weekly chart labels and today indicator, updated date picker to use ClipRect + stack to fix clipping and layout. - Minor header and accessibility fixes: static CARE eyebrow entry, theme toggle tooltip, and optional tooltip support for header icon buttons. - Added several local cli/mobile commands to .claude/settings.local.json.
Add two log files to aid debugging: exception-log.md records a Flutter framework assertion about ListTile background color/ink splash visibility and related stack details; flutter-run-log.md captures a full `flutter run` session (Kotlin Gradle Plugin warnings, engine/renderer messages, Geolocator init, skipped frames, DevTools URL, etc.). These logs help diagnose runtime and build issues.
Update flutter_local_notifications usage to match the newer v21 API (use named params: initialize(settings: ...); zonedSchedule(id:, title:, body:, scheduledDate:, notificationDetails: ...); cancel(id: ...)). Bump dependencies in pubspec.yaml (geolocator, permission_handler, flutter_local_notifications, timezone). Add README section documenting Kotlin Gradle Plugin (KGP) migration status, current compat flags, blocked plugins, and migration steps to follow once plugins are updated.
Add additional diagnostic checks to .claude/settings.local.json (WebFetch entries for github.com, openjdk.org, inside.java, stackoverflow.com, docs.gradle.org; Bash(java -version); and a grep of pubspec.lock for specific Android plugins). Update flutter-run-log.md to reflect a new flutter run output including Java/Kotlin warnings, updated build and install timings, additional runtime log lines, and a new DevTools/Dart VM Service URL.
Introduce iOS PWA support and developer automation: add PWA detection (lib/core/utils/pwa_detector.*) and a PwaOnboardingPrompt widget integrated into AppShell and exported from widgets.dart; update web/index.html and web/manifest.json with branding, viewport/splash images, and safe-area styling; add web dependency in pubspec.yaml. Also add Claude/agent/skill and MCP tooling configs (.claude/*, .codex/config.toml, .cursor/*, .gemini/settings.json, .mcp.json, .vscode/mcp.json), new skills for migration and feature scaffolding, update CLAUDE.md with a codebase map and automation docs, and refine .cursorignore to better exclude platform/build noise and lock files. These changes enable PWA onboarding for iOS web users and add project tooling/automation for developers.
Replace direct NVIDIA API calls from the Flutter app with a Supabase Edge Function. The Dart service now invokes the new 'generate-care-routine' function (removing the hard-coded NVIDIA API key and URL and the http client import) and adapts response/error handling to Supabase function responses. Added a new supabase/functions/generate-care-routine/index.ts that authenticates the user, proxies requests to the NVIDIA Integrate API using a secret stored in Supabase, and returns the AI response. Also add .vercel to .gitignore.
Add a .vercelignore to exclude local build artifacts and tooling directories from Vercel deployments (e.g. .git, build, android, ios, docs, .dart_tool, etc.). Update supabase/.temp/cli-latest to bump the Supabase CLI from v2.101.0 to v2.104.0.
Add a Vercel configuration (vercel.json) to define the buildCommand ("flutter build web") and outputDirectory ("build/web") for deploying the Flutter web app. Remove the .vercelignore file that previously excluded various project directories from Vercel deployments.
Add a .vercelignore file containing '.git' to prevent Git metadata from being uploaded with Vercel deployments.
This reverts commit 77b469b.
This reverts commit c843e29.
This reverts commit 31fa172.
This reverts commit 1c1b25a.
This reverts commit d0e2172.
Add CI/CD and Vercel configuration, PWA assets, and runtime web adjustments. - CI: Add GitHub Actions workflow to build Flutter web and deploy to Vercel (deploy-web.yml). - Vercel: Add vercel.json (COEP/COOP headers, rewrites) and .vercel/project.json; update .gitignore to keep project.json while ignoring .vercel/output. - Web UI: Improve web/index.html (lang, meta, theme colors, splash UI, Stripe JS load ordering, hide-on-first-frame logic) and update manifest.json for PWA metadata and icons; add pwa_banner.js to show an iOS install banner. - Runtime: Detect kIsWeb in main.dart (skip NotificationService on web) and in care_recommendation_service.dart route AI requests via a Supabase Edge Function on web to avoid CORS; keep direct HTTP calls (with API key) for non-web builds and adjust timeouts/error handling. - Tooling: Add .claude/launch.json and expanded .claude/settings.local.json for local dev tasks (local configs and helper commands). These changes enable production web builds, smoother PWA behavior on mobile, and a CORS-safe approach for AI suggestions when running in the browser.
There was a problem hiding this comment.
Pull request overview
This PR updates PetFolio’s web/PWA deployment setup (Vercel + GitHub Actions), adds an HTML/React-based “Care Redesign” prototype bundle, and implements substantial Flutter UI refinements for the Care module (compact hero header, trophy UI redesign, weekly chart/task card tweaks), alongside several dependency and platform-guard updates to improve web compatibility.
Changes:
- Add Vercel deployment configuration + a GitHub Actions workflow to build Flutter Web and deploy to Vercel; update web manifest/index for PWA polish (splash, install banner, theme).
- Add “PetFolio Redesign / Care Redesign” prototype files (HTML + JSX components) as a UI handoff bundle.
- Refactor Care UI in Flutter (hero header, trophy slider/cards, weekly chart/task cards) and adjust services for web/platform behavior (notifications guarded on web; AI routine proxy on web).
Reviewed changes
Copilot reviewed 26 out of 42 changed files in this pull request and generated 13 comments.
Show a summary per file
| File | Description |
|---|---|
web/pwa_banner.js |
Adds an iOS-only PWA install prompt banner script. |
web/manifest.json |
Updates PWA metadata (name/branding/colors/categories/scope). |
web/index.html |
Adds PWA splash/loading UI, theme meta, safe-area CSS, and loads the install banner + Stripe JS. |
vercel.json |
Defines Vercel output directory, caching headers, COOP/COEP headers, and SPA rewrites. |
README.md |
Adds Kotlin Gradle Plugin migration notes and workaround flags documentation. |
pubspec.yaml |
Updates several plugin dependency versions (geolocator/permission_handler/local notifications/timezone). |
progress.md |
Adds a dated Care Screen Redesign progress entry and notes about the changes. |
PetFolio Redesign/README.md |
Adds instructions for consuming the Claude Design handoff bundle. |
PetFolio Redesign/Care Redesign/ios-frame.jsx |
Adds JSX components for an iOS device frame/status/nav/keyboard prototype. |
PetFolio Redesign/Care Redesign/care_screen.jsx |
Adds a large React prototype of the redesigned Care screen with motion/depth effects. |
PetFolio Redesign/Care Redesign/Care Redesign.html |
Adds the prototype HTML entrypoint that loads React/Babel + the JSX prototype files. |
lib/main.dart |
Guards notification initialization so it doesn’t run on web (kIsWeb). |
lib/features/pet_profile/presentation/screens/manage_pets_screen.dart |
Adjusts pet reorder logic and updates reorderable sliver usage. |
lib/features/care/presentation/widgets/gamified_care_ui.dart |
Major Care UI refactor: compact hero header, trophy slider/cards + custom badge painters, weekly chart tweaks. |
lib/features/care/presentation/screens/care_screen.dart |
Updates spacing/layout, task grouping/counting rules, utility banner, and various task card visuals/behavior. |
lib/features/care/domain/services/care_recommendation_service.dart |
Routes web AI routine generation via a Supabase Edge Function (CORS avoidance). |
lib/features/care/data/models/pet_level.dart |
Updates badge labels/emojis/descriptions (more branded narrative). |
lib/core/widgets/app_shell.dart |
Tweaks header eyebrow text and adds tooltips to header icon buttons. |
lib/core/services/notification_service.dart |
Updates API usage to match newer flutter_local_notifications named parameters. |
flutter-run-log.md |
Adds a captured local flutter run console log. |
exception-log.md |
Adds captured Flutter runtime exception logs. |
android/gradle.properties |
Adds Flutter migrator Kotlin/AGP compatibility flags. |
.vercel/project.json |
Adds Vercel org/project IDs for CLI linkage. |
.gitignore |
Adds Vercel ignore rules while allowing .vercel/project.json. |
.github/workflows/deploy-web.yml |
Adds a workflow to build Flutter web and deploy to Vercel. |
.claude/settings.local.json |
Expands local Claude allowlist commands (includes machine-specific paths). |
.claude/launch.json |
Adds a local web run config with embedded --dart-define values. |
Comments suppressed due to low confidence (1)
lib/features/pet_profile/presentation/screens/manage_pets_screen.dart:45
Reorderable*callbacks passnewIndexas the post-drop index in the list including the removal offset. Without the standardif (newIndex > oldIndex) newIndex -= 1;adjustment, the moved item can land in the wrong position (and can hit edge cases near the end of the list).
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
306
to
309
| sliver: SliverReorderableList( | ||
| itemCount: pets.length, | ||
| onReorder: onReorder, | ||
| onReorderItem: onReorder, | ||
| proxyDecorator: (child, _, animation) => Material( |
Comment on lines
+1104
to
+1114
| final sheenDuration = Duration(milliseconds: 3800 + widget.index * 200); | ||
| _sheenCtrl = AnimationController(vsync: this, duration: sheenDuration); | ||
|
|
||
| if (widget.owned) { | ||
| final delayFraction = | ||
| (widget.index * 300 / sheenDuration.inMilliseconds).clamp(0.0, 1.0); | ||
| _sheenCtrl.forward(from: delayFraction); | ||
| _sheenCtrl.addStatusListener((s) { | ||
| if (s == AnimationStatus.completed && mounted) _sheenCtrl.repeat(); | ||
| }); | ||
| } |
Comment on lines
+18
to
+25
| }, | ||
| { | ||
| "source": "/(.*)", | ||
| "headers": [ | ||
| { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }, | ||
| { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" } | ||
| ] | ||
| } |
Comment on lines
+12
to
+15
| "--dart-define=SUPABASE_URL=https://jqyjvhwlcqcsuwcqgcwf.supabase.co", | ||
| "--dart-define=SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpxeWp2aHdsY3Fjc3V3Y3FnY3dmIiwicm9sZSI6ImFub24iLCJpYXQiOjE3Nzg1MjI4MjgsImV4cCI6MjA5NDA5ODgyOH0.3bF68bNG0IwAc50YbOC3sem4k8O-d1vkvNNqBt1HbRw", | ||
| "--dart-define=STRIPE_PUBLISHABLE_KEY=pk_test_51TQvlrPcVRApxzIxJ8RmKYA1WEw7k8zubumbIfsDjRSGgDyAcSU22RhsZRtKIP1lAZ0wtGjpLfzjI4fozMZxGSlo006zuZrbon", | ||
| "--dart-define=NVIDIA_API_KEY=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" |
Comment on lines
+9
to
+10
| **Read `petfolio-redesign/project/Care Redesign/Care Redesign.html` in full.** The user had this file open when they triggered the handoff, so it's almost certainly the primary design they want built. Read it top to bottom — don't skim. Then **follow its imports**: open every file it pulls in (shared components, CSS, scripts) so you understand how the pieces fit together before you start implementing. | ||
|
|
Comment on lines
+1
to
+10
| PS G:\GitHub\petfolio> flutter run --dart-define-from-file=.env | ||
| Launching lib\main.dart on sdk gphone16k x86 64 in debug mode... | ||
| WARNING: Your Android app project: app located at: G:\GitHub\petfolio\android\app\build.gradle.kts | ||
| applies the Kotlin Gradle Plugin, which will cause build failures in future versions of Flutter. | ||
| Please migrate your app to Built-in Kotlin using this guide: https://docs.flutter.dev/release/breaking-changes/migrate-to-built-in-kotlin/for-app-developers | ||
|
|
||
| WARNING: Your app uses the following plugins that apply Kotlin Gradle Plugin (KGP): image_picker_android, share_plus, shared_preferences_android, stripe_android, url_launcher_android | ||
| Future versions of Flutter will fail to build if your app uses plugins that apply KGP. | ||
|
|
||
| Please check the changelogs of these plugins and upgrade to a version that supports Built-in Kotlin. |
Comment on lines
+1
to
+15
| D/WindowOnBackDispatcher( 8540): setTopOnBackInvokedCallback (unwrapped): androidx.navigationevent.OnBackInvokedInput$createOnBackAnimationCallback$1@94b726b | ||
| D/WindowOnBackDispatcher( 8540): setTopOnBackInvokedCallback (unwrapped): android.app.Activity$$ExternalSyntheticLambda0@671fe96 | ||
| D/WindowOnBackDispatcher( 8540): setTopOnBackInvokedCallback (unwrapped): androidx.navigationevent.OnBackInvokedInput$createOnBackAnimationCallback$1@94b726b | ||
| D/WindowOnBackDispatcher( 8540): setTopOnBackInvokedCallback (unwrapped): android.app.Activity$$ExternalSyntheticLambda0@671fe96 | ||
| D/WindowOnBackDispatcher( 8540): setTopOnBackInvokedCallback (unwrapped): androidx.navigationevent.OnBackInvokedInput$createOnBackAnimationCallback$1@94b726b | ||
|
|
||
| ══╡ EXCEPTION CAUGHT BY FLUTTER FRAMEWORK ╞═════════════════════════════════════════════════════════ | ||
| The following assertion was thrown: | ||
| ListTile background color or ink splashes may be invisible. | ||
| The ListTile is wrapped in a DecoratedBox that has a background color. Because ListTile paints its | ||
| background and ink splashes on the nearest Material ancestor, this DecoratedBox will hide those | ||
| effects. | ||
| To fix this, wrap the ListTile in its own Material widget, or remove the background color from the | ||
| intermediate DecoratedBox. | ||
|
|
Comment on lines
+96
to
+107
| "Bash(git rm *)", | ||
| "Bash(dir \"G:\\\\GitHub\\\\petfolio\\\\PetFolio Redesign\\\\Care Redesign\" /b)", | ||
| "mcp__292a7621-3089-4236-bd52-07a54bf59881__list_tables", | ||
| "mcp__mobile-mcp__mobile_list_available_devices", | ||
| "mcp__mobile-mcp__mobile_take_screenshot", | ||
| "mcp__mobile-mcp__mobile_click_on_screen_at_coordinates", | ||
| "mcp__mobile-mcp__mobile_list_elements_on_screen", | ||
| "mcp__mobile-mcp__mobile_save_screenshot", | ||
| "mcp__mobile-mcp__mobile_swipe_on_screen", | ||
| "Bash(grep -E \"\\\\.\\(dart\\)$\")", | ||
| "Bash(Get-Content \"C:\\\\Users\\\\syedr\\\\AppData\\\\Local\\\\Temp\\\\claude\\\\G--GitHub-petfolio\\\\83d1e98f-3a1c-41fb-a000-787a9c3f0b74\\\\tasks\\\\bn6o3o4cc.output\" -Wait -Tail 30)", | ||
| "Bash(Select-Object -First 30)", |
Comment on lines
+64
to
+67
| document.getElementById('pwa-banner-close').addEventListener('click', function () { | ||
| localStorage.setItem('pwa_banner_dismissed', '1'); | ||
| banner.style.animation = 'slideUp .25s cubic-bezier(.16,1,.3,1) reverse both'; | ||
| setTimeout(function () { banner.remove(); }, 280); |
Comment on lines
+35
to
+40
| - name: Deploy to Vercel | ||
| working-directory: build/web | ||
| run: npx vercel deploy --prod --yes --token=${{ secrets.VERCEL_TOKEN }} | ||
| env: | ||
| VERCEL_ORG_ID: team_lC8aTJK0XiU9qDfaHeTfCJs6 | ||
| VERCEL_PROJECT_ID: prj_hMHouLWimZvr5dDOlZeAhbH8xtop |
Resolved 5 conflict files: - lib/main.dart: keep both dart:ui and flutter/foundation imports (both needed) - lib/features/care/presentation/screens/care_screen.dart: take HEAD (care redesign) — 14 conflict regions all favour the new gamified layout - lib/features/matching/presentation/screens/matching_screen.dart: combine debounce from HEAD with _lastKnownAccess initialisation from main - progress.md: preserve both the care-redesign and matching-P0/P1/P2 history sections - .claude/settings.local.json: union of both branches' allowed-commands lists Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Comment on lines
+12
to
+15
| "--dart-define=SUPABASE_URL=https://jqyjvhwlcqcsuwcqgcwf.supabase.co", | ||
| "--dart-define=SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpxeWp2aHdsY3Fjc3V3Y3FnY3dmIiwicm9sZSI6ImFub24iLCJpYXQiOjE3Nzg1MjI4MjgsImV4cCI6MjA5NDA5ODgyOH0.3bF68bNG0IwAc50YbOC3sem4k8O-d1vkvNNqBt1HbRw", | ||
| "--dart-define=STRIPE_PUBLISHABLE_KEY=pk_test_51TQvlrPcVRApxzIxJ8RmKYA1WEw7k8zubumbIfsDjRSGgDyAcSU22RhsZRtKIP1lAZ0wtGjpLfzjI4fozMZxGSlo006zuZrbon", | ||
| "--dart-define=NVIDIA_API_KEY=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" |
Comment on lines
+35
to
+39
| - name: Deploy to Vercel | ||
| working-directory: build/web | ||
| run: npx vercel deploy --prod --yes --token=${{ secrets.VERCEL_TOKEN }} | ||
| env: | ||
| VERCEL_ORG_ID: team_lC8aTJK0XiU9qDfaHeTfCJs6 |
Comment on lines
+11
to
+25
| { | ||
| "source": "/(.*)\\.wasm", | ||
| "headers": [ | ||
| { "key": "Content-Type", "value": "application/wasm" }, | ||
| { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }, | ||
| { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" } | ||
| ] | ||
| }, | ||
| { | ||
| "source": "/(.*)", | ||
| "headers": [ | ||
| { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }, | ||
| { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" } | ||
| ] | ||
| } |
Comment on lines
+10
to
+12
| <meta name="viewport" | ||
| content="width=device-width, initial-scale=1.0, maximum-scale=1.0, | ||
| user-scalable=no, viewport-fit=cover"> |
Comment on lines
+29
to
+31
| <!-- iOS touch icons --> | ||
| <link rel="apple-touch-icon" sizes="180x180" href="icons/Icon-192.png"> | ||
| <link rel="apple-touch-icon" sizes="512x512" href="icons/Icon-512.png"> |
Comment on lines
+1096
to
+1115
| @override | ||
| void initState() { | ||
| super.initState(); | ||
| _floatCtrl = AnimationController( | ||
| vsync: this, | ||
| duration: Duration(milliseconds: 3200 + widget.index * 200), | ||
| )..repeat(reverse: true); | ||
|
|
||
| final sheenDuration = Duration(milliseconds: 3800 + widget.index * 200); | ||
| _sheenCtrl = AnimationController(vsync: this, duration: sheenDuration); | ||
|
|
||
| if (widget.owned) { | ||
| final delayFraction = | ||
| (widget.index * 300 / sheenDuration.inMilliseconds).clamp(0.0, 1.0); | ||
| _sheenCtrl.forward(from: delayFraction); | ||
| _sheenCtrl.addStatusListener((s) { | ||
| if (s == AnimationStatus.completed && mounted) _sheenCtrl.repeat(); | ||
| }); | ||
| } | ||
| } |
Comment on lines
+1
to
+4
| { | ||
| "orgId": "team_lC8aTJK0XiU9qDfaHeTfCJs6", | ||
| "projectId": "prj_hMHouLWimZvr5dDOlZeAhbH8xtop" | ||
| } |
Comment on lines
26
to
28
| await _plugin.initialize( | ||
| const InitializationSettings(android: androidSettings, iOS: iosSettings), | ||
| settings: const InitializationSettings(android: androidSettings, iOS: iosSettings), | ||
| ); |
Comment on lines
78
to
+83
| await _plugin.zonedSchedule( | ||
| _idFor(taskId), | ||
| 'Care Reminder', | ||
| title, | ||
| scheduled, | ||
| NotificationDetails(android: androidDetails), | ||
| id: _idFor(taskId), | ||
| title: 'Care Reminder', | ||
| body: title, | ||
| scheduledDate: scheduled, | ||
| notificationDetails: NotificationDetails(android: androidDetails), |
Comment on lines
+71
to
+74
| final tasks = widget.dashboard.tasks.value ?? []; | ||
| final planned = tasks.where((t) => !t.isLogDerived).toList(); | ||
| final doneToday = planned.where((t) => t.isCompleted).length; | ||
| final totalToday = planned.length; |
Code fixes: - gamified_care_ui.dart: exclude asNeeded tasks from hero doneToday/totalToday counter (consistent with CareScreen); add didUpdateWidget to _TrophyCardState so sheen animation starts when a badge becomes owned after initial build - vercel.json: remove COEP/COOP headers from all-routes block — breaks Stripe (js.stripe.com); headers remain on /*.wasm only where cross-origin isolation is actually required - .github/workflows/deploy-web.yml: split preview (no --prod, PR events) vs production (--prod, push to main only) to prevent PR builds overwriting production - web/index.html: restore pinch-zoom (remove maximum-scale=1.0/user-scalable=no) for accessibility; fix apple-touch-icon sizes="192x192" to match Icon-192.png - web/pwa_banner.js: wrap localStorage.setItem in try/catch so dismiss works in iOS private mode - PetFolio Redesign/README.md: fix incorrect prototype path (was petfolio-redesign/project/Care Redesign/..., is PetFolio Redesign/Care Redesign/...) - Delete flutter-run-log.md and exception-log.md (transient runtime logs, not repo artifacts) Note: Copilot suggestions for notification_service.dart (positional args) and manage_pets_screen.dart (onReorder vs onReorderItem) were verified against the installed package APIs and found to be inverted — existing named-param style and onReorderItem are correct for flutter_local_notifications ^21 and Flutter 3.x respectively. Database (Supabase jqyjvhwlcqcsuwcqgcwf): - Migration pr17_revoke_anon_execute_sensitive_rpcs: revoke anon EXECUTE on ensure_direct_chat_thread, get_chat_inbox, matching_discovery_candidates — all SECURITY DEFINER functions that were accessible without authentication Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Running npx vercel deploy from the repo root (needed so Vercel reads vercel.json for headers/rewrites) caused Vercel to attempt its own build rather than use the pre-built Flutter Web output in build/web/. --prebuilt instructs Vercel to skip the build phase and deploy the files found in outputDirectory (build/web) directly. Also consolidate VERCEL_ORG_ID/VERCEL_PROJECT_ID to job-level env block. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Trailing comma after the last headers[] entry made vercel.json invalid JSON, causing the Vercel CLI to fail with "Couldn't parse JSON file". Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
--prebuilt requires .vercel/output (Vercel Build Output API format), not the raw build/web directory. Adding a 'npx vercel build' step packages the Flutter output into the expected format without re-running any build. Also add buildCommand:"" and framework:null to vercel.json so Vercel does not attempt framework detection or a rebuild during 'vercel build'. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This pull request introduces several key improvements to the project, focusing on enhancing web deployment, local development, and UI prototyping. The most significant changes include adding a GitHub Actions workflow for automated Flutter Web deployment to Vercel, introducing a new HTML prototype for the Care Redesign, and updating configuration files for both development and deployment environments.
Deployment automation and configuration:
.github/workflows/deploy-web.yml) to automatically build and deploy the Flutter Web app to Vercel on pushes and pull requests to themainbranch. This workflow uses environment secrets for sensitive API keys and integrates with Vercel for production deployment..vercel/project.json) to specify the organization and project IDs for deployment integration.Development environment enhancements:
.claude/launch.json) to streamline running the Flutter Web app locally with all necessarydart-defineenvironment variables, including Supabase, Stripe, and NVIDIA API keys..claude/settings.local.jsonwith additional bash and MCP commands, improving local development and testing workflows.UI prototyping:
PetFolio Redesign/Care Redesign/Care Redesign.html) that serves as a prototype for the Care Redesign. This file includes a comprehensive set of styles, theme support (light/dark), and scripts for responsive device scaling and React-based component rendering.