{
  "name": "sv-grid documentation",
  "site": "https://svgrid.com",
  "generatedAt": "2026-06-15T09:41:27.243Z",
  "counts": {
    "pages": 195,
    "pro": 9,
    "withDemo": 72
  },
  "sections": [
    {
      "id": "",
      "title": "Overview",
      "pages": [
        "changelog.md",
        "getting-started-full.md",
        "getting-started.md",
        "why-headless.md"
      ]
    },
    {
      "id": "compliance",
      "title": "Compliance",
      "pages": [
        "compliance/audit-log.md",
        "compliance/gdpr.md",
        "compliance/hipaa.md",
        "compliance/index.md",
        "compliance/soc2.md"
      ]
    },
    {
      "id": "getting-started",
      "title": "Getting started",
      "pages": [
        "getting-started/1-install.md",
        "getting-started/2-first-grid.md",
        "getting-started/3-data-and-columns.md",
        "getting-started/4-features.md",
        "getting-started/5-theme-and-density.md",
        "getting-started/6-going-to-production.md",
        "getting-started/starters.md"
      ]
    },
    {
      "id": "help",
      "title": "Help / topic pages",
      "pages": [
        "help/accessibility.md",
        "help/agents.md",
        "help/ai-smart-paste.md",
        "help/ai.md",
        "help/api-reference.md",
        "help/api-stability.md",
        "help/architecture.md",
        "help/benchmarks.md",
        "help/browser-support.md",
        "help/charts.md",
        "help/collaboration.md",
        "help/columns-hierarchy.md",
        "help/comparison.md",
        "help/conditional-form-schema.md",
        "help/errors.md",
        "help/export.md",
        "help/glossary.md",
        "help/grouping-aggregation.md",
        "help/i18n-rtl.md",
        "help/import.md",
        "help/index.md",
        "help/llm-grounding.md",
        "help/mcp-server.md",
        "help/migrating-from-ag-grid.md",
        "help/migrating-from-devextreme.md",
        "help/migrating-from-glide.md",
        "help/migrating-from-gridjs.md",
        "help/migrating-from-handsontable.md",
        "help/migrating-from-jqxgrid.md",
        "help/migrating-from-kendo-grid.md",
        "help/migrating-from-mui-x.md",
        "help/migrating-from-primevue-datatable.md",
        "help/migrating-from-react-data-grid.md",
        "help/migrating-from-smart-grid.md",
        "help/migrating-from-svar-svelte-datagrid.md",
        "help/migrating-from-svelte-headless-table.md",
        "help/migrating-from-syncfusion.md",
        "help/migrating-from-tabulator.md",
        "help/migrating-from-tanstack-table.md",
        "help/migrating-from-ui-kit-tables.md",
        "help/migrating-from-vincjo-datatables.md",
        "help/missing-features.md",
        "help/mobile-card-view.md",
        "help/observability.md",
        "help/pivot.md",
        "help/production.md",
        "help/real-time.md",
        "help/recipes.md",
        "help/saved-views.md",
        "help/security.md",
        "help/server-side-data.md",
        "help/spreadsheet-formulas.md",
        "help/state-maintenance.md",
        "help/status-bar.md",
        "help/tailwind.md",
        "help/testing-and-quality.md",
        "help/testing.md",
        "help/tokens.md",
        "help/versioning.md",
        "help/web-components.md"
      ]
    },
    {
      "id": "help/cells",
      "title": "Cells",
      "pages": [
        "help/cells/cell-components.md",
        "help/cells/cell-data-types.md",
        "help/cells/cell-text-selection.md",
        "help/cells/conditional-formatting.md",
        "help/cells/expressions.md",
        "help/cells/getting-values.md",
        "help/cells/highlighting-changes.md",
        "help/cells/sparklines.md",
        "help/cells/styling-cells.md",
        "help/cells/text-formatting.md",
        "help/cells/tooltips.md",
        "help/cells/view-refresh.md"
      ]
    },
    {
      "id": "help/columns",
      "title": "Columns",
      "pages": [
        "help/columns/column-definitions.md",
        "help/columns/column-groups.md",
        "help/columns/column-headers.md",
        "help/columns/column-moving.md",
        "help/columns/column-pinning.md",
        "help/columns/column-sizing.md",
        "help/columns/column-spanning.md",
        "help/columns/column-state.md",
        "help/columns/custom-header-components.md",
        "help/columns/tool-panel.md",
        "help/columns/updating-definitions.md"
      ]
    },
    {
      "id": "help/editing",
      "title": "Editing",
      "pages": [
        "help/editing/edit-components.md",
        "help/editing/full-row.md",
        "help/editing/overview.md",
        "help/editing/parsing-values.md",
        "help/editing/provided-editors.md",
        "help/editing/saving-values.md",
        "help/editing/start-stop-editing.md",
        "help/editing/undo-redo.md",
        "help/editing/validation.md"
      ]
    },
    {
      "id": "help/filtering",
      "title": "Filtering",
      "pages": [
        "help/filtering/applying-filters.md",
        "help/filtering/custom-column-filters.md",
        "help/filtering/date-filter.md",
        "help/filtering/filter-api.md",
        "help/filtering/filter-conditions.md",
        "help/filtering/floating-filters.md",
        "help/filtering/number-filter.md",
        "help/filtering/overview.md",
        "help/filtering/set-filter.md",
        "help/filtering/text-filter.md"
      ]
    },
    {
      "id": "help/grouping",
      "title": "help/grouping",
      "pages": [
        "help/grouping/aggregators.md"
      ]
    },
    {
      "id": "help/rows",
      "title": "Rows",
      "pages": [
        "help/rows/accessing-rows.md",
        "help/rows/full-width-rows.md",
        "help/rows/row-data.md",
        "help/rows/row-dragging.md",
        "help/rows/row-height.md",
        "help/rows/row-pagination.md",
        "help/rows/row-pinning.md",
        "help/rows/row-sorting.md",
        "help/rows/row-spanning.md",
        "help/rows/styling-rows.md",
        "help/rows/transactions.md",
        "help/rows/tree-rows.md"
      ]
    },
    {
      "id": "help/server",
      "title": "help/server",
      "pages": [
        "help/server/server-row-model.md"
      ]
    },
    {
      "id": "help/state",
      "title": "help/state",
      "pages": [
        "help/state/named-views.md"
      ]
    },
    {
      "id": "pro",
      "title": "Pro tier",
      "pages": [
        "pro/evaluation.md",
        "pro/licensing.md",
        "pro/README.md",
        "pro/support.md"
      ]
    },
    {
      "id": "recipes",
      "title": "Recipes / cookbook",
      "pages": [
        "recipes/autosave-with-debounce.md",
        "recipes/barcode-cells.md",
        "recipes/benchmark-harness.md",
        "recipes/between-date-filter.md",
        "recipes/build-a-feature-plugin.md",
        "recipes/bulk-edit-selected-rows.md",
        "recipes/cell-renderer-patterns.md",
        "recipes/chartjs-sync.md",
        "recipes/conditional-row-coloring.md",
        "recipes/cursor-based-infinite-scroll.md",
        "recipes/custom-filter-functions.md",
        "recipes/dependent-dropdowns.md",
        "recipes/drag-drop-columns.md",
        "recipes/external-search.md",
        "recipes/form-library-bridge.md",
        "recipes/grid-state-inspector.md",
        "recipes/heatmap-cells.md",
        "recipes/index.md",
        "recipes/kanban-from-grid-data.md",
        "recipes/lazy-load-expand.md",
        "recipes/loading-data.md",
        "recipes/million-rows.md",
        "recipes/mobile-card-pivot.md",
        "recipes/multi-sheet-export.md",
        "recipes/nl-filter.md",
        "recipes/persist-column-layout-to-url.md",
        "recipes/pin-first-column.md",
        "recipes/profiling-with-fps-hud.md",
        "recipes/role-based-editing.md",
        "recipes/saved-filter-sets.md",
        "recipes/saved-views.md",
        "recipes/server-side-filter-with-tanstack-query.md",
        "recipes/smart-paste.md",
        "recipes/sparkline-cells.md",
        "recipes/submit-time-validation.md",
        "recipes/testing-your-grid.md",
        "recipes/theme-matched-export.md",
        "recipes/theme-presets.md",
        "recipes/two-grid-master-detail.md",
        "recipes/undo-redo-edits.md",
        "recipes/use-svgrid-from-react.md",
        "recipes/websocket-streaming.md"
      ]
    },
    {
      "id": "reference",
      "title": "API reference",
      "pages": [
        "reference/auto/index.md",
        "reference/auto/sv-grid-community-core.md",
        "reference/auto/sv-grid-community-svgrid-wrapper.types.md",
        "reference/auto/sv-grid-pro-ai.md",
        "reference/auto/sv-grid-pro-export.md",
        "reference/auto/sv-grid-pro-import.md",
        "reference/auto/sv-grid-pro-install.md",
        "reference/auto/sv-grid-pro-pivot.md",
        "reference/bundle-size.md",
        "reference/ColumnDef.md",
        "reference/features.md",
        "reference/headless-engine.md",
        "reference/index.md",
        "reference/pro.md",
        "reference/SvGrid.md",
        "reference/SvGridApi.md"
      ]
    }
  ],
  "pages": [
    {
      "path": "changelog.md",
      "url": "/changelog",
      "title": "Changelog",
      "summary": "The user-facing log of what shipped. Format follows Keep a Changelog 1.1.0; versioning follows Semantic Versioning.",
      "section": "",
      "tier": "community",
      "words": 873,
      "lastUpdated": "2026-06-11",
      "demoIds": []
    },
    {
      "path": "compliance/audit-log.md",
      "url": "/compliance/audit-log",
      "title": "Audit log integration",
      "summary": "A typed, tamper-evident audit trail of every user action in the grid, in under 50 lines. Pattern works for any backend - your existing audit table, Datadog logs, an immutable ledger (DynamoDB with conditional writes, AWS QLDB, Kafka), or a write-once S3 bucket.",
      "section": "compliance",
      "tier": "community",
      "words": 661,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "compliance/gdpr.md",
      "url": "/compliance/gdpr",
      "title": "GDPR + data residency",
      "summary": "sv-grid is **GDPR-neutral**: the library never transmits personal data, never stores it server-side, and never logs it. If your app is GDPR-compliant before adding sv-grid, adding sv-grid does not break that compliance.",
      "section": "compliance",
      "tier": "community",
      "words": 615,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "compliance/hipaa.md",
      "url": "/compliance/hipaa",
      "title": "HIPAA posture",
      "summary": "sv-grid is **HIPAA-neutral**: the library does not transmit, store, or process PHI on its own. If your app is HIPAA-compliant before adding sv-grid, adding sv-grid does not break that compliance.",
      "section": "compliance",
      "tier": "community",
      "words": 647,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "compliance/index.md",
      "url": "/compliance/index",
      "title": "Compliance",
      "summary": "sv-grid is a client-side UI library - **all data stays in the browser**, the library never makes a network call of its own, no telemetry phones home. The compliance story is therefore short, but because enterprise procurement asks the same questions every time, this section answers each one directly.",
      "section": "compliance",
      "tier": "community",
      "words": 463,
      "lastUpdated": "2026-06-11",
      "demoIds": []
    },
    {
      "path": "compliance/soc2.md",
      "url": "/compliance/soc2",
      "title": "SOC 2 posture",
      "summary": "sv-grid is a UI library, not a service - so it cannot itself hold a SOC 2 report. But it can sit inside a SOC 2-audited application, and the controls below describe the line where the library's responsibility ends and yours begins.",
      "section": "compliance",
      "tier": "community",
      "words": 643,
      "lastUpdated": "2026-06-11",
      "demoIds": []
    },
    {
      "path": "getting-started-full.md",
      "url": "/getting-started-full",
      "title": "Getting Started with SvGrid",
      "summary": "SvGrid is a modern, production-ready data grid for Svelte 5 - a headless core engine paired with a Svelte render component (<SvGrid>). It scales from a 10-row read-only table to a virtualized 100,000-row, 100-column editing surface with grouping, multi-column filtering, server-side data, and full keyboard and screen-reader support.",
      "section": "",
      "tier": "community",
      "words": 3330,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "getting-started.md",
      "url": "/getting-started",
      "title": "Getting started with SvGrid",
      "summary": "SvGrid is a modern, production-ready data grid for Svelte 5 - a headless core engine paired with a Svelte render component (<SvGrid>). It scales from a 10-row read-only table to a virtualized 100,000-row × 100-column editing surface with grouping, multi-column filtering, server-side data, and full keyboard and screen-reader support.",
      "section": "",
      "tier": "community",
      "words": 524,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "getting-started/1-install.md",
      "url": "/getting-started/1-install",
      "title": "1. Install",
      "summary": "SvGrid is a single npm package. There is no peer dependency on a CSS framework - bring your own, or use the default theme that ships with the render component.",
      "section": "getting-started",
      "tier": "community",
      "words": 383,
      "lastUpdated": "2026-06-11",
      "demoIds": []
    },
    {
      "path": "getting-started/2-first-grid.md",
      "url": "/getting-started/2-first-grid",
      "title": "2. First grid in 60 seconds",
      "summary": "```svelte <script lang=\"ts\"> import { SvGrid, type ColumnDef } from 'sv-grid-community'",
      "section": "getting-started",
      "tier": "community",
      "words": 294,
      "lastUpdated": "2026-06-05",
      "demoIds": [
        "01-quick-start"
      ]
    },
    {
      "path": "getting-started/3-data-and-columns.md",
      "url": "/getting-started/3-data-and-columns",
      "title": "3. Data and columns",
      "summary": "SvGrid reads two arrays: data (your rows) and columns (the column-definition list). Everything else is opt-in.",
      "section": "getting-started",
      "tier": "community",
      "words": 701,
      "lastUpdated": "2026-06-05",
      "demoIds": []
    },
    {
      "path": "getting-started/4-features.md",
      "url": "/getting-started/4-features",
      "title": "4. Features",
      "summary": "The grid engine is **feature-gated**. Out of the box you get the core row model (rows in their original order). To enable sorting, filtering, grouping, pagination, expansion, or selection, register the matching feature; the wrapper wires the matching row-model factory for you.",
      "section": "getting-started",
      "tier": "community",
      "words": 795,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "getting-started/5-theme-and-density.md",
      "url": "/getting-started/5-theme-and-density",
      "title": "5. Theme and density",
      "summary": "The render component (<SvGrid>) ships its own scoped styles. You re-theme it by declaring --sg-* CSS custom properties at any level above the grid - :root for the whole app, a wrapper <div> for one instance, or directly on the <SvGrid> element itself.",
      "section": "getting-started",
      "tier": "community",
      "words": 645,
      "lastUpdated": "2026-06-05",
      "demoIds": [
        "10-custom-cells-and-themes"
      ]
    },
    {
      "path": "getting-started/6-going-to-production.md",
      "url": "/getting-started/6-going-to-production",
      "title": "6. Going to production",
      "summary": "You have a working grid. This page is the checklist that turns it into something you'd ship.",
      "section": "getting-started",
      "tier": "community",
      "words": 802,
      "lastUpdated": "2026-06-05",
      "demoIds": [
        "09-server-side",
        "06-large-dataset",
        "17-accessibility"
      ]
    },
    {
      "path": "getting-started/starters.md",
      "url": "/getting-started/starters",
      "title": "Starters & scaffolding",
      "summary": "The fastest way to a working SvGrid app. One command scaffolds a project with the grid already wired up - no copy-paste, no config archaeology.",
      "section": "getting-started",
      "tier": "community",
      "words": 562,
      "lastUpdated": "2026-06-11",
      "demoIds": []
    },
    {
      "path": "help/accessibility.md",
      "url": "/help/accessibility",
      "title": "Accessibility",
      "summary": "SvGrid implements the WAI-ARIA 1.2 grid pattern with full keyboard navigation and a screen-reader announcement layer. This page documents exactly what the grid does, where the responsibility line sits between the library and your code, and how to verify conformance.",
      "section": "help",
      "tier": "community",
      "words": 1359,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "17-accessibility"
      ]
    },
    {
      "path": "help/agents.md",
      "url": "/help/agents",
      "title": "Build an AI agent that drives the grid",
      "summary": "This is the \"AI-native data grid\" story end-to-end. Three patterns, in order of how much agency you hand to the LLM:",
      "section": "help",
      "tier": "community",
      "words": 1248,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "help/ai-smart-paste.md",
      "url": "/help/ai-smart-paste",
      "title": "AI Smart Paste",
      "summary": "Drop any shape of contact / lead / row data into a text area - CSV, TSV, JSON, vCard, Markdown table, an email signature block, or a single line of prose - and the parser maps it into typed rows your grid can insert or merge.",
      "section": "help",
      "tier": "community",
      "words": 1230,
      "lastUpdated": "2026-06-05",
      "demoIds": [
        "75-ai-smart-paste"
      ]
    },
    {
      "path": "help/ai.md",
      "url": "/help/ai",
      "title": "AI assistant - Pro",
      "summary": "Bring a language model into your grid with four helpers that stay strictly model-agnostic: **natural-language filter**, **smart fill**, **summarise**, and **classify**. Ships in the paid **sv-grid-pro** add-on; the Community build does not include these features.",
      "section": "help",
      "tier": "pro",
      "words": 1390,
      "lastUpdated": "2026-06-09",
      "demoIds": [
        "51-ai-assistant"
      ]
    },
    {
      "path": "help/api-reference.md",
      "url": "/help/api-reference",
      "title": "API reference",
      "summary": "A flat index of every Stable export. Each entry links to the topic page that covers it in depth. For the formal TypeScript shapes, inspect the .d.ts files in node_modules/sv-grid-community/dist - they're the source of truth and ship with full JSDoc.",
      "section": "help",
      "tier": "community",
      "words": 1553,
      "lastUpdated": "2026-06-04",
      "demoIds": []
    },
    {
      "path": "help/api-stability.md",
      "url": "/help/api-stability",
      "title": "API stability & semver policy",
      "summary": "The promise SvGrid makes to you about which exports you can lean on, how breaking changes are communicated, and how long deprecated APIs stick around.",
      "section": "help",
      "tier": "community",
      "words": 1178,
      "lastUpdated": "2026-06-11",
      "demoIds": []
    },
    {
      "path": "help/architecture.md",
      "url": "/help/architecture",
      "title": "Architecture overview",
      "summary": "A one-page mental model that should let you reason about every other topic in the docs. SvGrid is a strict three-layer system - if you know which layer a piece of code lives in, you know what it can and cannot do.",
      "section": "help",
      "tier": "community",
      "words": 1020,
      "lastUpdated": "2026-06-09",
      "demoIds": []
    },
    {
      "path": "help/benchmarks.md",
      "url": "/help/benchmarks",
      "title": "Performance benchmarks",
      "summary": "Headline numbers from the regression suite. Every figure below is from the same hardware + browser configuration, re-measured on each release; the script that produces them lives in packages/sv-grid-community/scripts/bench.ts and is checked in.",
      "section": "help",
      "tier": "community",
      "words": 1252,
      "lastUpdated": "2026-06-12",
      "demoIds": [
        "06-large-dataset"
      ]
    },
    {
      "path": "help/browser-support.md",
      "url": "/help/browser-support",
      "title": "Browser & runtime support",
      "summary": "The shipping target matrix. If your environment isn't listed, assume unsupported until you've validated the linked feature surfaces below.",
      "section": "help",
      "tier": "community",
      "words": 839,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "help/cells/cell-components.md",
      "url": "/help/cells/cell-components",
      "title": "Cell components",
      "summary": "For any cell whose content is more than a string, use cell: with renderSnippet or renderComponent. <div data-docs-demo=\"10-custom-cells-and-themes\" data-height=\"540\"></div>",
      "section": "help/cells",
      "tier": "community",
      "words": 330,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "10-custom-cells-and-themes"
      ]
    },
    {
      "path": "help/cells/cell-data-types.md",
      "url": "/help/cells/cell-data-types",
      "title": "Cell data types",
      "summary": "The editorType field on a column tags the column with a type. This drives three different behaviours: <div data-docs-demo=\"01-quick-start\" data-height=\"540\"></div>",
      "section": "help/cells",
      "tier": "community",
      "words": 346,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "01-quick-start"
      ]
    },
    {
      "path": "help/cells/cell-text-selection.md",
      "url": "/help/cells/cell-text-selection",
      "title": "Cell text selection",
      "summary": "By default the grid has **cell-range selection** (drag across cells, range highlight, copy as TSV). Standard browser text-selection inside a cell is **not** the default - clicking-and-dragging across a cell creates a range selection, not a text selection. <div data-docs-demo=\"04-selection-copy-paste\" data-height=\"540\"></div>",
      "section": "help/cells",
      "tier": "community",
      "words": 252,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "04-selection-copy-paste"
      ]
    },
    {
      "path": "help/cells/conditional-formatting.md",
      "url": "/help/cells/conditional-formatting",
      "title": "Conditional formatting",
      "summary": "Conditional formatting colors a cell by its value. SvGrid ships it as a declarative engine prop, conditionalFormats, so you describe the rules once and the grid paints every cell - no per-cell cell snippet required.",
      "section": "help/cells",
      "tier": "community",
      "words": 438,
      "lastUpdated": "2026-06-13",
      "demoIds": []
    },
    {
      "path": "help/cells/expressions.md",
      "url": "/help/cells/expressions",
      "title": "Expressions",
      "summary": "SvGrid does not ship a formula / expression language for cells. Computed values are JavaScript - either via accessorFn or inside a cell callback. <div data-docs-demo=\"83-spreadsheet-formulas\" data-height=\"540\"></div>",
      "section": "help/cells",
      "tier": "community",
      "words": 246,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "83-spreadsheet-formulas"
      ]
    },
    {
      "path": "help/cells/getting-values.md",
      "url": "/help/cells/getting-values",
      "title": "Getting values",
      "summary": "You get cell values in three ways depending on context. <div data-docs-demo=\"04-selection-copy-paste\" data-height=\"540\"></div>",
      "section": "help/cells",
      "tier": "community",
      "words": 219,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "04-selection-copy-paste"
      ]
    },
    {
      "path": "help/cells/highlighting-changes.md",
      "url": "/help/cells/highlighting-changes",
      "title": "Highlighting changes",
      "summary": "There is no built-in \"flash on change\" highlight. You build it with a diff against a frozen snapshot of the data. <div data-docs-demo=\"11-stock-market\" data-height=\"540\"></div>",
      "section": "help/cells",
      "tier": "community",
      "words": 264,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "11-stock-market"
      ]
    },
    {
      "path": "help/cells/sparklines.md",
      "url": "/help/cells/sparklines",
      "title": "Sparklines",
      "summary": "A sparkline is a tiny, word-sized chart drawn inside a single cell. SvGrid renders them as a first-class column type: set sparkline on a column whose value is an array of numbers and the grid paints an inline SVG. No chart library, no custom cell snippet.",
      "section": "help/cells",
      "tier": "community",
      "words": 437,
      "lastUpdated": "2026-06-13",
      "demoIds": []
    },
    {
      "path": "help/cells/styling-cells.md",
      "url": "/help/cells/styling-cells",
      "title": "Styling cells",
      "summary": "Cells render as <td> and pick up the same CSS variable tokens as the rest of the grid. <div data-docs-demo=\"62-conditional-styling\" data-height=\"540\"></div>",
      "section": "help/cells",
      "tier": "community",
      "words": 341,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "62-conditional-styling"
      ]
    },
    {
      "path": "help/cells/text-formatting.md",
      "url": "/help/cells/text-formatting",
      "title": "Text formatting",
      "summary": "The format field on a column produces locale-aware formatted strings without you writing a renderer. <div data-docs-demo=\"13-finances\" data-height=\"540\"></div>",
      "section": "help/cells",
      "tier": "community",
      "words": 336,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "13-finances"
      ]
    },
    {
      "path": "help/cells/tooltips.md",
      "url": "/help/cells/tooltips",
      "title": "Tooltips",
      "summary": "There is no built-in tooltip API on ColumnDef. Use the standard title attribute, an accessible <dialog>, or any popover library - wired through a custom cell renderer.",
      "section": "help/cells",
      "tier": "community",
      "words": 214,
      "lastUpdated": "2026-06-05",
      "demoIds": []
    },
    {
      "path": "help/cells/view-refresh.md",
      "url": "/help/cells/view-refresh",
      "title": "View refresh",
      "summary": "The grid renders reactively - it does **not** have a refresh() method, because it doesn't need one. To make the grid re-display, change the data that drives it.",
      "section": "help/cells",
      "tier": "community",
      "words": 246,
      "lastUpdated": "2026-06-05",
      "demoIds": []
    },
    {
      "path": "help/charts.md",
      "url": "/help/charts",
      "title": "Integrated charts",
      "summary": "SvGrid can chart its own data with no external charting library. Two pieces:",
      "section": "help",
      "tier": "community",
      "words": 1306,
      "lastUpdated": "2026-06-15",
      "demoIds": []
    },
    {
      "path": "help/collaboration.md",
      "url": "/help/collaboration",
      "title": "Real-time collaboration",
      "summary": "Two people (or two AI agents) on the same grid: **presence** (who's here and where their cursor is) and **live edits** (a change in one client appears in every other). SvGrid packages this as a headless controller over a pluggable transport - the only infrastructure-specific piece.",
      "section": "help",
      "tier": "community",
      "words": 358,
      "lastUpdated": "2026-06-13",
      "demoIds": []
    },
    {
      "path": "help/columns-hierarchy.md",
      "url": "/help/columns-hierarchy",
      "title": "Columns hierarchy & manager",
      "summary": "The pattern for grids with too many columns to fit on screen at once. A side-panel \"column manager\" exposes the column tree to the user: they pick what's visible, what gets collapsed into a one-cell summary, and what order leaves appear in within each group.",
      "section": "help",
      "tier": "community",
      "words": 921,
      "lastUpdated": "2026-06-12",
      "demoIds": [
        "54-columns-hierarchy"
      ]
    },
    {
      "path": "help/columns/column-definitions.md",
      "url": "/help/columns/column-definitions",
      "title": "Column definitions",
      "summary": "A ColumnDef tells SvGrid how to read a value out of a row, how to render it, and which features apply to it. The grid below is built from a handful of ColumnDefs - look at the source to see how each shape maps to a column behaviour:",
      "section": "help/columns",
      "tier": "community",
      "words": 591,
      "lastUpdated": "2026-06-12",
      "demoIds": [
        "01-quick-start"
      ]
    },
    {
      "path": "help/columns/column-groups.md",
      "url": "/help/columns/column-groups",
      "title": "Column groups",
      "summary": "A column group is a ColumnDef whose columns array contains children. The parent renders a spanning header above its children. The pivot demo below shows three levels of grouped headers in action - Year wraps Quarter wraps measure:",
      "section": "help/columns",
      "tier": "community",
      "words": 305,
      "lastUpdated": "2026-06-05",
      "demoIds": [
        "52-pivot-table"
      ]
    },
    {
      "path": "help/columns/column-headers.md",
      "url": "/help/columns/column-headers",
      "title": "Column headers - styling & height",
      "summary": "Headers are rendered as <th> inside a <thead> with role=\"row\". Style them with regular CSS - there are no header-specific Svelte props. <div data-docs-demo=\"01-quick-start\" data-height=\"540\"></div>",
      "section": "help/columns",
      "tier": "community",
      "words": 233,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "01-quick-start"
      ]
    },
    {
      "path": "help/columns/column-moving.md",
      "url": "/help/columns/column-moving",
      "title": "Column moving (drag to reorder)",
      "summary": "There are two ways to move columns in sv-grid:",
      "section": "help/columns",
      "tier": "community",
      "words": 569,
      "lastUpdated": "2026-06-09",
      "demoIds": [
        "109-column-reorder-engine"
      ]
    },
    {
      "path": "help/columns/column-pinning.md",
      "url": "/help/columns/column-pinning",
      "title": "Column pinning",
      "summary": "Pinning sticks a column to the **left** or **right** edge of the viewport so it does not scroll horizontally with the rest.",
      "section": "help/columns",
      "tier": "community",
      "words": 666,
      "lastUpdated": "2026-06-05",
      "demoIds": [
        "25-column-pinning"
      ]
    },
    {
      "path": "help/columns/column-sizing.md",
      "url": "/help/columns/column-sizing",
      "title": "Column sizing",
      "summary": "Each column has a pixel width. The default for all columns is the grid's columnWidth prop (default ~140 px); each column can override via its width field. <div data-docs-demo=\"63-column-layout-api\" data-height=\"540\"></div>",
      "section": "help/columns",
      "tier": "community",
      "words": 385,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "63-column-layout-api"
      ]
    },
    {
      "path": "help/columns/column-spanning.md",
      "url": "/help/columns/column-spanning",
      "title": "Column spanning",
      "summary": "\"Column spanning\" lets a single body cell span across **multiple columns** - useful for full-width subtotals, group banner rows, or notes embedded inside a wide grid.",
      "section": "help/columns",
      "tier": "community",
      "words": 182,
      "lastUpdated": "2026-06-05",
      "demoIds": []
    },
    {
      "path": "help/columns/column-state.md",
      "url": "/help/columns/column-state",
      "title": "Column state",
      "summary": "\"Column state\" is the bag of per-column settings that change at runtime: visibility, width, pinning, sort, filter. SvGrid keeps these as separate state slices inside the grid instance. <div data-docs-demo=\"55-state-maintenance\" data-height=\"540\"></div>",
      "section": "help/columns",
      "tier": "community",
      "words": 418,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "55-state-maintenance"
      ]
    },
    {
      "path": "help/columns/custom-header-components.md",
      "url": "/help/columns/custom-header-components",
      "title": "Custom header components",
      "summary": "The header field on a ColumnDef accepts a function that returns either a renderSnippet(...) or renderComponent(...). The function receives a HeaderContext so it can access the column, header, and grid. <div data-docs-demo=\"10-custom-cells-and-themes\" data-height=\"540\"></div>",
      "section": "help/columns",
      "tier": "community",
      "words": 290,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "10-custom-cells-and-themes"
      ]
    },
    {
      "path": "help/columns/tool-panel.md",
      "url": "/help/columns/tool-panel",
      "title": "Columns tool panel",
      "summary": "The tool panel is the docked sidebar - standard in enterprise grids - for managing columns without hunting through a right-click menu. Turn it on with the toolPanel prop:",
      "section": "help/columns",
      "tier": "community",
      "words": 177,
      "lastUpdated": "2026-06-13",
      "demoIds": []
    },
    {
      "path": "help/columns/updating-definitions.md",
      "url": "/help/columns/updating-definitions",
      "title": "Updating column definitions",
      "summary": "There are two ways to change columns after the grid has mounted:",
      "section": "help/columns",
      "tier": "community",
      "words": 387,
      "lastUpdated": "2026-06-05",
      "demoIds": []
    },
    {
      "path": "help/comparison.md",
      "url": "/help/comparison",
      "title": "Comparison: SvGrid vs AG Grid vs TanStack Table",
      "summary": "This is the page enterprise evaluators land on first. It is honest. The three projects solve overlapping problems and the right choice depends on your stack, your budget, and which constraints bite hardest.",
      "section": "help",
      "tier": "community",
      "words": 1480,
      "lastUpdated": "2026-06-10",
      "demoIds": []
    },
    {
      "path": "help/conditional-form-schema.md",
      "url": "/help/conditional-form-schema",
      "title": "Conditional form schema",
      "summary": "A pattern for declarative field-visibility and editability rules inside a grid. Instead of writing imperative if/else checks across many cell callbacks and editable props, you declare a **schema** of when-rules per field and the grid evaluates them per row.",
      "section": "help",
      "tier": "community",
      "words": 1339,
      "lastUpdated": "2026-06-11",
      "demoIds": [
        "82-conditional-form-schema"
      ]
    },
    {
      "path": "help/editing/edit-components.md",
      "url": "/help/editing/edit-components",
      "title": "Edit components",
      "summary": "The grid ships with five inline editors. Each is selected by the column's editorType: <div data-docs-demo=\"66-custom-cell-editors\" data-height=\"540\"></div>",
      "section": "help/editing",
      "tier": "community",
      "words": 231,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "66-custom-cell-editors"
      ]
    },
    {
      "path": "help/editing/full-row.md",
      "url": "/help/editing/full-row",
      "title": "Full-row editing",
      "summary": "\"Full-row editing\" means the user opens an entire row for edit (every editable cell becomes an editor simultaneously) and commits all changes at once. <div data-docs-demo=\"40-forms-master-detail\" data-height=\"540\"></div>",
      "section": "help/editing",
      "tier": "community",
      "words": 189,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "40-forms-master-detail"
      ]
    },
    {
      "path": "help/editing/overview.md",
      "url": "/help/editing/overview",
      "title": "Editing - overview",
      "summary": "Inline editing is a single prop on <SvGrid>. Try it - double-click any cell, type to replace, hit Enter to commit. Tab moves to the next editable cell:",
      "section": "help/editing",
      "tier": "community",
      "words": 403,
      "lastUpdated": "2026-06-09",
      "demoIds": [
        "05-inline-editing"
      ]
    },
    {
      "path": "help/editing/parsing-values.md",
      "url": "/help/editing/parsing-values",
      "title": "Parsing values",
      "summary": "When the user commits an edit, the editor's DOM value (a string for text / number / date inputs, a boolean for checkboxes) is parsed by parseEditorValue into the canonical value for the column's type. <div data-docs-demo=\"24-validation\" data-height=\"540\"></div>",
      "section": "help/editing",
      "tier": "community",
      "words": 215,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "24-validation"
      ]
    },
    {
      "path": "help/editing/provided-editors.md",
      "url": "/help/editing/provided-editors",
      "title": "Provided cell editors",
      "summary": "The grid ships nine built-in editors, selected via editorType on the column definition. Each editor renders inside the cell while editing and falls back to the default text render (or your cell snippet) when the cell is read-only. <div data-docs-demo=\"26-list-chips-editors\" data-height=\"540\"></div>",
      "section": "help/editing",
      "tier": "community",
      "words": 1073,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "26-list-chips-editors"
      ]
    },
    {
      "path": "help/editing/saving-values.md",
      "url": "/help/editing/saving-values",
      "title": "Saving values",
      "summary": "When the user commits an edit, the new value is written into the grid's **internal data copy**. The grid does **not** mutate the array you passed in via the data prop - it keeps its own working copy so an undo / cancel is possible without touching your state.",
      "section": "help/editing",
      "tier": "community",
      "words": 368,
      "lastUpdated": "2026-06-04",
      "demoIds": [
        "05-inline-editing"
      ]
    },
    {
      "path": "help/editing/start-stop-editing.md",
      "url": "/help/editing/start-stop-editing",
      "title": "Start / stop editing",
      "summary": "The cell must be **focused** (the grid's active cell). Click any cell or use the arrow keys to set focus.",
      "section": "help/editing",
      "tier": "community",
      "words": 243,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "05-inline-editing"
      ]
    },
    {
      "path": "help/editing/undo-redo.md",
      "url": "/help/editing/undo-redo",
      "title": "Undo / redo",
      "summary": "There is **no built-in undo/redo stack** inside <SvGrid>. The grid emits no per-edit event for an external stack to subscribe to, so undo/redo has to be built on top of the data-snapshot approach. <div data-docs-demo=\"55-state-maintenance\" data-height=\"540\"></div>",
      "section": "help/editing",
      "tier": "community",
      "words": 325,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "55-state-maintenance"
      ]
    },
    {
      "path": "help/editing/validation.md",
      "url": "/help/editing/validation",
      "title": "Validation",
      "summary": "There is no validate(value) callback on ColumnDef today. Validation happens by intercepting committed edits and either accepting or reverting them.",
      "section": "help/editing",
      "tier": "community",
      "words": 388,
      "lastUpdated": "2026-06-05",
      "demoIds": [
        "24-validation"
      ]
    },
    {
      "path": "help/errors.md",
      "url": "/help/errors",
      "title": "Error reference",
      "summary": "Every Error thrown by sv-grid-community or sv-grid-pro with the exact message text, the trigger condition, and the fix. If a runtime message you see isn't on this list, it's coming from your own code or a peer dependency.",
      "section": "help",
      "tier": "community",
      "words": 1205,
      "lastUpdated": "2026-06-11",
      "demoIds": []
    },
    {
      "path": "help/export.md",
      "url": "/help/export",
      "title": "Data export and printing - Pro",
      "summary": "Export the grid to **Excel (xlsx)**, **PDF**, **CSV**, **TSV**, **HTML**, or open a printable view in a new window. Ships in the paid **sv-grid-pro** add-on; the Community build does not include these features.",
      "section": "help",
      "tier": "pro",
      "words": 1138,
      "lastUpdated": "2026-06-09",
      "demoIds": [
        "21-export-and-print"
      ]
    },
    {
      "path": "help/filtering/applying-filters.md",
      "url": "/help/filtering/applying-filters",
      "title": "Applying filters",
      "summary": "\"Applying\" a filter means running it against the data. SvGrid applies filters **eagerly** by default: every keystroke updates the row model and the visible rows (with a 150ms debounce inside the column menu's value input). <div data-docs-demo=\"02-sort-filter-paginate\" data-height=\"540\"></div>",
      "section": "help/filtering",
      "tier": "community",
      "words": 245,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "02-sort-filter-paginate"
      ]
    },
    {
      "path": "help/filtering/custom-column-filters.md",
      "url": "/help/filtering/custom-column-filters",
      "title": "Custom column filters",
      "summary": "When the built-in operators and the set-filter pattern are not enough, take over the filter pipeline. <div data-docs-demo=\"03-excel-filters\" data-height=\"540\"></div>",
      "section": "help/filtering",
      "tier": "community",
      "words": 317,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "03-excel-filters"
      ]
    },
    {
      "path": "help/filtering/date-filter.md",
      "url": "/help/filtering/date-filter",
      "title": "Date filter",
      "summary": "A column with editorType: 'date' (or 'datetime') gets the **date** filter operator set: equals, lessThan, greaterThan, **between**, isBlank. <div data-docs-demo=\"64-filter-between-operator\" data-height=\"540\"></div>",
      "section": "help/filtering",
      "tier": "community",
      "words": 274,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "64-filter-between-operator"
      ]
    },
    {
      "path": "help/filtering/filter-api.md",
      "url": "/help/filtering/filter-api",
      "title": "Filter API",
      "summary": "Two surfaces - pick based on whether the caller is inside or outside the component that owns the grid state. <div data-docs-demo=\"64-filter-between-operator\" data-height=\"540\"></div>",
      "section": "help/filtering",
      "tier": "community",
      "words": 305,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "64-filter-between-operator"
      ]
    },
    {
      "path": "help/filtering/filter-conditions.md",
      "url": "/help/filtering/filter-conditions",
      "title": "Filter conditions",
      "summary": "A \"filter condition\" is a (column, operator, value) triple. The grid stores filter conditions in state.columnFilters. <div data-docs-demo=\"03-excel-filters\" data-height=\"540\"></div>",
      "section": "help/filtering",
      "tier": "community",
      "words": 276,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "03-excel-filters"
      ]
    },
    {
      "path": "help/filtering/floating-filters.md",
      "url": "/help/filtering/floating-filters",
      "title": "Floating filters",
      "summary": "\"Floating filters\" are the always-visible filter inputs that sit **between** the header row and the body - same idea as a filter row, but matched per-operator to the underlying column menu. <div data-docs-demo=\"03-excel-filters\" data-height=\"540\"></div>",
      "section": "help/filtering",
      "tier": "community",
      "words": 222,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "03-excel-filters"
      ]
    },
    {
      "path": "help/filtering/number-filter.md",
      "url": "/help/filtering/number-filter",
      "title": "Number filter",
      "summary": "A column with editorType: 'number' gets the **number** filter operator set: equals, greaterThan, lessThan, **between**, isBlank. The default operator is equals. <div data-docs-demo=\"64-filter-between-operator\" data-height=\"540\"></div>",
      "section": "help/filtering",
      "tier": "community",
      "words": 257,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "64-filter-between-operator"
      ]
    },
    {
      "path": "help/filtering/overview.md",
      "url": "/help/filtering/overview",
      "title": "Filtering - overview",
      "summary": "Click any column header's filter icon to open the operator + value popover; numeric and date columns range-bucket their distinct values so the menu stays usable on big datasets:",
      "section": "help/filtering",
      "tier": "community",
      "words": 537,
      "lastUpdated": "2026-06-09",
      "demoIds": [
        "03-excel-filters"
      ]
    },
    {
      "path": "help/filtering/set-filter.md",
      "url": "/help/filtering/set-filter",
      "title": "Set filter",
      "summary": "A \"set filter\" (a.k.a. value filter, list filter) shows a checklist of all distinct values in a column and lets the user pick which to include. It's what you reach for to filter status to \"active OR pending\", or department to a few specific teams.",
      "section": "help/filtering",
      "tier": "community",
      "words": 758,
      "lastUpdated": "2026-06-09",
      "demoIds": [
        "111-set-filter-advanced"
      ]
    },
    {
      "path": "help/filtering/text-filter.md",
      "url": "/help/filtering/text-filter",
      "title": "Text filter",
      "summary": "A column with no editorType (or editorType: 'text') gets the **text** filter operator set: contains, equals, startsWith, isBlank. The default operator is contains. <div data-docs-demo=\"69-highlighted-search\" data-height=\"540\"></div>",
      "section": "help/filtering",
      "tier": "community",
      "words": 358,
      "lastUpdated": "2026-06-09",
      "demoIds": [
        "69-highlighted-search",
        "110-locale-aware-filter"
      ]
    },
    {
      "path": "help/glossary.md",
      "url": "/help/glossary",
      "title": "Glossary",
      "summary": "Terminology used across the docs and the source. Sorted A-Z. If a term is unclear in a topic page and isn't on this list, please file an issue.",
      "section": "help",
      "tier": "community",
      "words": 1173,
      "lastUpdated": "2026-06-04",
      "demoIds": []
    },
    {
      "path": "help/grouping-aggregation.md",
      "url": "/help/grouping-aggregation",
      "title": "Grouping & aggregation",
      "summary": "Roll rows up by one or more columns and compute aggregates (sum, avg, count, min, max, custom) at each group level. Powered by columnGroupingFeature plus per-column aggregator config.",
      "section": "help",
      "tier": "community",
      "words": 1090,
      "lastUpdated": "2026-06-12",
      "demoIds": [
        "07-grouping-aggregation"
      ]
    },
    {
      "path": "help/grouping/aggregators.md",
      "url": "/help/grouping/aggregators",
      "title": "Group aggregators",
      "summary": "When grouping is active, each group row can show a rolled-up value per column - the sum of revenue, the average score, the count of deals. SvGrid does this declaratively: set aggregate on a column and the group header shows the result, formatted with that column's own format.",
      "section": "help/grouping",
      "tier": "community",
      "words": 398,
      "lastUpdated": "2026-06-13",
      "demoIds": []
    },
    {
      "path": "help/i18n-rtl.md",
      "url": "/help/i18n-rtl",
      "title": "Internationalisation & RTL",
      "summary": "The grid is locale-agnostic by design: every text label is yours to translate, every formatted value goes through Intl, and right-to-left layout flips via standard CSS logical properties.",
      "section": "help",
      "tier": "community",
      "words": 1135,
      "lastUpdated": "2026-06-12",
      "demoIds": [
        "38-rtl-i18n"
      ]
    },
    {
      "path": "help/import.md",
      "url": "/help/import",
      "title": "Data import - Pro",
      "summary": "The sister to data export and printing. Read an Excel file, CSV/TSV blob, or JSON array in the browser and produce a typed preview of every parsed row - including per-cell validation errors - before any data lands in the grid. Ships in the paid **sv-grid-pro** add-on.",
      "section": "help",
      "tier": "pro",
      "words": 1406,
      "lastUpdated": "2026-06-09",
      "demoIds": [
        "53-excel-import"
      ]
    },
    {
      "path": "help/index.md",
      "url": "/help/index",
      "title": "SvGrid Help",
      "summary": "Topic-oriented documentation for SvGrid. Each page is a focused explanation of one feature with copy-paste code that runs against the shipping library - written for SvGrid, not translated from another grid.",
      "section": "help",
      "tier": "community",
      "words": 1255,
      "lastUpdated": "2026-06-12",
      "demoIds": [
        "00-trading-desk"
      ]
    },
    {
      "path": "help/llm-grounding.md",
      "url": "/help/llm-grounding",
      "title": "Use sv-grid docs as LLM context",
      "summary": "This page is the \"how do I make ChatGPT / Claude / Cursor write good sv-grid code?\" guide. Three pre-built artefacts ship with the docs specifically so models can ground themselves in current, accurate information instead of hallucinating from training data.",
      "section": "help",
      "tier": "community",
      "words": 854,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "help/mcp-server.md",
      "url": "/help/mcp-server",
      "title": "MCP server",
      "summary": "The sv-grid MCP server lets AI clients (Claude Desktop, Cursor, Zed, Continue, custom agents) query the documentation, scaffold column definitions, and preview exports - all grounded in the same schemas the library ships with. No API key required; everything runs locally against your installed copy.",
      "section": "help",
      "tier": "community",
      "words": 1051,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "help/migrating-from-ag-grid.md",
      "url": "/help/migrating-from-ag-grid",
      "title": "Migrating from AG Grid to SvGrid",
      "summary": "If you tried AG Grid on a Svelte 5 project - via ag-grid-svelte, the old ag-grid-community/svelte, or a hand-rolled wrapper - you probably hit the same friction everyone hits: the bridge between AG Grid's React/Angular-first API and Svelte 5 runes is brittle, the bundle is heavy, and the Enterprise pricing only makes sense at scale.",
      "section": "help",
      "tier": "community",
      "words": 2129,
      "lastUpdated": "2026-06-11",
      "demoIds": []
    },
    {
      "path": "help/migrating-from-devextreme.md",
      "url": "/help/migrating-from-devextreme",
      "title": "Migrating from DevExtreme DataGrid (DevExpress)",
      "summary": "DevExtreme DataGrid is a deep, commercial multi-framework grid from DevExpress (jQuery, React, Vue, Angular). Moving to SvGrid trades the commercial suite for a Svelte-5-native grid with an MIT core and a far lower-cost paid tier.",
      "section": "help",
      "tier": "community",
      "words": 476,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "help/migrating-from-glide.md",
      "url": "/help/migrating-from-glide",
      "title": "Migrating from Glide Data Grid",
      "summary": "Glide Data Grid is the canvas-rendered, ultra-high-performance choice for very wide datasets (100k+ rows, 100+ columns). Sv-grid renders to DOM with virtualization, which trades the absolute peak FPS for accessibility + standards-compliant HTML.",
      "section": "help",
      "tier": "community",
      "words": 939,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "help/migrating-from-gridjs.md",
      "url": "/help/migrating-from-gridjs",
      "title": "Migrating from Grid.js",
      "summary": "Grid.js is a small vanilla-JS table for search, sort, and pagination that you render into a DOM element. SvGrid does the same in a Svelte-5-native component and keeps going - virtualization, Excel-style filters, editing, grouping - when you outgrow the basics.",
      "section": "help",
      "tier": "community",
      "words": 406,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "help/migrating-from-handsontable.md",
      "url": "/help/migrating-from-handsontable",
      "title": "Migrating from Handsontable",
      "summary": "Handsontable's mental model is \"spreadsheet-in-a-page\": every cell editable, formulas, copy/paste with the OS clipboard, frozen rows and columns. Sv-grid covers ~90% of the same surface; the port is mostly a configuration translation, except for HyperFormula (see the Formulas section below).",
      "section": "help",
      "tier": "community",
      "words": 967,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "help/migrating-from-jqxgrid.md",
      "url": "/help/migrating-from-jqxgrid",
      "title": "Migrating from jqxGrid (jQWidgets)",
      "summary": "jqxGrid and SvGrid come from the **same team**. jqxGrid is the mature, multi-framework grid (jQuery core with Angular, React, and Vue integrations); SvGrid is the Svelte-5-native member of the family. If your team is consolidating on Svelte 5, this guide maps a jqxGrid setup onto SvGrid - and the concepts will feel familiar because the engineering lineage is shared.",
      "section": "help",
      "tier": "community",
      "words": 573,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "help/migrating-from-kendo-grid.md",
      "url": "/help/migrating-from-kendo-grid",
      "title": "Migrating from Kendo UI Grid (Telerik)",
      "summary": "Kendo UI Grid is the polished, commercial enterprise grid from Telerik / Progress, available for jQuery, React, Vue, and Angular. Moving to SvGrid trades the multi-framework commercial suite for a Svelte-5-native grid with an MIT core - and a much cheaper paid tier.",
      "section": "help",
      "tier": "community",
      "words": 498,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "help/migrating-from-mui-x.md",
      "url": "/help/migrating-from-mui-x",
      "title": "Migrating from MUI X DataGrid",
      "summary": "MUI X DataGrid is the most common starting point for teams already on Material UI. It's a closed-source-Pro / open-source-Community split very similar to sv-grid's. The port is mostly mechanical.",
      "section": "help",
      "tier": "community",
      "words": 871,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "help/migrating-from-primevue-datatable.md",
      "url": "/help/migrating-from-primevue-datatable",
      "title": "Migrating from PrimeVue / PrimeNG / PrimeReact DataTable",
      "summary": "The Prime DataTable is the grid in the Prime UI suites for Vue, Angular, and React. Its columns are declared as <Column> children with field / header props - a shape that maps cleanly onto SvGrid's ColumnDef array. The port is mostly translating columns and events into a Svelte 5 component.",
      "section": "help",
      "tier": "community",
      "words": 452,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "help/migrating-from-react-data-grid.md",
      "url": "/help/migrating-from-react-data-grid",
      "title": "Migrating from React Data Grid (adazzle)",
      "summary": "react-data-grid is a fast, Excel-like React grid with a clean column API. SvGrid mirrors its shape - virtualized DOM, typed columns, inline editing, custom cells - on Svelte 5 runes instead of React, so the port is mostly a column rename pass.",
      "section": "help",
      "tier": "community",
      "words": 454,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "help/migrating-from-smart-grid.md",
      "url": "/help/migrating-from-smart-grid",
      "title": "Migrating from Smart.Grid (Smart Web Components)",
      "summary": "Smart.Grid (htmlelements.com) and SvGrid come from the **same team**. Smart.Grid is a framework-agnostic custom element - it even works inside Svelte today - while SvGrid is the reactive, Svelte-5-native option. If you are standardising a Svelte app on idiomatic components, this guide maps a Smart.Grid setup onto SvGrid.",
      "section": "help",
      "tier": "community",
      "words": 532,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "help/migrating-from-svar-svelte-datagrid.md",
      "url": "/help/migrating-from-svar-svelte-datagrid",
      "title": "Migrating from SVAR Svelte DataGrid",
      "summary": "SVAR Svelte DataGrid (wx-svelte-grid) is, like SvGrid, an actual Svelte-native grid rather than a wrapper, and both are MIT-licensed and free for commercial use. Because both are component-first with array-of-object column definitions, a port is mostly a configuration translation. The reasons people switch are **capability** (SvGrid adds row grouping with aggregation, master-detail, Excel-style cell-range selection, integrated charts, and pivot) and **architecture** (SvGrid also exposes a headless engine and an MCP server).",
      "section": "help",
      "tier": "community",
      "words": 733,
      "lastUpdated": "2026-06-15",
      "demoIds": []
    },
    {
      "path": "help/migrating-from-svelte-headless-table.md",
      "url": "/help/migrating-from-svelte-headless-table",
      "title": "Migrating from svelte-headless-table",
      "summary": "svelte-headless-table popularised the headless-table pattern in the Svelte ecosystem. It is built on Svelte 4 stores and plugins (addSortBy, addColumnFilters, addPagination, ...), and it leaves the markup to you. SvGrid keeps the same headless idea but runs on Svelte 5 runes and ships a render component, so the port mostly *removes* the table you used to hand-author.",
      "section": "help",
      "tier": "community",
      "words": 670,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "help/migrating-from-syncfusion.md",
      "url": "/help/migrating-from-syncfusion",
      "title": "Migrating from Syncfusion Grid",
      "summary": "Syncfusion Grid is a comprehensive commercial grid across JavaScript, React, Vue, Angular, and Blazor, with a free community license for qualifying small teams. Moving to SvGrid trades the multi-framework suite for a Svelte-5-native grid with an unconditional MIT core.",
      "section": "help",
      "tier": "community",
      "words": 453,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "help/migrating-from-tabulator.md",
      "url": "/help/migrating-from-tabulator",
      "title": "Migrating from Tabulator",
      "summary": "Tabulator is a feature-rich vanilla-JS table you instantiate against a DOM element and drive imperatively (table.setData(...), table.on('cellEdited', ...)). SvGrid covers a similar feature surface but as a Svelte 5 component: data is a reactive $state array, custom cells are snippets, and there is no manual mount / teardown.",
      "section": "help",
      "tier": "community",
      "words": 484,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "help/migrating-from-tanstack-table.md",
      "url": "/help/migrating-from-tanstack-table",
      "title": "Migrating from TanStack Table",
      "summary": "TanStack Table (formerly React Table v8) is the closest conceptual sibling to sv-grid - both are \"headless data grid\" libraries with explicit row-model pipelines. If you already think in createTable() + getCoreRowModel(), this is a half-day port.",
      "section": "help",
      "tier": "community",
      "words": 870,
      "lastUpdated": "2026-06-08",
      "demoIds": []
    },
    {
      "path": "help/migrating-from-ui-kit-tables.md",
      "url": "/help/migrating-from-ui-kit-tables",
      "title": "Migrating from a UI-kit table (Flowbite / Skeleton / shadcn-svelte)",
      "summary": "Flowbite-Svelte, Skeleton, and shadcn-svelte all ship a styled <Table> component. They are presentation components: they render the rows you pass and match your design tokens, but sorting, filtering, virtualization, and editing are yours to write by hand. Moving to SvGrid replaces that hand-rolled logic with built-in features - while still letting you match the design system.",
      "section": "help",
      "tier": "community",
      "words": 642,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "help/migrating-from-vincjo-datatables.md",
      "url": "/help/migrating-from-vincjo-datatables",
      "title": "Migrating from @vincjo/datatables",
      "summary": "@vincjo/datatables is a small, ergonomic Svelte datatable helper: you wrap your data in a handler and it gives you reactive sorting, filtering, and pagination while you keep your own table markup. SvGrid covers the same job and then keeps going - virtualization, an Excel-style filter menu, inline editing, and a render component - so the port is mostly about deciding how much markup you want to keep.",
      "section": "help",
      "tier": "community",
      "words": 632,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "help/missing-features.md",
      "url": "/help/missing-features",
      "title": "Missing features",
      "summary": "This is the honest accounting of capabilities the help topics flagged as **not yet implemented** in the community build. Each entry has:",
      "section": "help",
      "tier": "community",
      "words": 1183,
      "lastUpdated": "2026-06-05",
      "demoIds": []
    },
    {
      "path": "help/mobile-card-view.md",
      "url": "/help/mobile-card-view",
      "title": "Mobile card view",
      "summary": "On wide screens the grid is the grid. Under a viewport breakpoint (by convention 720 px), the same $state array re-renders as touch-friendly cards. Tap a card to expand it into an edit panel; the write flows through api.setCellValue so dirty tracking, filtering, and external observers see every edit identically, whether it came from the desktop grid or from the mobile card.",
      "section": "help",
      "tier": "community",
      "words": 1319,
      "lastUpdated": "2026-06-09",
      "demoIds": [
        "81-mobile-card-view"
      ]
    },
    {
      "path": "help/observability.md",
      "url": "/help/observability",
      "title": "Observability",
      "summary": "Production-grade visibility into a live grid: which rows users see, which cells they edit, what they filter for, how often the imperative API is invoked. Everything you need to wire into Sentry, Datadog, OpenTelemetry, Honeycomb, your own pipeline.",
      "section": "help",
      "tier": "community",
      "words": 864,
      "lastUpdated": "2026-06-08",
      "demoIds": []
    },
    {
      "path": "help/pivot.md",
      "url": "/help/pivot",
      "title": "Pivot tables - Pro",
      "summary": "A built-in pivot model that turns a flat data set into a row-axis tree, a nested column-axis header, and one aggregated cell per (row-path × col-path × measure) triple. Ships in **sv-grid-pro**.",
      "section": "help",
      "tier": "pro",
      "words": 1142,
      "lastUpdated": "2026-06-09",
      "demoIds": [
        "52-pivot-table"
      ]
    },
    {
      "path": "help/production.md",
      "url": "/help/production",
      "title": "Production deployment",
      "summary": "The checklist that turns \"it works on my laptop\" into \"it ships\". One page per concern; each concern is one paragraph + the code that matters. <div data-docs-demo=\"22-admin-template\" data-height=\"540\"></div>",
      "section": "help",
      "tier": "community",
      "words": 1090,
      "lastUpdated": "2026-06-10",
      "demoIds": [
        "22-admin-template"
      ]
    },
    {
      "path": "help/real-time.md",
      "url": "/help/real-time",
      "title": "Real-time / streaming updates",
      "summary": "How to drive the grid from a WebSocket / SSE / poll. Three patterns ranked by the rate of change:",
      "section": "help",
      "tier": "community",
      "words": 1101,
      "lastUpdated": "2026-06-09",
      "demoIds": [
        "34-realtime-orders"
      ]
    },
    {
      "path": "help/recipes.md",
      "url": "/help/recipes",
      "title": "Recipes / Cookbook",
      "summary": "Quick patterns for the questions that come up over and over. Each recipe is paired with a live demo or a minimal snippet that runs against the shipping library.",
      "section": "help",
      "tier": "community",
      "words": 1503,
      "lastUpdated": "2026-06-05",
      "demoIds": [
        "02-sort-filter-paginate",
        "04-selection-copy-paste",
        "23-bulk-actions",
        "18-cascade-editing",
        "24-validation",
        "25-column-pinning",
        "26-list-chips-editors",
        "27-spreadsheet-ribbon",
        "08-tree-and-master-detail",
        "40-forms-master-detail",
        "36-reporting-workspace",
        "37-theming-studio",
        "38-rtl-i18n",
        "39-print-board-export",
        "41-healthcare-emr",
        "42-logistics-fleet",
        "43-compliance-queue",
        "44-field-service",
        "45-gantt-chart",
        "46-scheduler",
        "47-trash-truck-timeline",
        "48-crm-sales-pipeline",
        "49-admin-dashboard",
        "50-seller-panel"
      ]
    },
    {
      "path": "help/rows/accessing-rows.md",
      "url": "/help/rows/accessing-rows",
      "title": "Accessing rows",
      "summary": "You can read the grid's current rows in three ways. <div data-docs-demo=\"04-selection-copy-paste\" data-height=\"540\"></div>",
      "section": "help/rows",
      "tier": "community",
      "words": 313,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "04-selection-copy-paste"
      ]
    },
    {
      "path": "help/rows/full-width-rows.md",
      "url": "/help/rows/full-width-rows",
      "title": "Full-width rows",
      "summary": "\"Full-width rows\" are rows whose content takes the entire grid width instead of being cell-by-cell - useful for inline editors, banner ads, section dividers, and detail-row expansions. <div data-docs-demo=\"08-tree-and-master-detail\" data-height=\"540\"></div>",
      "section": "help/rows",
      "tier": "community",
      "words": 159,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "08-tree-and-master-detail"
      ]
    },
    {
      "path": "help/rows/row-data.md",
      "url": "/help/rows/row-data",
      "title": "Row data",
      "summary": "Row data is whatever you pass to <SvGrid data={...}>. It is a ReadonlyArray<TData> where TData is your row type. Any shape works; the grid does not require a base class or interface. <div data-docs-demo=\"01-quick-start\" data-height=\"540\"></div>",
      "section": "help/rows",
      "tier": "community",
      "words": 306,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "01-quick-start"
      ]
    },
    {
      "path": "help/rows/row-dragging.md",
      "url": "/help/rows/row-dragging",
      "title": "Row dragging",
      "summary": "Drag-to-reorder for rows is a common interaction (kanban-like reordering, moving items between two grids, dragging rows out to an external drop zone). <div data-docs-demo=\"23-bulk-actions\" data-height=\"540\"></div>",
      "section": "help/rows",
      "tier": "community",
      "words": 232,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "23-bulk-actions"
      ]
    },
    {
      "path": "help/rows/row-height.md",
      "url": "/help/rows/row-height",
      "title": "Row height",
      "summary": "Row height is a single integer in pixels. <div data-docs-demo=\"10-custom-cells-and-themes\" data-height=\"540\"></div>",
      "section": "help/rows",
      "tier": "community",
      "words": 337,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "10-custom-cells-and-themes"
      ]
    },
    {
      "path": "help/rows/row-pagination.md",
      "url": "/help/rows/row-pagination",
      "title": "Row pagination",
      "summary": "Pagination is opt-in. Register the feature, register the row model, then either turn it on with showPagination or drive its state from outside. <div data-docs-demo=\"02-sort-filter-paginate\" data-height=\"540\"></div>",
      "section": "help/rows",
      "tier": "community",
      "words": 241,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "02-sort-filter-paginate"
      ]
    },
    {
      "path": "help/rows/row-pinning.md",
      "url": "/help/rows/row-pinning",
      "title": "Row pinning (top / bottom)",
      "summary": "Pin specific rows to the **top** or **bottom** of the grid so they stay visible while the rest of the data scrolls. Typical use cases:",
      "section": "help/rows",
      "tier": "community",
      "words": 789,
      "lastUpdated": "2026-06-09",
      "demoIds": [
        "108-pinned-rows-engine"
      ]
    },
    {
      "path": "help/rows/row-sorting.md",
      "url": "/help/rows/row-sorting",
      "title": "Row sorting",
      "summary": "Sorting is a feature you opt into. Try it live - click any column header to cycle none → asc → desc → none; shift-click adds the column to the sort key list (multi-sort):",
      "section": "help/rows",
      "tier": "community",
      "words": 380,
      "lastUpdated": "2026-06-05",
      "demoIds": [
        "02-sort-filter-paginate"
      ]
    },
    {
      "path": "help/rows/row-spanning.md",
      "url": "/help/rows/row-spanning",
      "title": "Row spanning",
      "summary": "\"Row spanning\" lets one cell's content cover **multiple rows**, the way a merged cell does in a spreadsheet.",
      "section": "help/rows",
      "tier": "community",
      "words": 189,
      "lastUpdated": "2026-06-05",
      "demoIds": []
    },
    {
      "path": "help/rows/styling-rows.md",
      "url": "/help/rows/styling-rows",
      "title": "Styling rows",
      "summary": "Rows are <tr role=\"row\"> elements inside the grid table. Style them with plain CSS. <div data-docs-demo=\"62-conditional-styling\" data-height=\"540\"></div>",
      "section": "help/rows",
      "tier": "community",
      "words": 260,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "62-conditional-styling"
      ]
    },
    {
      "path": "help/rows/transactions.md",
      "url": "/help/rows/transactions",
      "title": "Transactions",
      "summary": "api.applyTransaction({ add, update, remove }) applies a batch of row mutations in a **single** data update - one re-render for the whole batch, not one per row. It's the path to use for high-frequency / streaming feeds (WebSocket deltas, tick data) where calling addRow / setCellValue per row would thrash.",
      "section": "help/rows",
      "tier": "community",
      "words": 323,
      "lastUpdated": "2026-06-13",
      "demoIds": []
    },
    {
      "path": "help/rows/tree-rows.md",
      "url": "/help/rows/tree-rows",
      "title": "Tree rows (expand / collapse)",
      "summary": "SvGrid does not have a treeData prop. Tree-shaped data renders through the same data + columns pipeline as any other grid, with the tree behaviour living in *your* derived-state code. This is on purpose: a tree is just \"a flat list with a depth field and a collapsible subtree\", and the headless engine doesn't need to know which.",
      "section": "help/rows",
      "tier": "community",
      "words": 987,
      "lastUpdated": "2026-06-05",
      "demoIds": [
        "28-org-chart-tree"
      ]
    },
    {
      "path": "help/saved-views.md",
      "url": "/help/saved-views",
      "title": "Saved views & layout persistence",
      "summary": "The pattern for \"user changes sort + filters + columns; reopens the page next week; everything is where they left it.\" Powered entirely by your own state - the grid never writes to storage on its own.",
      "section": "help",
      "tier": "community",
      "words": 1132,
      "lastUpdated": "2026-06-12",
      "demoIds": [
        "36-reporting-workspace"
      ]
    },
    {
      "path": "help/security.md",
      "url": "/help/security",
      "title": "Security & supply chain",
      "summary": "SvGrid is built for shipping into regulated environments where every dependency, every runtime call, and every network egress has to be justified before procurement signs. This page is the answer to \"what does this package do, what does it depend on, and what would I tell our InfoSec team?\". <div data-docs-demo=\"16-csp-compliant\" data-height=\"540\"></div>",
      "section": "help",
      "tier": "community",
      "words": 1232,
      "lastUpdated": "2026-06-12",
      "demoIds": [
        "16-csp-compliant"
      ]
    },
    {
      "path": "help/server-side-data.md",
      "url": "/help/server-side-data",
      "title": "Server-side data",
      "summary": "The patterns for moving sort, filter, group, and pagination off the client and onto your API. Three flavours, ranked by complexity:",
      "section": "help",
      "tier": "community",
      "words": 1512,
      "lastUpdated": "2026-06-08",
      "demoIds": [
        "33-server-infinite"
      ]
    },
    {
      "path": "help/server/server-row-model.md",
      "url": "/help/server/server-row-model",
      "title": "Server-Side Row Model (SSRM)",
      "summary": "When the data lives on the server - millions of rows in a database - the grid should hold only the page on screen and push sorting, filtering, and paging to the backend. SvGrid packages this as **one datasource contract**: you implement a single async getRows, and createServerDataSource owns the rest.",
      "section": "help/server",
      "tier": "community",
      "words": 411,
      "lastUpdated": "2026-06-13",
      "demoIds": []
    },
    {
      "path": "help/spreadsheet-formulas.md",
      "url": "/help/spreadsheet-formulas",
      "title": "Spreadsheet formulas",
      "summary": "A minimal Excel-style formula engine that runs in the browser, with no dependencies. Cells can hold either a literal value (number, string, boolean) or a formula starting with =. When the formula resolves against the sheet, the cell shows the computed value; when you click the cell, the formula bar shows the source.",
      "section": "help",
      "tier": "community",
      "words": 1623,
      "lastUpdated": "2026-06-11",
      "demoIds": [
        "83-spreadsheet-formulas"
      ]
    },
    {
      "path": "help/state-maintenance.md",
      "url": "/help/state-maintenance",
      "title": "State maintenance",
      "summary": "The pattern for snapshotting every dimension the user can change about the grid - sort, filters, group-by, column visibility + widths, pagination, expansion, selection, active cell - into a single JSON bag, and rehydrating the grid from one. Builds on Saved views but adds undo / redo, named bookmarks, JSON import / export, and debounced auto-save.",
      "section": "help",
      "tier": "community",
      "words": 1063,
      "lastUpdated": "2026-06-12",
      "demoIds": [
        "55-state-maintenance"
      ]
    },
    {
      "path": "help/state/named-views.md",
      "url": "/help/state/named-views",
      "title": "Named views",
      "summary": "A \"view\" is a saved snapshot of the grid's state - sort, filters, column order/width/visibility, page, grouping. Named views let a user save the layout they like and switch between them. SvGrid ships this as a small manager over the grid's getState() / setState(), with pluggable storage.",
      "section": "help/state",
      "tier": "community",
      "words": 327,
      "lastUpdated": "2026-06-13",
      "demoIds": []
    },
    {
      "path": "help/status-bar.md",
      "url": "/help/status-bar",
      "title": "Status bar",
      "summary": "The status bar is the strip under the grid that shows live aggregates of the **selected cell range** - count, sum, average, min, max - the way Excel does at the bottom-right when you select a block of numbers.",
      "section": "help",
      "tier": "community",
      "words": 234,
      "lastUpdated": "2026-06-13",
      "demoIds": []
    },
    {
      "path": "help/tailwind.md",
      "url": "/help/tailwind",
      "title": "Tailwind integration",
      "summary": "SvGrid was built alongside Tailwind v4 (the gallery is the proof). The two compose cleanly because they have **non-overlapping concerns**: <div data-docs-demo=\"10-custom-cells-and-themes\" data-height=\"540\"></div>",
      "section": "help",
      "tier": "community",
      "words": 959,
      "lastUpdated": "2026-06-09",
      "demoIds": [
        "10-custom-cells-and-themes"
      ]
    },
    {
      "path": "help/testing-and-quality.md",
      "url": "/help/testing-and-quality",
      "title": "Testing & Quality",
      "summary": "SvGrid ships with a comprehensive automated test suite. This page is the honest accounting of what we test, what we don't, and where coverage stands today.",
      "section": "help",
      "tier": "community",
      "words": 914,
      "lastUpdated": "2026-06-05",
      "demoIds": []
    },
    {
      "path": "help/testing.md",
      "url": "/help/testing",
      "title": "Testing your grid",
      "summary": "How to write tests that catch regressions before they ship. SvGrid is designed for both **fast unit tests** (Layer 2, the headless engine, runs in pure node) and **slow but accurate browser tests** (Layer 3, the <SvGrid> component, needs a real DOM or jsdom).",
      "section": "help",
      "tier": "community",
      "words": 1219,
      "lastUpdated": "2026-06-04",
      "demoIds": []
    },
    {
      "path": "help/tokens.md",
      "url": "/help/tokens",
      "title": "Design tokens",
      "summary": "Every visual property the grid exposes for theming is a CSS custom property (--sg-*). Tokens cascade like any other CSS variable - override at :root, on a wrapper element, or per-grid; the closest declaration wins. <div data-docs-demo=\"74-theme-integrations\" data-height=\"540\"></div>",
      "section": "help",
      "tier": "community",
      "words": 869,
      "lastUpdated": "2026-06-12",
      "demoIds": [
        "74-theme-integrations"
      ]
    },
    {
      "path": "help/versioning.md",
      "url": "/help/versioning",
      "title": "Doc versioning",
      "summary": "How sv-grid documentation tracks multiple shipping major versions.",
      "section": "help",
      "tier": "community",
      "words": 346,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "help/web-components.md",
      "url": "/help/web-components",
      "title": "Web Components & Custom Elements",
      "summary": "Ship SvGrid as a framework-agnostic web component (custom element) and use the Svelte 5 data grid in React, Vue, Angular, or plain HTML - no Svelte required in the host app.",
      "section": "help",
      "tier": "community",
      "words": 1425,
      "lastUpdated": "2026-06-11",
      "demoIds": []
    },
    {
      "path": "pro/evaluation.md",
      "url": "/pro/evaluation",
      "title": "Pro evaluation",
      "summary": "The sv-grid-pro package is soft-gated; you can evaluate every feature in production-equivalent code paths without contacting sales. This page is the playbook.",
      "section": "pro",
      "tier": "pro",
      "words": 686,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "pro/licensing.md",
      "url": "/pro/licensing",
      "title": "Pro licensing",
      "summary": "The sv-grid-pro package is **soft-gated**: every feature runs without a key, with a small unlicensed-build watermark in the bottom-right corner of the grid + a one-time console nudge. Set a key once at app startup and both disappear.",
      "section": "pro",
      "tier": "pro",
      "words": 641,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "pro/README.md",
      "url": "/pro/README",
      "title": "Pro feature pack",
      "summary": "sv-grid-pro is a paid add-on for sv-grid-community. It bolts onto the same <SvGrid> you already have and adds four feature areas: data export, data import, an AI assistant, and pivot tables.",
      "section": "pro",
      "tier": "pro",
      "words": 772,
      "lastUpdated": "2026-06-05",
      "demoIds": []
    },
    {
      "path": "pro/support.md",
      "url": "/pro/support",
      "title": "Pro support",
      "summary": "What you get on each tier, what response time to expect, how to escalate.",
      "section": "pro",
      "tier": "pro",
      "words": 501,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/autosave-with-debounce.md",
      "url": "/recipes/autosave-with-debounce",
      "title": "Auto-save edits with debounce",
      "summary": "Persist every cell edit to the server, debounced so a fast typer generates one save, not twenty.",
      "section": "recipes",
      "tier": "community",
      "words": 228,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/barcode-cells.md",
      "url": "/recipes/barcode-cells",
      "title": "Barcode cells in a Svelte data grid (EAN-13)",
      "summary": "Render a real, scannable EAN-13 barcode in every row of your Svelte data grid - drawn as crisp SVG with no canvas, no eval, and no third-party dependency. This is the retail, warehouse, and inventory pattern: a product table where each row carries its own barcode label, sharp at any zoom and ready to print.",
      "section": "recipes",
      "tier": "community",
      "words": 973,
      "lastUpdated": "2026-06-12",
      "demoIds": [
        "112-barcode-cells"
      ]
    },
    {
      "path": "recipes/benchmark-harness.md",
      "url": "/recipes/benchmark-harness",
      "title": "Benchmark harness",
      "summary": "You're answering:",
      "section": "recipes",
      "tier": "community",
      "words": 1050,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/between-date-filter.md",
      "url": "/recipes/between-date-filter",
      "title": "Between-operator filters for date ranges",
      "summary": "\"From / to\" date range as one filter, not two.",
      "section": "recipes",
      "tier": "community",
      "words": 96,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/build-a-feature-plugin.md",
      "url": "/recipes/build-a-feature-plugin",
      "title": "Build your own feature plugin",
      "summary": "You want to inject behavior that applies to *every* row or column - a computed accent class, an audit fingerprint, an inline diff badge, a per-row policy gate - without forking the grid component or writing the same cell: boilerplate on every column def.",
      "section": "recipes",
      "tier": "community",
      "words": 618,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/bulk-edit-selected-rows.md",
      "url": "/recipes/bulk-edit-selected-rows",
      "title": "Bulk-edit selected rows",
      "summary": "Goal: the user selects N rows, opens a toolbar, picks a field + value, and **every** selected row updates in one click. Standard back-office workflow for status changes, reassignments, tag application.",
      "section": "recipes",
      "tier": "community",
      "words": 760,
      "lastUpdated": "2026-06-05",
      "demoIds": []
    },
    {
      "path": "recipes/cell-renderer-patterns.md",
      "url": "/recipes/cell-renderer-patterns",
      "title": "Cell renderer patterns",
      "summary": "Every supported shape for the cell: slot on a ColumnDef, with the trade-offs for each.",
      "section": "recipes",
      "tier": "community",
      "words": 550,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/chartjs-sync.md",
      "url": "/recipes/chartjs-sync",
      "title": "Chart.js sync from grid filter state",
      "summary": "A chart that re-renders from api.getDisplayedRows() on every filter / sort change.",
      "section": "recipes",
      "tier": "community",
      "words": 97,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/conditional-row-coloring.md",
      "url": "/recipes/conditional-row-coloring",
      "title": "Conditional row coloring",
      "summary": "rowClass returns a class map per row; CSS does the rest.",
      "section": "recipes",
      "tier": "community",
      "words": 92,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/cursor-based-infinite-scroll.md",
      "url": "/recipes/cursor-based-infinite-scroll",
      "title": "Cursor-based infinite scroll",
      "summary": "Sparse-load a 100k-row audit log without paginating. Pattern: debounce on scroll, fetch the next chunk by cursor, splice into $state.",
      "section": "recipes",
      "tier": "community",
      "words": 286,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/custom-filter-functions.md",
      "url": "/recipes/custom-filter-functions",
      "title": "Custom filter functions",
      "summary": "You need any of:",
      "section": "recipes",
      "tier": "community",
      "words": 668,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/dependent-dropdowns.md",
      "url": "/recipes/dependent-dropdowns",
      "title": "Dependent dropdowns (cascading editors)",
      "summary": "Country → State → City. Editing one level resets downstream levels; each cell's dropdown options come from the row's upstream value.",
      "section": "recipes",
      "tier": "community",
      "words": 268,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/drag-drop-columns.md",
      "url": "/recipes/drag-drop-columns",
      "title": "Drag-drop columns to reorder",
      "summary": "Re-order columns by dragging them in a side panel; live grid reflects the new order.",
      "section": "recipes",
      "tier": "community",
      "words": 102,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/external-search.md",
      "url": "/recipes/external-search",
      "title": "External search box with highlighted matches",
      "summary": "A search input outside the grid filters the visible rows AND highlights matched substrings inline.",
      "section": "recipes",
      "tier": "community",
      "words": 105,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/form-library-bridge.md",
      "url": "/recipes/form-library-bridge",
      "title": "Form library bridge",
      "summary": "You want the same row to be editable two ways:",
      "section": "recipes",
      "tier": "community",
      "words": 756,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/grid-state-inspector.md",
      "url": "/recipes/grid-state-inspector",
      "title": "Grid state inspector",
      "summary": "You're stuck on one of:",
      "section": "recipes",
      "tier": "community",
      "words": 776,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/heatmap-cells.md",
      "url": "/recipes/heatmap-cells",
      "title": "Heatmap-tinted numeric cells",
      "summary": "Bucket cell values into red/amber/neutral/green tints based on per-column min/max.",
      "section": "recipes",
      "tier": "community",
      "words": 92,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/index.md",
      "url": "/recipes/index",
      "title": "Recipes / cookbook",
      "summary": "Copy-paste patterns for sv-grid. Every recipe is a complete, runnable snippet you can drop into your app. Each pairs with a live demo in the gallery.",
      "section": "recipes",
      "tier": "community",
      "words": 422,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/kanban-from-grid-data.md",
      "url": "/recipes/kanban-from-grid-data",
      "title": "Kanban board over the same `$state`",
      "summary": "One <SvGrid> with columns = lanes, rows pivoted by status. HTML5 drag-drop moves cards between lanes.",
      "section": "recipes",
      "tier": "community",
      "words": 110,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/lazy-load-expand.md",
      "url": "/recipes/lazy-load-expand",
      "title": "Lazy-load expand on demand",
      "summary": "Tree rows where children are fetched only when the user expands their parent.",
      "section": "recipes",
      "tier": "community",
      "words": 100,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/loading-data.md",
      "url": "/recipes/loading-data",
      "title": "Loading data from REST + GraphQL",
      "summary": "Three shapes. Pick the one that matches your back-end; the grid doesn't care which.",
      "section": "recipes",
      "tier": "community",
      "words": 310,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/million-rows.md",
      "url": "/recipes/million-rows",
      "title": "1 million rows with virtualization",
      "summary": "Row + column virtualization configured for very wide / very tall data.",
      "section": "recipes",
      "tier": "community",
      "words": 98,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/mobile-card-pivot.md",
      "url": "/recipes/mobile-card-pivot",
      "title": "Mobile card view with grid-on-desktop",
      "summary": "Same data, two layouts. Auto-pivot below 720px or force one via a toolbar switch.",
      "section": "recipes",
      "tier": "community",
      "words": 103,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/multi-sheet-export.md",
      "url": "/recipes/multi-sheet-export",
      "title": "Multi-sheet xlsx export",
      "summary": "One workbook, multiple tabs - one per group / region / period.",
      "section": "recipes",
      "tier": "community",
      "words": 99,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/nl-filter.md",
      "url": "/recipes/nl-filter",
      "title": "NL filter wired to your LLM",
      "summary": "\"show last quarter > $10k sorted by date\" - one natural-language input drives setFilter + setSort.",
      "section": "recipes",
      "tier": "community",
      "words": 99,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/persist-column-layout-to-url.md",
      "url": "/recipes/persist-column-layout-to-url",
      "title": "Persist column layout to URL",
      "summary": "Goal: when a user sorts, filters, or pages the grid, the URL updates so that copy-pasting the link gives the recipient the same view. On reload the grid restores from the URL.",
      "section": "recipes",
      "tier": "community",
      "words": 521,
      "lastUpdated": "2026-06-05",
      "demoIds": []
    },
    {
      "path": "recipes/pin-first-column.md",
      "url": "/recipes/pin-first-column",
      "title": "Pin first column on horizontal scroll",
      "summary": "Wide grids where the row-label column must stay visible while the data scrolls horizontally.",
      "section": "recipes",
      "tier": "community",
      "words": 98,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/profiling-with-fps-hud.md",
      "url": "/recipes/profiling-with-fps-hud",
      "title": "Profiling with a live FPS HUD",
      "summary": "You're trying to figure out:",
      "section": "recipes",
      "tier": "community",
      "words": 710,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/role-based-editing.md",
      "url": "/recipes/role-based-editing",
      "title": "Role-based editable columns",
      "summary": "Different user roles can edit different cells; the grid hides editors per-row via the editable callback.",
      "section": "recipes",
      "tier": "community",
      "words": 97,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/saved-filter-sets.md",
      "url": "/recipes/saved-filter-sets",
      "title": "Saved filter sets",
      "summary": "Name and recall named filter combinations; round-trip via api.getFilters / setFilter.",
      "section": "recipes",
      "tier": "community",
      "words": 92,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/saved-views.md",
      "url": "/recipes/saved-views",
      "title": "Saved views (localStorage)",
      "summary": "Per-user grid layouts. Each \"view\" snapshots column widths, pinning, sort, filter, page index, and (optionally) grouping. Switching views restores the snapshot.",
      "section": "recipes",
      "tier": "community",
      "words": 249,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/server-side-filter-with-tanstack-query.md",
      "url": "/recipes/server-side-filter-with-tanstack-query",
      "title": "Server-side filter with TanStack Query",
      "summary": "Goal: drive the grid from a real API. Sort + filter + page round-trip to the server; the response goes into TanStack Query so we get **caching, deduplication, request cancellation, retries, optimistic updates, and stale-while-revalidate** for free.",
      "section": "recipes",
      "tier": "community",
      "words": 1382,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/smart-paste.md",
      "url": "/recipes/smart-paste",
      "title": "Smart paste: CSV / TSV / free-form → typed rows",
      "summary": "Paste anything; the assistant infers columns and previews typed rows for accept/update/skip.",
      "section": "recipes",
      "tier": "community",
      "words": 107,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/sparkline-cells.md",
      "url": "/recipes/sparkline-cells",
      "title": "Sparkline cell renderer",
      "summary": "In-cell mini-charts of a value series, rendered via inline SVG.",
      "section": "recipes",
      "tier": "community",
      "words": 92,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/submit-time-validation.md",
      "url": "/recipes/submit-time-validation",
      "title": "Submit-time validation with error summary",
      "summary": "Different from per-keystroke validation. The user edits freely; on **Submit**, a row-level validator runs and highlights every invalid cell with an aria-live summary panel.",
      "section": "recipes",
      "tier": "community",
      "words": 249,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/testing-your-grid.md",
      "url": "/recipes/testing-your-grid",
      "title": "Testing your grid",
      "summary": "Three strategies for testing a grid in your app. Pick the strategy that matches the question you're answering.",
      "section": "recipes",
      "tier": "community",
      "words": 721,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/theme-matched-export.md",
      "url": "/recipes/theme-matched-export",
      "title": "Theme-matched xlsx export",
      "summary": "Excel file colours follow the same --sg-* tokens the grid renders with.",
      "section": "recipes",
      "tier": "community",
      "words": 97,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/theme-presets.md",
      "url": "/recipes/theme-presets",
      "title": "Theme tokens for Ant / MUI / Fluent / shadcn",
      "summary": "Map your design system's tokens to --sg-* and the grid re-skins.",
      "section": "recipes",
      "tier": "community",
      "words": 103,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/two-grid-master-detail.md",
      "url": "/recipes/two-grid-master-detail",
      "title": "Two-grid master / detail",
      "summary": "Goal: one grid shows the **master** (parents - orders, customers, projects, …), a second grid below shows the **detail** for whichever row is selected (line items, contacts, tasks, …).",
      "section": "recipes",
      "tier": "community",
      "words": 633,
      "lastUpdated": "2026-06-05",
      "demoIds": []
    },
    {
      "path": "recipes/undo-redo-edits.md",
      "url": "/recipes/undo-redo-edits",
      "title": "Undo / redo for grid edits",
      "summary": "Maintain a history stack of cell edits; Ctrl+Z / Ctrl+Y replay backwards / forwards.",
      "section": "recipes",
      "tier": "community",
      "words": 104,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "recipes/use-svgrid-from-react.md",
      "url": "/recipes/use-svgrid-from-react",
      "title": "Use SvGrid from React (custom-element bridge)",
      "summary": "SvGrid is Svelte-5-native, but you can drop it into a React app via a thin **custom element** wrapper. The wrapper publishes one <sv-grid-element> tag, React renders it like any other DOM element, and data + columns cross the boundary as serialised properties.",
      "section": "recipes",
      "tier": "community",
      "words": 1382,
      "lastUpdated": "2026-06-11",
      "demoIds": []
    },
    {
      "path": "recipes/websocket-streaming.md",
      "url": "/recipes/websocket-streaming",
      "title": "WebSocket streaming with backpressure",
      "summary": "Live tick stream with pause / resume / disconnect-and-replay and per-tick delta merge.",
      "section": "recipes",
      "tier": "community",
      "words": 100,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "reference/auto/index.md",
      "url": "/reference/auto/index",
      "title": "Auto-generated reference",
      "summary": "_Generated from the published TypeScript sources. Do not edit by hand - rerun node tools/build-reference.mjs._",
      "section": "reference",
      "tier": "community",
      "words": 71,
      "lastUpdated": "2026-06-08",
      "demoIds": []
    },
    {
      "path": "reference/auto/sv-grid-community-core.md",
      "url": "/reference/auto/sv-grid-community-core",
      "title": "`sv-grid-community` · `core.ts`",
      "summary": "Auto-generated. Source: packages\\sv-grid-community\\src\\core.ts.",
      "section": "reference",
      "tier": "community",
      "words": 2204,
      "lastUpdated": "2026-06-08",
      "demoIds": []
    },
    {
      "path": "reference/auto/sv-grid-community-svgrid-wrapper.types.md",
      "url": "/reference/auto/sv-grid-community-svgrid-wrapper.types",
      "title": "`sv-grid-community` · `svgrid-wrapper.types.ts`",
      "summary": "Auto-generated. Source: packages\\sv-grid-community\\src\\svgrid-wrapper.types.ts.",
      "section": "reference",
      "tier": "community",
      "words": 61,
      "lastUpdated": "2026-06-08",
      "demoIds": []
    },
    {
      "path": "reference/auto/sv-grid-pro-ai.md",
      "url": "/reference/auto/sv-grid-pro-ai",
      "title": "`sv-grid-pro` · `ai.ts`",
      "summary": "Auto-generated. Source: packages\\sv-grid-pro\\src\\ai.ts.",
      "section": "reference",
      "tier": "community",
      "words": 908,
      "lastUpdated": "2026-06-08",
      "demoIds": []
    },
    {
      "path": "reference/auto/sv-grid-pro-export.md",
      "url": "/reference/auto/sv-grid-pro-export",
      "title": "`sv-grid-pro` · `export.ts`",
      "summary": "Auto-generated. Source: packages\\sv-grid-pro\\src\\export.ts.",
      "section": "reference",
      "tier": "community",
      "words": 618,
      "lastUpdated": "2026-06-08",
      "demoIds": []
    },
    {
      "path": "reference/auto/sv-grid-pro-import.md",
      "url": "/reference/auto/sv-grid-pro-import",
      "title": "`sv-grid-pro` · `import.ts`",
      "summary": "Auto-generated. Source: packages\\sv-grid-pro\\src\\import.ts.",
      "section": "reference",
      "tier": "community",
      "words": 474,
      "lastUpdated": "2026-06-08",
      "demoIds": []
    },
    {
      "path": "reference/auto/sv-grid-pro-install.md",
      "url": "/reference/auto/sv-grid-pro-install",
      "title": "`sv-grid-pro` · `install.ts`",
      "summary": "Auto-generated. Source: packages\\sv-grid-pro\\src\\install.ts.",
      "section": "reference",
      "tier": "community",
      "words": 216,
      "lastUpdated": "2026-06-08",
      "demoIds": []
    },
    {
      "path": "reference/auto/sv-grid-pro-pivot.md",
      "url": "/reference/auto/sv-grid-pro-pivot",
      "title": "`sv-grid-pro` · `pivot.ts`",
      "summary": "Auto-generated. Source: packages\\sv-grid-pro\\src\\pivot.ts.",
      "section": "reference",
      "tier": "community",
      "words": 545,
      "lastUpdated": "2026-06-08",
      "demoIds": []
    },
    {
      "path": "reference/bundle-size.md",
      "url": "/reference/bundle-size",
      "title": "Bundle size",
      "summary": "What each feature costs in the final bundle, how to reproduce the numbers on your branch, and what to do if size matters.",
      "section": "reference",
      "tier": "community",
      "words": 534,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "reference/ColumnDef.md",
      "url": "/reference/ColumnDef",
      "title": "`ColumnDef` reference",
      "summary": "A column definition is the contract between the grid and one column of data. Pass an array of these as the columns prop to <SvGrid>.",
      "section": "reference",
      "tier": "community",
      "words": 848,
      "lastUpdated": "2026-06-05",
      "demoIds": []
    },
    {
      "path": "reference/features.md",
      "url": "/reference/features",
      "title": "Features reference",
      "summary": "A \"feature\" is a small bundle of state + helpers the grid engine checks for when wiring its row-model pipeline. Register only what you use - each feature ships about 1-2 KB gzipped and adds a small per-update cost.",
      "section": "reference",
      "tier": "community",
      "words": 634,
      "lastUpdated": "2026-06-05",
      "demoIds": []
    },
    {
      "path": "reference/headless-engine.md",
      "url": "/reference/headless-engine",
      "title": "Headless engine",
      "summary": "createSvGrid(options) returns a table object with:",
      "section": "reference",
      "tier": "community",
      "words": 657,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "reference/index.md",
      "url": "/reference/index",
      "title": "API reference",
      "summary": "The exhaustive surface of the published packages. For walkthroughs + patterns see Help; for first contact see Getting started.",
      "section": "reference",
      "tier": "community",
      "words": 206,
      "lastUpdated": "2026-06-12",
      "demoIds": []
    },
    {
      "path": "reference/pro.md",
      "url": "/reference/pro",
      "title": "Pro reference",
      "summary": "Everything that sv-grid-pro adds on top of the Community surface. Install + license: see Pro feature pack.",
      "section": "reference",
      "tier": "pro",
      "words": 737,
      "lastUpdated": "2026-06-05",
      "demoIds": []
    },
    {
      "path": "reference/SvGrid.md",
      "url": "/reference/SvGrid",
      "title": "`<SvGrid>` reference",
      "summary": "The render component. One <SvGrid> element per grid instance.",
      "section": "reference",
      "tier": "community",
      "words": 1030,
      "lastUpdated": "2026-06-05",
      "demoIds": []
    },
    {
      "path": "reference/SvGridApi.md",
      "url": "/reference/SvGridApi",
      "title": "`SvGridApi` reference",
      "summary": "The imperative API exposed via <SvGrid onApiReady={(api) => ...}>. Use it for data, column, filter, sort, group, selection, and visibility operations from outside the component.",
      "section": "reference",
      "tier": "community",
      "words": 520,
      "lastUpdated": "2026-06-05",
      "demoIds": []
    },
    {
      "path": "why-headless.md",
      "url": "/why-headless",
      "title": "Why headless?",
      "summary": "SvGrid is **headless at the core**, with a fully-styled Svelte component shipped on top. That two-layer split is deliberate, and worth understanding before you reach for either.",
      "section": "",
      "tier": "community",
      "words": 831,
      "lastUpdated": "2026-05-30",
      "demoIds": []
    }
  ]
}
