diff --git a/app/(dashboard)/e/[sector]/[slug]/loading.tsx b/app/(dashboard)/e/[sector]/[slug]/loading.tsx
index c4aaff45..60115268 100644
--- a/app/(dashboard)/e/[sector]/[slug]/loading.tsx
+++ b/app/(dashboard)/e/[sector]/[slug]/loading.tsx
@@ -114,8 +114,8 @@ function FullScreenWorkspaceSkeleton() {
-
-
-
-
)}
- {items.length === 0 ? (
+ {!hasAnyItem ? (
// On desktop the preview pane is always visible alongside this
// column, so showing the onboarding card here would duplicate it.
- // On mobile the layout is a master-detail toggle and the user is
- // stuck on the list view until they pick a row: without a card
- // here they'd have no way to reach the explainer at all. So:
- // compact card on mobile only, quiet empty state on desktop.
+ // Below xl the panes stack into one feed, so the sibling preview
+ // and fields panes are hidden when the inbox is empty (see their
+ // classNames): this list is the only onboarding surface there.
+ // So: compact card on mobile only, quiet empty state on desktop.
showOnboarding ? (
<>
@@ -965,9 +965,15 @@ export default function InvoiceInboxWorkspace(_props: WorkspaceComponentProps) {
)}
- {/* Document preview (hero) */}
+ {/* Document preview (hero). When the inbox is empty there is nothing
+ to preview and no row can be selected, so below xl (stacked feed)
+ this pane is hidden: the list's compact onboarding card is the
+ single onboarding surface, avoiding a duplicated card. */}
{selected ? (
@@ -999,9 +1005,14 @@ export default function InvoiceInboxWorkspace(_props: WorkspaceComponentProps) {
{/* Fields rail. Below xl it stacks below the preview as part of the
single vertical feed (top border for separation). At xl+ it's the
- third pane with a left border. */}
+ third pane with a left border. With an empty inbox no row can be
+ selected, so below xl it is hidden to keep the stacked empty state
+ to just the list column. */}