Two or three columns inside a block, and one rule for when they stop being columns. A form, a record's detail, cards side by side.
IngotPageLayout (the rhythm of blocks, the side index) inside IngotAppFrame (width, margins). This is the inside of one block.dl) and are IngotDescriptionList, not a grid somebody stacked spans into.IngotTable — a grid is layout, not data.children: ReactNode — The columns' contents. Each child takes one column; only `IngotColumnsFull` runs the whole width.columns: 2 | 3 | 4 — How many columns, once there is room for them. Defaults to 2. Three and four take a step on the way down: two columns from `sm`, the full count from `collapseBelow`.gap: 3 | 4 | 5 — The step of the space scale between cells — `--s-3`, `--s-4` (default), `--s-5`. Not an arbitrary number: a gap that can be missed by two pixels stops being a scale.minItemWidth: number — Tiles instead of a count: the narrowest one cell may be, in pixels, and the row holds as many as fit. It wins over `columns` — a caller that asked for tiles asked for tiles.collapseBelow: "md" | "lg" — Below this width it becomes one column. Defaults to `md`. There is no "never": two columns on a phone are two columns of about 150 px, and whatever was worth putting side by side cannot be read in them.className: string — Placement of the block only. The width of the columns and the gap do not belong here.testId: string — An anchor for tests.