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 && (