Files
TREK/client/scripts/feature-pairs.json
T
Maurice 65bb2d95eb feat(journey): keep the route recorded on a journey day from Dawarich, previewed first, with its gaps
A day header in the journey timeline now carries the Dawarich mark for an
editor whose Dawarich answers (dimmed with the reason while offline). It opens
a dialog that names the journey and the day and reads that one local day from
the caller's own connection: a sketch of the route, distance, first and last
time, pieces, gaps without recording, modes and whether tracks or thinned
points answered. The day is cut in the zone Dawarich records in where its
answer shows one, else in this device's, and a picker cuts it in any other.
Nothing is kept before "Keep route". On a phone the same sheet opens from the
journey's More options for the day of the card shown.

What is kept is the preview that was seen: the save reads the day again and
refuses with recording_changed when its hash moved, and the dialog shows the
new version. The same day taken over twice keeps one version and announces
nothing; a different version is replaced only on "Replace", never touching an
entry or text. A failed read throws before any write, so the kept version
stays. Gaps stay gaps: points are split where silence ends elsewhere, and no
day is joined to the one before. The dialog says how many other people will
see the route; editors may keep their own recording.

Kept days show in the day header (distance, whose recording, since when,
still running) and on the desktop and phone journey maps in the colour of
their day's pins, winning over the live trail of their date, and stay drawn
without Dawarich. A trip's GPX track is now drawn dashed as the plan, recorded
routes solid. Shared links do not show recorded days. Remove route asks first
and works without a connection.

Server: migration 046160 adds journey_recorded_days (one row per journey,
local day and source, segments as JSON, zone, window, fetch time, hash,
importer kept past their account). The journey domain owns the rows through
JourneyRecordedDaysService; the new journey-recordings domain takes a day
over through DawarichTracksService.fetchDay, which reads past the cache, asks
a window wide enough for every zone and refuses with DomainErrors. REST under
/api/journeys/:id/recordings (list, preview, PUT and DELETE /:date) with
@trek/shared contracts, and MCP list_journey_recorded_days,
preview_journey_recorded_day, save_journey_recorded_day and
delete_journey_recorded_day on the same service and access. A new user event
journey:recording:updated keeps every open map current. JourneyTrack gains an
optional kind. All 27 locales carry the strings; the Journey and Dawarich wiki
pages and the MCP tool list say what it does.
2026-10-21 15:05:21 +02:00

966 lines
48 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",
"src/components/Admin/addons/useLlmParsingConfig.ts"
],
"desktop": ["src/components/Admin/AddonManager.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": "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": "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",
"src/components/Collections/StatusBadge.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, useSettlementForm",
"hooks": ["src/components/Budget/useCostsLedger.ts", "src/components/Budget/useSettlementForm.ts"],
"desktop": ["src/components/Budget/CostsPanel.tsx"],
"mobile": ["src/mobile/screens/trip/tabs/MCostsTab.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": "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 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/components/shared/PlaceAvatarUpload.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",
"src/mobile/screens/trip/places/MPlacesFilterSheet.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 stay length draft",
"hooks": ["src/components/Roadtrip/useStayDraft.ts"],
"desktop": ["src/components/Roadtrip/RoadtripStayModal.tsx"],
"mobile": ["src/mobile/screens/trip/roadtrip/MRtStaySheet.tsx"]
},
{
"feature": "Settings / Account",
"hooks": ["src/components/Settings/useAccountSettings.ts"],
"desktop": ["src/components/Settings/AccountTab.tsx"],
"mobile": ["src/mobile/screens/settings/MSettingsAccount.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 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/Admin/DefaultUserSettingsTab.tsx", "src/components/Settings/MapSettingsTab.tsx"],
"mobile": [
"src/mobile/screens/admin/MAdminDefaultUserSettings.tsx",
"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"]
}
],
"mobileOnly": {
"src/mobile/screens/admin/MAdminUi.tsx": "Phone only admin UI primitives (button, card, field, input, secret input, sheet frame).",
"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/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/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/MWebPushCard.tsx": "Already shares hooks/useWebPush with components/Settings/WebPushCard.tsx.",
"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/map/MPlacesFilterPill.tsx": "Phone only map control for the active places filter count, built on the shared MapTogglePill.",
"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/planTimelineModel.ts": "Phone plan timeline row builder over the shared utils/dayMerge, dayOrder and dayTourProjection.",
"src/mobile/screens/trip/plan/useMPlanDaySwipe.ts": "Phone only touch swipe gesture for switching days.",
"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/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/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/MImportSheet.tsx": "Menu that routes to ImpFileStep and ImpListStep, with no logic of its own.",
"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/MMehrSheet.tsx": "Phone dock overflow menu that only opens tabs and sheets.",
"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/tabs/MCollabTab.tsx": "Phone collab sub tab router that reuses the desktop CollabLinks component.",
"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/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/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."
}
}