Skip to main content

Feature Coverage & Roadmap

Requirement-by-requirement status across 58 spec leaves: 56 built, 1 partial, 1 not built. Honest status, straight from the spec matrix.

A

LeafRequirementStatusNotesFlags
A1Inline editing✅ builtP2 — enableEditing
A2Infinite / virtual scroll✅ builtvirtual scroll = D1 (enableVirtualization); infinite = useBstInfiniteDataSource (fetch-on-scroll append + onReachEnd) over the server DataSourceuseBstInfiniteDataSource
A3Pagination (client/server)✅ builtclient + server (manual mode) v0.28.0 — useBstDataSource / DataSource (manual sort/filter/paginate passthrough)
A4Nested / master-detail✅ builtv0.13.0 — enableExpanding + renderDetailenableExpanding
A5Inline charts / cell spanning✅ builtv0.12.0 spanning (enableCellSpanning, col+row) · charts = M1enableCellSpanning
A6High-perf at 3 scales🟡 partialworkflow tier ✅; 10k client-virtual now ✅ (D1); server tier reachable v0.28.0 + infinite scroll (A2); 1M migration tier still to prove end-to-end

B

LeafRequirementStatusNotesFlags
B1Text / long text✅ builtP2 · QR + barcode v0.23.0 (dep-free inline-SVG; QR verified bit-for-bit vs qrcode) · ERP field formats (cellMeta.pattern: PAN/GSTIN/IFSC/IBAN/SWIFT/email/…)meta.type, cellMeta
B2Number (currency/precision/formats)✅ builtP2 — Intl formats · ERP field formats (cellMeta.pattern: Aadhaar/Verhoeff, PIN, card/Luhn)cellMeta
B3Date / time✅ builtP2
B4Boolean✅ builtP2 (now an injectable check icon)
B5Files & attachments✅ builtfile cell + image thumbnails + file-type icons + in-cell PDF thumbnail (cellMeta.pdfThumbnail — page 1 rendered by pdf.js to an <img>; engine stays dep-free, app injects createPdfjsThumbnailer(pdfjs) via <BstPdfThumbnailerProvider>) + click-to-preview (BstFilePreview: image inline · PDF native iframe, data:→blob:) + configurable upload/delete (cellMeta.onUpload/onDelete); a server raster (thumbnailUrl) wins when presentfiles, cellMeta, DataSource
B6Single select✅ builtP2 (inline overlay editor)
B7Multi select (chips/overflow)✅ builtP2 · width-aware chips (cellMeta.fitChips — fit to column width)cellMeta
B8Radio group✅ builtP2
B9Hyperlink✅ builtP2
B10Action column✅ builtP2; "floating" variant open (Q5)meta.type

C

LeafRequirementStatusNotesFlags
C1Editing modes✅ builtP2 — cell + row-session
C2Save on Enter/Blur/Explicit✅ builtP2enableEditing
C3Cell/row/cross-col/async validation✅ builtP2 — enableValidation
C4Inline validation feedback✅ builtP2
C5Shortcuts (arrows/undo-redo)✅ builtP3 — nav + enableUndoRedoenableTypeToEdit, enableUndoRedo
C6Tab nav (skip/wrap)✅ builtP3enableTypeToEdit

D

LeafRequirementStatusNotesFlags
D1Row & column virtualization✅ builtenableVirtualization (+ enableColumnVirtualization) on @tanstack/react-virtual — windowed rows (dynamic measure) + columns, sticky header, bounded DOM; yields to master-detail / grouping / cell spanning / row pinning. Tested (virtualization.test.tsx)enableVirtualization, enableColumnVirtualization
D2Lightweight cell renderers✅ builtP2 — memoized hot-path
D3Smart column auto-size✅ builtv0.22.0 — double-click resizer → sampled canvas.measureText fitcomputeAutoWidth
D4Partial / dirty-cell render✅ builtP2–3 — draft overlay, paint-time

E

LeafRequirementStatusNotesFlags
E1Sorting✅ builtP1
E2Column & global search✅ builtP1 global + P3 per-column filter row
E3Advanced filtering✅ builtP3 — filter builder + bstConditionenableColumnFilters, showFilterBuilder, conditionalFormats
E4Multi-column grouping✅ builtv0.15.0 — enableGrouping + aggregates + group toggleenableGrouping

F

LeafRequirementStatusNotesFlags
F1Disable grid✅ builtP2 — disableddisabled
F2Disable row✅ builtP2 — rowDisabledenableCellSelection, rowDisabled, enableNotes
F3Disable column✅ builtP3 — meta.disabledmeta.disabled, showColumnEditToggle, enableFind
F4Disable cell✅ builtP3 — meta.disabled fn + cellDisabledmeta.disabled, cellDisabled
F5Conditional visibility/render✅ builtv0.18.0 — conditionalFormats (hideContent + rule styling)conditionalFormats

G

LeafRequirementStatusNotesFlags
G1Freeze / pin rows & columns✅ builtcolumn pin P3 + row pin v0.14.0 (enableRowPinning)enableRowPinning
G2Row & column resizing✅ builtcolumn resize (P3) + row resize v0.25.0 (enableRowResize — drag a row edge to set its height, double-click to reset)enableRowResize
G3Auto layout✅ builtfixed layout + total-size + fitColumns fit-to-viewportfitColumns, enableStickyHeader
G4Responsive✅ builtv0.22.0 — enableResponsive + meta.responsivePriority (hide low-priority when narrow)enableResponsive, enableStickyHeader

H

LeafRequirementStatusNotesFlags
H1Copy cell✅ builtP3enableClipboard
H2Copy row✅ builtP3enableClipboard, enableCopyRow
H3Copy column✅ builtfixed — runtime.copyColumn / Ctrl+Space selects the whole column and copies all pages (pre-pagination, filter+sort order); copyRow/Shift+Space too. Server-tier export rides the Phase-4 foundationenableClipboard, enableCopyColumn
H4Paste✅ builtP3 — needs enableEditingenableClipboard

I

LeafRequirementStatusNotesFlags
I1Row lifecycle events✅ builtP2 — enableRowActions + onDataChange
I2Cell events + deferred save✅ builtP2 (C2≡I2)enableEditing
I3File ops (upload/view/delete)✅ builtview + preview (BstFilePreview) + upload/delete via cellMeta.onUpload/onDelete (busy state; local object-URL fallback), now also formal DataSource verbs uploadFile/deleteFile/getFileUrl + createFileHandlers(source) bridge (Plan.md §2.2)files, DataSource
I4Backend updates → cells/rows/grid✅ builtboth halves done. Send: batch mode's runtime.getChangeSet() + one onSave({ changes, rows[].patch, next }) per save action (v0.30.0), a rejected save keeping every draft. Reconcile: onSave may RETURN a BstSaveResult — applied rows adopt the server's authoritative values (IDs, timestamps, normalised/recomputed fields), failed rows/cells keep their draft + show the error (partial success); returning nothing commits every draft as typedenableEditing
I5External updates (parent/WS)❌ not builtWebSocket / live merge not built

J

LeafRequirementStatusNotesFlags
J1Popup form editors✅ builtP2 — Dialog / modal popups
J2Rich / custom React editors✅ builtcustom React ✅ · rich-text v0.23.0 (dep-free sanitized-HTML cell + popup editor; not Lexical)meta.type

K

LeafRequirementStatusNotesFlags
K1Dynamic cell styling✅ builtv0.10.0 slots + v0.18.0 conditionalFormatsenableSorting, classNames
K2Dynamic row styling✅ builtslots (classNames.row/styles.row) + row-scope rulesenableSorting, classNames
K3Conditional formatting✅ builtv0.18.0 — rule engine + <BstConditionalFormatBuilder>showFormatBuilder, conditionalFormats, enableConditionalFormatting

L

LeafRequirementStatusNotesFlags
L1Multi-row highlighting✅ builtrow-scope conditionalFormats (v0.18.0) + validation
L2Cell highlighting✅ builtP2 — error ring + rule styling
L3Inline error presentation✅ builtP2

M

LeafRequirementStatusNotesFlags
M1In-cell charts✅ builtv0.19.0 — sparkline cell type (line/area/bar)meta.type
M2KPI cells✅ builtv0.19.0 — kpi cell type (value + delta + mini-spark)meta.type

Generated from the corpus coverage matrix.