Logo

Table

CDK-backed table primitives with captions, headers, rows, footers, sticky columns, empty states, actions, and virtual scrolling support.

Preview

Deployment activity from the current workspace.
DeployApplicationStatusRegionMonthly
DEP-2048Atlas StudioReadyEU Central$1,280
DEP-2049Northwind PortalQueuedUS East$860
DEP-2050Signal DeskReadyAP South$1,440
DEP-2051Beacon APIFailedEU West$520
DEP-2052Orbit ConsoleReadyUS West$1,110

Usage

TS

import { CurrencyPipe } from '@angular/common';
import { FrTableModule } from '@frame-ui-ng/components/table';

columns = ['id', 'app', 'status', 'region', 'cost'];

deployments = [
  { id: 'DEP-2048', app: 'Atlas Studio', owner: 'Mira', status: 'Ready', region: 'EU Central', cost: 1280 },
  { id: 'DEP-2049', app: 'Northwind Portal', owner: 'Rhea', status: 'Queued', region: 'US East', cost: 860 },
  { id: 'DEP-2050', app: 'Signal Desk', owner: 'Nora', status: 'Ready', region: 'AP South', cost: 1440 },
];

totalCost(): number {
  return this.deployments.reduce((total, deployment) => total + deployment.cost, 0);
}

HTML

<div frTableContainer>
  <table frTable variant="outline" [dataSource]="deployments">
    <caption frTableCaption>Deployment activity from the current workspace.</caption>

    <ng-container frColumnDef="id">
      <th frHeaderCell *frHeaderCellDef>Deploy</th>
      <td frCell *frCellDef="let deployment">{{ deployment.id }}</td>
    </ng-container>

    <ng-container frColumnDef="app">
      <th frHeaderCell *frHeaderCellDef>Application</th>
      <td frCell *frCellDef="let deployment">{{ deployment.app }}</td>
    </ng-container>

    <ng-container frColumnDef="status">
      <th frHeaderCell *frHeaderCellDef>Status</th>
      <td frCell *frCellDef="let deployment">{{ deployment.status }}</td>
    </ng-container>

    <ng-container frColumnDef="region">
      <th frHeaderCell *frHeaderCellDef>Region</th>
      <td frCell frTableMuted *frCellDef="let deployment">{{ deployment.region }}</td>
    </ng-container>

    <ng-container frColumnDef="cost">
      <th frHeaderCell frTableNumeric *frHeaderCellDef>Monthly</th>
      <td frCell frTableNumeric *frCellDef="let deployment">{{ deployment.cost | currency }}</td>
    </ng-container>

    <tr frHeaderRow *frHeaderRowDef="columns"></tr>
    <tr frRow *frRowDef="let row; columns: columns"></tr>
  </table>
</div>

Examples

Basic

Use CDK column and row definitions for semantic tables with FrameUI styling.

Deployment activity from the current workspace.
DeployApplicationStatusRegionMonthly
DEP-2048Atlas StudioReadyEU Central$1,280
DEP-2049Northwind PortalQueuedUS East$860
DEP-2050Signal DeskReadyAP South$1,440
DEP-2051Beacon APIFailedEU West$520
DEP-2052Orbit ConsoleReadyUS West$1,110

Actions

Place buttons or menus in a trailing action column while keeping the row structure accessible.

DeployApplicationStatusActions
DEP-2048Atlas StudioReady
DEP-2049Northwind PortalQueued
DEP-2050Signal DeskReady
DEP-2051Beacon APIFailed
DEP-2052Orbit ConsoleReady

Dynamic Columns

Drive the row definition from a signal or computed value when columns can be toggled.

DeployApplicationOwnerRegion
DEP-2048Atlas StudioMiraEU Central
DEP-2049Northwind PortalJonasUS East
DEP-2050Signal DeskRheaAP South
DEP-2051Beacon APINoraEU West
DEP-2052Orbit ConsoleTheoUS West

Empty State

Use FrNoDataRow for empty results without special-casing the whole table template.

DeployApplication
No deployments match the current filters.

Sticky Columns

Use CDK sticky column inputs for wide tables that need pinned leading or trailing context.

DeployApplicationOwnerRegionStatusCost
DEP-3000Atlas StudioMiraEU CentralReady$1,280
DEP-3001Northwind PortalJonasUS EastQueued$895
DEP-3002Signal DeskRheaAP SouthReady$1,510
DEP-3003Beacon APINoraEU WestFailed$625
DEP-3004Orbit ConsoleTheoUS WestReady$1,250
DEP-3005Atlas StudioMiraEU CentralReady$1,455
DEP-3006Northwind PortalJonasUS EastQueued$1,070
DEP-3007Signal DeskRheaAP SouthReady$1,685

Sticky Header

Use row-definition sticky microsyntax when the header should remain visible inside a scrollable table container.

DeployApplicationOwnerCost
DEP-3000Atlas StudioMira$1,280
DEP-3001Northwind PortalJonas$895
DEP-3002Signal DeskRhea$1,510
DEP-3003Beacon APINora$625
DEP-3004Orbit ConsoleTheo$1,250
DEP-3005Atlas StudioMira$1,455
DEP-3006Northwind PortalJonas$1,070
DEP-3007Signal DeskRhea$1,685
DEP-3008Beacon APINora$800
DEP-3009Orbit ConsoleTheo$1,425
DEP-3010Atlas StudioMira$1,630
DEP-3011Northwind PortalJonas$1,245
DEP-3012Signal DeskRhea$1,440
DEP-3013Beacon APINora$555
DEP-3014Orbit ConsoleTheo$1,180
DEP-3015Atlas StudioMira$1,385
DEP-3016Northwind PortalJonas$1,000
DEP-3017Signal DeskRhea$1,615

Virtual Scroll

Compose table virtual primitives with FrVirtualScroll for large datasets with fixed row heights.

Deploy
Application
Owner
Region
Cost

RTL

Logical spacing and numeric alignment helpers continue to work in right-to-left layouts.

النشرالتطبيقالتكلفة
DEP-2048Atlas Studio$1,280
DEP-2049Northwind Portal$860
DEP-2050Signal Desk$1,440

Custom Styling

Override tokens on the table or a parent wrapper to tune density, surfaces, borders, row hover states, and card treatments locally.

Deployment activity from the current workspace.
DeployApplicationStatusRegionMonthly
DEP-2048Atlas StudioReadyEU Central$1,280
DEP-2049Northwind PortalQueuedUS East$860
DEP-2050Signal DeskReadyAP South$1,440
DEP-2051Beacon APIFailedEU West$520
DEP-2052Orbit ConsoleReadyUS West$1,110

Token Inspector

Inspect the container, table root, caption, header cells, body rows, and data cells used by the CDK-backed table.

Token inspection table for deployments.
DeployApplicationMonthly
DEP-2048Atlas Studio$1,280
DEP-2049Northwind Portal$860
DEP-2050Signal Desk$1,440

Design Tokens

Use these CSS custom properties to tune table surfaces, captions, header treatment, row states, cell spacing, footers, and sticky columns.

SCSS

--frame-table-bg: var(--frame-background);
--frame-table-color: var(--frame-foreground);
--frame-table-border: var(--frame-border);
--frame-table-radius: var(--frame-radius-md);
--frame-table-shadow: none;
--frame-table-caption-color: var(--frame-muted-foreground);
--frame-table-caption-font-size: 0.875rem;
--frame-table-header-bg: transparent;
--frame-table-header-color: var(--frame-muted-foreground);
--frame-table-header-font-size: 0.875rem;
--frame-table-header-font-weight: 500;
--frame-table-row-border: var(--frame-border);
--frame-table-row-hover-bg: var(--frame-accent);
--frame-table-row-selected-bg: color-mix(in srgb, var(--frame-primary) 10%, transparent);
--frame-table-row-striped-bg: color-mix(in srgb, var(--frame-muted) 45%, transparent);
--frame-table-cell-padding-block: 0.75rem;
--frame-table-cell-padding-inline: 1rem;
--frame-table-cell-font-size: 0.875rem;
--frame-table-cell-line-height: 1.5;
--frame-table-footer-bg: transparent;
--frame-table-footer-font-weight: 600;
--frame-table-transition-duration: 150ms;
--frame-table-sticky-shadow: 1px 0 0 var(--frame-table-border);