diff --git a/src/app/(app)/quotes/[id]/page.tsx b/src/app/(app)/quotes/[id]/page.tsx index 302c32e..cf3b462 100644 --- a/src/app/(app)/quotes/[id]/page.tsx +++ b/src/app/(app)/quotes/[id]/page.tsx @@ -2465,17 +2465,25 @@ export default function QuoteDetailPage({ params }: { params: Promise<{ id: stri )} - {/* ADMIN PANELS — reference / config, laid out 3-up BELOW the - items table rather than beside it, so the table gets the - page's full width. The eye still lands on the items first - because these now come after it in the flow. - `items-start` stops the three cards stretching to a shared - height when one has far more content than the others. - Three cards (down from six): - 1. Attachments — tabbed (Outbound / Internal) + {/* ADMIN PANELS — reference / config, laid out BELOW the items + table rather than beside it, so the table gets the page's + full width. The eye still lands on the items first because + these now come after it in the flow. + + Two columns, not three: each card owns a tab strip, and + thirds of this row (~186px of strip) are too narrow for + their labels — "Outbound"+count and "Email Status" both + overflowed and collided. Attachments spans both columns + (its own row); Linked Orders and Activity share the row + below at half width each, which clears both strips + comfortably. + + `items-start` stops the cards stretching to a shared height + when one has far more content than the others. + 1. Attachments — tabbed (Outbound / Internal / Inbound) 2. Linked Orders — its own card (specific, deserves focus) - 3. Activity — tabbed (History / Email Status) */} -
+ 3. Activity — tabbed (Email Status / History) */} +
{/* Attachments — single tabbed card with Outbound and Internal tabs. Both write to the same `quote_attachments` PB @@ -2488,7 +2496,14 @@ export default function QuoteDetailPage({ params }: { params: Promise<{ id: stri office uses to justify the prices (never sent to the buyer) */} - + {/* Attachments spans both columns, so it gets a full-width + row of its own with Linked Orders + Activity sharing the + row beneath. It carries the most content of the three — + three tabs, a dropzone and a file list — and its tab + labels ("Outbound" / "Internal" / "Inbound", each with a + count) need ~213px of strip. At a third of the row they + only got ~186px and collided into each other. */} + @@ -2497,22 +2512,29 @@ export default function QuoteDetailPage({ params }: { params: Promise<{ id: stri + {/* The count spans deliberately have no `ml-*`: + TabsTrigger already puts `gap-1.5` between its + children, so a margin on top of that double-spaced + them and helped push the labels into each other + back when this card was only a third of the row + wide. `tabular-nums` keeps the tab widths steady as + counts tick over 9. */} Outbound - + {outboundAttachments.length} Internal - + {internalAttachments.length} Inbound - + {attachments.filter((a) => a.direction === "inbound").length}