{
  "about": "How AG Grid options, API calls and events map onto Lattice Grid. One row per AG Grid name, with what Lattice calls the same thing and how close the two are.",
  "agVersion": "36",
  "statuses": {
    "direct": "Same capability, under a different name or in a different place. Nothing is lost in the move.",
    "partial": "The capability is there, in a shape different enough that the conversion needs a decision.",
    "different-by-design": "Lattice answers the same need another way, on purpose.",
    "none": "No equivalent. What to do instead is in the note."
  },
  "fields": {
    "agOption": "The AG Grid name, as AG Grid documents it at the major named in agVersion.",
    "agScope": "Where it lives in AG Grid: gridOptions, colDef, gridApi, event, edition, or concept for a row about an approach rather than one option.",
    "latticeEquivalent": "The Lattice Grid name. Every one of these is in the shipped API reference.",
    "status": "direct, partial, different-by-design or none.",
    "note": "What changes in practice.",
    "docsUrl": "The Lattice Grid page that documents the equivalent.",
    "agDocsUrl": "AG Grid's own documentation for the option named.",
    "legacyAgOption": "The name AG Grid used before it renamed the option, where it did. Present only on those rows."
  },
  "rows": [
    {
      "agOption": "columnDefs",
      "agScope": "gridOptions",
      "latticeEquivalent": "columns",
      "status": "direct",
      "note": "The column list, in display order. Column groups nest inside it, or are declared on their own with columnGroups.",
      "docsUrl": "/docs/columns/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "rowData",
      "agScope": "gridOptions",
      "latticeEquivalent": "rows",
      "status": "direct",
      "note": "The row objects. The array is copied on ingest, so the one you pass is never written to.",
      "docsUrl": "/docs/api/rows-and-sources/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "defaultColDef",
      "agScope": "gridOptions",
      "latticeEquivalent": "columnDefaults",
      "status": "direct",
      "note": "Merged under every column before its own definition.",
      "docsUrl": "/docs/columns/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "columnTypes",
      "agScope": "gridOptions",
      "latticeEquivalent": "columnPresets",
      "status": "partial",
      "note": "Named bundles a column opts into with preset. Lattice keeps type for the data type (money, date, duration), so a named bundle and a data type are separate ideas.",
      "docsUrl": "/docs/columns/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "dataTypeDefinitions",
      "agScope": "gridOptions",
      "latticeEquivalent": "dataTypes",
      "status": "partial",
      "note": "Types of your own, registered ahead of the built-ins so a name of yours overrides one of ours. A Lattice type carries format, parse, compare, storage, editor, filter and Excel behaviour together.",
      "docsUrl": "/docs/units/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "getRowId",
      "agScope": "gridOptions",
      "latticeEquivalent": "rowKey",
      "status": "direct",
      "note": "A field name, a dot path, an array of fields for a composite key, or a function. Set it: change tracking, streaming dedupe and selection persistence all depend on stable identity.",
      "docsUrl": "/docs/api/rows-and-sources/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "components",
      "agScope": "gridOptions",
      "latticeEquivalent": "components",
      "status": "direct",
      "note": "Renderers, editors and filters addressable by name.",
      "docsUrl": "/docs/api/rendering-and-formatting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "context",
      "agScope": "gridOptions",
      "latticeEquivalent": "context",
      "status": "direct",
      "note": "Passed to every callback, so formatters and renderers need no closures over application state.",
      "docsUrl": "/docs/api/platform/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "initialState",
      "agScope": "gridOptions",
      "latticeEquivalent": "state",
      "status": "direct",
      "note": "A saved view restored at construction.",
      "docsUrl": "/docs/api/export-and-state/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-state/"
    },
    {
      "agOption": "localeText",
      "agScope": "gridOptions",
      "latticeEquivalent": "messages",
      "status": "direct",
      "note": "Replaces the labels, menus and screen-reader announcements. Twenty catalogues ship in the package; a partial object of your own lays over British English.",
      "docsUrl": "/docs/accessibility/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "enableRtl",
      "agScope": "gridOptions",
      "latticeEquivalent": "direction",
      "status": "direct",
      "note": "direction: 'rtl' lays the grid out right to left, and an Arabic, Hebrew or Farsi locale does it without setting anything else.",
      "docsUrl": "/docs/right-to-left/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "field",
      "agScope": "colDef",
      "latticeEquivalent": "field",
      "status": "direct",
      "note": "Dot paths are read, so 'site.address.postcode' is a column.",
      "docsUrl": "/docs/columns/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "colId",
      "agScope": "colDef",
      "latticeEquivalent": "id",
      "status": "direct",
      "note": "Defaults to field, and is required on a column that has none.",
      "docsUrl": "/docs/columns/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "headerName",
      "agScope": "colDef",
      "latticeEquivalent": "title",
      "status": "direct",
      "note": "Defaults to a humanised field name.",
      "docsUrl": "/docs/columns/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "children",
      "agScope": "colDef",
      "latticeEquivalent": "columnGroups",
      "status": "direct",
      "note": "Banded headings, declared inside columns or separately with columnGroups. Groups nest.",
      "docsUrl": "/docs/columns/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "width",
      "agScope": "colDef",
      "latticeEquivalent": "layout.width",
      "status": "direct",
      "note": "A pixel number, or a percentage string that follows the container as it resizes.",
      "docsUrl": "/docs/columns/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "minWidth",
      "agScope": "colDef",
      "latticeEquivalent": "layout.min",
      "status": "direct",
      "note": "The floor a resize or a flex share is clamped to.",
      "docsUrl": "/docs/columns/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "maxWidth",
      "agScope": "colDef",
      "latticeEquivalent": "layout.max",
      "status": "direct",
      "note": "The ceiling a resize or a flex share is clamped to.",
      "docsUrl": "/docs/columns/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "flex",
      "agScope": "colDef",
      "latticeEquivalent": "layout.flex",
      "status": "direct",
      "note": "Share out the spare width. Resolved before any other sizing and wins over it.",
      "docsUrl": "/docs/columns/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "hide",
      "agScope": "colDef",
      "latticeEquivalent": "layout.hidden",
      "status": "direct",
      "note": "Start the column hidden; the tool panel and columns.show() bring it back.",
      "docsUrl": "/docs/columns/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "pinned",
      "agScope": "colDef",
      "latticeEquivalent": "layout.pin",
      "status": "direct",
      "note": "'start' or 'end' rather than left or right, so a pinned column holds the leading edge in a right-to-left grid too.",
      "docsUrl": "/docs/columns/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "resizable",
      "agScope": "colDef",
      "latticeEquivalent": "layout.resizable",
      "status": "direct",
      "note": "Whether the user may drag this column wider or narrower.",
      "docsUrl": "/docs/columns/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "suppressMovable",
      "agScope": "colDef",
      "latticeEquivalent": "layout.movable",
      "status": "direct",
      "note": "Set movable: false for the same effect.",
      "docsUrl": "/docs/columns/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "lockPosition",
      "agScope": "colDef",
      "latticeEquivalent": "layout.lockPosition",
      "status": "direct",
      "note": "Hold the column where it is while others move around it.",
      "docsUrl": "/docs/columns/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "lockVisible",
      "agScope": "colDef",
      "latticeEquivalent": "layout.lockVisible",
      "status": "direct",
      "note": "Keep the column on screen whatever the tool panel offers.",
      "docsUrl": "/docs/columns/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "rowSpan",
      "agScope": "colDef",
      "latticeEquivalent": "rowSpan",
      "status": "direct",
      "note": "A function of the cell returning how many rows to merge down. Spanned cells draw in their own layer, so scrolling cannot clip them.",
      "docsUrl": "/docs/columns/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "colSpan",
      "agScope": "colDef",
      "latticeEquivalent": "colSpan",
      "status": "direct",
      "note": "A function of the cell returning how many columns to merge across.",
      "docsUrl": "/docs/columns/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "tooltip",
      "agScope": "colDef",
      "latticeEquivalent": "cell.tooltip",
      "status": "direct",
      "note": "A string or a function is plain text and becomes the browser title, the same as it was.",
      "docsUrl": "/docs/api/rendering-and-formatting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/",
      "legacyAgOption": "tooltipField, tooltipValueGetter"
    },
    {
      "agOption": "tooltipShowDelay",
      "agScope": "gridOptions",
      "latticeEquivalent": "tooltip.delay",
      "status": "direct",
      "note": "How long the pointer or the keyboard cursor rests on a cell before a tooltip is built. tooltip.maxWidth caps how wide it grows.",
      "docsUrl": "/docs/api/rendering-and-formatting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "tooltipComponent",
      "agScope": "colDef",
      "latticeEquivalent": "cell.tooltip",
      "status": "direct",
      "note": "The object form is a tooltip the grid draws: render returns an element, a { title, rows, note } spec, an { html } wrapper or a string, and mount and unmount carry live content. Shown on keyboard focus as well as hover, and dismissed with Escape.",
      "docsUrl": "/docs/api/rendering-and-formatting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "valueGetter",
      "agScope": "colDef",
      "latticeEquivalent": "value.compute",
      "status": "partial",
      "note": "A computed value declares the columns it reads in value.deps, so the grid knows when to recompute it and can catch a cycle before it renders.",
      "docsUrl": "/docs/columns/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "valueFormatter",
      "agScope": "colDef",
      "latticeEquivalent": "value.format",
      "status": "direct",
      "note": "Overrides the data type's formatter for that column. A format string such as 'percent:1' covers the common cases without a function.",
      "docsUrl": "/docs/columns/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "valueParser",
      "agScope": "colDef",
      "latticeEquivalent": "value.parse",
      "status": "direct",
      "note": "Turns what the editor produced back into a value. Always called, whatever the editor emitted.",
      "docsUrl": "/docs/api/editing/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "valueSetter",
      "agScope": "colDef",
      "latticeEquivalent": "value.apply",
      "status": "direct",
      "note": "Writes the value back into the row object.",
      "docsUrl": "/docs/api/editing/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "comparator",
      "agScope": "colDef",
      "latticeEquivalent": "value.compare",
      "status": "direct",
      "note": "Overrides the data type's comparator for that column.",
      "docsUrl": "/docs/columns/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "keyCreator",
      "agScope": "colDef",
      "latticeEquivalent": "value.key",
      "status": "direct",
      "note": "The group key a value contributes when the grid groups by that column.",
      "docsUrl": "/docs/analytics/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "getQuickFilterText",
      "agScope": "colDef",
      "latticeEquivalent": "value.quickFilterText",
      "status": "direct",
      "note": "What the quick filter matches for that column.",
      "docsUrl": "/docs/sorting-and-filtering/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "cellRenderer",
      "agScope": "colDef",
      "latticeEquivalent": "cell.render",
      "status": "direct",
      "note": "A built-in renderer name, a function, or a component. A bare string on the cell key is the renderer name.",
      "docsUrl": "/docs/api/rendering-and-formatting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "cellRendererParams",
      "agScope": "colDef",
      "latticeEquivalent": "cell.props",
      "status": "direct",
      "note": "Passed to the renderer.",
      "docsUrl": "/docs/api/rendering-and-formatting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "cellClass",
      "agScope": "colDef",
      "latticeEquivalent": "cell.class",
      "status": "direct",
      "note": "A class, an array of classes, or a function of the cell.",
      "docsUrl": "/docs/api/rendering-and-formatting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "cellClassRules",
      "agScope": "colDef",
      "latticeEquivalent": "cell.classWhen",
      "status": "direct",
      "note": "A class per predicate, re-evaluated as values change.",
      "docsUrl": "/docs/api/rendering-and-formatting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "cellStyle",
      "agScope": "colDef",
      "latticeEquivalent": "cell.style",
      "status": "direct",
      "note": "Inline styles, static or computed per cell.",
      "docsUrl": "/docs/api/rendering-and-formatting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "rowClass",
      "agScope": "gridOptions",
      "latticeEquivalent": "rowClass",
      "status": "direct",
      "note": "A class for every row, re-evaluated on each repaint.",
      "docsUrl": "/docs/api/rendering-and-formatting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "getRowClass",
      "agScope": "gridOptions",
      "latticeEquivalent": "rowClass",
      "status": "direct",
      "note": "The function form of the same key.",
      "docsUrl": "/docs/api/rendering-and-formatting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "rowStyle",
      "agScope": "gridOptions",
      "latticeEquivalent": "rowStyle",
      "status": "direct",
      "note": "Inline styles for every row.",
      "docsUrl": "/docs/api/rendering-and-formatting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "getRowStyle",
      "agScope": "gridOptions",
      "latticeEquivalent": "rowStyle",
      "status": "direct",
      "note": "The function form of the same key. Declare it once: two definitions of one key in an object literal means the first is thrown away before the grid ever sees it.",
      "docsUrl": "/docs/api/rendering-and-formatting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "headerClass",
      "agScope": "colDef",
      "latticeEquivalent": "header.class",
      "status": "direct",
      "note": "Adds a class to the heading cell.",
      "docsUrl": "/docs/api/rendering-and-formatting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "headerComponent",
      "agScope": "colDef",
      "latticeEquivalent": "header.render",
      "status": "direct",
      "note": "A function or a component drawing the heading. It may write into the heading element, return an element, or return a string used as the heading text.",
      "docsUrl": "/docs/api/rendering-and-formatting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "editable",
      "agScope": "colDef",
      "latticeEquivalent": "edit.enabled",
      "status": "direct",
      "note": "A boolean or a predicate of the cell.",
      "docsUrl": "/docs/api/editing/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "cellEditor",
      "agScope": "colDef",
      "latticeEquivalent": "edit.editor",
      "status": "direct",
      "note": "A built-in editor name or one of your own.",
      "docsUrl": "/docs/api/editing/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "cellEditorParams",
      "agScope": "colDef",
      "latticeEquivalent": "edit.props",
      "status": "direct",
      "note": "Passed to the editor.",
      "docsUrl": "/docs/api/editing/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "cellEditorPopup",
      "agScope": "colDef",
      "latticeEquivalent": "edit.popup",
      "status": "direct",
      "note": "Open the editor over the cell rather than inside it.",
      "docsUrl": "/docs/api/editing/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "singleClickEdit",
      "agScope": "gridOptions",
      "latticeEquivalent": "edit.start",
      "status": "direct",
      "note": "edit.start takes 'single', 'double' or 'key'.",
      "docsUrl": "/docs/api/editing/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "editType",
      "agScope": "gridOptions",
      "latticeEquivalent": "edit.mode",
      "status": "direct",
      "note": "edit.mode: 'row' edits the whole row at once; 'cell' is the default.",
      "docsUrl": "/docs/api/editing/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "enterNavigatesVerticallyAfterEdit",
      "agScope": "gridOptions",
      "latticeEquivalent": "edit.enterMovesDown",
      "status": "direct",
      "note": "Enter commits and moves down the column.",
      "docsUrl": "/docs/api/editing/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "undoRedoCellEditing",
      "agScope": "gridOptions",
      "latticeEquivalent": "history",
      "status": "partial",
      "note": "Undo is always present and covers more than edits: sorts, filters, column moves, grouping, an applied view and a restore each record one labelled entry.",
      "docsUrl": "/docs/api/editing/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "undoRedoCellEditingLimit",
      "agScope": "gridOptions",
      "latticeEquivalent": "edit.undoDepth",
      "status": "direct",
      "note": "How many steps are kept.",
      "docsUrl": "/docs/api/editing/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "stopEditingWhenCellsLoseFocus",
      "agScope": "gridOptions",
      "latticeEquivalent": "edit.stop",
      "status": "partial",
      "note": "edit.stop(cancel) commits or discards an open editor from your own code, and edit.start opens one, so closing an edit is something you can drive rather than only configure.",
      "docsUrl": "/docs/api/editing/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "rowSelection",
      "agScope": "gridOptions",
      "latticeEquivalent": "selection",
      "status": "direct",
      "note": "The object form takes mode plus checkbox, headerCheckbox, checkboxOnly, groupSelectsChildren, ranges and fillHandle. A bare 'single', 'multiple' or 'none' is accepted as shorthand.",
      "docsUrl": "/docs/api/editing/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/row-selection/",
      "legacyAgOption": "rowSelection: 'single' | 'multiple'"
    },
    {
      "agOption": "rowSelection.enableClickSelection",
      "agScope": "gridOptions",
      "latticeEquivalent": "selection.checkboxOnly",
      "status": "direct",
      "note": "Set checkboxOnly and only the checkbox column changes selection, so a row whose click opens a record no longer selects it as well.",
      "docsUrl": "/docs/api/editing/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/row-selection/",
      "legacyAgOption": "suppressRowClickSelection"
    },
    {
      "agOption": "rowSelection.checkboxes",
      "agScope": "colDef",
      "latticeEquivalent": "selection.checkbox",
      "status": "direct",
      "note": "The grid generates the checkbox column rather than you declaring it on a column, so it is never exported and never appears in the tool panel.",
      "docsUrl": "/docs/api/editing/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/row-selection/",
      "legacyAgOption": "checkboxSelection"
    },
    {
      "agOption": "rowSelection.headerCheckbox",
      "agScope": "colDef",
      "latticeEquivalent": "selection.headerCheckbox",
      "status": "direct",
      "note": "A tri-state select-all in the checkbox column heading.",
      "docsUrl": "/docs/api/editing/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/row-selection/",
      "legacyAgOption": "headerCheckboxSelection"
    },
    {
      "agOption": "rowSelection.groupSelects: 'descendants'",
      "agScope": "gridOptions",
      "latticeEquivalent": "selection.groupSelectsChildren",
      "status": "direct",
      "note": "Selecting a group selects the rows beneath it.",
      "docsUrl": "/docs/analytics/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/row-selection/",
      "legacyAgOption": "groupSelectsChildren"
    },
    {
      "agOption": "rowSelection.groupSelects: 'filteredDescendants'",
      "agScope": "gridOptions",
      "latticeEquivalent": "selection.groupSelectsFiltered",
      "status": "direct",
      "note": "Extend that cascade to children the filters exclude.",
      "docsUrl": "/docs/analytics/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/row-selection/",
      "legacyAgOption": "groupSelectsFiltered"
    },
    {
      "agOption": "cellSelection",
      "agScope": "gridOptions",
      "latticeEquivalent": "selection.ranges",
      "status": "direct",
      "note": "Rectangular cell ranges by drag and by Shift with an arrow key. On unless selection is none, and an explicit true brings it back.",
      "docsUrl": "/docs/api/editing/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/row-selection/",
      "legacyAgOption": "enableRangeSelection"
    },
    {
      "agOption": "cellSelection.handle",
      "agScope": "gridOptions",
      "latticeEquivalent": "selection.fillHandle",
      "status": "direct",
      "note": "The drag handle at the corner of a range, and the fill it performs.",
      "docsUrl": "/docs/api/editing/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/row-selection/",
      "legacyAgOption": "enableFillHandle"
    },
    {
      "agOption": "api.getSelectedRows",
      "agScope": "gridApi",
      "latticeEquivalent": "selection.rows",
      "status": "direct",
      "note": "selection.keys() gives the keys, selection.all() includes rows the filters currently hide.",
      "docsUrl": "/docs/api/editing/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-api/"
    },
    {
      "agOption": "api.selectAll",
      "agScope": "gridApi",
      "latticeEquivalent": "selection.set",
      "status": "partial",
      "note": "Replace the selection with the keys you pass; selection.clear() empties it.",
      "docsUrl": "/docs/api/editing/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-api/"
    },
    {
      "agOption": "sortable",
      "agScope": "colDef",
      "latticeEquivalent": "sort.enabled",
      "status": "direct",
      "note": "Whether the column can be sorted.",
      "docsUrl": "/docs/sorting-and-filtering/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/row-sorting/"
    },
    {
      "agOption": "sort",
      "agScope": "colDef",
      "latticeEquivalent": "sort.direction",
      "status": "direct",
      "note": "The direction the column starts in.",
      "docsUrl": "/docs/sorting-and-filtering/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/row-sorting/"
    },
    {
      "agOption": "sortIndex",
      "agScope": "colDef",
      "latticeEquivalent": "sort.order",
      "status": "direct",
      "note": "This column's place in a multi-column sort, lowest first.",
      "docsUrl": "/docs/sorting-and-filtering/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/row-sorting/"
    },
    {
      "agOption": "defaultColDef.sortingOrder",
      "agScope": "gridOptions",
      "latticeEquivalent": "none",
      "status": "none",
      "note": "The cycle a header click steps through is the grid's. Set the order you want through sort.set() from a control of your own.",
      "docsUrl": "/docs/sorting-and-filtering/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/row-sorting/",
      "legacyAgOption": "sortingOrder"
    },
    {
      "agOption": "api.applyColumnState (sort)",
      "agScope": "gridApi",
      "latticeEquivalent": "sort.set",
      "status": "direct",
      "note": "An array of { col, dir } entries, in priority order, so one call sets a multi-column sort.",
      "docsUrl": "/docs/api/filtering-and-sorting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-api/"
    },
    {
      "agOption": "filter",
      "agScope": "colDef",
      "latticeEquivalent": "filter.enabled",
      "status": "direct",
      "note": "Turn the column's filter on or off. The filter a column offers follows its data type.",
      "docsUrl": "/docs/sorting-and-filtering/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "filterParams",
      "agScope": "colDef",
      "latticeEquivalent": "filter.props",
      "status": "direct",
      "note": "Options passed to that column's filter.",
      "docsUrl": "/docs/sorting-and-filtering/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "floatingFilter",
      "agScope": "colDef",
      "latticeEquivalent": "filterRow",
      "status": "direct",
      "note": "filterRow draws one inline filter cell per column under the headings, and a column opts out with its own filterRow: false.",
      "docsUrl": "/docs/sorting-and-filtering/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "api.getFilterModel",
      "agScope": "gridApi",
      "latticeEquivalent": "filters.get",
      "status": "partial",
      "note": "Filters read back as one condition tree whatever set them, a header popup, the tool panel or your code.",
      "docsUrl": "/docs/api/filtering-and-sorting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-api/"
    },
    {
      "agOption": "api.setFilterModel",
      "agScope": "gridApi",
      "latticeEquivalent": "filters.set",
      "status": "partial",
      "note": "The condition tree is a published shape with a named operator per condition. An operator outside the published list is refused and named in a warning rather than quietly passing every row.",
      "docsUrl": "/docs/api/filtering-and-sorting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-api/"
    },
    {
      "agOption": "quickFilterText",
      "agScope": "gridOptions",
      "latticeEquivalent": "quickFilterText",
      "status": "direct",
      "note": "The opening quick-filter term; filters.quick(text) sets it afterwards, in contains, words, fuzzy or regex mode.",
      "docsUrl": "/docs/sorting-and-filtering/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "isExternalFilterPresent",
      "agScope": "gridOptions",
      "latticeEquivalent": "filters.where",
      "status": "direct",
      "note": "Registering a named predicate is what makes it present, so there is no second flag to keep in step.",
      "docsUrl": "/docs/api/filtering-and-sorting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/filter-external/"
    },
    {
      "agOption": "doesExternalFilterPass",
      "agScope": "gridOptions",
      "latticeEquivalent": "filters.where",
      "status": "direct",
      "note": "The predicate you pass to filters.where(name, fn) receives the row. Several are in force at once under their own names.",
      "docsUrl": "/docs/api/filtering-and-sorting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/filter-external/"
    },
    {
      "agOption": "api.onFilterChanged",
      "agScope": "gridApi",
      "latticeEquivalent": "filters.reapply",
      "status": "direct",
      "note": "Declare deps and the grid re-runs the predicate when those columns change; call filters.reapply(name) when something it reads outside the grid changes, such as a rate table arriving.",
      "docsUrl": "/docs/api/filtering-and-sorting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/filter-external/"
    },
    {
      "agOption": "no application-wide defaults (defaultColDef is per grid)",
      "agScope": "concept",
      "latticeEquivalent": "defaults() and columnDefaults",
      "status": "direct",
      "note": "Set a house configuration once and every grid built afterwards inherits it, merged beneath whatever that grid sets for itself, which always wins. defaults() reads what is in force and defaults(null) clears it. Per-column defaults stay on the grid, as columnDefaults.",
      "docsUrl": "/docs/api/adapters/#wrapping-creategrid",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "doesExternalFilterPass on a server-backed grid",
      "agScope": "concept",
      "latticeEquivalent": "filters.where",
      "status": "partial",
      "note": "A function cannot travel to a server. Give the predicate a condition twin and the source narrows the fetch itself; the grid says so rather than quietly narrowing nothing.",
      "docsUrl": "/docs/pushdown/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/filter-external/"
    },
    {
      "agOption": "rowGroup",
      "agScope": "colDef",
      "latticeEquivalent": "group.enabled",
      "status": "direct",
      "note": "Group the rows by this column.",
      "docsUrl": "/docs/analytics/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "rowGroupIndex",
      "agScope": "colDef",
      "latticeEquivalent": "group.index",
      "status": "direct",
      "note": "Where this column sits in the grouping order.",
      "docsUrl": "/docs/analytics/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "rowGroupPanelShow",
      "agScope": "gridOptions",
      "latticeEquivalent": "groupPanel",
      "status": "direct",
      "note": "A drag-and-drop strip above the headings, with removable and reorderable chips, operable from the keyboard.",
      "docsUrl": "/docs/analytics/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "groupDefaultExpanded",
      "agScope": "gridOptions",
      "latticeEquivalent": "groupDefaultExpanded",
      "status": "direct",
      "note": "True opens every group, a number opens the first levels, a predicate answers per group.",
      "docsUrl": "/docs/analytics/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "groupRowRenderer",
      "agScope": "gridOptions",
      "latticeEquivalent": "groupRenderer",
      "status": "direct",
      "note": "Draw the group row yourself, as one band across the columns.",
      "docsUrl": "/docs/analytics/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "groupTotalRow",
      "agScope": "gridOptions",
      "latticeEquivalent": "groupFooter",
      "status": "direct",
      "note": "A closing total row per group.",
      "docsUrl": "/docs/analytics/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/",
      "legacyAgOption": "groupIncludeFooter"
    },
    {
      "agOption": "grandTotalRow",
      "agScope": "gridOptions",
      "latticeEquivalent": "grandTotalRow",
      "status": "direct",
      "note": "Inline at the end, or pinned above the status bar.",
      "docsUrl": "/docs/analytics/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "suppressAggFuncInHeader",
      "agScope": "gridOptions",
      "latticeEquivalent": "showTotalInHeader",
      "status": "direct",
      "note": "Set showTotalInHeader: false to keep the reduction out of the heading.",
      "docsUrl": "/docs/analytics/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "aggFunc",
      "agScope": "colDef",
      "latticeEquivalent": "total",
      "status": "direct",
      "note": "One property drives the group row, the tree node, the pivot cell and the grand total. Split it with groupTotal and grandTotal where the subtotals and the grand total should reduce differently.",
      "docsUrl": "/docs/analytics/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "aggFuncs",
      "agScope": "gridOptions",
      "latticeEquivalent": "totalFns",
      "status": "direct",
      "note": "Reductions of your own, addressable by name from a column.",
      "docsUrl": "/docs/analytics/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "pivotMode",
      "agScope": "gridOptions",
      "latticeEquivalent": "pivot",
      "status": "direct",
      "note": "The object form carries the totals group, its label and a column ceiling that reports rather than locking the browser.",
      "docsUrl": "/docs/analytics/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "pivot",
      "agScope": "colDef",
      "latticeEquivalent": "pivot.enabled",
      "status": "direct",
      "note": "Pivot by this column.",
      "docsUrl": "/docs/analytics/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "treeData",
      "agScope": "gridOptions",
      "latticeEquivalent": "tree",
      "status": "direct",
      "note": "tree: { path } for a path per row, or { parentKey } for a parent reference.",
      "docsUrl": "/docs/tree-data/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "getDataPath",
      "agScope": "gridOptions",
      "latticeEquivalent": "tree",
      "status": "direct",
      "note": "The path key names the field holding each row's path.",
      "docsUrl": "/docs/tree-data/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "masterDetail",
      "agScope": "gridOptions",
      "latticeEquivalent": "detail",
      "status": "direct",
      "note": "A master row expands into a nested grid, inline or into an element you supply.",
      "docsUrl": "/docs/tree-data/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "detailCellRendererParams",
      "agScope": "gridOptions",
      "latticeEquivalent": "detail",
      "status": "direct",
      "note": "The detail block carries rows, config, render, isMaster, height and where to put it.",
      "docsUrl": "/docs/tree-data/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "isFullWidthRow",
      "agScope": "gridOptions",
      "latticeEquivalent": "fullWidth",
      "status": "direct",
      "note": "fullWidth: { when, render } picks the rows and fills them.",
      "docsUrl": "/docs/api/presenting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "fullWidthCellRenderer",
      "agScope": "gridOptions",
      "latticeEquivalent": "fullWidth",
      "status": "direct",
      "note": "The render half of the same option.",
      "docsUrl": "/docs/api/presenting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "autoGroupColumnDef",
      "agScope": "gridOptions",
      "latticeEquivalent": "groupRenderer",
      "status": "partial",
      "note": "There is no separate generated group column to configure. Draw the group row with groupRenderer, and the sticky group headings and the group panel are configured on the grid.",
      "docsUrl": "/docs/analytics/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "pinnedTopRowData",
      "agScope": "gridOptions",
      "latticeEquivalent": "pinnedTopRows",
      "status": "direct",
      "note": "Held above the scrolling body, and outside the data: not counted, sorted, filtered or exported.",
      "docsUrl": "/docs/api/presenting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "pinnedBottomRowData",
      "agScope": "gridOptions",
      "latticeEquivalent": "pinnedBottomRows",
      "status": "direct",
      "note": "The same below the body, under the grand total when both are shown.",
      "docsUrl": "/docs/api/presenting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "rowNumbers",
      "agScope": "gridOptions",
      "latticeEquivalent": "rowNumbers",
      "status": "direct",
      "note": "A row-number column the grid generates, numbering the rows as they are displayed, after sort, filter and grouping. Read-only, and out of an export unless you ask for it.",
      "docsUrl": "/docs/api/presenting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "pagination",
      "agScope": "gridOptions",
      "latticeEquivalent": "pagination",
      "status": "direct",
      "note": "A window over the rows the query already produced, so a page change costs a repaint and nothing more.",
      "docsUrl": "/docs/api/rows-and-sources/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "paginationPageSize",
      "agScope": "gridOptions",
      "latticeEquivalent": "pagination.set",
      "status": "direct",
      "note": "pagination.set({ pageSize }) moves it at run time; pageSize: 0 shows everything.",
      "docsUrl": "/docs/api/rows-and-sources/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "rowBuffer",
      "agScope": "gridOptions",
      "latticeEquivalent": "overscan",
      "status": "direct",
      "note": "How many rows are drawn beyond the viewport.",
      "docsUrl": "/docs/large-data/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "suppressColumnVirtualisation",
      "agScope": "gridOptions",
      "latticeEquivalent": "columnVirtualisationAbove",
      "status": "partial",
      "note": "Columns virtualise above a column count you set rather than being switched off outright.",
      "docsUrl": "/docs/large-data/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "api.applyTransaction",
      "agScope": "gridApi",
      "latticeEquivalent": "rows.apply",
      "status": "direct",
      "note": "Add, update and remove in one transaction, keyed on rowKey. rows.queue() batches a high-frequency feed into the next frame.",
      "docsUrl": "/docs/api/rows-and-sources/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-api/"
    },
    {
      "agOption": "api.applyTransactionAsync",
      "agScope": "gridApi",
      "latticeEquivalent": "rows.queue",
      "status": "direct",
      "note": "Batches the change into the next frame instead of applying it at once.",
      "docsUrl": "/docs/api/rows-and-sources/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-api/"
    },
    {
      "agOption": "api.setGridOption('rowData', rows)",
      "agScope": "gridApi",
      "latticeEquivalent": "rows.load",
      "status": "direct",
      "note": "Replaces the data and keeps the view: sort, filters, grouping and column layout survive.",
      "docsUrl": "/docs/api/rows-and-sources/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-api/"
    },
    {
      "agOption": "api.setGridOption",
      "agScope": "gridApi",
      "latticeEquivalent": "grid.set",
      "status": "direct",
      "note": "grid.set(key, value) writes one configuration key at run time, grid.setAll(values) several.",
      "docsUrl": "/docs/api/platform/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-api/"
    },
    {
      "agOption": "api.refreshCells",
      "agScope": "gridApi",
      "latticeEquivalent": "rows.refresh",
      "status": "direct",
      "note": "Re-runs computed values and repaints, without re-running sort, filter or grouping. Narrow it to the rows and columns you mean.",
      "docsUrl": "/docs/api/rows-and-sources/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-api/"
    },
    {
      "agOption": "api.redrawRows",
      "agScope": "gridApi",
      "latticeEquivalent": "rows.refresh",
      "status": "partial",
      "note": "One method covers both: pass force to recompute a cached value as well as repaint.",
      "docsUrl": "/docs/api/rows-and-sources/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-api/"
    },
    {
      "agOption": "rowDragManaged",
      "agScope": "gridOptions",
      "latticeEquivalent": "rowReorder",
      "status": "partial",
      "note": "Dragging a handle or Alt and Shift with an arrow key reorders rows. It is refused, with the reason announced, while a sort, filter or grouping is in force, because the order you would be dragging into is not the order stored.",
      "docsUrl": "/docs/api/editing/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "rowDrag",
      "agScope": "colDef",
      "latticeEquivalent": "rowReorder.column",
      "status": "direct",
      "note": "Name the column the handle sits in; otherwise it goes in the first visible column.",
      "docsUrl": "/docs/api/editing/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "alignedGrids",
      "agScope": "gridOptions",
      "latticeEquivalent": "alignedGrids",
      "status": "direct",
      "note": "Widths, order, visibility, pinning and horizontal scroll are shared; sort, filters, selection and rows stay independent.",
      "docsUrl": "/docs/api/presenting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "rowModelType: 'clientSide'",
      "agScope": "gridOptions",
      "latticeEquivalent": "source",
      "status": "direct",
      "note": "The default. Every row is present and the grid filters, sorts, groups and totals it.",
      "docsUrl": "/docs/sources/memory/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "rowModelType: 'infinite'",
      "agScope": "gridOptions",
      "latticeEquivalent": "source",
      "status": "partial",
      "note": "source: { mode: 'paged', fetch } fetches a block at a time over a flat list, with sort and filter handed to the server.",
      "docsUrl": "/docs/sources/paged/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/infinite-scrolling/"
    },
    {
      "agOption": "rowModelType: 'serverSide'",
      "agScope": "gridOptions",
      "latticeEquivalent": "source",
      "status": "partial",
      "note": "source: { mode: 'remote', fetch } asks the server for a window and pushes sort, filter, grouping, pivot and totals to it. The request is a published shape, so a server targets it rather than guessing.",
      "docsUrl": "/docs/sources/remote/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/server-side-model/"
    },
    {
      "agOption": "serverSideDatasource",
      "agScope": "gridOptions",
      "latticeEquivalent": "fetch",
      "status": "partial",
      "note": "One fetch function answers one block and returns the rows and, when it knows it, the total.",
      "docsUrl": "/docs/sources/remote/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/server-side-model/"
    },
    {
      "agOption": "cacheBlockSize",
      "agScope": "gridOptions",
      "latticeEquivalent": "pageSize",
      "status": "direct",
      "note": "How many rows come back per block.",
      "docsUrl": "/docs/sources/remote/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/server-side-model/"
    },
    {
      "agOption": "maxBlocksInCache",
      "agScope": "gridOptions",
      "latticeEquivalent": "maxCachedPages",
      "status": "direct",
      "note": "How many blocks are kept before the least recently used ones are dropped.",
      "docsUrl": "/docs/sources/remote/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/server-side-model/"
    },
    {
      "agOption": "rowModelType: 'viewport'",
      "agScope": "gridOptions",
      "latticeEquivalent": "source",
      "status": "different-by-design",
      "note": "A feed that pushes rows is a stream: source: { mode: 'stream', connect } renders as rows land, with a sliding window by count or by age so an overnight feed cannot grow without bound.",
      "docsUrl": "/docs/sources/stream/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "Server-side pivot and group wiring",
      "agScope": "concept",
      "latticeEquivalent": "createPushdownSource",
      "status": "partial",
      "note": "A pushdown adapter turns the grid's request into what your engine speaks. The adapter declares what it can answer, the rest is finished in the browser, and lastPlan() reports the split.",
      "docsUrl": "/docs/pushdown/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/server-side-model/"
    },
    {
      "agOption": "sideBar",
      "agScope": "gridOptions",
      "latticeEquivalent": "toolPanel",
      "status": "partial",
      "note": "One side dock with the panels you name: columns, filters, views, quick, formatting, statistics, regression.",
      "docsUrl": "/docs/api/presenting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "statusBar",
      "agScope": "gridOptions",
      "latticeEquivalent": "statusBar",
      "status": "direct",
      "note": "Composable panels along the bottom, each silent when it has nothing to report.",
      "docsUrl": "/docs/api/presenting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "getContextMenuItems",
      "agScope": "gridOptions",
      "latticeEquivalent": "contextMenu",
      "status": "direct",
      "note": "The function form receives the defaults and returns the items you want. contextMenu: false suppresses it, which is what a read-only grid wants.",
      "docsUrl": "/docs/api/editing/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "getMainMenuItems",
      "agScope": "gridOptions",
      "latticeEquivalent": "columnMenu",
      "status": "direct",
      "note": "The same shape for the heading menu.",
      "docsUrl": "/docs/api/editing/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "suppressContextMenu",
      "agScope": "gridOptions",
      "latticeEquivalent": "contextMenu",
      "status": "direct",
      "note": "contextMenu: false, and a column may suppress its own.",
      "docsUrl": "/docs/api/editing/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "suppressMenuHide",
      "agScope": "gridOptions",
      "latticeEquivalent": "headerControls",
      "status": "direct",
      "note": "AG Grid deprecated this in favour of suppressHeaderMenuButton on the column. headerControls: 'always' keeps the sort, filter and menu controls visible instead of revealing them on hover.",
      "docsUrl": "/docs/columns/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "suppressHeaderMenuButton",
      "agScope": "colDef",
      "latticeEquivalent": "headerControls",
      "status": "direct",
      "note": "'hidden' draws no controls but keeps a sort badge on a sorted column; 'none' shows the title alone.",
      "docsUrl": "/docs/columns/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/column-properties/"
    },
    {
      "agOption": "overlayLoadingTemplate",
      "agScope": "gridOptions",
      "latticeEquivalent": "overlay",
      "status": "partial",
      "note": "grid.overlay puts your own content over the grid, so a loading or empty state is markup you control rather than a template string.",
      "docsUrl": "/docs/api/presenting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "overlayNoRowsTemplate",
      "agScope": "gridOptions",
      "latticeEquivalent": "overlay",
      "status": "partial",
      "note": "The same surface covers the empty state.",
      "docsUrl": "/docs/api/presenting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "domLayout: 'autoHeight'",
      "agScope": "gridOptions",
      "latticeEquivalent": "none",
      "status": "none",
      "note": "The grid fills the element it is mounted in, so size that element. autoHeight in Lattice sizes rows to their content, which is a different thing.",
      "docsUrl": "/docs/api/presenting/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "rowHeight",
      "agScope": "gridOptions",
      "latticeEquivalent": "rowHeight",
      "status": "direct",
      "note": "A number, or a function for variable-height rows. density sets every geometry token at once if you would rather not pick pixels.",
      "docsUrl": "/docs/theming/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "getRowHeight",
      "agScope": "gridOptions",
      "latticeEquivalent": "rowHeight",
      "status": "direct",
      "note": "The function form of the same key.",
      "docsUrl": "/docs/theming/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "headerHeight",
      "agScope": "gridOptions",
      "latticeEquivalent": "headerHeight",
      "status": "direct",
      "note": "Per header row.",
      "docsUrl": "/docs/theming/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "suppressCellFocus",
      "agScope": "gridOptions",
      "latticeEquivalent": "none",
      "status": "different-by-design",
      "note": "The focused cell stays visible: keyboard operation and what a screen reader announces both depend on it. For a plainer read-only look, showColumnFunctions: false leaves each heading as its label.",
      "docsUrl": "/docs/columns/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "theme",
      "agScope": "gridOptions",
      "latticeEquivalent": "theme",
      "status": "partial",
      "note": "Four themes ship, light, dark, high-contrast and terminal, and everything else is CSS custom properties on the grid root. AG Grid's theming API is the deeper one.",
      "docsUrl": "/docs/theming/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/themes/",
      "legacyAgOption": "ag-theme-quartz and the other theme classes"
    },
    {
      "agOption": "api.exportDataAsCsv",
      "agScope": "gridApi",
      "latticeEquivalent": "export.csv",
      "status": "direct",
      "note": "Fields are sanitised against formula injection on the way out.",
      "docsUrl": "/docs/export/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-api/"
    },
    {
      "agOption": "api.exportDataAsExcel",
      "agScope": "gridApi",
      "latticeEquivalent": "export.excel",
      "status": "direct",
      "note": "A real xlsx file, written without a spreadsheet dependency, and large exports stream. Included rather than sold separately.",
      "docsUrl": "/docs/export/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-api/"
    },
    {
      "agOption": "processCellForClipboard",
      "agScope": "gridOptions",
      "latticeEquivalent": "export.clipboard",
      "status": "partial",
      "note": "Copy writes tab-separated text; the grid's own paste parser is its counterpart, and a bulk paste can show a confirm-and-cancel preview first.",
      "docsUrl": "/docs/export/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "excelStyles",
      "agScope": "gridOptions",
      "latticeEquivalent": "column.export",
      "status": "different-by-design",
      "note": "A column declares what its exported value is; a data type declares how it reaches a spreadsheet, so a time or a duration stays numeric and still sorts in the sheet. Sheet styling is AG Grid's deeper surface.",
      "docsUrl": "/docs/export/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-options/"
    },
    {
      "agOption": "api.getState",
      "agScope": "gridApi",
      "latticeEquivalent": "state.get",
      "status": "direct",
      "note": "One serialisable object: columns, order, filters, quick text, sort, grouping, pivot, expansion, selection, scroll and paging.",
      "docsUrl": "/docs/api/export-and-state/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-state/"
    },
    {
      "agOption": "api.applyColumnState (column state)",
      "agScope": "gridApi",
      "latticeEquivalent": "state.apply",
      "status": "partial",
      "note": "One call restores a whole view and reports what it could not apply, such as a column that no longer exists, rather than failing silently.",
      "docsUrl": "/docs/api/export-and-state/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-state/"
    },
    {
      "agOption": "LicenseManager.setLicenseKey",
      "agScope": "edition",
      "latticeEquivalent": "licence",
      "status": "partial",
      "note": "A signed key set in configuration or through grid.licence.set(). It is checked offline and unlocks nothing, because nothing is locked: the key removes the trial watermark.",
      "docsUrl": "/docs/licensing/",
      "agDocsUrl": "https://www.ag-grid.com/license-pricing/"
    },
    {
      "agOption": "Enterprise modules",
      "agScope": "edition",
      "latticeEquivalent": "none",
      "status": "different-by-design",
      "note": "There is no feature tier. Grouping, pivot, tree data, master detail, range selection, Excel export, charts, the board, the Gantt, KPI tiles and statistics are all in the package you install.",
      "docsUrl": "/docs/licensing/",
      "agDocsUrl": "https://www.ag-grid.com/license-pricing/"
    },
    {
      "agOption": "Community edition",
      "agScope": "edition",
      "latticeEquivalent": "none",
      "status": "different-by-design",
      "note": "There is no free tier. AG Grid has one, and for a project that needs nothing beyond it that is the cheaper answer.",
      "docsUrl": "/docs/licensing/",
      "agDocsUrl": "https://www.ag-grid.com/license-pricing/"
    },
    {
      "agOption": "onGridReady",
      "agScope": "event",
      "latticeEquivalent": "ready",
      "status": "direct",
      "note": "Fires once, on the frame after the grid is built, with every API on it ready to call.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onCellValueChanged",
      "agScope": "event",
      "latticeEquivalent": "cell:changed",
      "status": "direct",
      "note": "A cell value was written by an edit, a revert, or an undo or redo step.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onCellClicked",
      "agScope": "event",
      "latticeEquivalent": "cell:clicked",
      "status": "direct",
      "note": "Primary button, single click.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onCellDoubleClicked",
      "agScope": "event",
      "latticeEquivalent": "cell:dblclicked",
      "status": "direct",
      "note": "",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onCellContextMenu",
      "agScope": "event",
      "latticeEquivalent": "cell:contextmenu",
      "status": "direct",
      "note": "Raised by the pointer and by the keyboard menu key.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onCellMouseOver",
      "agScope": "event",
      "latticeEquivalent": "cell:mouseover",
      "status": "direct",
      "note": "The pointer entered a cell. Crossing between two children of one cell is not a re-entry.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onCellMouseOut",
      "agScope": "event",
      "latticeEquivalent": "cell:mouseout",
      "status": "direct",
      "note": "The pointer left a cell, under the same rule.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onCellMouseDown",
      "agScope": "event",
      "latticeEquivalent": "cell:mousedown",
      "status": "direct",
      "note": "A button was pressed on a cell, before any click is resolved.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onRowClicked",
      "agScope": "event",
      "latticeEquivalent": "row:clicked",
      "status": "direct",
      "note": "Raised alongside the cell event for the cell under the pointer.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onRowDoubleClicked",
      "agScope": "event",
      "latticeEquivalent": "row:dblclicked",
      "status": "direct",
      "note": "",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onCellEditingStarted",
      "agScope": "event",
      "latticeEquivalent": "cell:edit:start",
      "status": "direct",
      "note": "An editor opened, by double click, by Enter, or by typing.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onCellEditingStopped",
      "agScope": "event",
      "latticeEquivalent": "cell:edit:end",
      "status": "direct",
      "note": "The payload says whether it committed, was cancelled, or was refused by validation.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onRowEditingStarted",
      "agScope": "event",
      "latticeEquivalent": "row:edit:start",
      "status": "direct",
      "note": "The whole-row counterpart.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onRowEditingStopped",
      "agScope": "event",
      "latticeEquivalent": "row:edit:end",
      "status": "direct",
      "note": "The whole-row counterpart.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onSelectionChanged",
      "agScope": "event",
      "latticeEquivalent": "selection:changed",
      "status": "direct",
      "note": "",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onCellSelectionChanged",
      "agScope": "event",
      "latticeEquivalent": "range:changed",
      "status": "direct",
      "note": "",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/",
      "legacyAgOption": "onRangeSelectionChanged"
    },
    {
      "agOption": "onSortChanged",
      "agScope": "event",
      "latticeEquivalent": "sort:changed",
      "status": "direct",
      "note": "Raised whether a header click or your code changed it.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onFilterChanged",
      "agScope": "event",
      "latticeEquivalent": "filter:changed",
      "status": "direct",
      "note": "Covers a condition, the quick filter text and a named predicate.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onRowGroupOpened",
      "agScope": "event",
      "latticeEquivalent": "group:toggled",
      "status": "direct",
      "note": "One group, one branch, or all of them at once.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onColumnResized",
      "agScope": "event",
      "latticeEquivalent": "column:resized",
      "status": "direct",
      "note": "",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onColumnMoved",
      "agScope": "event",
      "latticeEquivalent": "column:moved",
      "status": "direct",
      "note": "",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onColumnVisible",
      "agScope": "event",
      "latticeEquivalent": "column:visible",
      "status": "direct",
      "note": "",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onColumnPinned",
      "agScope": "event",
      "latticeEquivalent": "column:pinned",
      "status": "direct",
      "note": "",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onColumnRowGroupChanged",
      "agScope": "event",
      "latticeEquivalent": "column:grouped",
      "status": "direct",
      "note": "Which columns the rows are grouped by changed.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onColumnPivotChanged",
      "agScope": "event",
      "latticeEquivalent": "column:pivoted",
      "status": "direct",
      "note": "",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onPaginationChanged",
      "agScope": "event",
      "latticeEquivalent": "page:changed",
      "status": "direct",
      "note": "The page or the page size moved.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onModelUpdated",
      "agScope": "event",
      "latticeEquivalent": "model:changed",
      "status": "direct",
      "note": "The display model was rebuilt, with a reason naming what did it.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onRowDataUpdated",
      "agScope": "event",
      "latticeEquivalent": "rows:changed",
      "status": "direct",
      "note": "Rows were added, updated, removed or moved.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onFirstDataRendered",
      "agScope": "event",
      "latticeEquivalent": "render:first",
      "status": "partial",
      "note": "The renderer wrote its first frame. render:done reports each later pass, what caused it and how long it took.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onGridSizeChanged",
      "agScope": "event",
      "latticeEquivalent": "size:changed",
      "status": "direct",
      "note": "The host element changed size.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onBodyScroll",
      "agScope": "event",
      "latticeEquivalent": "scroll",
      "status": "direct",
      "note": "Raised only when the offset actually moved.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onBodyScrollEnd",
      "agScope": "event",
      "latticeEquivalent": "scroll:end",
      "status": "direct",
      "note": "The last frame of a scroll gesture has been drawn.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onStateUpdated",
      "agScope": "event",
      "latticeEquivalent": "state:changed",
      "status": "direct",
      "note": "One logical change, announced once, with a cause saying whether a gesture, an apply or a reset produced it.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onRowDragEnd",
      "agScope": "event",
      "latticeEquivalent": "rowDrag:ended",
      "status": "direct",
      "note": "The payload says whether the drop is being acted on.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onPasteEnd",
      "agScope": "event",
      "latticeEquivalent": "none",
      "status": "none",
      "note": "A paste lands as ordinary cell writes, so watch cell:changed. The whole paste is one undo entry rather than one per cell, and edit.pastePreview shows a confirm-and-cancel diff before a bulk paste commits.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onFilterOpened",
      "agScope": "event",
      "latticeEquivalent": "column:filter:open",
      "status": "direct",
      "note": "The header filter affordance was activated.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onColumnMenuVisibleChanged",
      "agScope": "event",
      "latticeEquivalent": "column:menu:open",
      "status": "partial",
      "note": "Lattice raises the request to open: the payload names the column and the element to anchor the menu to. AG Grid reports that the menu became visible or hidden.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    },
    {
      "agOption": "onCellKeyDown",
      "agScope": "event",
      "latticeEquivalent": "none",
      "status": "none",
      "note": "Key handling is the grid's. Bind your own shortcuts on the host element, and use the cancellable before-events to gate what a key would do.",
      "docsUrl": "/docs/api/events/",
      "agDocsUrl": "https://www.ag-grid.com/javascript-data-grid/grid-events/"
    }
  ],
  "latticeVersion": "1.71.0"
}