Table Block
The container of a table: its children are TableColumn markers followed by TableRow blocks whose Paragraph cells carry a columnId.

Extends

id
The block's permanent identity inside its document.
inherited
revision
Output only: CID of the last Change that modified this block.
optional · inherited
type
Block type tag, always `Table`.
Tableoptional
attributes
Parent-layout attributes.
optional
childrenType
How this block lays out its children — a children type such as `Unordered` or `Grid`.
optional
columnCount
Number of columns the children occupy when `childrenType` is `Grid`.
optional

A table block is the container of a table. Its children are TableColumn blocks, which are childless and whose sibling order defines column display order, followed by TableRow blocks whose children are Paragraph cells carrying a columnId attribute. A cell's identity is (row, columnId), never its grid position. That lets concurrent CRDT edits merge cleanly.

There is no cell block type. A cell is an ordinary paragraph under a table row whose columnId names a table column id. The order of cells inside a row is ignored. Editing a cell is a text edit on one block. Inserting, reordering or deleting a column is one sibling operation on one column block, and no cell renumbers. Two people who concurrently add a row and reorder the columns merge cleanly. Readers drop cells whose column is gone, render missing cells empty, honor isHeader only on the first row and the first column, and ignore rows or columns outside a Table. These are client conventions: the daemon enforces none of them.

The Table block's own attributes are only the parent-layout pair. In the markdown dialect a table is a GFM table with a <!-- id:… --> line before it, a <!-- col:… --> comment in each header cell and a row id comment in each row's last cell. Cell ids are re-derived from (row, column) on update. Blocks has the worked example and the reasoning.

See also

Do you like what you are reading? Subscribe to receive updates.

Unsubscribe anytime