diff --git a/src/app/baseball/(dashboard)/dashboard/dev-plan/DevPlanClient.tsx b/src/app/baseball/(dashboard)/dashboard/dev-plan/DevPlanClient.tsx index eb1dc90b4..9930c9df0 100644 --- a/src/app/baseball/(dashboard)/dashboard/dev-plan/DevPlanClient.tsx +++ b/src/app/baseball/(dashboard)/dashboard/dev-plan/DevPlanClient.tsx @@ -559,9 +559,15 @@ export default function DevPlanClient() { ) : null} - {/* Goals with Tabs */} + {/* Goals with Tabs. The four icon+label+badge triggers are + whitespace-nowrap and sum past the ~338px content width at + 390px, and TabsList has no scroll handling of its own — so + below md the list rides a contained edge-bled scroller + (matching the page's px-4 shell) instead of overflowing the + page. md+ is untouched (overflow-visible, no bleed). */} - +
+ } badge={activeCount > 0 ? activeCount : undefined}> Active @@ -575,6 +581,7 @@ export default function DevPlanClient() { All +
- -
- {name} - {item.player?.high_school_name || 'No school'} + {/* ONE pre-composed flex child — Button wraps children in a bare + , so Avatar + div as siblings stack vertically (see + Button's CHILDREN CONTRACT doc). Same pattern as the card row. */} +
+ +
+ {name} + {item.player?.high_school_name || 'No school'} +
@@ -607,6 +612,147 @@ function PipelineListRow({ ); } +// Rule 8 (docs/MOBILE_DOCTRINE.md) — a `min-w` table wrapped only in +// `overflow-x-auto` is not the phone treatment on a reading surface. Below +// `lg` each row becomes a composed card (identity + position/grad-year + +// status + updated + tap-through/actions), mirroring the `hidden lg:block` / +// `lg:hidden` split already shipped in AcademicsClient.tsx:291/294 in this +// same app. The desktop `` above stays byte-identical; this card +// consumes the exact same row props/callbacks — no new read/write path. +function PipelineListCard({ + item, + focused, + selected, + editing, + noteValue, + onFocus, + onOpenPeek, + onToggleSelect, + onStatusChange, + onStartEditNote, + onNoteValueChange, + onSaveNote, + onCancelNote, + onViewProfile, + onRemove, +}: PipelineListRowProps) { + const name = getFullName(item.player?.first_name, item.player?.last_name); + const location = item.player?.city && item.player?.state ? `${item.player.city}, ${item.player.state}` : 'N/A'; + + return ( + +
+ {/* Long-press multi-select isn't available on a card row — a compact, + always-visible checkbox keeps single-tap selection reachable. */} + + +
+ +
+ {item.player?.primary_position || '—'} + · + {item.player?.grad_year ?? '—'} + · + {location} +
+ + + +
+
+