mobileTabs.find(tab => tab.id === id)?.label ?? id
- // While the trip runs, today's chip carries a ring and a button jumps back to it
- // from wherever the rail was scrolled (#2392). Null outside the trip's dates.
+ // While the trip runs, today's chip carries a ring and a dot (#2392). That mark
+ // is the whole of it: a second button beside the rail only crowded the chrome.
+ // Null outside the trip's dates.
const todayDayId = findTodayDayId(days)
- const jumpToToday = () => {
- if (todayDayId == null || todayDayId === planner.selectedDayId) return
- if (view === 'map') selectDayOnMap(todayDayId)
- else planner.handleSelectDay(todayDayId, true)
- }
const onDayChipTap = (dayId: number) => {
if (dayId === planner.selectedDayId) openSheet('day', { dayId })
@@ -542,20 +538,6 @@ export default function MTripShell({
)
})}
- {/* Back to today from anywhere on the rail (#2392). Mounted for the whole
- running trip and dimmed while today is already open, so it never
- appears under the thumb and shoves the rail aside. */}
- {todayDayId != null && (
-
- )}
{/* Drop the day filter and show the whole trip (#2257). Map only: the
plan timeline and the road trip chain are both single-day, so there is
nothing to widen there. Stays mounted while a day is active rather than
diff --git a/client/src/mobile/screens/trip/map/MMapArea.tsx b/client/src/mobile/screens/trip/map/MMapArea.tsx
index 299b5f479..0e973ba91 100644
--- a/client/src/mobile/screens/trip/map/MMapArea.tsx
+++ b/client/src/mobile/screens/trip/map/MMapArea.tsx
@@ -4,7 +4,6 @@ import { MapCompassPill, type CompassMap } from '../../../../components/Map/MapC
import { MAP_LAYER_SWITCHER_INSET, MAP_ROUND_CONTROL_SIZE } from '../../../../components/Map/MapLayerSwitcher'
import { TripRouteOverviewPill, TripRouteOverviewPanel } from '../../../../components/Map/TripRouteOverview'
import { DawarichTrailPill } from '../../../../components/Map/DawarichTrailPill'
-import { MPlacesFilterPill } from './MPlacesFilterPill'
import PoiCategoryPill from '../../../../components/Map/PoiCategoryPill'
import { usePoiExplore } from '../../../../components/Map/usePoiExplore'
import { useMergedMapPois } from '../../../../components/Map/useMergedMapPois'
@@ -453,27 +452,38 @@ export default function MMapArea({ planner, shell }: MMapAreaProps) {
)}
- {/* Compass, GL maps only (Leaflet cannot rotate). Both engines draw the base-layer
- switcher in the bottom left corner, so the compass stands on top of it, on the
- same left edge: beside it the two read as one crowded row next to the dock.
- The offsets are inline because they are computed from the switcher's own
- numbers. */}
- {mapActive && glMap && (
-
-
+ {/* The left column, over the base-layer switcher both engines draw in the bottom
+ left corner: the recorded Dawarich route, and the compass, which only shows
+ while the map is turned off north. Two round controls a side at most, one
+ frosted style and one 8px gap, so neither corner crowds the dock. The offsets
+ are inline because they are computed from the switcher's own numbers. */}
+ {mapActive && (glMap || planner.dawarichEnabled) && (
+
+ {/* Kept in road-trip mode: the recorded route beside the planned one is
+ exactly the comparison a drive invites. */}
+ {!onStage && planner.dawarichEnabled && (
+
+ )}
+ {glMap && }
)}
- {/* Whole-trip overview (#1736): the stages stack above their toggle on the right,
- clear of the round-controls band below it and of the base-layer switcher and
- the compass, which both sit bottom left. The offset is Tailwind rather than
- inline because the compass band is identified by being the one element with
- an inline --bottom-nav-h, and a second would make that ambiguous. The places
- filter closes the stack, under the toggles, so the overview card stays
- right above its own toggle: it decides which pins the plan map shows, so it is
- there whatever else is; the stage draws its own pins and has no use for it. */}
+ {/* The right column: the whole-trip overview (#1736) over the locate button, its
+ stages stacking above their toggle. 20px off the edge and 8px over the locate
+ button, mirroring the left column. The places filter has no button here: it
+ is set in the places tab, whose filter the map's pins follow. The offset is
+ Tailwind rather than inline because the compass band is identified by being
+ the one element with an inline --bottom-nav-h, and a second would make that
+ ambiguous. */}
{mapActive && !onStage && (
-
+
{!planner.roadtripActive && planner.overviewActive && (
)}
- {/* Kept in road-trip mode: the recorded route beside the planned one is
- exactly the comparison a drive invites. */}
- {planner.dawarichEnabled && (
-
- )}
- shell.openSheet('placesFilter')} />
)}
diff --git a/client/src/mobile/screens/trip/map/MPlacesFilterPill.tsx b/client/src/mobile/screens/trip/map/MPlacesFilterPill.tsx
deleted file mode 100644
index 4a57109dd..000000000
--- a/client/src/mobile/screens/trip/map/MPlacesFilterPill.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import { SlidersHorizontal } from 'lucide-react'
-import { MapTogglePill } from '../../../../components/Map/MapTogglePill'
-import { useTripStore } from '../../../../store/tripStore'
-import { countActivePlacesFilters } from '../../../../utils/placesFilter'
-import { useTranslation } from '../../../../i18n'
-
-/**
- * The phone map's way into the places filter: a round control in the right-hand
- * stack, lit and badged with how many filters are narrowing the markers. The sheet
- * it opens is the shell's 'placesFilter' sheet, so the button announces a dialog
- * rather than a pressed state.
- */
-export function MPlacesFilterPill({ onOpen }: { onOpen: () => void }) {
- const { t } = useTranslation()
- const filter = useTripStore(s => s.placesFilter)
- const categoryFilters = useTripStore(s => s.placesCategoryFilter)
- const ratingFilter = useTripStore(s => s.placesRatingFilter)
- const count = countActivePlacesFilters({ filter, categoryFilters, ratingFilter })
- const label = count > 0 ? `${t('places.filters')} (${count})` : t('places.filters')
- return (
- 0}
- onToggle={onOpen}
- label={label}
- badge={count}
- testId="places-filter-pill"
- opensDialog
- icon={}
- />
- )
-}
diff --git a/client/src/mobile/screens/trip/places/MPlacesFilterSheet.tsx b/client/src/mobile/screens/trip/places/MPlacesFilterSheet.tsx
deleted file mode 100644
index c25998d23..000000000
--- a/client/src/mobile/screens/trip/places/MPlacesFilterSheet.tsx
+++ /dev/null
@@ -1,96 +0,0 @@
-import { RotateCcw, X } from 'lucide-react'
-import MSheet from '../../../components/MSheet'
-import MIconBtn from '../../../components/MIconBtn'
-import MChip from '../../../components/MChip'
-import { useTripStore } from '../../../../store/tripStore'
-import { countActivePlacesFilters } from '../../../../utils/placesFilter'
-import { useTranslation } from '../../../../i18n'
-import type { Category, Place } from '../../../../types'
-import { MCategoryFilterList, MRatingFloorChips } from './MPlacesFilterControls'
-import { placesFilterTabs, poolHasTracks } from '../../../../components/Planner/usePlacesPool'
-
-interface MPlacesFilterSheetProps {
- open: boolean
- onClose: () => void
- places: Place[]
- categories: Category[]
- toursEnabled: boolean
-}
-
-/** Uppercase eyebrow over each group of the sheet. */
-function SectionTitle({ children }: { children: string }) {
- return (
-
{children}
- )
-}
-
-/**
- * The places filter, opened from the phone map: which pool to show, a minimum
- * rating and the trip's categories, with one button that lifts them all. Every
- * choice lands in the trip store at once, so the markers behind the sheet and the
- * places list change with it (#1541). Routed as shell sheet 'placesFilter'.
- */
-export default function MPlacesFilterSheet({ open, onClose, places, categories, toursEnabled }: MPlacesFilterSheetProps) {
- const { t } = useTranslation()
- const filter = useTripStore(s => s.placesFilter)
- const categoryFilters = useTripStore(s => s.placesCategoryFilter)
- const ratingFilter = useTripStore(s => s.placesRatingFilter)
- const setFilter = useTripStore(s => s.setPlacesFilter)
- const resetPlacesFilters = useTripStore(s => s.resetPlacesFilters)
- const activeCount = countActivePlacesFilters({ filter, categoryFilters, ratingFilter })
-
- const pools = placesFilterTabs(t, poolHasTracks(places, toursEnabled))
- const hasCategoryChoice = categories.length > 0 || places.some(p => p.category_id == null)
-
- return (
- // Opaque: the sheet opens over the map, and the default bar glass let the map's
- // place names show through the chips and category rows (seen at 390px wide).
-
-