Files
TREK/client/scripts/feature-pairs.json
T
Maurice 2851eb7afe feat(mobile): a Google Maps route is imported into a road trip day on an iPad and an unfolded Duo
The desktop's import dialog keeps its markup and moves its logic into
useGoogleRouteImport, unchanged: the link previewed, its stops in order with
the unresolved ones named, and the resolved ones appended to the day picked,
at least two, under one request id per opening and day. The large screens
get the same flow as a sheet, offered on the stage card under the track
offer to a member who may add places to days. The phone has no entry to it.
2026-11-08 02:57:43 +00:00

1089 lines
56 KiB
JSON

{
"pairs": [
{
"feature": "Accommodation (stay) create/edit",
"hooks": ["src/components/Planner/stayFormModel.ts"],
"desktop": ["src/components/Planner/DayDetailPanel.tsx", "src/components/Planner/useDayDetail.ts"],
"mobile": ["src/mobile/screens/trip/sheets/MAccommodationSheet.tsx"]
},
{
"feature": "Add place to collection",
"hooks": ["src/components/Collections/addPlaceModel.ts", "src/components/Collections/useAddPlaceToCollection.ts"],
"desktop": ["src/components/Collections/AddPlaceToCollectionModal.tsx"],
"mobile": ["src/mobile/screens/collections/MCollAddSheet.tsx"]
},
{
"feature": "Addon manager",
"hooks": [
"src/components/Admin/addons/addonModel.ts",
"src/components/Admin/addons/useAddonManager.ts"
],
"desktop": ["src/components/Admin/AddonManager.tsx"],
"mobile": ["src/mobile/screens/admin/MAdminAddonManager.tsx"]
},
{
"feature": "Addon manager: AI tile",
"hooks": ["src/components/Admin/addons/useAiAddonTile.ts"],
"desktop": ["src/components/Admin/addons/AiAddonTile.tsx"],
"mobile": ["src/mobile/screens/admin/MAdminAddonManager.tsx"]
},
{
"feature": "Admin notification preference matrix",
"hooks": ["src/components/Admin/useAdminNotificationMatrix.ts", "src/pages/admin/AdminPage.constants.ts"],
"desktop": ["src/pages/admin/AdminNotificationsPanel.tsx"],
"mobile": ["src/mobile/screens/admin/MAdminNotifyMatrix.tsx"]
},
{
"feature": "Admin notifications tab",
"hooks": ["src/components/Admin/useAdminNotificationSettings.ts"],
"desktop": ["src/pages/admin/AdminNotificationsTab.tsx"],
"mobile": ["src/mobile/screens/admin/MAdminNotificationsSection.tsx"]
},
{
"feature": "Admin page shell",
"hooks": ["src/pages/admin/useAdmin.ts"],
"desktop": ["src/pages/AdminPage.tsx"],
"mobile": ["src/mobile/screens/admin/MAdmin.tsx"]
},
{
"feature": "Admin settings tab: trekApiModel",
"hooks": ["src/components/Admin/trekApiModel.ts"],
"desktop": ["src/pages/admin/TrekApiCard.tsx"],
"mobile": ["src/mobile/screens/admin/MApiProviderBlocks.tsx"]
},
{
"feature": "Admin settings tab: useAdminSettingsActions",
"hooks": ["src/components/Admin/useAdminSettingsActions.ts"],
"desktop": ["src/pages/admin/AdminSettingsTab.tsx"],
"mobile": ["src/mobile/screens/admin/MAdminSettingsSection.tsx"]
},
{
"feature": "Admin users invite status",
"hooks": ["src/pages/admin/adminModel.ts"],
"desktop": ["src/pages/admin/AdminUsersTab.tsx"],
"mobile": ["src/mobile/screens/admin/MAdminUsersSection.tsx"]
},
{
"feature": "AI assistant chat",
"hooks": ["src/components/Assistant/useAssistantThread.ts", "src/components/Assistant/useAssistantStatus.ts"],
"desktop": ["src/components/Assistant/AssistantWindow.tsx"],
"mobile": ["src/mobile/screens/trip/assistant/MAssistantScreen.tsx"]
},
{
"feature": "AI assistant home chat",
"hooks": ["src/components/Assistant/useAssistantHome.ts"],
"desktop": ["src/components/Assistant/AssistantWindow.tsx"],
"mobile": [
"src/mobile/screens/assistant/MAssistantHomeScreen.tsx",
"src/mobile/screens/dashboard/MDashboard.tsx"
]
},
{
"feature": "Assistant hints",
"hooks": ["src/components/Assistant/useAssistantHints.ts"],
"desktop": ["src/components/Assistant/AssistantHeader.tsx", "src/components/Assistant/AssistantLauncher.tsx"],
"mobile": [
"src/mobile/screens/trip/assistant/MAssistantScreen.tsx",
"src/mobile/screens/trip/sheets/MMehrSheet.tsx"
]
},
{
"feature": "Atlas country/region action sheet",
"hooks": ["src/pages/atlas/useAtlasCountryActions.ts"],
"desktop": ["src/pages/AtlasPage.tsx"],
"mobile": ["src/mobile/screens/atlas/MAtlasCountryPopup.tsx"]
},
{
"feature": "Atlas page: atlasModel",
"hooks": ["src/pages/atlas/atlasModel.ts"],
"desktop": [
"src/components/Atlas/AtlasCountryPlaces.tsx",
"src/components/shared/CountryFlag.tsx",
"src/pages/AtlasPage.tsx"
],
"mobile": ["src/mobile/screens/atlas/MAtlas.tsx", "src/mobile/screens/atlas/MAtlasBucketSheet.tsx"]
},
{
"feature": "Atlas page: useAtlas",
"hooks": ["src/pages/atlas/useAtlas.ts"],
"desktop": ["src/pages/AtlasPage.tsx"],
"mobile": ["src/mobile/screens/atlas/MAtlas.tsx", "src/mobile/screens/atlas/atlasController.ts"]
},
{
"feature": "Audit log",
"hooks": ["src/components/Admin/useAuditLog.ts"],
"desktop": ["src/components/Admin/AuditLogPanel.tsx"],
"mobile": ["src/mobile/screens/admin/MAdminAuditLogPanel.tsx"]
},
{
"feature": "Backup panel",
"hooks": ["src/components/Admin/useBackupAdmin.ts"],
"desktop": ["src/components/Admin/BackupPanel.tsx"],
"mobile": ["src/mobile/screens/admin/MAdminBackupPanel.tsx"]
},
{
"feature": "Booking forms: linked expense and file attach",
"hooks": ["src/components/Planner/useBookingExpenseIntent.ts"],
"desktop": ["src/components/Planner/ReservationModal.tsx", "src/components/Planner/TransportModal.tsx"],
"mobile": [
"src/mobile/screens/trip/sheets/MReservationSheet.tsx",
"src/mobile/screens/trip/sheets/MTransportFormSheet.tsx"
]
},
{
"feature": "Booking save follow-up: travellers and files before the editor closes",
"hooks": ["src/components/Planner/useBookingFollowUp.ts"],
"desktop": ["src/components/Planner/ReservationModal.tsx", "src/components/Planner/TransportModal.tsx"],
"mobile": [
"src/mobile/screens/trip/sheets/MReservationSheet.tsx",
"src/mobile/screens/trip/sheets/MTransportFormSheet.tsx"
]
},
{
"feature": "Bookings and transports lists",
"hooks": ["src/components/Planner/bookings/bookingsModel.ts"],
"desktop": [
"src/components/Planner/DayDetailPanel.tsx",
"src/components/Planner/DayPlanSidebar.tsx",
"src/components/Planner/PlaceInspector.tsx",
"src/components/Planner/ReservationModal.tsx",
"src/components/Planner/ReservationsPanel.tsx",
"src/components/Planner/TransportModal.tsx",
"src/components/Planner/bookings/BookingCard.tsx",
"src/components/Planner/bookings/BookingDetailDialog.tsx",
"src/components/Planner/bookings/BookingDetailHost.tsx",
"src/components/Planner/bookings/BookingDialogShell.tsx",
"src/components/Planner/bookings/BookingsHeader.tsx",
"src/components/Planner/bookings/BookingsList.tsx",
"src/components/Planner/bookings/BookingsTimeline.tsx",
"src/components/Planner/bookings/bookingFacts.ts",
"src/components/Planner/bookings/bookingParts.tsx",
"src/components/Planner/bookings/timelineModel.ts",
"src/components/Planner/bookings/useReservationListFilter.ts",
"src/components/Planner/planCosts.ts",
"src/pages/sharedTrip/SharedBookingsView.tsx",
"src/pages/sharedTrip/SharedDayCard.tsx"
],
"mobile": ["src/mobile/screens/trip/tabs/MBookingsTab.tsx", "src/mobile/screens/trip/tabs/MTransportsTab.tsx"]
},
{
"feature": "Bottom nav context-aware create action",
"hooks": ["src/components/Layout/useCreateAction.ts"],
"desktop": ["src/components/Layout/BottomNav.tsx"],
"mobile": ["src/mobile/components/MBottomNav.tsx"]
},
{
"feature": "Bulk save selected places to a collection",
"hooks": ["src/components/Collections/useSaveTripPlacesToList.ts"],
"desktop": ["src/components/Collections/SaveTripPlacesToListModal.tsx"],
"mobile": ["src/mobile/screens/trip/places/MPlacesSaveToCollectionSheet.tsx"]
},
{
"feature": "Category manager",
"hooks": ["src/components/Admin/useCategoryAdmin.ts"],
"desktop": ["src/components/Admin/CategoryManager.tsx"],
"mobile": ["src/mobile/screens/admin/MAdminCategoryManager.tsx"]
},
{
"feature": "Collab chat: collabModel",
"hooks": ["src/components/Collab/collabModel.ts"],
"desktop": [
"src/components/Collab/CollabChatMessages.tsx",
"src/components/Collab/CollabPolls.tsx",
"src/components/Collab/useCollabChat.ts"
],
"mobile": [
"src/mobile/screens/trip/tabs/MCollabChat.tsx",
"src/mobile/screens/trip/tabs/MCollabNotes.tsx",
"src/mobile/screens/trip/tabs/MCollabPolls.tsx"
]
},
{
"feature": "Collab chat: useCollabChatData",
"hooks": ["src/components/Collab/useCollabChatData.ts"],
"desktop": ["src/components/Collab/useCollabChat.ts"],
"mobile": ["src/mobile/screens/trip/tabs/MCollabChat.tsx"]
},
{
"feature": "Collab notes",
"hooks": ["src/components/Collab/useCollabNotesData.ts"],
"desktop": ["src/components/Collab/CollabNotes.tsx"],
"mobile": ["src/mobile/screens/trip/tabs/MCollabNotes.tsx"]
},
{
"feature": "Collab polls",
"hooks": ["src/components/Collab/useCollabPolls.ts"],
"desktop": ["src/components/Collab/CollabPolls.tsx"],
"mobile": ["src/mobile/screens/trip/tabs/MCollabPolls.tsx"]
},
{
"feature": "Collection list editor",
"hooks": ["src/components/Collections/useListEditor.ts"],
"desktop": ["src/components/Collections/ListEditorModal.tsx"],
"mobile": ["src/mobile/screens/collections/MCollEditSheet.tsx"]
},
{
"feature": "Collection place detail",
"hooks": ["src/components/Collections/useCollectionPlaceForm.ts"],
"desktop": ["src/components/Collections/CollectionPlaceDetail.tsx"],
"mobile": ["src/mobile/screens/collections/MCollPlaceSheet.tsx"]
},
{
"feature": "Collection sharing",
"hooks": ["src/components/Collections/useCollectionSharing.ts"],
"desktop": ["src/components/Collections/ShareCollectionModal.tsx"],
"mobile": ["src/mobile/screens/collections/MCollShareSheet.tsx"]
},
{
"feature": "Collections page: collectionsModel",
"hooks": ["src/pages/collections/collectionsModel.ts"],
"desktop": [
"src/components/Collections/AddPlaceToCollectionModal.tsx",
"src/components/Collections/CollectionFilterBar.tsx",
"src/components/Collections/CollectionMap.tsx",
"src/components/Collections/CollectionPicker.tsx",
"src/components/Collections/CollectionPlaceDetail.tsx",
"src/components/Collections/ListEditorModal.tsx",
"src/components/Collections/MSaveToCollectionSheet.tsx"
],
"mobile": [
"src/mobile/screens/collections/MCollAddSheet.tsx",
"src/mobile/screens/collections/MCollEditSheet.tsx",
"src/mobile/screens/collections/MCollPlaceRow.tsx",
"src/mobile/screens/collections/MCollPlaceSheet.tsx",
"src/mobile/screens/collections/MCollections.tsx"
]
},
{
"feature": "Collections page: useCollections",
"hooks": ["src/pages/collections/useCollections.ts"],
"desktop": ["src/pages/CollectionsPage.tsx"],
"mobile": ["src/mobile/screens/collections/MCollections.tsx"]
},
{
"feature": "Collection tours (LIB-03): useCollectionTours, useCollectionTourTakeOver",
"hooks": [
"src/components/Tours/collection/useCollectionTours.ts",
"src/components/Tours/collection/useCollectionTourTakeOver.ts"
],
"desktop": ["src/components/Tours/collection/CollectionToursSection.tsx"],
"mobile": ["src/mobile/screens/collections/MCollTours.tsx"]
},
{
"feature": "Copy collection places to a trip",
"hooks": ["src/components/Collections/useTripCopyPicker.ts"],
"desktop": ["src/components/Collections/CopyToTripModal.tsx"],
"mobile": ["src/mobile/screens/collections/MCollTripPickerSheet.tsx"]
},
{
"feature": "Costs/budget ledger: costsModel",
"hooks": ["src/components/Budget/costsModel.ts"],
"desktop": ["src/components/Budget/CostsPanel.tsx"],
"mobile": ["src/mobile/screens/trip/sheets/MCostSheet.tsx", "src/mobile/screens/trip/tabs/MCostsTab.tsx"]
},
{
"feature": "Costs/budget ledger: useCostsLedger, useExpenseLinks",
"hooks": ["src/components/Budget/useCostsLedger.ts", "src/components/Budget/useExpenseLinks.ts"],
"desktop": ["src/components/Budget/CostsPanel.tsx"],
"mobile": ["src/mobile/screens/trip/tabs/MCostsTab.tsx"]
},
{
"feature": "Costs/budget settle-up payment: useSettlementForm",
"hooks": ["src/components/Budget/useSettlementForm.ts"],
"desktop": ["src/components/Budget/CostsPanel.tsx"],
"mobile": ["src/mobile/screens/trip/tabs/MCostsPayment.tsx"]
},
{
"feature": "Create/edit trip form",
"hooks": ["src/components/Trips/tripFormModel.ts", "src/components/Trips/useTripCoverPicker.ts"],
"desktop": ["src/components/Trips/TripFormModal.tsx"],
"mobile": ["src/mobile/screens/dashboard/MNewTripSheet.tsx"]
},
{
"feature": "Dashboard page",
"hooks": ["src/pages/dashboard/useDashboard.ts"],
"desktop": ["src/pages/DashboardPage.tsx"],
"mobile": ["src/mobile/screens/dashboard/MDashboard.tsx"]
},
{
"feature": "Dashboard residuals: dashboardModel",
"hooks": ["src/pages/dashboard/dashboardModel.ts"],
"desktop": ["src/pages/DashboardPage.tsx"],
"mobile": ["src/mobile/screens/dashboard/MDashWidgets.tsx", "src/mobile/screens/dashboard/MDashboard.tsx"]
},
{
"feature": "Dashboard residuals: useDashboardPlugins",
"hooks": ["src/components/Dashboard/useDashboardPlugins.ts"],
"desktop": ["src/pages/DashboardPage.tsx"],
"mobile": ["src/mobile/screens/dashboard/MDashboard.tsx"]
},
{
"feature": "Dashboard widgets: useCollectionLists",
"hooks": ["src/components/Dashboard/useCollectionLists.ts"],
"desktop": ["src/components/Dashboard/CollectionsWidget.tsx"],
"mobile": ["src/mobile/screens/dashboard/MDashWidgets.tsx"]
},
{
"feature": "Dashboard widgets: useCurrencyConverter, useDashboardTimezones",
"hooks": [
"src/components/Dashboard/useCurrencyConverter.ts",
"src/components/Dashboard/useDashboardTimezones.ts"
],
"desktop": ["src/pages/DashboardPage.tsx"],
"mobile": ["src/mobile/screens/dashboard/MDashWidgets.tsx"]
},
{
"feature": "Day detail",
"hooks": ["src/components/Planner/dayDetailModel.ts"],
"desktop": ["src/components/Planner/DayDetailPanel.tsx"],
"mobile": ["src/mobile/screens/trip/plan/useMPlanTimeline.ts", "src/mobile/screens/trip/sheets/MDaySheet.tsx"]
},
{
"feature": "Day note create/edit/delete",
"hooks": ["src/hooks/useDayNotes.ts"],
"desktop": ["src/components/Planner/DayPlanSidebar.tsx"],
"mobile": ["src/mobile/screens/trip/sheets/MDaySheet.tsx", "src/mobile/screens/trip/sheets/MNoteSheet.tsx"]
},
{
"feature": "Day plan reorder",
"hooks": ["src/utils/mergedOrder.ts"],
"desktop": ["src/components/Planner/DayPlanSidebar.tsx"],
"mobile": ["src/mobile/screens/trip/plan/useMPlanTimeline.ts"]
},
{
"feature": "Day route optimize + Google Maps / CoMaps export",
"hooks": ["src/components/Planner/dayRoute.ts"],
"desktop": ["src/components/Planner/DayPlanSidebar.tsx"],
"mobile": ["src/mobile/screens/trip/plan/useMPlanTimeline.ts", "src/mobile/screens/trip/sheets/MDaySheet.tsx"]
},
{
"feature": "Day weather chip anchor + weather icon map: dayWeather",
"hooks": ["src/utils/dayWeather.ts"],
"desktop": ["src/components/Planner/DayPlanSidebar.tsx", "src/pages/TripPlannerPage.tsx"],
"mobile": ["src/mobile/screens/trip/plan/useMPlanTimeline.ts", "src/mobile/screens/trip/sheets/MDaySheet.tsx"]
},
{
"feature": "Day weather chip anchor + weather icon map: weatherIcons",
"hooks": ["src/components/Weather/weatherIcons.ts"],
"desktop": ["src/components/Planner/DayDetailPanel.tsx", "src/components/Weather/WeatherWidget.tsx"],
"mobile": ["src/mobile/screens/trip/plan/MPlanTimeline.tsx", "src/mobile/screens/trip/sheets/MDaySheet.tsx"]
},
{
"feature": "Default user settings",
"hooks": ["src/components/Admin/useDefaultUserSettings.ts"],
"desktop": ["src/components/Admin/DefaultUserSettingsTab.tsx"],
"mobile": ["src/mobile/screens/admin/MAdminDefaultUserSettings.tsx"]
},
{
"feature": "Dev test notifications panel",
"hooks": ["src/components/Admin/useDevNotifications.ts"],
"desktop": ["src/components/Admin/DevNotificationsPanel.tsx"],
"mobile": ["src/mobile/screens/admin/MAdminDevNotificationsPanel.tsx"]
},
{
"feature": "Document sync leftovers: docSyncModel",
"hooks": ["src/components/Files/docsync/docSyncModel.ts"],
"desktop": ["src/components/Files/docsync/DocSyncFlow.tsx", "src/components/Files/docsync/DocSyncPanel.tsx"],
"mobile": ["src/mobile/screens/trip/tabs/MDocSyncSheet.tsx"]
},
{
"feature": "Document sync leftovers: useScopePicker",
"hooks": ["src/components/Files/docsync/useScopePicker.ts"],
"desktop": ["src/components/Files/docsync/DocSyncScopeModal.tsx"],
"mobile": ["src/mobile/screens/trip/tabs/MDocSyncSheet.tsx"]
},
{
"feature": "Expense editor",
"hooks": ["src/components/Budget/useExpenseForm.ts"],
"desktop": ["src/components/Budget/CostsPanel.tsx"],
"mobile": ["src/mobile/screens/trip/sheets/MCostSheet.tsx"]
},
{
"feature": "GitHub releases panel",
"hooks": ["src/components/Admin/useGithubReleases.ts", "src/utils/releaseNotes.ts"],
"desktop": ["src/components/Admin/GitHubPanel.tsx"],
"mobile": ["src/mobile/screens/admin/MAdminGitHubPanel.tsx"]
},
{
"feature": "Google/Naver shared-list import",
"hooks": ["src/components/Planner/useListImport.ts"],
"desktop": ["src/components/Planner/usePlacesSidebar.ts"],
"mobile": ["src/mobile/screens/trip/sheets/ImpListStep.tsx"]
},
{
"feature": "Places column file routing between the Tours and places imports",
"hooks": ["src/components/Planner/usePlacesColumnFileImport.ts"],
"desktop": ["src/components/Planner/usePlacesSidebar.ts"],
"mobile": ["src/mobile/screens/trip/sheets/MImportSheet.tsx"]
},
{
"feature": "GPX/KML/KMZ file import into places",
"hooks": ["src/components/Planner/usePlacesFileImport.ts"],
"desktop": ["src/components/Planner/FileImportModal.tsx"],
"mobile": ["src/mobile/screens/trip/sheets/ImpFileStep.tsx"]
},
{
"feature": "Journey detail page: JourneyDetailPage.helpers",
"hooks": ["src/pages/journeyDetail/JourneyDetailPage.helpers.ts"],
"desktop": [
"src/components/Journey/JourneyDetailPageAddTripDialog.tsx",
"src/components/Journey/JourneyDetailPageEntryCard.tsx",
"src/components/Journey/JourneyDetailPageEntryEditor.tsx",
"src/components/Journey/JourneyDetailPageGalleryView.tsx",
"src/components/Journey/JourneyDetailPageMapView.tsx",
"src/components/Journey/JourneyDetailPagePhotoGrid.tsx",
"src/components/Journey/JourneyDetailPageProviderPicker.tsx",
"src/components/Journey/JourneyDetailPageSettingsDialog.tsx",
"src/components/Journey/JourneyEntryCover.tsx",
"src/components/Journey/MobileEntryView.tsx",
"src/pages/JourneyDetailPage.tsx",
"src/pages/JourneyPublicPage.tsx",
"src/pages/journeyPublic/useJourneyPublic.ts"
],
"mobile": [
"src/mobile/screens/journey/MJourneyCreateSheet.tsx",
"src/mobile/screens/journey/MJourneyDetail.tsx",
"src/mobile/screens/journey/MJourneyEntrySheet.tsx",
"src/mobile/screens/journey/MJourneySettingsSheet.tsx",
"src/mobile/screens/journey/mobileJourneyMeta.ts"
]
},
{
"feature": "Journey day take-over: useJourneyDayImport",
"hooks": ["src/components/Journey/useJourneyDayImport.ts"],
"desktop": ["src/components/Journey/JourneyDayImportDialog.tsx"],
"mobile": ["src/mobile/screens/journey/MJourneyDayImportSheet.tsx"]
},
{
"feature": "Journey day recording: useJourneyRecordingDay",
"hooks": ["src/components/Journey/useJourneyRecordingDay.ts"],
"desktop": ["src/components/Journey/JourneyRecordingDialog.tsx"],
"mobile": ["src/mobile/screens/journey/MJourneyRecordingSheet.tsx"]
},
{
"feature": "Journey detail page: useJourneyDetail",
"hooks": ["src/pages/journeyDetail/useJourneyDetail.ts"],
"desktop": ["src/pages/JourneyDetailPage.tsx"],
"mobile": ["src/mobile/screens/journey/MJourneyDetail.tsx"]
},
{
"feature": "Journey detail screen: useGalleryUpload",
"hooks": ["src/components/Journey/useGalleryUpload.ts"],
"desktop": ["src/components/Journey/JourneyDetailPageGalleryView.tsx"],
"mobile": ["src/mobile/screens/journey/MJourneyDetail.tsx"]
},
{
"feature": "Journey detail screen: useJourneyCarouselSync",
"hooks": ["src/components/Journey/useJourneyCarouselSync.ts"],
"desktop": ["src/components/Journey/MobileMapTimeline.tsx"],
"mobile": ["src/mobile/screens/journey/MJourneyDetail.tsx"]
},
{
"feature": "Journey entry editor",
"hooks": ["src/components/Journey/useJourneyEntryForm.ts"],
"desktop": ["src/components/Journey/JourneyDetailPageEntryEditor.tsx"],
"mobile": ["src/mobile/screens/journey/MJourneyEntrySheet.tsx"]
},
{
"feature": "Journey list page",
"hooks": ["src/pages/journey/useJourney.ts"],
"desktop": ["src/pages/JourneyPage.tsx"],
"mobile": ["src/mobile/screens/journey/MJourney.tsx"]
},
{
"feature": "Journey settings: useJourneySettings",
"hooks": ["src/components/Journey/useJourneySettings.ts"],
"desktop": [
"src/components/Journey/JourneyDetailPageAddTripDialog.tsx",
"src/components/Journey/JourneyDetailPageSettingsDialog.tsx"
],
"mobile": ["src/mobile/screens/journey/MJourneySettingsSheet.tsx"]
},
{
"feature": "Journey settings: useJourneyShareLink",
"hooks": ["src/components/Journey/useJourneyShareLink.ts"],
"desktop": ["src/components/Journey/JourneyShareSection.tsx"],
"mobile": ["src/mobile/screens/journey/MJourneySettingsSheet.tsx"]
},
{
"feature": "Lists sub-tab (packing/todo) persistence",
"hooks": ["src/hooks/useListsSubTab.ts"],
"desktop": ["src/pages/tripPlanner/ListsContainer.tsx"],
"mobile": ["src/mobile/screens/trip/MTripShell.tsx"]
},
{
"feature": "MCP tokens / OAuth sessions admin",
"hooks": ["src/components/Admin/useMcpTokensAdmin.ts"],
"desktop": ["src/components/Admin/AdminMcpTokensPanel.tsx"],
"mobile": ["src/mobile/screens/admin/MAdminMcpTokensPanel.tsx"]
},
{
"feature": "Media lightbox",
"hooks": ["src/components/Files/useMediaLightbox.ts"],
"desktop": ["src/components/Files/FileManagerImageLightbox.tsx"],
"mobile": ["src/mobile/screens/trip/tabs/MFileLightbox.tsx"]
},
{
"feature": "Notifications list row actions",
"hooks": ["src/components/Notifications/useNotificationItemActions.ts"],
"desktop": ["src/components/Notifications/InAppNotificationItem.tsx"],
"mobile": ["src/mobile/screens/notifications/MNotificationRow.tsx"]
},
{
"feature": "Notifications page",
"hooks": ["src/pages/inAppNotifications/useInAppNotifications.ts"],
"desktop": ["src/pages/InAppNotificationsPage.tsx"],
"mobile": ["src/mobile/screens/notifications/MNotifications.tsx"]
},
{
"feature": "OAuth scope group picker",
"hooks": ["src/components/OAuth/useScopeSelection.ts"],
"desktop": ["src/components/OAuth/ScopeGroupPicker.tsx"],
"mobile": ["src/mobile/screens/settings/MScopeGroupPicker.tsx"]
},
{
"feature": "Packing bag card and bag weight summary",
"hooks": ["src/components/Packing/useBagCardEditor.ts"],
"desktop": ["src/components/Packing/PackingListPanelBagCard.tsx"],
"mobile": ["src/mobile/screens/trip/tabs/MBagsSheet.tsx"]
},
{
"feature": "Packing list: packingListModel",
"hooks": ["src/components/Packing/packingListModel.ts"],
"desktop": [
"src/components/Packing/packingPrintDocument.ts",
"src/components/Packing/usePackingExport.ts",
"src/components/Packing/usePackingListPanel.ts"
],
"mobile": [
"src/mobile/screens/trip/tabs/MBagsSheet.tsx",
"src/mobile/screens/trip/tabs/MPackItemSheet.tsx",
"src/mobile/screens/trip/tabs/MPackingListTab.tsx"
]
},
{
"feature": "Packing list: usePackingBags, usePackingCategoryAssignees, usePackingItemActions, usePackingTemplates",
"hooks": [
"src/components/Packing/usePackingBags.ts",
"src/components/Packing/usePackingCategoryAssignees.ts",
"src/components/Packing/usePackingItemActions.ts",
"src/components/Packing/usePackingTemplates.ts"
],
"desktop": ["src/components/Packing/usePackingListPanel.ts"],
"mobile": ["src/mobile/screens/trip/tabs/MPackingListTab.tsx"]
},
{
"feature": "Packing list: usePackingImport",
"hooks": ["src/components/Packing/usePackingImport.ts"],
"desktop": ["src/components/Packing/usePackingListPanel.ts"],
"mobile": ["src/mobile/screens/trip/tabs/MPackingImportSheet.tsx"]
},
{
"feature": "Packing template manager",
"hooks": ["src/components/Admin/usePackingTemplateAdmin.ts"],
"desktop": ["src/components/Admin/PackingTemplateManager.tsx"],
"mobile": ["src/mobile/screens/admin/MAdminPackingTemplateManager.tsx"]
},
{
"feature": "Per-leg travel mode and connector mode menu",
"hooks": ["src/components/Planner/useLegModeActions.ts"],
"desktop": ["src/components/Planner/DayPlanSidebar.tsx"],
"mobile": ["src/mobile/screens/trip/plan/MPlanTimeline.tsx", "src/mobile/screens/trip/plan/useMPlanTimeline.ts"]
},
{
"feature": "Permissions panel",
"hooks": ["src/components/Admin/usePermissionsAdmin.ts"],
"desktop": ["src/components/Admin/PermissionsPanel.tsx"],
"mobile": ["src/mobile/screens/admin/MAdminPermissionsPanel.tsx"]
},
{
"feature": "Place add/edit form and maps search: usePlaceForm",
"hooks": ["src/components/Planner/usePlaceForm.ts"],
"desktop": ["src/components/Planner/PlaceFormModal.tsx"],
"mobile": [
"src/mobile/screens/trip/sheets/MPlaceEditSheet.tsx",
"src/mobile/screens/trip/sheets/PlCategoryPicker.tsx"
]
},
{
"feature": "Place add/edit form and maps search: usePlaceSearch",
"hooks": ["src/components/Planner/usePlaceSearch.ts"],
"desktop": ["src/components/Planner/PlaceFormModal.tsx"],
"mobile": ["src/mobile/screens/trip/sheets/PlPlaceSearch.tsx"]
},
{
"feature": "Place detail actions",
"hooks": ["src/components/Planner/usePlaceActions.ts"],
"desktop": [
"src/components/Planner/PlaceInspector.tsx",
"src/pages/tripPlanner/useTripPlannerPage.ts"
],
"mobile": ["src/mobile/screens/trip/sheets/MPlaceSheet.tsx"]
},
{
"feature": "Places pool list",
"hooks": ["src/components/Planner/usePlacesPool.ts"],
"desktop": ["src/components/Planner/PlacesSidebarHeader.tsx", "src/components/Planner/usePlacesSidebar.ts"],
"mobile": [
"src/mobile/screens/trip/places/MPlacesBrowser.tsx",
"src/mobile/screens/trip/places/MPlacesFilterControls.tsx"
]
},
{
"feature": "Plugins admin",
"hooks": [
"src/components/Admin/plugins/pluginModel.ts",
"src/components/Admin/plugins/usePluginDetail.ts",
"src/components/Admin/plugins/usePluginsAdmin.ts"
],
"desktop": ["src/components/Admin/AdminPluginsPanel.tsx"],
"mobile": ["src/mobile/screens/admin/MAdminPluginsPanel.tsx"]
},
{
"feature": "Public transit for one leg, between two city walks from the first one's end, and a journey late for the next walk",
"hooks": ["src/components/Planner/useTransitLegPlanner.ts"],
"desktop": ["src/components/Planner/DayPlanSidebar.tsx"],
"mobile": ["src/mobile/screens/trip/plan/useMPlanTimeline.ts"]
},
{
"feature": "A tour's start and end in the day plan, its end worked out from its time, and an end that runs into the next timed item",
"hooks": ["src/components/Tours/tourDayTime.ts"],
"desktop": ["src/components/Planner/DayPlanSidebar.tsx"],
"mobile": ["src/mobile/screens/trip/plan/useMPlanTimeline.ts"]
},
{
"feature": "A multi-day tour put on a day: the whole tour there, or a stage a day from that day on",
"hooks": ["src/components/Tours/stages/stageSpread.ts"],
"desktop": ["src/components/Tours/stages/TourDayChoiceDialog.tsx", "src/components/Tours/stages/TourDayAddButton.tsx"],
"mobile": ["src/mobile/screens/trip/sheets/MTourDayChoiceSheet.tsx"]
},
{
"feature": "Reservation form incl. hotel accommodation creation",
"hooks": ["src/components/Planner/reservationFormModel.ts", "src/components/Planner/useReservationForm.ts"],
"desktop": ["src/components/Planner/ReservationModal.tsx"],
"mobile": ["src/mobile/screens/trip/sheets/MReservationSheet.tsx"]
},
{
"feature": "Road-trip add-stop draft",
"hooks": ["src/components/Roadtrip/useStopDraftForm.ts"],
"desktop": ["src/components/Roadtrip/RoadtripStopPopup.tsx"],
"mobile": ["src/mobile/screens/trip/roadtrip/MRtDraftSheet.tsx"]
},
{
"feature": "Road-trip Google Maps route import",
"hooks": ["src/components/Roadtrip/useGoogleRouteImport.ts"],
"desktop": ["src/components/Roadtrip/GoogleRouteImport.tsx"],
"mobile": ["src/mobile/screens/trip/roadtrip/MRtRouteImportSheet.tsx"]
},
{
"feature": "Road-trip stay length draft",
"hooks": ["src/components/Roadtrip/useStayDraft.ts"],
"desktop": ["src/components/Roadtrip/RoadtripStayModal.tsx"],
"mobile": ["src/mobile/screens/trip/roadtrip/MRtStaySheet.tsx"]
},
{
"feature": "Demo welcome",
"hooks": ["src/components/Demo/useDemoWelcome.ts"],
"desktop": ["src/components/Demo/DemoWelcome.tsx"],
"mobile": ["src/mobile/screens/dashboard/MDemoWelcome.tsx"]
},
{
"feature": "Settings / Demo account locks",
"hooks": ["src/components/Demo/useDemoLock.ts"],
"desktop": [
"src/components/Settings/AccountDemoLock.tsx",
"src/components/Settings/DisplaySettingsTab.tsx",
"src/components/Settings/IntegrationsTab.tsx",
"src/components/Settings/ai/AiConnectionSection.tsx"
],
"mobile": [
"src/mobile/screens/settings/MAiConnectionSection.tsx",
"src/mobile/screens/settings/MSettingsGeneral.tsx",
"src/mobile/screens/settings/MSettingsMcp.tsx"
]
},
{
"feature": "Settings / Account",
"hooks": ["src/components/Settings/AccountDemoLock.tsx", "src/components/Settings/useAccountSettings.ts"],
"desktop": ["src/components/Settings/AccountTab.tsx"],
"mobile": ["src/mobile/screens/settings/MSettingsAccount.tsx"]
},
{
"feature": "Settings / Account / Native app server",
"hooks": ["src/components/Settings/useNativeServer.ts"],
"desktop": ["src/components/Settings/NativeServerSection.tsx"],
"mobile": ["src/mobile/screens/settings/MSettingsServer.tsx"]
},
{
"feature": "Settings / Account / Passkeys",
"hooks": ["src/components/Settings/usePasskeys.ts"],
"desktop": ["src/components/Settings/PasskeysSection.tsx"],
"mobile": ["src/mobile/screens/settings/MSettingsAccount.tsx"]
},
{
"feature": "Settings / Appearance",
"hooks": ["src/components/Settings/appearanceModel.ts", "src/components/Settings/useAppearanceEditor.ts"],
"desktop": ["src/components/Settings/AppearanceSettingsTab.tsx"],
"mobile": ["src/mobile/screens/settings/MSettingsAppearance.tsx"]
},
{
"feature": "Settings / General/Display",
"hooks": ["src/components/Settings/useSettingSaver.ts"],
"desktop": ["src/components/Settings/DisplaySettingsTab.tsx"],
"mobile": ["src/mobile/screens/settings/MSettingsGeneral.tsx"]
},
{
"feature": "Settings / Integrations / AI assistant",
"hooks": ["src/components/Settings/ai/useAiConnections.ts"],
"desktop": ["src/components/Settings/ai/AiConnectionSection.tsx"],
"mobile": ["src/mobile/screens/settings/MAiConnectionSection.tsx"]
},
{
"feature": "Settings / Integrations / AI parsing",
"hooks": ["src/components/Settings/useLlmConnection.ts"],
"desktop": ["src/components/Settings/LlmConnectionSection.tsx"],
"mobile": ["src/mobile/screens/settings/MLlmConnectionSection.tsx"]
},
{
"feature": "Settings / Integrations / AirTrail",
"hooks": ["src/components/Settings/useAirTrailSettings.ts"],
"desktop": ["src/components/Settings/AirTrailConnectionSection.tsx"],
"mobile": ["src/mobile/screens/settings/MAirTrailConnectionSection.tsx"]
},
{
"feature": "Settings / Integrations / MCP",
"hooks": ["src/components/Settings/useMcpIntegration.ts"],
"desktop": ["src/components/Settings/IntegrationsTab.tsx"],
"mobile": ["src/mobile/screens/settings/MSettingsMcp.tsx"]
},
{
"feature": "Settings / Integrations / Photo providers",
"hooks": ["src/components/Settings/usePhotoProviderConnections.ts"],
"desktop": ["src/components/Settings/PhotoProvidersSection.tsx"],
"mobile": ["src/mobile/screens/settings/MPhotoProvidersSection.tsx"]
},
{
"feature": "Settings / Map: mapSettingsModel",
"hooks": ["src/components/Settings/mapSettingsModel.ts"],
"desktop": ["src/components/Settings/MapSettingsTab.tsx"],
"mobile": ["src/mobile/screens/settings/MSettingsMap.tsx"]
},
{
"feature": "Settings / Map: useMapSettingsForm",
"hooks": ["src/components/Settings/useMapSettingsForm.ts"],
"desktop": ["src/components/Settings/MapSettingsTab.tsx"],
"mobile": ["src/mobile/screens/settings/MSettingsMap.tsx"]
},
{
"feature": "Settings / Notifications",
"hooks": ["src/components/Settings/useNotificationSettings.ts"],
"desktop": ["src/components/Settings/NotificationsTab.tsx"],
"mobile": ["src/mobile/screens/settings/MSettingsNotifications.tsx"]
},
{
"feature": "Settings / Plugins: usePluginActivity",
"hooks": ["src/components/Settings/usePluginActivity.ts"],
"desktop": ["src/components/Settings/PluginActivityPanel.tsx"],
"mobile": ["src/mobile/screens/settings/MSettingsPlugins.tsx"]
},
{
"feature": "Settings / Plugins: usePluginUserSettings",
"hooks": ["src/components/Plugins/usePluginUserSettings.ts"],
"desktop": ["src/components/Settings/PluginSettingsTab.tsx"],
"mobile": ["src/mobile/screens/settings/MSettingsPlugins.tsx"]
},
{
"feature": "Settings page",
"hooks": ["src/pages/settings/useSettings.ts"],
"desktop": ["src/pages/SettingsPage.tsx"],
"mobile": ["src/mobile/screens/settings/MSettings.tsx"]
},
{
"feature": "Settings shell: visible tabs + integrations gating",
"hooks": ["src/components/Settings/useIntegrationGates.ts"],
"desktop": ["src/components/Settings/IntegrationsTab.tsx"],
"mobile": ["src/mobile/screens/settings/MSettingsIntegrations.tsx"]
},
{
"feature": "Storage backends admin: useBackendForm",
"hooks": ["src/components/Admin/storage/useBackendForm.ts"],
"desktop": ["src/components/Admin/storage/BackendForm.tsx"],
"mobile": ["src/mobile/screens/admin/MAdminStoragePanel.tsx"]
},
{
"feature": "Storage backends admin: useStoragePanel",
"hooks": ["src/components/Admin/storage/useStoragePanel.ts"],
"desktop": ["src/components/Admin/storage/AdminStoragePanel.tsx"],
"mobile": ["src/mobile/screens/admin/MAdminStoragePanel.tsx"]
},
{
"feature": "To-do list and task add/edit form: useTaskForm",
"hooks": ["src/components/Todo/useTaskForm.ts"],
"desktop": ["src/components/Todo/TodoListPanel.tsx"],
"mobile": ["src/mobile/screens/trip/tabs/MTaskSheet.tsx"]
},
{
"feature": "To-do list and task add/edit form: useTodoList",
"hooks": ["src/components/Todo/useTodoList.ts"],
"desktop": ["src/components/Todo/TodoListPanel.tsx"],
"mobile": ["src/mobile/screens/trip/tabs/MTodoListTab.tsx"]
},
{
"feature": "Toast presenter queue",
"hooks": ["src/components/shared/useToastQueue.ts"],
"desktop": ["src/components/shared/Toast.tsx"],
"mobile": ["src/mobile/components/MToastHost.tsx"]
},
{
"feature": "Tours list filter",
"hooks": ["src/components/Tours/tourPresentation.ts"],
"desktop": [
"src/components/Tours/TourDetailDialog.tsx",
"src/components/Tours/planner/TourPlannerPanels.tsx",
"src/components/Tours/tourParts.tsx"
],
"mobile": ["src/mobile/screens/trip/places/MToursSelectionList.tsx"]
},
{
"feature": "Tours list facets",
"hooks": ["src/components/Tours/useTourListFilters.ts"],
"desktop": ["src/components/Tours/ToursSidebar.tsx"],
"mobile": ["src/mobile/screens/trip/places/MPlacesBrowser.tsx"]
},
{
"feature": "Transport booking detail view: reservationFiles",
"hooks": ["src/utils/reservationFiles.ts"],
"desktop": [
"src/components/Planner/DayPlanSidebarTransportDetailModal.tsx",
"src/components/Planner/ReservationsPanel.tsx",
"src/components/Planner/bookings/BookingDetailHost.tsx"
],
"mobile": [
"src/mobile/screens/trip/sheets/MTransportSheet.tsx",
"src/mobile/screens/trip/tabs/MBookingsTab.tsx",
"src/mobile/screens/trip/tabs/MTransportsTab.tsx"
]
},
{
"feature": "Transport booking detail view: transportDetailModel",
"hooks": ["src/components/Planner/transportDetailModel.ts"],
"desktop": ["src/components/Planner/DayPlanSidebarTransportDetailModal.tsx"],
"mobile": ["src/mobile/screens/trip/sheets/MTransportSheet.tsx"]
},
{
"feature": "Transport booking form: bookingFormModel",
"hooks": ["src/components/Planner/bookingFormModel.ts"],
"desktop": [
"src/components/Planner/ReservationModal.tsx",
"src/components/Planner/TransportModal.tsx",
"src/components/Planner/useBookingFileAttach.ts"
],
"mobile": [
"src/mobile/screens/trip/sheets/MReservationSheet.tsx",
"src/mobile/screens/trip/sheets/MTransportFormSheet.tsx"
]
},
{
"feature": "Transport booking form: transportEndpoints, useTransportForm",
"hooks": ["src/components/Planner/transportEndpoints.ts", "src/components/Planner/useTransportForm.ts"],
"desktop": ["src/components/Planner/TransportModal.tsx"],
"mobile": ["src/mobile/screens/trip/sheets/MTransportFormSheet.tsx"]
},
{
"feature": "Trip export",
"hooks": ["src/components/Planner/useTripExport.ts"],
"desktop": ["src/components/Planner/TripExportModal.tsx"],
"mobile": ["src/mobile/screens/trip/sheets/MExportSheet.tsx"]
},
{
"feature": "Trip files: fileActions",
"hooks": ["src/components/Files/fileActions.ts"],
"desktop": ["src/components/Files/FileManagerAssignModal.tsx", "src/components/Files/useFileManager.ts"],
"mobile": [
"src/mobile/screens/trip/tabs/MFileLinkSheet.tsx",
"src/mobile/screens/trip/tabs/MFileMenuSheet.tsx",
"src/mobile/screens/trip/tabs/MFilesTab.tsx"
]
},
{
"feature": "Trip files: fileListRules",
"hooks": ["src/components/Files/fileListRules.ts"],
"desktop": ["src/components/Files/FileManagerRow.tsx", "src/components/Files/useFileManager.ts"],
"mobile": ["src/mobile/screens/trip/tabs/MFileLinkSheet.tsx", "src/mobile/screens/trip/tabs/filesModel.ts"]
},
{
"feature": "Trip files: useFileTrash",
"hooks": ["src/components/Files/useFileTrash.ts"],
"desktop": ["src/components/Files/useFileManager.ts"],
"mobile": ["src/mobile/screens/trip/tabs/MFileTrashSheet.tsx"]
},
{
"feature": "Trip loading splash",
"hooks": ["src/components/shared/useTripSplashBeats.ts"],
"desktop": ["src/components/shared/TripLoadingSplash.tsx"],
"mobile": ["src/mobile/screens/trip/MTripLoadingSplash.tsx"]
},
{
"feature": "Trip planner page",
"hooks": ["src/pages/tripPlanner/useTripPlanner.ts"],
"desktop": ["src/pages/tripPlanner/useTripPlannerPage.ts"],
"mobile": ["src/mobile/screens/trip/MTripShell.tsx"]
},
{
"feature": "Trip sheet wiring: transportEditorOpeners",
"hooks": ["src/pages/tripPlanner/transportEditorOpeners.ts"],
"desktop": ["src/pages/TripPlannerPage.tsx", "src/pages/tripPlanner/usePlannerDialogs.ts"],
"mobile": ["src/mobile/screens/trip/sheets/MTripSheets.tsx"]
},
{
"feature": "Trip sheet wiring: tripCover, useBookingExpenseEditor",
"hooks": ["src/pages/tripPlanner/tripCover.ts", "src/pages/tripPlanner/useBookingExpenseEditor.ts"],
"desktop": ["src/pages/TripPlannerPage.tsx"],
"mobile": ["src/mobile/screens/trip/sheets/MTripSheets.tsx"]
},
{
"feature": "User modals/sheets",
"hooks": ["src/components/Admin/useAdminUserActions.ts"],
"desktop": ["src/pages/admin/AdminUserModals.tsx"],
"mobile": ["src/mobile/screens/admin/MAdminSheets.tsx"]
},
{
"feature": "Vacay calendar logging logic: useVacayCalendarLogic",
"hooks": ["src/components/Vacay/useVacayCalendarLogic.ts"],
"desktop": ["src/components/Vacay/VacayCalendar.tsx", "src/components/Vacay/VacayPersons.tsx"],
"mobile": ["src/mobile/screens/vacay/useMVacay.ts"]
},
{
"feature": "Vacay calendar logging logic: vacayFormat",
"hooks": ["src/components/Vacay/vacayFormat.ts"],
"desktop": ["src/components/Vacay/VacayStats.tsx"],
"mobile": ["src/mobile/screens/vacay/MVacay.tsx"]
},
{
"feature": "Vacay fusion invite",
"hooks": ["src/components/Vacay/useVacayUserPicker.ts"],
"desktop": ["src/components/Vacay/VacayPersons.tsx", "src/components/Vacay/VacaySharedCalendars.tsx"],
"mobile": ["src/mobile/screens/vacay/MVacayInviteSheet.tsx", "src/mobile/screens/vacay/MVacayShareSheet.tsx"]
},
{
"feature": "Vacay page",
"hooks": ["src/pages/vacay/useVacay.ts"],
"desktop": ["src/pages/VacayPage.tsx"],
"mobile": ["src/mobile/screens/vacay/useMVacay.ts"]
},
{
"feature": "Vacay read-only calendar sharing",
"hooks": ["src/components/Vacay/useVacayShareActions.ts"],
"desktop": ["src/components/Vacay/VacaySharedCalendars.tsx"],
"mobile": ["src/mobile/screens/vacay/MVacayShareSheet.tsx", "src/mobile/screens/vacay/useMVacay.ts"]
},
{
"feature": "Vacay settings",
"hooks": ["src/components/Vacay/useVacaySettings.ts"],
"desktop": ["src/components/Vacay/VacaySettings.tsx"],
"mobile": ["src/mobile/screens/vacay/MVacaySettingsSheet.tsx"]
},
{
"feature": "Paddle regions admin card",
"hooks": ["src/components/Admin/paddle/usePaddleRegionsAdmin.ts", "src/components/Admin/paddle/paddleRegionsModel.ts"],
"desktop": ["src/components/Admin/paddle/PaddleRegionsPanel.tsx"],
"mobile": ["src/mobile/screens/admin/MAdminPaddleRegionsPanel.tsx"]
},
{
"feature": "School holiday catalog admin card",
"hooks": ["src/components/Admin/useSchoolHolidayCatalog.ts"],
"desktop": ["src/components/Admin/SchoolHolidayCatalog.tsx"],
"mobile": ["src/mobile/screens/admin/MAdminSchoolHolidayCatalog.tsx"]
},
{
"feature": "Trip settings: members, guests, public and invite link",
"hooks": ["src/components/Trips/useTripShare.ts"],
"desktop": ["src/components/Trips/TripShareDialog.tsx"],
"mobile": ["src/mobile/screens/trip/sheets/MTripSettingsSheet.tsx"]
}
],
"mobileOnly": {
"src/mobile/screens/admin/MAdminOidcCard.tsx": "Markup only; the OIDC card of MAdminSettingsSection, with the form state from useAdmin and the save from its useAdminSettingsActions handed in through props.",
"src/mobile/screens/admin/MAdminResetMfaSheet.tsx": "Markup only; the 2FA reset confirm that MAdminSheets opens, with the reset handed in through props from its useAdminUserActions.",
"src/mobile/screens/admin/MAdminUi.tsx": "Phone only admin UI primitives (button, card, field, input, secret input, sheet frame).",
"src/mobile/screens/admin/MPluginVersionDate.tsx": "Markup only; the published date of a plugin version in MAdminPluginsPanel, formatted with the user's date format through useFormatDate.",
"src/mobile/screens/admin/MStorageReclaimCard.tsx": "Markup only; renders the reclaim view and handlers that MAdminStoragePanel takes from useStoragePanel, the twin of StorageReclaimSection.",
"src/mobile/screens/atlas/MAtlasSearch.tsx": "Phone full screen country search overlay; options, suggestions and selection come through props from MAtlas.",
"src/mobile/screens/atlas/MAtlasStatsCard.tsx": "Markup only; renders the AtlasStats that MAtlas passes in.",
"src/mobile/screens/collections/MCollCategoryPicker.tsx": "Phone only category dropdown; value and categories come through props from the collection sheets.",
"src/mobile/screens/collections/MCollInvites.tsx": "Markup only; the invites and accept and decline come through props from useCollections via MCollections.",
"src/mobile/screens/collections/MCollLabelsSheet.tsx": "Phone label sheet; create, update, delete and assign come through props from useCollections.",
"src/mobile/screens/collections/MCollLinksEditor.tsx": "Markup only; link rows and the change handler come through props from the collection sheets.",
"src/mobile/screens/collections/MCollListNav.tsx": "Markup only; the collections' lists as the header dropdown or as the column beside the places on a wide window, with the lists and the selection handed in through props from useCollections.",
"src/mobile/screens/collections/MCollListPickerSheet.tsx": "Phone list picker sheet; the move or copy action comes through onPick from useCollections.",
"src/mobile/screens/collections/MCollSheetKit.tsx": "Phone only sheet UI primitives for the collections screens (header, footer, pill, eyebrow).",
"src/mobile/screens/collections/collectionsMobileModel.ts": "Visual constants only the phone collections screens use (category and status specs, swatches, cover gradient).",
"src/mobile/screens/dashboard/MUserMenu.tsx": "Phone avatar menu with a three state theme cycle the desktop navbar does not have.",
"src/mobile/screens/journey/MDawarichDaySheet.tsx": "Markup only; the phone frame the Dawarich day sheets (route and stays) render their shared review in.",
"src/mobile/screens/journey/MJourneyFeed.tsx": "Markup only; the journey's entries as a feed beside the map on a wide window, with the entries, the active one and the tap handed in through props from useJourneyDetail and useJourneyCarouselSync.",
"src/mobile/screens/settings/MAppLockCard.tsx": "Phone only: the app lock exists only in the native app, so there is no desktop setting to share with.",
"src/mobile/screens/settings/MConfirmSheet.tsx": "Phone only bottom sheet confirm dialog used across the mobile screens.",
"src/mobile/screens/settings/MDawarichConnectionSection.tsx": "Already shares hooks/useDawarichConnection with components/Settings/DawarichConnectionSection.tsx.",
"src/mobile/screens/settings/MMobileDashOrder.tsx": "Phone only setting that orders the mobile dashboard blocks; the desktop has no such setting.",
"src/mobile/screens/settings/MMobileNavCustomizer.tsx": "Phone only editor for the mobile bottom nav, built on components/Settings/useMobileNavEditor.",
"src/mobile/screens/settings/MSetPickerSheet.tsx": "Phone only option picker bottom sheet, a generic UI primitive.",
"src/mobile/screens/settings/MSettingsAbout.tsx": "Markup only about card with static links and no state.",
"src/mobile/screens/settings/MSettingsOffline.tsx": "Already shares components/Settings/useOfflineSettings with components/Settings/OfflineTab.tsx.",
"src/mobile/screens/settings/MSettingsUi.tsx": "Phone only settings UI primitives (card, row, input, button, segments, hint).",
"src/mobile/screens/settings/MTileCacheUsage.tsx": "Phone only: the native tile cache size and clear action, which the browser build has no counterpart for.",
"src/mobile/screens/settings/MWebPushCard.tsx": "Already shares hooks/useWebPush with components/Settings/WebPushCard.tsx.",
"src/mobile/screens/trip/MTripRail.tsx": "Phone shell only; the trip's sections on the leading edge of a wide window in place of the dock, with the tabs and handlers MTripShell hands in.",
"src/mobile/screens/trip/MTripShellParts.tsx": "Markup only; small pieces of MTripShell's top controls (segment pill, compact toggle, document sync button), with the state and handlers MTripShell hands in.",
"src/mobile/screens/trip/dockTabs.ts": "Phone only helper that picks which trip tabs get a seat in the mobile dock.",
"src/mobile/screens/trip/lib/dayNotes.ts": "Phone only helper that splits a leading time off a day note for the plan timeline.",
"src/mobile/screens/trip/map/MMapArea.tsx": "Phone map stage framing; already shares usePoiExplore and useMergedMapPois with the desktop trip planner.",
"src/mobile/screens/trip/places/MPlacesBulkCategorySheet.tsx": "Markup only; categories and the pick handler come through props from MPlacesBrowser.",
"src/mobile/screens/trip/places/MPlacesToursModeSwitch.tsx": "Markup only places or tours toggle; value and onChange come through props from MPlacesBrowser.",
"src/mobile/screens/trip/places/placesBrowserModel.ts": "Phone pool helpers over the shared utils/placesFilter, placeSearch and plannedPlaces.",
"src/mobile/screens/trip/plan/MPlanTimelineRows.tsx": "Markup only timeline rows; row data comes from MPlanTimeline and planTimelineModel.",
"src/mobile/screens/trip/plan/MRouteAppsSheet.tsx": "Markup only; the route apps come from the shared components/Planner/dayRouteApps the desktop menu uses too.",
"src/mobile/screens/trip/plan/openRouteTarget.ts": "Phone only helper that opens a route target: a web link in a new tab, geo: in place.",
"src/mobile/screens/trip/plan/planTimelineModel.ts": "Phone plan timeline row builder over the shared utils/dayMerge, dayOrder and dayTourProjection.",
"src/mobile/screens/trip/plan/useMPlanDragReorder.ts": "Phone only long press drag gesture; the reorder itself runs through the handler it is given.",
"src/mobile/screens/trip/roadtrip/MRoadtripRows.tsx": "Markup only road trip rows over the shared Roadtrip models the desktop sidebar rows also use.",
"src/mobile/screens/trip/roadtrip/MRoadtripTab.tsx": "Phone road trip tab over the shared roadtripRowModel, stopBookings and nightBookend RoadtripSidebar uses.",
"src/mobile/screens/trip/roadtrip/MRtAlternativesBar.tsx": "Markup only; state from useMRtAlternatives, text from the shared alternativeOverlays.",
"src/mobile/screens/trip/roadtrip/MRtCorridorBar.tsx": "Markup only; its corridor state comes through props from useMRtCorridor.",
"src/mobile/screens/trip/roadtrip/MRtCorridorSheet.tsx": "Phone corridor search sheet over useMRtCorridor and the planner's shared corridor state.",
"src/mobile/screens/trip/roadtrip/MRtInfoSheet.tsx": "Read only figures sheet that already shares useHotelBookends, dayWindow and parseAvoid with RoadtripLimitsCard.",
"src/mobile/screens/trip/roadtrip/MRtLimitsEditor.tsx": "Large screen form inside MRtInfoSheet over the planner's saveRoadtripLimit, the desktop dialog's own save, and the shared dayWindow, parseAvoid and rangeFromSpec.",
"src/mobile/screens/trip/roadtrip/MRtKindSheet.tsx": "Thin sheet over planner.setRoadtripStopKind that already shares STOP_KINDS with StopKindPicker.",
"src/mobile/screens/trip/roadtrip/MRtStopSheet.tsx": "Phone only stop detail sheet over the shared roadtripRowModel, stayReading and planner writers.",
"src/mobile/screens/trip/roadtrip/MRtTrackSheet.tsx": "Large screen sheet over the planner's followTrack, the same hook RoadtripTrackModal runs on; the phone has no entry to it.",
"src/mobile/screens/trip/roadtrip/stageBadges.ts": "Badge helpers for the phone stage header and alternatives bar, which have no desktop counterpart.",
"src/mobile/screens/trip/roadtrip/useMRoadtrip.ts": "Phone stage screen adapter over the shared roadtripRowModel plus a live clock tick.",
"src/mobile/screens/trip/roadtrip/useMRtAlternatives.ts": "Tap to preview, confirm to write layer over the planner's shared route alternatives.",
"src/mobile/screens/trip/roadtrip/useMRtCorridor.ts": "Phone reach and anchor layer over the planner's shared corridor state.",
"src/mobile/screens/trip/sheets/MBookingFields.tsx": "Markup only: the booking code, notes, traveler and route stop fields both phone booking sheets draw.",
"src/mobile/screens/trip/sheets/MBookingFilesCosts.tsx": "Phone booking sheet footer that composes PlFileAttach and MLinkedCosts.",
"src/mobile/screens/trip/sheets/MBrowseActionsSheet.tsx": "Phone action sheet for a pool place that calls planner handlers and the shared placeToSaveTarget.",
"src/mobile/screens/trip/sheets/MDaysSheet.tsx": "Button based day reorder sheet over planner.handleReorderDays; the desktop reorders by drag.",
"src/mobile/screens/trip/sheets/MLinkedCosts.tsx": "Already shares useExpenseLinks with the desktop BookingCostsSection; only markup and a search filter are local.",
"src/mobile/screens/trip/sheets/MTourDetailShell.tsx": "Markup only phone frame for the shared TourDetailDialog, which renders its own content into it.",
"src/mobile/screens/trip/sheets/MTripSheetUi.tsx": "Phone sheet UI primitives (eyebrow, headers, stat boxes, action circles) and a time display helper.",
"src/mobile/screens/trip/sheets/PlFileAttach.tsx": "Markup only; pending files and link actions come through props from the phone form sheets.",
"src/mobile/screens/trip/sheets/PlSheetChrome.tsx": "Phone form sheet chrome primitives (header, footer, field classes).",
"src/mobile/screens/trip/sheets/PlTimeFields.tsx": "Phone time fields that already share timeCollisions with the desktop PlaceFormModal.",
"src/mobile/screens/trip/sheets/tourSheetOpen.ts": "Phone only context for MTourDetailShell: whether the tour sheet is open and the name it carries.",
"src/mobile/screens/trip/tabs/MCollabTab.tsx": "Phone collab sub tab router that reuses the desktop CollabLinks component.",
"src/mobile/screens/trip/tabs/MFilesBoard.tsx": "Markup only; the trip's files as tiles and the picked file's preview on a wide window, with the files and their actions handed in through props from MFilesTab.",
"src/mobile/screens/trip/tabs/MListsTab.tsx": "Phone router between the packing and to-do bodies, with no logic of its own.",
"src/mobile/screens/trip/tabs/MReceiptScanButton.tsx": "Already shares useReceiptScan and ReceiptScanModal with the desktop CostsPanel.",
"src/mobile/screens/trip/tabs/MReservationCardParts.tsx": "Markup only: the title, actions, date, files and delete sheet parts both phone booking tabs draw.",
"src/mobile/screens/trip/tabs/MTodoSidebar.tsx": "Markup only; the to-do filters as a pane beside the tasks on a wide window, with the filter state and the counts handed in through props from useTodoView.",
"src/mobile/screens/trip/tabs/MTripTabPanel.tsx": "Phone tab router that mounts the per tab screens and plugin frames, with no logic of its own.",
"src/mobile/screens/trip/tabs/collabPanes.ts": "Phone only; decides whether the collab tab shows the chat beside a board on a wide window, a layout question of the touch shell that the desktop planner does not have.",
"src/mobile/screens/trip/tabs/listsModel.ts": "Priority colour and label constants only the phone to-do list and task sheet use.",
"src/mobile/screens/trip/tabs/tabChrome.tsx": "Phone tab chrome primitives (scroller, section headers, fields, traveler chips, plugin slots).",
"src/mobile/screens/trip/tabs/tabModel.ts": "Phone tab prop type and status colour tokens only the phone tabs use.",
"src/mobile/screens/trip/tabs/transportsModel.ts": "Phone transport card readers (metadata, day and time cells) for MTransportsTab and MBookingsTab.",
"src/mobile/screens/vacay/MVacayMonth.tsx": "Markup only; its day cell colours come from the phone vacayDayModel.",
"src/mobile/screens/vacay/vacayDayModel.ts": "Phone day cell colour model for MVacayMonth; the desktop card styles its cells inline."
}
}