Financial Table

Data Display
Tables

Data table optimized for financial data with currency formatting, sorting, negative highlighting, and totals.

Preview

Click column headers to sort

Region
Q1(USD)
Q2(USD)
Q3(USD)
Q4(USD)
North America125,000.00142,000.00138,000.00165,000.00
Europe98,000.00105,000.00112,000.00128,000.00
Asia Pacific87,000.0092,000.0099,000.00115,000.00
Latin America45,000.0048,000.0052,000.0058,000.00

With Totals Row

Automatic sum calculation for numeric columns

Region
Q1(USD)
Q2(USD)
Q3(USD)
Q4(USD)
North America125,000.00142,000.00138,000.00165,000.00
Europe98,000.00105,000.00112,000.00128,000.00
Asia Pacific87,000.0092,000.0099,000.00115,000.00
Latin America45,000.0048,000.0052,000.0058,000.00
Grand Total355,000.00387,000.00401,000.00466,000.00

Negative Value Highlighting

Negative numbers are automatically highlighted in red

Category
Revenue(USD)
Expenses(USD)
Net Profit(USD)
Product Sales520,000.00312,000.00208,000.00
Services180,000.00125,000.0055,000.00
Licensing95,000.0012,000.0083,000.00
Subscriptions210,000.00145,000.0065,000.00
Returns & Refunds-35,000.008,000.00-43,000.00
Total970,000.00602,000.00368,000.00

Density Options

Compact, comfortable, or spacious row padding

Compact

Region
Q1(USD)
Q2(USD)
Q3(USD)
Q4(USD)
North America125,000.00142,000.00138,000.00165,000.00
Europe98,000.00105,000.00112,000.00128,000.00

Comfortable (default)

Region
Q1(USD)
Q2(USD)
Q3(USD)
Q4(USD)
North America125,000.00142,000.00138,000.00165,000.00
Europe98,000.00105,000.00112,000.00128,000.00

Spacious

Region
Q1(USD)
Q2(USD)
Q3(USD)
Q4(USD)
North America125,000.00142,000.00138,000.00165,000.00
Europe98,000.00105,000.00112,000.00128,000.00

Striped Rows

Alternating row backgrounds for better readability

Region
Q1(USD)
Q2(USD)
Q3(USD)
Q4(USD)
North America125,000.00142,000.00138,000.00165,000.00
Europe98,000.00105,000.00112,000.00128,000.00
Asia Pacific87,000.0092,000.0099,000.00115,000.00
Latin America45,000.0048,000.0052,000.0058,000.00
Total355,000.00387,000.00401,000.00466,000.00

Custom Number Formatting

Use format function for custom number display

Region
Q1 Revenue
Q2 Revenue
Q3 Revenue
Q4 Revenue
North America$125K$142K$138K$165K
Europe$98K$105K$112K$128K
Asia Pacific$87K$92K$99K$115K
Latin America$45K$48K$52K$58K
Total$355K$387K$401K$466K

Props

FinancialTable component API reference

PropTypeDefaultDescription
columnsFinancialColumn[]Column definitions (required)
dataT[]Array of row data objects (required)
stripedbooleanfalseAlternate row backgrounds
highlightNegativebooleantrueHighlight negative numbers in red
showTotalsbooleanfalseShow totals footer row
totalsLabelstring'Total'Label for totals row
density'compact' | 'comfortable' | 'spacious''comfortable'Row padding
classNamestringAdditional CSS classes

FinancialColumn Type

PropTypeDefaultDescription
keystringProperty key in data object (required)
labelstringColumn header text (required)
currencystringCurrency code to display (e.g., "USD")
decimalsnumber2Decimal places
sortablebooleanfalseEnable column sorting
widthstringCSS width value
align'left' | 'right''right'Text alignment
format(value: number) => stringCustom number formatter
render(value, row) => ReactNodeCustom cell render

Usage

Import and implementation example

import { FinancialTable, FinancialColumn } from '@/blocks/data-display/financial-table'

interface SalesData {
  region: string
  revenue: number
  profit: number
}

const columns: FinancialColumn<SalesData>[] = [
  { key: 'region', label: 'Region', align: 'left' },
  { key: 'revenue', label: 'Revenue', currency: 'USD', sortable: true },
  { key: 'profit', label: 'Profit', currency: 'USD', sortable: true },
]

const data: SalesData[] = [
  { region: 'North America', revenue: 125000, profit: 45000 },
  { region: 'Europe', revenue: 98000, profit: 32000 },
]

export default function Example() {
  return (
    <>
      {/* Basic table */}
      <FinancialTable columns={columns} data={data} />

      {/* With totals row */}
      <FinancialTable
        columns={columns}
        data={data}
        showTotals
        totalsLabel="Total"
      />

      {/* Highlight negative values */}
      <FinancialTable
        columns={columns}
        data={data}
        highlightNegative
      />

      {/* Custom number formatting */}
      <FinancialTable
        columns={[
          { key: 'revenue', label: 'Revenue', format: (v) => `$${(v / 1000).toFixed(0)}K` },
        ]}
        data={data}
      />

      {/* Different densities */}
      <FinancialTable columns={columns} data={data} density="compact" />
      <FinancialTable columns={columns} data={data} density="comfortable" />
      <FinancialTable columns={columns} data={data} density="spacious" />

      {/* Striped rows */}
      <FinancialTable columns={columns} data={data} striped />
    </>
  )
}

Features

Built-in functionality

  • Currency display: Show currency codes in column headers
  • Number formatting: Locale-aware formatting with custom decimals
  • Negative highlighting: Red text for negative values
  • Column sorting: Click headers to sort ascending/descending
  • Totals row: Automatic sum calculation for numeric columns
  • Monospace numbers: Tabular nums for aligned columns
  • Density options: Compact, comfortable, spacious row heights
  • Dark mode: Full dark mode support

Accessibility

Accessibility considerations

ARIA Attributes

Uses semantic table elementsSortable columns have aria-sort attributeTotals row uses tfoot element

Keyboard Navigation

KeyAction
TabNavigate between sortable headers
Enter / SpaceToggle sort direction

Notes

  • Sort state announced to screen readers
  • Negative values visually distinct (not relying on color alone)
  • Currency values properly formatted for screen readers