Add backdrop overlay with tap-to-dismiss, enforce 44px touch targets on the
toggle button, auto-close on route change, clean up z-index layering, remove
duplicate translate logic, and respect safe-area insets for standalone PWA mode.
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
- Add pnpm packageExtensions to declare zod as peer dep of @hookform/resolvers
(the package imports zod/v4/core but doesn't declare the peer dependency)
- Raise workbox maximumFileSizeToCacheInBytes to 5MB for large app bundle
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Add workbox-window as direct dependency and set injectRegister: false
to prevent conflict between vite-plugin-pwa and @cloudflare/vite-plugin.
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
UserStoreProvider was switching between three different return structures
(LoadingSpinner / children directly / Context.Provider wrapping children),
causing full fiber tree restructures in React 19 concurrent mode. When
batched with other state updates (e.g. UpgradeBlockContext loading),
React called insertBefore with a reference node already detached from
the DOM.
- Always render UserStoreContext.Provider so tree structure is stable;
spinner vs children toggle happens inside it
- Use useRef to hold a stable Zustand store (update via setState instead
of recreating on every render)
- Move inline <style> from App.tsx JSX into main.css to avoid React 19
style-tag edge cases with conditional sibling rendering
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Adds a BEFORE trigger and CHECK constraint on profiles to guarantee that
is_temporary cannot coexist with a paid plan (solo, team, or annual),
regardless of which code path performs the update.
Also back-fills any existing inconsistent rows.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Added a 14-day trial period for the "solo" and "team" plans during checkout session creation. Also, enforced a member limit of 3 for the "team" plan in the user invitation process and updated the settings page to reflect this limit with appropriate messaging.
Show the active subscription plan pill (Founder/Teams/Solo) next to the
user's name on the overview greeting and in the settings page header.
Made-with: Cursor