Milestone v1.0: FamilySync MVP #1

Merged
luckberg merged 376 commits from gsd/v1.0-milestone into main 2026-06-10 17:39:19 -04:00
Showing only changes of commit 2e10752a59 - Show all commits
+11 -6
View File
@@ -236,9 +236,15 @@ export function CalendarShell() {
// ── Calendar content ───────────────────────────────────────────────────────
// The content panel (right of sidebar on desktop, full-width on phone)
function CalendarContent() {
return (
// The content panel (right of sidebar on desktop, full-width on phone).
//
// This is a plain JSX value, NOT a nested `function CalendarContent()` rendered
// as `<CalendarContent />`. A component defined inside render has a new identity
// every render, so React unmounts+remounts its entire subtree — including
// <ScheduleXCalendar> — on ANY CalendarShell re-render (popup/form close, post-
// write events refetch). That full remount is the "calendar flash" (Bug B). As
// an element value it reconciles in place across re-renders: no remount, no flash.
const calendarContent = (
<div
style={{
flex: 1,
@@ -331,7 +337,6 @@ export function CalendarShell() {
)}
</div>
)
}
// ── Full layout ────────────────────────────────────────────────────────────
@@ -355,7 +360,7 @@ export function CalendarShell() {
currentUserName={meQuery.data?.user.displayName ?? undefined}
/>
<InstallPrompt />
<CalendarContent />
{calendarContent}
<EventDetailPopover />
{/* New Event FAB — phone: bottom-right floating action button (UI-SPEC §Interaction Contract) */}
@@ -457,7 +462,7 @@ export function CalendarShell() {
</button>
</div>
<CalendarContent />
{calendarContent}
</div>
{/* EventDetailPopover — standalone mode driven by Zustand openEventId */}