Native Shell
Native Shell: AI-generated UI, native in your app, on every platform. Apps on iOS, Android, macOS, Windows and Linux, GPUI apps and web pages load signed, sandboxed TSX modules at run time and draw th
Pixel-perfect Material (M3) data tables for your app in one prompt, with an MCP server for Claude Code, Cursor and Codex. Angular, React, Vue, HTML. MIT.
Developer toolsGitHub @table-broOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
Pixel-perfect Material data tables for Angular, and more. A Web Components table engine on top of existing UI components.
Taken from the repository README
Loading the full README.
Read the full README ↗Pixel-perfect Material data tables for Angular, and more.
A Web Components table engine on top of existing UI components.
Table, Bro is the Custom Element <table-bro>, a data table built for the look of a design system and the speed of a
native page. Rows of a fixed height render without measurement, pages turn with a kinetic scroll, row details open as
animated islands with Material 3 corners, and search, sort and filters run on the client or go to your server as one
query. The core has no runtime dependencies and works with any framework or none; Angular gets its own wrapper. The look
and the controls of the table come from a skin: a thin layer that puts the components of a UI library into the toolbar,
the paginator, the cells and the filter drawer. Three skins ship with the table, Angular Material, Bootstrap 5 and plain
HTML, and a skin for your own design system is written the same way, so the table uses your components and follows the
theme of your application instead of bringing its own.
Demo · Docs · Examples · Architecture · Interactive diagram · API reference · Changelog
<table>. The table is a plain <table> in the light DOM: your stylesheet, your selectors,
your design tokens apply as they are.@table-bro-extended/island-details.<table-bro-ng> prerenders during Angular server-side rendering in the skins mat, bs and nv,
with the template of the browser; prerenderTableBro() renders the same loading state into a server DOM without
Angular.config.texts sets the words of the toolbar, the search line, the
filter drawer, the paginator, the progress bar, the states and the row numbers, by the component of the skin; the
texts it does not set stay English. The paginator of the Angular Material skin takes its texts from
MatPaginatorIntl.MCP server for AI coding agents. @table-bro/mcp gives Claude Code, Codex, Cursor or VS Code the reference of the
table, a check of a table spec and a code generator for Angular and Vanilla JS with the three skins. The agent writes
the files; the server only reads. With it an agent builds a full table up to 2× faster and with ~45% fewer tokens,
measured with Claude Opus, Sonnet and Haiku.
claude mcp add --scope project table-bro -- npx -y @table-bro/[email protected]
Responsive layout for mobile, multi-row selection and inline cell editing.
| Package | What it gives |
|---|---|
@table-bro/core | The table, <table-bro>, its CSS and the filter drawer container |
@table-bro/angular-material | The skin mat on the components of Angular Material, in the theme of the application |
@table-bro/bootstrap | The skin bs on the components and the classes of Bootstrap 5 |
@table-bro/native | The skin nv: plain HTML elements, no UI library |
@table-bro/angular | <table-bro-ng>, the Angular wrapper with signal inputs and outputs |
@table-bro/mcp | The MCP server: the reference, the spec check and the code generator of a table for AI coding agents |
All packages share one version. Angular packages support Angular >=20 <23.
The site gives these steps on Getting started.
npm install @table-bro/core @table-bro/angular @table-bro/angular-material @angular/elements
Add node_modules/@table-bro/core/dist/table-bro.min.css and
node_modules/@table-bro/angular-material/dist/table-bro.material.min.css to "styles" of angular.json, and
provideTableBroMatSkin() to the providers of app.config.ts. Then:
import {ChangeDetectionStrategy, Component, signal} from '@angular/core';
import {TableBroNg} from '@table-bro/angular';
import type {BroCol, BroConfig, BroRow} from '@table-bro/core';
interface Order extends BroRow {
description: string;
price: number;
}
@Component({
selector: 'app-orders',
template: `<table-bro-ng [cols]="cols()" [rows]="rows()" [conf]="conf()"></table-bro-ng>`,
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [
TableBroNg
]
})
export class OrdersComponent {
cols = signal<BroCol<Order>[]>([
{title: 'Description', name: 'description'},
{title: 'Price', name: 'price', dataType: 'number', className: 'bro-col_text-right'}
]);
rows = signal<Order[]>([
{description: 'Modern Cotton Chair', price: 100},
{description: 'Awesome Concrete Ball', price: 200}
]);
conf = signal<BroConfig>({skin: 'mat', toolbarTitle: 'Orders'});
}
The working page of
samples/angular-material shows this table. The README of
@table-bro/angular-material gives the whole setup, with the theme and the icon font.
npm install @table-bro/core @table-bro/bootstrap bootstrap @types/bootstrap
Link the CSS of Bootstrap 5, then the CSS of the core and of the skin:
<link rel="stylesheet" href="node_modules/bootstrap/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="node_modules/@table-bro/core/dist/table-bro.min.css">
<link rel="stylesheet" href="node_modules/@table-bro/bootstrap/dist/table-bro.bootstrap.min.css">
Register the skin once, before the tables: the import registers the skin, which takes the classes of Bootstrap:
import {useBootstrap} from '@table-bro/bootstrap';
import {Dropdown, Tooltip} from 'bootstrap';
useBootstrap({Dropdown, Tooltip});
Then the table:
const table = document.createElement('table-bro');
table.configure({
cols: [
{title: 'Description', name: 'description'},
{title: 'Price', name: 'price', dataType: 'number', className: 'bro-col_text-right'}
],
rows: [
{description: 'Modern Cotton Chair', price: 100},
{description: 'Awesome Concrete Ball', price: 200}
],
conf: {skin: 'bs', toolbarTitle: 'Orders'}
});
document.body.append(table);
The working page of samples/bootstrap shows this
table. The README of @table-bro/bootstrap gives the elements of the cells, the settings
and loading without a bundler.
npm install @table-bro/core @table-bro/native
<link rel="stylesheet" href="node_modules/@table-bro/core/dist/table-bro.min.css">
<link rel="stylesheet" href="node_modules/@table-bro/native/dist/table-bro.native.min.css">
import '@table-bro/core';
import '@table-bro/native';
const table = document.createElement('table-bro');
table.configure({
cols: [
{title: 'Description', name: 'description'},
{title: 'Price', name: 'price', dataType: 'number', className: 'bro-col_text-right'}
],
rows: [
{description: 'Modern Cotton Chair', price: 100},
{description: 'Awesome Concrete Ball', price: 200}
],
conf: {skin: 'nv', toolbarTitle: 'Orders'}
});
document.body.append(table);
The working page of samples/native shows this table.
The table is set up through the core, the same way for every skin: the config, the columns, the server mode, the
themes, the styling, the CSS variables --bro-* and loading without a bundler. The README of
@table-bro/core describes them.
npx -y @table-bro/[email protected] starts the MCP server: the agent gets the docs, checks a table spec and generates the
code of the table for your project. The README of @table-bro/mcp gives the setup for each agent, and
the site describes the server on MCP server.
Node.js 22.12 or newer.
npm ci # also sets the git hook of the lint
npx playwright install chromium # the browser of the unit tests
npm run build # every package: dist/ of each package, dist/ of the Angular packages
npm test # the architecture rules, the public API reports and the unit tests
CONTRIBUTING.md describes the repository, the checks and the commits. SECURITY.md tells how to report a vulnerability.
MIT. The notices of the code of Angular Material and Bootstrap are in THIRD_PARTY_NOTICES.md.