Follow-up from #77, which moved the four goods sections onto TanStack Table (shared `components/goods-table.tsx`) with click-to-sort headers, persisted per-section sorting, %-met severity, collapse, and a 60vh height cap.
The Machines card (required-vs-built per machine/recipe) kept its fixed layout. Give it the same treatment: sortable columns (machine, built, required, short), a sensible default (worst shortfall first — its current fixed order), collapse, and the height cap. It has its own column set and nested per-recipe rows, so it was parked rather than shoehorned into the goods columns.
Also deliberately deferred from #77 and recorded there: kind/category filter chips for the goods sections, and `@tanstack/react-virtual` if row counts ever measurably hurt rendering.
Follow-up from #77, which moved the four goods sections onto TanStack Table (shared `components/goods-table.tsx`) with click-to-sort headers, persisted per-section sorting, %-met severity, collapse, and a 60vh height cap.
The Machines card (required-vs-built per machine/recipe) kept its fixed layout. Give it the same treatment: sortable columns (machine, built, required, short), a sensible default (worst shortfall first — its current fixed order), collapse, and the height cap. It has its own column set and nested per-recipe rows, so it was parked rather than shoehorned into the goods columns.
Also deliberately deferred from #77 and recorded there: kind/category filter chips for the goods sections, and `@tanstack/react-virtual` if row counts ever measurably hurt rendering.