diff --git a/components/email/email-list-item.tsx b/components/email/email-list-item.tsx index 2fdd4172..84813009 100644 --- a/components/email/email-list-item.tsx +++ b/components/email/email-list-item.tsx @@ -50,7 +50,9 @@ export function EmailListItem({ email, selected, onClick, onDoubleClick, onConte const currentMailboxRole = mailboxes.find(mb => mb.id === selectedMailbox)?.role; const showRecipient = currentMailboxRole === 'sent' || currentMailboxRole === 'drafts'; const sender = showRecipient ? (email.to?.[0] ?? email.from?.[0]) : email.from?.[0]; - const isFocusedMailLayout = mailLayout === 'focus'; + const isMobile = useUIStore((state) => state.isMobile); + // The horizontal one-line "focus" layout doesn't fit on narrow screens; fall back to multi-line on mobile. + const isFocusedMailLayout = mailLayout === 'focus' && !isMobile; const hideJunkAvatarImages = currentMailboxRole === 'junk' && !showAvatarsInJunk; const trimmedPreview = stripInvisibleLeading(email.preview ?? ''); const inlinePreview = showPreview && trimmedPreview ? ` ${trimmedPreview}` : ''; @@ -68,8 +70,6 @@ export function EmailListItem({ email, selected, onClick, onDoubleClick, onConte sourceMailboxId: selectedMailbox, }); - const isMobile = useUIStore((state) => state.isMobile); - const { onTouchStart, onTouchEnd, onTouchMove, onTouchCancel, isPressed } = useLongPress( useCallback((pos) => { onContextMenu?.( diff --git a/components/email/email-list.tsx b/components/email/email-list.tsx index 17f11b3d..70245be7 100644 --- a/components/email/email-list.tsx +++ b/components/email/email-list.tsx @@ -11,6 +11,7 @@ import { ConfirmDialog } from "@/components/ui/confirm-dialog"; import { useEmailStore } from "@/stores/email-store"; import { useAuthStore } from "@/stores/auth-store"; import { useSettingsStore } from "@/stores/settings-store"; +import { useUIStore } from "@/stores/ui-store"; import { groupEmailsByThread, sortThreadGroups } from "@/lib/thread-utils"; import { useContextMenu } from "@/hooks/use-context-menu"; import { useConfirmDialog } from "@/hooks/use-confirm-dialog"; @@ -107,7 +108,9 @@ export function EmailList({ const density = useSettingsStore((state) => state.density); const showPreview = useSettingsStore((state) => state.showPreview); const mailLayout = useSettingsStore((state) => state.mailLayout); - const isFocusedMailLayout = mailLayout === 'focus'; + const isMobile = useUIStore((state) => state.isMobile); + // Match the list items: focus layout collapses to multi-line on mobile, so virtualizer estimates must match. + const isFocusedMailLayout = mailLayout === 'focus' && !isMobile; const estimateSize = useCallback(() => { if (isFocusedMailLayout) { diff --git a/components/email/thread-list-item.tsx b/components/email/thread-list-item.tsx index ca940644..d0e845c0 100644 --- a/components/email/thread-list-item.tsx +++ b/components/email/thread-list-item.tsx @@ -73,7 +73,9 @@ const SingleEmailItem = React.forwardRef( const getAccountById = useAccountStore((state) => state.getAccountById); const accountColor = email.accountId ? getAccountById(email.accountId)?.avatarColor : undefined; const isChecked = selectedEmailIds.has(email.id); - const isFocusedMailLayout = mailLayout === 'focus'; + const isMobile = useUIStore((state) => state.isMobile); + // The horizontal one-line "focus" layout doesn't fit on narrow screens; fall back to multi-line on mobile. + const isFocusedMailLayout = mailLayout === 'focus' && !isMobile; const trimmedPreview = stripInvisibleLeading(email.preview ?? ''); const inlinePreview = showPreview && trimmedPreview ? ` ${trimmedPreview}` : ''; @@ -91,8 +93,6 @@ const SingleEmailItem = React.forwardRef( sourceMailboxId: selectedMailbox, }); - const isMobile = useUIStore((state) => state.isMobile); - const { onTouchStart, onTouchEnd, onTouchMove, onTouchCancel, isPressed } = useLongPress( useCallback((pos) => { onContextMenu?.( @@ -377,7 +377,8 @@ export const ThreadListItem = React.forwardRef state.showAvatarsInJunk); const isMobile = useUIStore((state) => state.isMobile); const { latestEmail, participantNames, hasUnread, hasStarred, hasAttachment, hasAnswered, hasForwarded, emailCount } = thread; - const isFocusedMailLayout = mailLayout === 'focus'; + // The horizontal one-line "focus" layout doesn't fit on narrow screens; fall back to multi-line on mobile. + const isFocusedMailLayout = mailLayout === 'focus' && !isMobile; const trimmedPreview = stripInvisibleLeading(latestEmail.preview ?? ''); const inlinePreview = showPreview && trimmedPreview ? ` ${trimmedPreview}` : '';