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`. | Table | optional | ||||||
| attributes Parent-layout attributes. | 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
block/table-row: a row of cells.
block/table-column: a column marker.
block/paragraph: the cell block.
Blocks: the worked table example.
Documents: how concurrent edits merge.
Do you like what you are reading? Subscribe to receive updates.
Unsubscribe anytime