diff --git a/client/scripts/theme-baseline.json b/client/scripts/theme-baseline.json index e9a007d72..198f830c4 100644 --- a/client/scripts/theme-baseline.json +++ b/client/scripts/theme-baseline.json @@ -125,7 +125,6 @@ "components/shared/CustomSelect.tsx": 1, "components/shared/CustomTimePicker.tsx": 1, "components/shared/EmptyState.tsx": 1, - "components/shared/ErrorBoundary.tsx": 2, "components/shared/Modal.tsx": 3, "components/shared/NavigationMenu.tsx": 1, "components/shared/NoteColorPicker.tsx": 2, @@ -166,7 +165,7 @@ "mobile/screens/admin/MAdminUi.tsx": 10, "mobile/screens/admin/MAdminUsersSection.tsx": 14, "mobile/screens/admin/MApiProviderBlocks.tsx": 10, - "mobile/screens/atlas/MAtlas.tsx": 7, + "mobile/screens/atlas/MAtlas.tsx": 5, "mobile/screens/atlas/MAtlasBucketSheet.tsx": 16, "mobile/screens/atlas/MAtlasCountryPopup.tsx": 11, "mobile/screens/atlas/MAtlasSearch.tsx": 5, @@ -219,11 +218,10 @@ "mobile/screens/trip/places/MPlacesBrowser.tsx": 10, "mobile/screens/trip/places/MPlacesBulkCategorySheet.tsx": 4, "mobile/screens/trip/places/MPlacesFilterControls.tsx": 1, - "mobile/screens/trip/places/MPlacesFilterSheet.tsx": 3, "mobile/screens/trip/places/MPlacesSaveToCollectionSheet.tsx": 7, "mobile/screens/trip/places/MPlacesToursModeSwitch.tsx": 1, - "mobile/screens/trip/plan/MPlanTimeline.tsx": 14, - "mobile/screens/trip/plan/MPlanTimelineRows.tsx": 26, + "mobile/screens/trip/plan/MPlanTimeline.tsx": 12, + "mobile/screens/trip/plan/MPlanTimelineRows.tsx": 24, "mobile/screens/trip/roadtrip/MRoadtripRows.tsx": 31, "mobile/screens/trip/roadtrip/MRoadtripTab.tsx": 16, "mobile/screens/trip/roadtrip/MRtAlternativesBar.tsx": 8, @@ -281,7 +279,7 @@ "mobile/screens/trip/tabs/MTransportsTab.tsx": 2, "mobile/screens/trip/tabs/filesModel.ts": 5, "mobile/screens/trip/tabs/tabChrome.tsx": 12, - "mobile/screens/vacay/MVacay.tsx": 23, + "mobile/screens/vacay/MVacay.tsx": 17, "mobile/screens/vacay/MVacayInviteSheet.tsx": 9, "mobile/screens/vacay/MVacayMonth.tsx": 3, "mobile/screens/vacay/MVacaySettingsSheet.tsx": 35, diff --git a/client/src/App.tsx b/client/src/App.tsx index bcf5cad6a..316dd808f 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useState, useRef, ReactNode, Suspense } from 'react' -import { Routes, Route, Navigate, useLocation } from 'react-router' +import { Routes, Route, Navigate, useLocation, useNavigationType } from 'react-router' import { useAuthStore } from './store/authStore' import { useSettingsStore } from './store/settingsStore' import { applyAppearance } from './theme/applyAppearance' @@ -21,6 +21,7 @@ import { lazyWithRetry } from './utils/lazyWithRetry' import { reconcileAppVersion } from './utils/versionHandover' import { useServerVersionStore } from './store/serverVersionStore' import { useIsPhone } from './mobile/useIsPhone' +import { useRouteTransition } from './mobile/routeTransition' import { TranslationProvider, useTranslation } from './i18n' import { authApi, isAuthPublicPath } from './api/client' import { tripRepo } from './repo/tripRepo' @@ -411,6 +412,9 @@ export default function App() { }, [settings.dark_mode, settings.appearance, isSharedPage]) const isPhone = useIsPhone() + // On the phone, pages slide like a native navigation stack (mobile/routeTransition.ts). + const navigationType = useNavigationType() + const routedLocation = useRouteTransition(location, navigationType, isPhone) const keepingTour = useSaveToCollectionStore(s => s.tour !== null) const isAuthPage = location.pathname.startsWith('/login') || location.pathname.startsWith('/register') @@ -455,7 +459,7 @@ export default function App() { so a mounted boundary keeps the current page on screen instead of flashing a spinner on every jump — the spinner is for the first paint of a deep link. */} }> - + } /> } /> } /> diff --git a/client/src/components/Layout/AppLockGate.tsx b/client/src/components/Layout/AppLockGate.tsx index 45498c8b7..094f08e6f 100644 --- a/client/src/components/Layout/AppLockGate.tsx +++ b/client/src/components/Layout/AppLockGate.tsx @@ -62,7 +62,7 @@ export default function AppLockGate(): React.ReactElement | null { role="dialog" aria-modal="true" aria-label={t('native.lock.title')} - className="fixed inset-0 z-[100001] flex flex-col items-center justify-center gap-5 bg-surface p-8 text-center backdrop-blur-2xl" + className="fixed inset-0 z-[calc(var(--z-toast)+1)] flex flex-col items-center justify-center gap-5 bg-surface p-8 text-center backdrop-blur-2xl" >