Display

Table.

A plain, responsive table with mono uppercase column heads, hover rows, a footer and a caption. Scrolls sideways on narrow screens.

Sites listed on the Lantern directory
SiteOwnerServerStatus
turtle.farmMikaHearth SMPOnline
guestbook.hubOrenHearth SMPOnline
mine.logsJunoDeepstoneBusy
rail.mapPipDeepstoneOffline

Installation#

With the CLI

$npx lanterncn add table

This also installs the Lantern theme and any Lantern UI components it depends on. The shadcn CLI works directly too: npx shadcn@latest add httptim/lantern-ui/table. See Installation if your project is not set up yet.

Manually

  1. Copy the source into your project

    components/ui/table.tsx
    import * as React from "react";
    
    import { cn } from "@/lib/utils";
    
    function Table({ className, ...props }: React.ComponentProps<"table">) {
      return (
        <div data-slot="table-container" className="relative w-full overflow-x-auto">
          <table data-slot="table" className={cn("w-full caption-bottom text-sm", className)} {...props} />
        </div>
      );
    }
    
    function TableHeader({ className, ...props }: React.ComponentProps<"thead">) {
      return <thead data-slot="table-header" className={cn("[&_tr]:border-b", className)} {...props} />;
    }
    
    function TableBody({ className, ...props }: React.ComponentProps<"tbody">) {
      return <tbody data-slot="table-body" className={cn("[&_tr:last-child]:border-0", className)} {...props} />;
    }
    
    function TableFooter({ className, ...props }: React.ComponentProps<"tfoot">) {
      return (
        <tfoot
          data-slot="table-footer"
          className={cn("border-t bg-secondary/60 font-medium [&>tr]:last:border-b-0", className)}
          {...props}
        />
      );
    }
    
    function TableRow({ className, ...props }: React.ComponentProps<"tr">) {
      return (
        <tr
          data-slot="table-row"
          className={cn("border-b transition-colors hover:bg-secondary/50 data-[state=selected]:bg-accent", className)}
          {...props}
        />
      );
    }
    
    function TableHead({ className, ...props }: React.ComponentProps<"th">) {
      return (
        <th
          data-slot="table-head"
          className={cn(
            "h-10 px-3 text-left align-middle font-mono text-[10px] font-semibold tracking-[0.2em] whitespace-nowrap text-muted-foreground uppercase [&:has([role=checkbox])]:pr-0",
            className,
          )}
          {...props}
        />
      );
    }
    
    function TableCell({ className, ...props }: React.ComponentProps<"td">) {
      return (
        <td
          data-slot="table-cell"
          className={cn("p-3 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0", className)}
          {...props}
        />
      );
    }
    
    function TableCaption({ className, ...props }: React.ComponentProps<"caption">) {
      return (
        <caption
          data-slot="table-caption"
          className={cn("mt-4 font-mono text-[10px] tracking-[0.2em] text-muted-foreground uppercase", className)}
          {...props}
        />
      );
    }
    
    export { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption };
  2. Update the import paths to match your project

    The source imports cn from @/lib/utils.

Usage#

import {
  Table,
  TableHeader,
  TableBody,
  TableFooter,
  TableHead,
  TableRow,
  TableCell,
  TableCaption,
} from "@/components/ui/table";
<Table>
  <TableHeader>
    <TableRow>
      <TableHead>Site</TableHead>
    </TableRow>
  </TableHeader>
  <TableBody>
    <TableRow>
      <TableCell>turtle.farm</TableCell>
    </TableRow>
  </TableBody>
</Table>

Examples#

TurtleJobBlocksFuel
T-01Strip mine4,120812
T-02Tree farm1,386240
T-03Wheat harvest96295
T-04Tunnel2,0481530
Total8,516