Capítulo 65 de 108
Componente de tabela responsiva e não opinativo sobre dados: fornece só a marcação/estilo (Table, TableRow, TableCell...); lógica de sorting/filtering/paginação fica a cargo de TanStack Table (ver Data Table).
Table > TableCaption, TableHeader > TableRow > TableHead, TableBody > TableRow > TableCell, TableFooter.TableFooter: linha de resumo (ex. total) fixada visualmente ao final da tabela.DropdownMenu dentro de TableCell para menu de ações por linha (padrão comum, não uma prop dedicada).<Table>
<TableCaption>A list of your recent invoices.</TableCaption>
<TableHeader>
<TableRow>
<TableHead className="w-[100px]">Invoice</TableHead>
<TableHead>Status</TableHead>
<TableHead>Method</TableHead>
<TableHead className="text-right">Amount</TableHead>
</TableRow>
</TableHeader>
<TableBody>
<TableRow>
<TableCell className="font-medium">INV001</TableCell>
<TableCell>Paid</TableCell>
<TableCell>Credit Card</TableCell>
<TableCell className="text-right">$250.00</TableCell>
</TableRow>
</TableBody>
</Table>
<TableFooter>
<TableRow>
<TableCell colSpan={3}>Total</TableCell>
<TableCell className="text-right">$2,500.00</TableCell>
</TableRow>
</TableFooter>
colSpan para mesclar células.<TableCell className="text-right">
<DropdownMenu>
<DropdownMenuTrigger render={<Button variant="ghost" size="icon" className="size-8" />}>
<MoreHorizontalIcon />
<span className="sr-only">Open menu</span>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
<DropdownMenuItem>Edit</DropdownMenuItem>
<DropdownMenuItem>Duplicate</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem variant="destructive">Delete</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
</TableCell>
Table
├── TableCaption
├── TableHeader
│ └── TableRow > TableHead (×N)
├── TableBody
│ └── TableRow > TableCell (×N)
└── TableFooter
Table: este componente é puramente de marcação; qualquer comportamento de dados precisa de TanStack Table (ver Data Table).<table> HTML puro ao lado de Table: perde consistência de estilo/dark mode do design system.Table é a camada de apresentação; para qualquer interatividade (sort, filter, paginação, seleção), acople TanStack Table por cima (ch066).TableFooter é o slot correto para totais/resumos, não uma TableRow extra dentro de TableBody.DropdownMenu dentro de TableCell com align="end".Table para sort/filter/paginação/seleção.