Skip to content
D
Documentation

DashboardGridOptions

reference
5 min readUpdated

Import it from @grafloria/element.

ts
interface DashboardGridOptions

Properties

NameTypeDefaultDescription
columns?numberColumn count (default 12). With responsive, the starting/maximum count.
rtl?booleanRIGHT-TO-LEFT board. Cells are unchanged — x=0 is still the first column — but it renders at the board's RIGHT edge and columns run leftwards. Purely a pixel-mapping concern: the engine, the cells and every saved layout are direction-agnostic.
responsive?DashboardResponsiveOptionsDerive the column count from the board's width (see the interface).
onColumnsChange?(columns: number, previous: number) => voidFires after a responsive (or programmatic) column-count change.
gap?numberGap between cells, px (default 12).
padding?numberBoard padding, px (default = gap).
sizing?'fit' | 'grow'Sizing mode (default 'fit' — the user decision recorded in the plan).
baseRowHeight?number'grow' row height, px (default 110).
minRowHeight?number'fit' row-height floor, px (default 28).
designHeight?numberThe board's design height (default: the group's height at bind time). 'fit' pins the frame to it; 'grow' never shrinks the frame below it.
float?booleanEngine float mode (default false → gravity packs upward).
maxRows?numberEngine row bound (see GridPackOptions.maxRows). A nested strip like the KPI section passes 1: its DESIGN is one row, so height growth and pushes that would spill a sibling downward are refused (siblings shift along the row instead), and the strip can never be squeezed.
escalate?booleanNested boards only. true (default): a child pulled clearly past the bound GROWS the container's slab in the parent (height escalation). false: the pane is the bound — the pull is refused where it stands, the container's sizing: 'fit'.
dragOut?'remove' | 'cancel'What dragging a tile OUT of the board means (default 'cancel' — the tile snaps back on release). 'remove' dims the ghost outside the board and a release outside calls onRemoveRequest — deletion stays on the page's atomic command path.
removeZone?(screen: { x: number; y: number }, world: { x: number; y: number }) => booleanWith dragOut:'remove', restrict deletion to an EXPLICIT drop zone (the page passes "over the palette" — gridstack web2's trash semantics). Outside the zone a release snaps home instead: a 60px overshoot past the frame edge must never destroy a widget (live parity review — the plan prototype clamps at its edges and cannot delete at all).
onRemoveRequest?(nodeId: string, displaced: Command[]) => void | Promise<void>Page hook for drag-out removal: execute ONE undoable batch that removes nodeId AND applies displaced (the survivors' cell commits, so undo restores the exact board).
onDropIn?(node: NodeModel, cell: CellRect, displaced: Command[], target: { boardId: string }) => void | Promise<void>Page hook for palette drag-in release: add node (already carrying cell in its gridItem) to target.boardId — this view, or a page or section the chip was dropped into (tile first, step 4a) — through the page's command path, folding displaced into the same batch.
onMemberLeaving?(memberId: string) => Command[]A member is about to LEAVE this board through a gesture (moved into another board, made a tab of its own). Answers the commands that follow it in the same batch — a tab page emptied by the move closes.
onMemberMoving?(memberId: string, fromBoardId: string, toBoardId: string) => Command[]A member CONTAINER is moving from this board to another by a gesture (tile first, 4b-ii). Answers the commands that carry the host's own bookkeeping for it — the spec entry, the registry — in the same batch.
tabDrop?TabDropHooksA widget dragged over a tab STRIP becomes a new tab there: the hooks that hit-test, mark and commit it.
onGesture?(e: { type: 'commit' | 'cancel' | 'remove' | 'drop-in'; kind: 'move' | 'resize' | 'palette'; nodeId: string; changed: boolean; }) => voidFires after commits/cancels/removals so the page can refocus/refit/flash.
onSelect?(id: string | undefined) => voidThe selection on this board changed: the selected member — a widget or a SECTION (container) — or undefined.
renderCaption?(sectionId: string, host: HTMLElement) => voidSECTION CAPTIONS (0.4.22). Paint a member section's caption band yourself: the band is handed over empty, sized and themed, and keeps its press rules. Default: the kit's icon · text · subtitle · ⓘ · actions.
onCaptionAction?(sectionId: string, actionId: string) => voidA press on a caption action button (see SectionCaptionOptions.actions).
resizeHandles?boolean
fluid?booleanFLUID board: the group's frame follows the CANVAS CONTAINER — width always, and height too in 'fit' — so the dashboard is laid out at real CSS pixels like every other grid library, never as a picture the camera scales (review D1: a 900-px viewport drew 30-px KPI figures at 18 px). The binder owns the ResizeObserver; sync() re-reads the container as well.
overflow?'bounded' | 'scroll'What FIT mode does past its row floor. 'bounded' (default): the design height is a CAPACITY — a drop, resize or add that would need one row too many is refused (the engine's capacity), visibly, at design time. 'scroll': no bound; the frame extends to hold the rows at the floor height so nothing paints outside it, and the canvas pans.
static?booleanSTATIC board (gridstack's staticGrid): the pointer can neither drag nor resize and no handles are injected; the API (moveTo/resizeTo, adds, undo) still works. The viewer's mode — see setStatic for the live switch.
nesting?numberNESTING POLICY (tile first, step 2): the deepest board a DROP may enter, counting a view as 0 — a widget into a section is 1, into a section inside a tab page is 2. Deeper containers are opaque to a drag: the pointer over them means a cell on their parent board (or beside them). Unbounded by default.
dragHandle?DragHandleOptionDRAG HANDLE (DevExpress drags an item by its caption; gridstack's handle). true — the CAPTION STRIP is the handle (the header shows grip dots); a selector string — your own element inside the host; a { grip: true } object — a dedicated GRIP the kit paints, positioned left / center / right and, for the top edge, inside the header band or outside as a tab above the card (the DevExpress …
squeeze?booleanFIT AND THE ROW FLOOR. true (default): a bounded fit board holds as many rows as fit at minRowHeight — a gesture that needs another row SQUEEZES every row toward the floor, and is refused only when even that is not enough.

Was this page helpful?

DashboardGridOptions — Grafloria