Skip to content

[RFC] The Figma library has no Table component, only cells — the widest code/design gap in the system #6108

Description

@joaodotwork

The gap

@astryxdesign/core ships Table with fifteen plugins — sort, filter, pagination,
column resize, selection, grouping, tree data, sticky columns, row expansion, row
status, context menus. In the Figma library there is no Table component to
instantiate.
The only published table components are TableCell and
TableHeaderCell.

The assembled table exists, but only as documentation: a FRAME named Table on the
Table & List page, and a SECTION named Table on Templates. Neither is a
component, so a designer cannot insert one — they compose rows from cells by hand, or
copy the example frame and detach from whatever it was.

For a component library whose centre of gravity is data-dense product UI — AppShell,
SideNav, CommandPalette, a Table with fifteen plugins — this looks like the widest
gap between what the code can do and what a designer can reach.

Evidence

Read through the Plugin API in the library file, 2026-09-07:

findAllWithCriteria({types: ['COMPONENT_SET']})  matching /table/i
  -> TableHeaderCell, TableCell, SelectableCard

top-level nodes named Table
  -> FRAME   "Table" on page "Table & List"
  -> SECTION "Table" on page "Templates"

Table is absent from both the component sets and the standalone components, so
importComponentSetByKeyAsync has nothing to resolve. TableCell and
TableHeaderCell import fine and carry sensible props:

component props
TableHeaderCell Label, Sortable, Align Right, Has Checkbox, Has Filter, Resizable, Density (Compact/Balanced/Spacious), Sort (None/Ascending/Descending)
TableCell Content (SLOT), Align Right, Leading Checkbox, Leading Expand, Divider Bottom, Divider Right, Density, State (Default/Hovered/Selected)

So the primitives are good and the composition is the missing piece.

What composing it by hand actually costs

We built a five-column, four-row unit list from these cells for a client evaluation —
sortable headers, right-aligned numerics, a Badge in the status column, Pagination
underneath. It works, and it looks right. But:

  • 36 instances for a four-row table. Twenty cells, five header cells, plus the
    contents of each slot. A realistic table is a hundred nodes before any data.
  • Widths are the designer's problem. Cells hug their content, so a table only lines
    up if every cell in a column is set to a fixed width by hand. Nothing enforces that
    the header and its column agree.
  • Nothing is reusable. The next person composes their own, with their own densities
    and their own widths, and the two tables diverge immediately. That is the failure mode
    a design system exists to prevent.
  • The code's plugins have no representation at all. A designer cannot show a sorted
    column, a filter chip row, a selected row set, or an expanded row without building
    each state from scratch — even though the code does all of it.

Proposal

A published Table component, or a documented composition that behaves like one:

  1. A Table component set taking a SLOT for rows, with the variants the code
    already has — Density, dividers, isStriped, hasHover, verticalAlign,
    textOverflow. That mirrors TableProps and gives a designer the same dials the
    engineer has.
  2. A TableRow component between it and the cells, so a row is one instance rather
    than N cells, and column widths can live on the table rather than on each cell.
  3. Failing either, promote the example frame on Table & List to a component and say
    so in its description. Even a non-variant component would beat a frame nobody can
    insert.

Worth deciding alongside: the code models row state (hover, selected) as runtime CSS,
while the Figma cells model it as a State variant. That asymmetry is fine, but it is
worth documenting, because a designer switching State=Hovered on twenty cells is
expressing something the code does with one CSS rule.

What we can contribute

We have the hand-composed version — five columns, sortable header, badge cells,
pagination — built from the published cells, and it is a reasonable starting point for
(1) and (2). Happy to open a PR against the Figma library workflow, or to hand over the
composition script if the library is maintained through
Night Watch
rather than through PRs. Related: #5923 on the theme collections, where the same
"the library advertises something a consumer cannot reach" shape shows up.

Environment

@astryxdesign/core@0.5.3, Astryx Library (Community) (cYTWQpjWxbR30zwQgqlSmY) as
of 2026-09-07, read through the Figma Desktop Bridge Plugin API. No
FIGMA_ACCESS_TOKEN, so component publish state per node was not inspected — the claim
is that no Table component set or standalone component exists in the file, not a claim
about publish flags.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions