From 27c19b5ff5b317311d88ae44e2c7c6f6f882ff0a Mon Sep 17 00:00:00 2001 From: Maurice Date: Fri, 6 Nov 2026 16:45:09 +0100 Subject: [PATCH] feat(mobile): admin, settings picker and place sheets in the common style, all sheets on glass Admin sheets: their frame draws the icon tile header (an icon per sheet, the plugin sheets' icons moved out of the title into the tile), the soft scroll edge and 42 px footer buttons; admin fields use the sheets' eyebrow labels and round inputs. The settings picker, the bulk category sheet and the save to list sheet get the common header (TileHeader may now leave out the icon for a plain picker). Every phone sheet now uses the glass material, as the trip settings do; it stays 94 % opaque, so forms over the map remain legible. --- client/scripts/theme-baseline.json | 6 +-- .../screens/admin/MAdminPluginsPanel.tsx | 42 +++++++++---------- .../screens/admin/MAdminResetMfaSheet.tsx | 3 +- .../admin/MAdminSchoolHolidayCatalog.tsx | 10 +++-- .../src/mobile/screens/admin/MAdminSheets.tsx | 7 +++- client/src/mobile/screens/admin/MAdminUi.tsx | 24 +++++++---- .../screens/admin/MAdminUsersSection.tsx | 3 +- .../screens/collections/MCollPlaceSheet.tsx | 2 +- .../mobile/screens/journey/MJourneyDetail.tsx | 4 +- .../screens/settings/MSetPickerSheet.tsx | 12 ++++-- .../mobile/screens/settings/MSettingsMcp.tsx | 6 +-- .../trip/places/MPlacesBulkCategorySheet.tsx | 24 +++++------ .../places/MPlacesSaveToCollectionSheet.tsx | 20 ++++----- .../trip/roadtrip/MRtCorridorSheet.tsx | 2 +- .../screens/trip/roadtrip/MRtDraftSheet.tsx | 2 +- .../screens/trip/roadtrip/MRtInfoSheet.tsx | 2 +- .../screens/trip/roadtrip/MRtKindSheet.tsx | 2 +- .../screens/trip/roadtrip/MRtStaySheet.tsx | 2 +- .../screens/trip/roadtrip/MRtStopSheet.tsx | 2 +- .../mobile/screens/trip/sheets/MCostSheet.tsx | 2 +- .../screens/trip/sheets/MPlaceEditSheet.tsx | 2 +- .../screens/trip/sheets/MReservationSheet.tsx | 2 +- .../trip/sheets/MTransportFormSheet.tsx | 2 +- .../screens/trip/sheets/MTripSheetUi.tsx | 11 +++-- 24 files changed, 110 insertions(+), 84 deletions(-) diff --git a/client/scripts/theme-baseline.json b/client/scripts/theme-baseline.json index b8b4cb8fc..f0548f921 100644 --- a/client/scripts/theme-baseline.json +++ b/client/scripts/theme-baseline.json @@ -201,7 +201,7 @@ "mobile/screens/settings/MMobileNavCustomizer.tsx": 8, "mobile/screens/settings/MPhotoProvidersSection.tsx": 2, "mobile/screens/settings/MScopeGroupPicker.tsx": 5, - "mobile/screens/settings/MSetPickerSheet.tsx": 2, + "mobile/screens/settings/MSetPickerSheet.tsx": 1, "mobile/screens/settings/MSettings.tsx": 2, "mobile/screens/settings/MSettingsAbout.tsx": 5, "mobile/screens/settings/MSettingsAccount.tsx": 20, @@ -216,9 +216,9 @@ "mobile/screens/trip/MTripLoadingSplash.tsx": 2, "mobile/screens/trip/MTripShell.tsx": 9, "mobile/screens/trip/places/MPlacesBrowser.tsx": 10, - "mobile/screens/trip/places/MPlacesBulkCategorySheet.tsx": 4, + "mobile/screens/trip/places/MPlacesBulkCategorySheet.tsx": 2, "mobile/screens/trip/places/MPlacesFilterControls.tsx": 1, - "mobile/screens/trip/places/MPlacesSaveToCollectionSheet.tsx": 7, + "mobile/screens/trip/places/MPlacesSaveToCollectionSheet.tsx": 6, "mobile/screens/trip/places/MPlacesToursModeSwitch.tsx": 1, "mobile/screens/trip/plan/MPlanTimeline.tsx": 12, "mobile/screens/trip/plan/MPlanTimelineRows.tsx": 24, diff --git a/client/src/mobile/screens/admin/MAdminPluginsPanel.tsx b/client/src/mobile/screens/admin/MAdminPluginsPanel.tsx index 2526e55f2..991be710a 100644 --- a/client/src/mobile/screens/admin/MAdminPluginsPanel.tsx +++ b/client/src/mobile/screens/admin/MAdminPluginsPanel.tsx @@ -1,12 +1,7 @@ import { useState } from 'react' import { useFormatDate } from '../../../hooks/useDateFormat' import MPluginVersionDate from './MPluginVersionDate' -import { - Blocks, AlertTriangle, PackageOpen, RefreshCw, Trash2, Download, Bug, X, ShieldCheck, UploadCloud, - ArrowUpCircle, Github, ExternalLink, ChevronDown, Check, Lock, Search, Link2, KeyRound, ShieldAlert, - SlidersHorizontal, ArrowUpDown, CircleDot, MoreHorizontal, RotateCw, Database, - Globe, Info, History, PauseCircle, Puzzle, Bot, -} from 'lucide-react' +import { Blocks, AlertTriangle, PackageOpen, RefreshCw, Trash2, Download, Bug, X, ShieldCheck, UploadCloud, ArrowUpCircle, Github, ExternalLink, ChevronDown, Check, Lock, Search, Link2, KeyRound, ShieldAlert, SlidersHorizontal, ArrowUpDown, CircleDot, MoreHorizontal, RotateCw, Database, Globe, Info, History, PauseCircle, Puzzle, Bot, ListChecks } from 'lucide-react' import PluginIcon from '../../../components/shared/PluginIcon' import { type RangeWarning } from '../../../components/Admin/useRangeBypass' import { deriveCaps } from '../../../components/Admin/pluginCaps' @@ -353,9 +348,10 @@ export default function MAdminPluginsPanel() { {/* Error-log sheet */} {errorsFor && ( - setErrorsFor(null)} variant="bottom" material="opaque" ariaLabel={t('admin.plugins.errorLog')}> + setErrorsFor(null)} variant="bottom" material="glass" ariaLabel={t('admin.plugins.errorLog')}> {errorsFor.id} — {t('admin.plugins.errorLog')}} + icon={} + title={<>{errorsFor.id} — {t('admin.plugins.errorLog')}} onClose={() => setErrorsFor(null)} >
@@ -374,9 +370,10 @@ export default function MAdminPluginsPanel() { {/* Operator-supplied egress hosts */} {egressFor && ( - setEgressFor(null)} variant="bottom" material="opaque" ariaLabel={t('admin.plugins.allowedHosts')}> + setEgressFor(null)} variant="bottom" material="glass" ariaLabel={t('admin.plugins.allowedHosts')}> {egressFor.id} — {t('admin.plugins.allowedHosts')}} + icon={} + title={<>{egressFor.id} — {t('admin.plugins.allowedHosts')}} onClose={() => setEgressFor(null)} > {!egressFor.supported ? ( @@ -421,9 +418,10 @@ export default function MAdminPluginsPanel() { {/* Instance-wide settings (the admin-owned scope:'instance' fields) */} {settings.form && ( - + {settings.form.id} — {t('admin.plugins.instanceSettings')}} + icon={} + title={<>{settings.form.id} — {t('admin.plugins.instanceSettings')}} onClose={settings.close} >
@@ -602,8 +600,8 @@ function PickerSheet({ open, onClose, title, options, value, onPick }: { options: Array<[string, string]>; value: string; onPick: (v: string) => void }) { return ( - - + + } title={title} onClose={onClose}>
{options.map(([v, lbl]) => ( @@ -813,8 +811,8 @@ function VersionPickerSheet({ plugin, versions, failed, busy, t, onPick, onClose t: T; onPick: (version: string) => void; onClose: () => void }) { return ( - - + + } title={t('admin.plugins.versionPickerTitle', { name: plugin.name })} onClose={onClose}>
{failed &&

{t('admin.plugins.detailError')}

} {!failed && !versions &&

{t('common.loading')}

} @@ -973,7 +971,7 @@ function PluginDetailSheet({ item, installed, busy, onInstall, onClose, t, local const sectionH = 'text-[11px] font-semibold uppercase tracking-wider text-m-muted' return ( - +
@@ -1195,7 +1193,7 @@ function SignatureBlockSheet({ data, entry, busy, t, onRetrust, onClose }: { const offerRetrust = retrust !== null return ( - +
@@ -1248,7 +1246,7 @@ function UpdateConsentSheet({ data, unsigned, t, onApprove, onLater }: { t: T; onApprove: () => void; onLater: () => void }) { return ( - +
@@ -1305,7 +1303,7 @@ function DependencyResolveSheet({ data, t, busy, installedIds, onDownload, onClo }) { const rows = dependencyRows(data) return ( - +
diff --git a/client/src/mobile/screens/admin/MAdminResetMfaSheet.tsx b/client/src/mobile/screens/admin/MAdminResetMfaSheet.tsx index 66bd302be..18d72d391 100644 --- a/client/src/mobile/screens/admin/MAdminResetMfaSheet.tsx +++ b/client/src/mobile/screens/admin/MAdminResetMfaSheet.tsx @@ -32,7 +32,8 @@ export default function MAdminResetMfaSheet({ open, onClose, user, onReset, t }: return ( } + title={t('admin.mfa.reset')} onClose={onClose} footer={ <> diff --git a/client/src/mobile/screens/admin/MAdminSchoolHolidayCatalog.tsx b/client/src/mobile/screens/admin/MAdminSchoolHolidayCatalog.tsx index 997b8b28b..1005de086 100644 --- a/client/src/mobile/screens/admin/MAdminSchoolHolidayCatalog.tsx +++ b/client/src/mobile/screens/admin/MAdminSchoolHolidayCatalog.tsx @@ -41,9 +41,10 @@ function AddCountrySheet({ onClose(); }; return ( - + } + title={t('schoolCatalog.addCountry')} onClose={close} footer={ <> @@ -113,12 +114,13 @@ function RegionSheet({ region, busy, offline, error, onClose, onSave }: EditorPr if (!busy) onClose(); }} variant="card" - material="opaque" + material="glass" ariaLabel={name.trim() || t('schoolCatalog.region')} discardGuard={body} > } + title={name.trim() || t('schoolCatalog.region')} onClose={() => { if (!busy) onClose(); }} diff --git a/client/src/mobile/screens/admin/MAdminSheets.tsx b/client/src/mobile/screens/admin/MAdminSheets.tsx index 047a875f1..4d4f1ca13 100644 --- a/client/src/mobile/screens/admin/MAdminSheets.tsx +++ b/client/src/mobile/screens/admin/MAdminSheets.tsx @@ -1,5 +1,5 @@ import { useState } from 'react' -import { AlertTriangle, CheckCircle, ExternalLink, Fingerprint, ShieldOff, Trash2 } from 'lucide-react' +import { AlertTriangle, CheckCircle, ExternalLink, Fingerprint, ShieldOff, Trash2, UserPlus, UserCog, Download, KeyRound, RotateCcw } from 'lucide-react' import { useAdminUserActions } from '../../../components/Admin/useAdminUserActions' import type { TranslationFn } from '../../../types' import type { useAdmin } from '../../../pages/admin/useAdmin' @@ -63,6 +63,7 @@ export default function MAdminSheets({ admin, t }: MAdminSheetsProps) { {/* Create user */} setShowCreateUser(false)} ariaLabel={t('admin.createUser')}> } title={t('admin.createUser')} onClose={() => setShowCreateUser(false)} footer={ @@ -115,6 +116,7 @@ export default function MAdminSheets({ admin, t }: MAdminSheetsProps) { {/* Edit user */} setEditingUser(null)} ariaLabel={t('admin.editUser')}> } title={t('admin.editUser')} onClose={() => setEditingUser(null)} footer={ @@ -205,6 +207,7 @@ export default function MAdminSheets({ admin, t }: MAdminSheetsProps) { {/* How to update */} setShowUpdateModal(false)} ariaLabel={t('admin.update.howTo')}> } title={t('admin.update.howTo')} onClose={() => setShowUpdateModal(false)} footer={ setShowUpdateModal(false)}>{t('common.close')}} @@ -256,6 +259,7 @@ export default function MAdminSheets({ admin, t }: MAdminSheetsProps) { {/* Reset passkeys confirm */} setShowResetPasskeys(false)} ariaLabel={t('admin.passkey.reset')}> } title={t('admin.passkey.reset')} onClose={() => setShowResetPasskeys(false)} footer={ @@ -288,6 +292,7 @@ export default function MAdminSheets({ admin, t }: MAdminSheetsProps) { {/* Rotate JWT confirm */} setShowRotateJwtModal(false)} ariaLabel={t('admin.rotateJwt.title')}> } title={t('admin.rotateJwt.title')} onClose={() => setShowRotateJwtModal(false)} footer={ diff --git a/client/src/mobile/screens/admin/MAdminUi.tsx b/client/src/mobile/screens/admin/MAdminUi.tsx index 774e0ee0a..5fb682032 100644 --- a/client/src/mobile/screens/admin/MAdminUi.tsx +++ b/client/src/mobile/screens/admin/MAdminUi.tsx @@ -83,7 +83,7 @@ export function MAdminClampedText({ children, className = '' }: { children: stri export function MAdminField({ label, hint, children }: { label: ReactNode; hint?: ReactNode; children: ReactNode }) { return (
-
{label}
+
{label}
{children} {hint &&
{hint}
}
@@ -94,7 +94,7 @@ export function MAdminInput({ className = '', ...props }: InputHTMLAttributes ) } @@ -161,11 +161,14 @@ export function MAdminButton({ /** Sheet body frame: title row + close, scrollable content, optional footer. */ export function MAdminSheetFrame({ title, + icon, onClose, footer, children, }: { title: ReactNode + /** The icon tile in front of the title, as every phone sheet has. */ + icon?: ReactNode onClose: () => void footer?: ReactNode children: ReactNode @@ -173,15 +176,22 @@ export function MAdminSheetFrame({ const { t } = useTranslation() return ( <> -
-
{title}
+ {/* TileHeader's shape: the icon tile, the title and the round close. */} +
+ {icon && ( + + {icon} + + )} +
{title}
- +
-
{children}
+
{children}
{footer && ( -
+ // The footer's buttons take the sheets' 42 px size; elsewhere MAdminButton stays a small pill. +
{footer}
)} diff --git a/client/src/mobile/screens/admin/MAdminUsersSection.tsx b/client/src/mobile/screens/admin/MAdminUsersSection.tsx index 5c1ed3d7d..a2abb4363 100644 --- a/client/src/mobile/screens/admin/MAdminUsersSection.tsx +++ b/client/src/mobile/screens/admin/MAdminUsersSection.tsx @@ -1,4 +1,4 @@ -import { Copy, Link2, Trash2, UserPlus } from 'lucide-react' +import { Copy, Link2, Trash2, UserPlus, Ticket } from 'lucide-react' import type { TranslationFn } from '../../../types' import type { useAdmin } from '../../../pages/admin/useAdmin' import { inviteMeta, inviteStatus } from '../../../pages/admin/adminModel' @@ -167,6 +167,7 @@ export default function MAdminUsersSection({ admin, t, locale }: MAdminUsersSect {/* Create invite sheet */} setShowCreateInvite(false)} ariaLabel={t('admin.invite.create')}> } title={t('admin.invite.create')} onClose={() => setShowCreateInvite(false)} footer={ diff --git a/client/src/mobile/screens/collections/MCollPlaceSheet.tsx b/client/src/mobile/screens/collections/MCollPlaceSheet.tsx index 87eb585f3..b71bbf063 100644 --- a/client/src/mobile/screens/collections/MCollPlaceSheet.tsx +++ b/client/src/mobile/screens/collections/MCollPlaceSheet.tsx @@ -68,7 +68,7 @@ export default function MCollPlaceSheet({ 'flex flex-1 items-center justify-center gap-[6px] rounded-[13px] border border-[color:var(--m-rowbr)] bg-[color:var(--m-sheet)] px-2 py-[11px] text-[0.78125rem] font-semibold text-m-ink' return ( - + {held && ( <> {/* Hero: auto cover (photo when available, the design gradient otherwise) */} diff --git a/client/src/mobile/screens/journey/MJourneyDetail.tsx b/client/src/mobile/screens/journey/MJourneyDetail.tsx index ed35af64f..28d9a4963 100644 --- a/client/src/mobile/screens/journey/MJourneyDetail.tsx +++ b/client/src/mobile/screens/journey/MJourneyDetail.tsx @@ -528,7 +528,7 @@ export default function MJourneyDetail({ journeyId, embedded = false }: JourneyD {/* Opaque, not the glass default: these two sit over a full-screen map whose card carousel is bright and busy, and the frosted material let the titles behind read straight through the menu. */} - setShowUploadMenu(false)} variant="bottom" material="opaque" ariaLabel={t('common.upload')}> + setShowUploadMenu(false)} variant="bottom" material="glass" ariaLabel={t('common.upload')}>
{/* Journey actions: book export, suggestions switch, settings */} - setShowActionMenu(false)} variant="bottom" material="opaque" ariaLabel={t('files.menu')}> + setShowActionMenu(false)} variant="bottom" material="glass" ariaLabel={t('files.menu')}>
diff --git a/client/src/mobile/screens/settings/MSetPickerSheet.tsx b/client/src/mobile/screens/settings/MSetPickerSheet.tsx index b3d2ed3cf..a4ba8ed65 100644 --- a/client/src/mobile/screens/settings/MSetPickerSheet.tsx +++ b/client/src/mobile/screens/settings/MSetPickerSheet.tsx @@ -1,6 +1,8 @@ import { ReactNode } from 'react' import { Check } from 'lucide-react' import MSheet from '../../components/MSheet' +import { TileHeader } from '../trip/sheets/MTripSheetUi' +import { useTranslation } from '../../../i18n' export interface MSetPickerOption { value: string @@ -21,10 +23,14 @@ interface MSetPickerSheetProps { * presets). Selecting closes the sheet. */ export default function MSetPickerSheet({ open, onClose, title, options, value, onSelect }: MSetPickerSheetProps) { + const { t } = useTranslation() + const closeLabel = t('common.close') return ( - -
{title}
-
+ +
+ +
+
{options.map((opt) => { const active = opt.value === value return ( diff --git a/client/src/mobile/screens/settings/MSettingsMcp.tsx b/client/src/mobile/screens/settings/MSettingsMcp.tsx index 5000051a3..f3ee84078 100644 --- a/client/src/mobile/screens/settings/MSettingsMcp.tsx +++ b/client/src/mobile/screens/settings/MSettingsMcp.tsx @@ -300,7 +300,7 @@ export default function MSettingsMcp() { if (!createdClient) setCreateOpen(false) }} variant="card" - material="opaque" + material="glass" ariaLabel={t('settings.oauth.modal.createTitle')} >
@@ -409,7 +409,7 @@ export default function MSettingsMcp() { if (!createdToken) setTokenModalOpen(false) }} variant="card" - material="opaque" + material="glass" ariaLabel={t('settings.mcp.modal.createTitle')} >
@@ -461,7 +461,7 @@ export default function MSettingsMcp() { {/* Rotated secret display */} - setRotatedSecret(null)} variant="card" material="opaque" ariaLabel={t('settings.oauth.rotateSecretDoneTitle')}> + setRotatedSecret(null)} variant="card" material="glass" ariaLabel={t('settings.oauth.rotateSecretDoneTitle')}>
{t('settings.oauth.rotateSecretDoneTitle')}

diff --git a/client/src/mobile/screens/trip/places/MPlacesBulkCategorySheet.tsx b/client/src/mobile/screens/trip/places/MPlacesBulkCategorySheet.tsx index c039af7e9..795a5d66e 100644 --- a/client/src/mobile/screens/trip/places/MPlacesBulkCategorySheet.tsx +++ b/client/src/mobile/screens/trip/places/MPlacesBulkCategorySheet.tsx @@ -1,6 +1,6 @@ -import { MapPin, X } from 'lucide-react' +import { MapPin, Tag } from 'lucide-react' import MSheet from '../../../components/MSheet' -import MIconBtn from '../../../components/MIconBtn' +import { TileHeader } from '../sheets/MTripSheetUi' import { getCategoryIcon } from '../../../../components/shared/categoryIcons' import { useTranslation } from '../../../../i18n' import type { Category } from '../../../../types' @@ -21,17 +21,17 @@ interface MPlacesBulkCategorySheetProps { export default function MPlacesBulkCategorySheet({ open, count, categories, onPick, onClose }: MPlacesBulkCategorySheetProps) { const { t } = useTranslation() return ( - -

-
-
{t('places.changeCategory')}
-
{t('places.selectionCount', { count })}
-
- - - + +
+ } + title={t('places.changeCategory')} + sub={t('places.selectionCount', { count })} + onClose={onClose} + closeLabel={t('common.close')} + />
-
+
{categories.map(c => { const CatIcon = getCategoryIcon(c.icon) return ( diff --git a/client/src/mobile/screens/trip/places/MPlacesSaveToCollectionSheet.tsx b/client/src/mobile/screens/trip/places/MPlacesSaveToCollectionSheet.tsx index 69d4451a1..ef12a9615 100644 --- a/client/src/mobile/screens/trip/places/MPlacesSaveToCollectionSheet.tsx +++ b/client/src/mobile/screens/trip/places/MPlacesSaveToCollectionSheet.tsx @@ -1,6 +1,6 @@ -import { ArrowRight, Bookmark, Loader2, Plus, X } from 'lucide-react' +import { ArrowRight, Bookmark, Loader2, Plus } from 'lucide-react' import MSheet from '../../../components/MSheet' -import MIconBtn from '../../../components/MIconBtn' +import { TileHeader } from '../sheets/MTripSheetUi' import { useTranslation } from '../../../../i18n' import { useSaveTripPlacesToList } from '../../../../components/Collections/useSaveTripPlacesToList' @@ -25,14 +25,14 @@ export default function MPlacesSaveToCollectionSheet({ open, tripId, placeIds, o }) return ( - -
-
- {t('collections.saveNToList', { count: placeIds.length })} -
- - - + +
+ } + title={t('collections.saveNToList', { count: placeIds.length })} + onClose={onClose} + closeLabel={t('common.close')} + />
{lists.length > 5 && ( diff --git a/client/src/mobile/screens/trip/roadtrip/MRtCorridorSheet.tsx b/client/src/mobile/screens/trip/roadtrip/MRtCorridorSheet.tsx index cfd0de63f..e9ab5f613 100644 --- a/client/src/mobile/screens/trip/roadtrip/MRtCorridorSheet.tsx +++ b/client/src/mobile/screens/trip/roadtrip/MRtCorridorSheet.tsx @@ -74,7 +74,7 @@ export default function MRtCorridorSheet({ planner, shell }: MTripSheetsProps) { open={open} onClose={shell.closeSheet} variant="bottom" - material="opaque" + material="glass" ariaLabel={t('roadtrip.poi.title')} >
diff --git a/client/src/mobile/screens/trip/roadtrip/MRtDraftSheet.tsx b/client/src/mobile/screens/trip/roadtrip/MRtDraftSheet.tsx index 70e1b0b72..8a6b96a44 100644 --- a/client/src/mobile/screens/trip/roadtrip/MRtDraftSheet.tsx +++ b/client/src/mobile/screens/trip/roadtrip/MRtDraftSheet.tsx @@ -75,7 +75,7 @@ export default function MRtDraftSheet({ planner }: MRtDraftSheetProps) { } return ( - + +
} diff --git a/client/src/mobile/screens/trip/roadtrip/MRtKindSheet.tsx b/client/src/mobile/screens/trip/roadtrip/MRtKindSheet.tsx index 44b0d389f..0858a283d 100644 --- a/client/src/mobile/screens/trip/roadtrip/MRtKindSheet.tsx +++ b/client/src/mobile/screens/trip/roadtrip/MRtKindSheet.tsx @@ -81,7 +81,7 @@ export default function MRtKindSheet({ planner, shell }: MTripSheetsProps) { open={open && !!stop} onClose={shell.closeSheet} variant="bottom" - material="opaque" + material="glass" ariaLabel={t('roadtrip.stop.kind')} > {stop && ( diff --git a/client/src/mobile/screens/trip/roadtrip/MRtStaySheet.tsx b/client/src/mobile/screens/trip/roadtrip/MRtStaySheet.tsx index 09edc3024..eeb1e2d20 100644 --- a/client/src/mobile/screens/trip/roadtrip/MRtStaySheet.tsx +++ b/client/src/mobile/screens/trip/roadtrip/MRtStaySheet.tsx @@ -150,7 +150,7 @@ export default function MRtStaySheet({ planner, shell }: MTripSheetsProps) { open={open && !!stop} onClose={shell.closeSheet} variant="bottom" - material="opaque" + material="glass" // Named for what it holds: a stop left at a set time has no stay to add. ariaLabel={leave.until ? t('roadtrip.stop.stay') : t('roadtrip.stay.add')} > diff --git a/client/src/mobile/screens/trip/roadtrip/MRtStopSheet.tsx b/client/src/mobile/screens/trip/roadtrip/MRtStopSheet.tsx index 5a6c02063..97fcba646 100644 --- a/client/src/mobile/screens/trip/roadtrip/MRtStopSheet.tsx +++ b/client/src/mobile/screens/trip/roadtrip/MRtStopSheet.tsx @@ -290,7 +290,7 @@ export default function MRtStopSheet({ planner, shell }: MTripSheetsProps) { const tiles = (navTargets.length > 0 ? 1 : 0) + 1 return ( - + {/* ── Header: the disc the chain draws, the name, the way to the editor and the way out ── */}
{/* Centred, not top-aligned: one line of the name is shorter than the 34px disc, so diff --git a/client/src/mobile/screens/trip/sheets/MCostSheet.tsx b/client/src/mobile/screens/trip/sheets/MCostSheet.tsx index 4d79772de..74e35b6bd 100644 --- a/client/src/mobile/screens/trip/sheets/MCostSheet.tsx +++ b/client/src/mobile/screens/trip/sheets/MCostSheet.tsx @@ -122,7 +122,7 @@ export default function MCostSheet({ tripId, base, people, me, editing, prefill, diff --git a/client/src/mobile/screens/trip/sheets/MReservationSheet.tsx b/client/src/mobile/screens/trip/sheets/MReservationSheet.tsx index 0afab9d5c..782677f96 100644 --- a/client/src/mobile/screens/trip/sheets/MReservationSheet.tsx +++ b/client/src/mobile/screens/trip/sheets/MReservationSheet.tsx @@ -175,7 +175,7 @@ export default function MReservationSheet({ planner, onOpenExpense }: MReservati diff --git a/client/src/mobile/screens/trip/sheets/MTransportFormSheet.tsx b/client/src/mobile/screens/trip/sheets/MTransportFormSheet.tsx index 71c79bbdf..2d893a9cc 100644 --- a/client/src/mobile/screens/trip/sheets/MTransportFormSheet.tsx +++ b/client/src/mobile/screens/trip/sheets/MTransportFormSheet.tsx @@ -163,7 +163,7 @@ export default function MTransportFormSheet({ planner, onOpenExpense }: MTranspo diff --git a/client/src/mobile/screens/trip/sheets/MTripSheetUi.tsx b/client/src/mobile/screens/trip/sheets/MTripSheetUi.tsx index 06851860a..1fe212153 100644 --- a/client/src/mobile/screens/trip/sheets/MTripSheetUi.tsx +++ b/client/src/mobile/screens/trip/sheets/MTripSheetUi.tsx @@ -76,7 +76,8 @@ export function SheetSection({ } interface TileHeaderProps { - icon: ReactNode + /** Left out for a plain picker; every other sheet shows its icon tile. */ + icon?: ReactNode title: ReactNode sub?: ReactNode /** Let a sentence-length subtitle wrap instead of truncating it to one line. */ @@ -97,9 +98,11 @@ interface TileHeaderProps { export function TileHeader({ icon, title, sub, subWrap = false, onClose, closeLabel }: TileHeaderProps) { return (
-
- {icon} -
+ {icon && ( +
+ {icon} +
+ )}
{title}
{sub && (