Releases: orneryd/uiGrid
Releases · orneryd/uiGrid
rust-v1.0.6 - Black Math
rust-v1.0.6 - Black Math — 2026-05-20
Rust core + ui-grid-egui adapter reach functional parity with the canonical TypeScript engine and the vanilla web component. The web suite (Angular / React / Web Components) is unchanged; this release scopes to ui-grid-core, ui-grid-egui, and ui-grid-c-abi. Wasm-parity specs lock the contract in so any future Rust-side drift is caught against TS.
TLDR;
- Row selection chrome
- Selection interactions
- Drag-paint multi-row selection
- Validation chrome
- Row-edit lifecycle decoration
- Custom group row renderer
- Custom expandable row renderer
- Custom empty-state renderer
- Custom selection-checkbox renderer
- Custom filter renderer
- Custom header controls renderer
- Custom cell editor
- Custom cell renderer
- Custom formatter
- Editor input-type switching
- Keyboard navigation
- Pagination chrome
- Column auto-fit on resize-handle double-click
- Column-width drag-resize syncing
- Pin / unpin width preservation
- Group / expand / tree chevron placement fix
- Header label truncation
- Filter input clear button
- Save / restore column widths
- Selection / validation / row-edit theme fields
Added — Rust core (parity ports of existing TS APIs)
rowIdentityJS callback bridge — closures can't cross the wasm boundary via serde, sobuild_grid_rows_js,build_pipeline_js, andresolve_grid_row_id_jsnow pluck the JS callback off the liveJsValueand pre-resolve identities (recursively, for tree mode) intorow_identity_overridesbefore deserialization. Rust drops therow_id_fieldlookup entirely; TS drops the bridge bypass ingrid.core.wasm-bridge.ts.- Identity-cached
buildGridRows— mirrors the TSrowsCachekeyed on(data, options, hidden, expanded, rowSize)reference identity. Public surface:get_cached_grid_pipeline_rows,clear_grid_pipeline_rows_cache. Cache is cleared onmark_dirty()and at the start ofrun_grid_benchmarkso stale entries from recycled allocator addresses can't cause false hits. - Prepared-filter fast path —
prepare_grid_column_filters(per-column, once) +matches_grid_row_prepared_filters(per-row, no allocation), with wasm shims so JS callers can opt in. Pipeline now uses the prepared variant. - Async validators —
RunGridCellValidatorsRunner::{Pending, Ready}andrun_grid_cell_validators_asyncmirror the TSPromise<string[]>shape without pulling in a Rust async runtime. Hosts step the runner manually or callrun_to_completion. GridValidatorRegistry.set_validator/get_validatorbridged through wasm withHostValidatorMarker+RegisteredValidatorMessage. Closures stay JS-side; the bridge calls back into JS for non-built-in validators while Rust's built-inrequired/minLength/maxLengthshort-circuit locally.KeyOverrideSpec— Rust analog of TSGridKeyEventOverride.GridOptions::key_down_overrides: Vec<KeyOverrideSpec>lets consumers opt out of any built-in keydown (Ctrl+A, F2, Home/End, Space, etc.). Match supportskey_code,key, and modifier combinations.SortKind::DeferToHost—guess_sort_kindreturns this variant for columns withsortingAlgorithm. The wasm bridge falls back to TS sort for those columns only; columns without a custom algorithm continue sorting in Rust.- Generic exporter registry — new
crates/ui-grid-core/src/exporter_registry.rswithregister_grid_exporter/unregister_grid_exporter/export_gridand a thread-safeOnceLock<RwLock<HashMap<String, Arc<dyn GridExporter>>>>.GridExportScope::{Visible, All, Selected},GridRegisteredExportContext,GridExportResult,GridExportertrait. Built-in CSV exporter auto-registered viainit_default_grid_exporterssoexport_grid("csv", ctx)works without setup. run_grid_benchmark— host-agnostic Rust analog of TSgridApi.core.benchmark(iterations) -> Promise<GridBenchmarkResult>. Returns{iterations, total_ms, average_ms, visible_rows, rendered_items}. Egui demo wires it to a Benchmark button.resolve_exporter_filename,build_grid_header_context,format_grid_header_display_valueported from TS so Rust hosts (egui) compute exporter filenames and templated header values identically to the web suite.- Column-width persistence in
GridSavedState—column_width_overrides: BTreeMap<String, String>mirrors the TScolumnWidthOverrides(gated bysaveWidths). Save / restore round-trips the user's resize state across hosts. has_sorting_algorithmflag onGridColumnDef— set by the wasm bridge so Rust can detect sorting-algorithm columns without seeing the JS callback.
Added — Egui adapter (vanilla web-component feature parity)
- Row selection chrome — synthetic
selectionRowHeaderColinjected whenenable_row_selection+enable_row_header_selectionare on. Per-row checkbox + select-all header. Width auto-scales to2 × icon_width(theme-driven) so the column stays narrow regardless of egui style overrides. Synthetic column is excluded from drag-reorder and the data-column min-width floor. - Selection interactions — Ctrl/Cmd-click adds to selection (additive); plain click is single-select; Shift-click extends to range.
Ctrl+Aselects all selectable rows;Spacetoggles the focused row. Drag-paint multi-row selection: press a row, drag across other rows — every row whose rect contains the pointer becomes the endpoint, the anchor→endpoint range is selected.enableFullRowSelection,noUnselect,modifierKeysToMultiSelect,enableSelectionBatchEventhonored. - Validation chrome — invalid cells (rows whose
$$invalid<col>flag is set byrunGridCellValidators) get a red border + tinted background. Hover shows the joined error messages tooltip viaget_grid_cell_error_messages.enable_select_allhonoured; the select-all checkbox auto-disables when no rows are selectable. - Row-edit lifecycle decoration —
mark_row_dirty,mark_row_saving,mark_row_clean,mark_row_errorpaint the row with theme-supplied tints (row_dirty_background,row_saving_background,row_error_background). Mutually-exclusive priority: error > saving > dirty. - Grid-level renderer hooks:
with_group_row_renderer(fn)— caller paints the entire group row, returnsGridGroupRowAction(defaults:None, returnsTogglewhen chevron is clicked).with_expandable_row_renderer(fn)— caller paints the entire detail row.with_empty_state_renderer(fn)— caller paints the empty state when filters knock all rows out.with_selection_checkbox_renderer(fn)— caller replaces both the per-row and select-all checkboxes (ctx.row = Some(...)for per-row,ctx.is_header = truefor select-all).
- Per-column hooks on
EguiColumnExt:with_filter_renderer(fn)— replace the default filterTextEditwith any control (dropdown, range slider, etc.). Mutate&mut Stringand returntrueto re-run the pipeline.with_header_controls_renderer(fn)— caller paints the sort / group / pin / move chrome; signals intent by pushingEguiHeaderAction::{ToggleGrouping, CycleSort, PinLeft, PinRight, Unpin, MoveLeft, MoveRight}.with_cell_editor(fn)— replace the default editor; returnstruewhen the value changed.with_cell_renderer(fn)— full custom cell paint.with_formatter(fn)— string formatter applied before the default label paints.
- Editor input-type switching — date columns use
egui_extras::DatePickerButton(jiffDate), boolean columns use a checkbox, numeric columns use a numericTextEdit. Hosts can still override viawith_cell_editor. - Keyboard navigation — Arrow keys / Tab / Shift-Tab move focus; Enter and
F2begin edit;Home/Endjump to row start/end;Ctrl+Home/Ctrl+Endto first/last row; first-character keypress on a focused cell begins edit pre-seeded with that character. - Pagination chrome — range label
M – N of total, page-size combo readspaginationPageSizesfrom options, prev/next visually disabled at edges (in addition to the click guard). - Column auto-fit on resize-handle double-click — double-clicking the resize gripper measures the header label + visible cell content via
egui::Fonts::layout_no_wrapand writes the result intocolumn_widths. Reserves 28px per visible header control (sort / group / pin) so the title isn't clobbered. column_widthsoverrides synced from drag-resize — each header cell's actual rendered width is captured back into the sharedcolumn_widthsmap after the user releases the pointer, so the outer scroll-area / pinned-region width math tracks the real table width and there's no empty scrollable space.- Pin / unpin preserves column widths — pre-fit pass on first paint measures every column without a declared width or override and stores the result in the shared
column_widthsmap; all four table layouts (unpinned single + pinned left / center / right) consult the same map, so widths survive pin/unpin. - Group / expand / tree chevron lands on the first data column —
primary_data_column_indexskips the synthetic selection column so the leading control doesn't paint inside the checkbox cell when row selection + expandable / tree are on at the same time. - Header label truncation — labels render inside a rect bounded by the controls' left edge, with
Label::truncate()so titles ellipsise instead of being clobbered by sort / group / pin chrome. - Filter input "clear" button — inline ✕ when the active filter is non-empty.
- Save / restore state with
column_widths—EguiGrid::column_width_overrides()reader +set_column_width_overridewriter; round-trips throughGridSavedState. - Theme fields for selection + validation + row-edit chrome —
GridThemegainedrow_selected_background,row_selected_indicator, `cell_invalid_bo...
v1.0.6 - Black Math
v1.0.6 — Black Math 2026-05-18
Added
- Rust core feature parity with the canonical TypeScript engine —
@ornery/ui-grid-core's WASM build now mirrors all fourteen ported pipeline modules (viewmodel, identity, row-state, edit, display, infinite-scroll, pinning, pagination, sorting, filtering, tree, grouping, state, pipeline) and a new wasm-parity spec suite locks the contract in. Each TS module has a subprocess-driven parity test that runs the wasm shim and asserts byte-identical output for the same input fixtures. - Rust ↔ JS callback bridge for
rowIdentity— closures can't cross the wasm boundary via serde, so the bridge now plucks the JSrowIdentitycallback off the liveJsValueand pre-resolves identities (recursively, for tree mode) before serde deserializes.build_grid_rows_js/build_pipeline_jsandresolve_grid_row_id_jsnow use the wasm path consistently. - WebAssembly performance pass — cleaner wasm-bridge plumbing reduces per-call overhead on hot paths, and demo apps disable wasm module auto-registration so consumers opt in explicitly.
- Vitest config across the workspace + CI coverage reporting — added a shared vitest config and brought CI coverage reporting back online so test gates run consistently across packages.
- Row selection on the expandable harness across all wrappers — the Angular, React, and Web Components "expandable" demos now also enable
enableRowSelection, so the selection checkbox column appears alongside the expand toggle. Live demos exercise the same UX surface across all three frameworks. - Egui parity plan — added a planning doc describing how the egui adapter will reach parity with the web-suite features (selection / validate / row-edit, keys / filters / pagination, new-core APIs).
- Date-picker slot template on the Web Components templated harness — the vanilla demo now renders an interactive
<input type="date">for the renewal column via a slot template, with a delegated change handler that walks back to the body cell, mutates the row in place, and re-publishes throughsetData()so picked values persist.
Changed
- Expand/tree toggle leads the cell content instead of trailing it — the disclosure chevron now sits on the leading edge of the primary cell, in front of the row label, matching the tree-toggle convention. The
margin-inline-start: autooverride that previously pushed the expand toggle to the trailing edge has been removed; both initial render and patch paths emit the toggle before.cell-content. - Host element establishes its own stacking + paint context —
:hostnow setsisolation: isolateandcontain: layout paint, so sibling repaints in the surrounding page (e.g. button hover transforms on the demo pages) don't invalidate the grid's sticky filter strip. Fixes the filter-row flicker observed on the React and vanilla demos while Angular was already flicker-free via its component view encapsulation. - Viewport-width measurement under-estimates by 2px — the body viewport's
overflow-x: autoplus sub-pixel rounding on the host box made tracks resolve ~1–2px wider than the actual renderable width, surfacing a spurious default horizontal scrollbar.setViewportWidthnow floors and subtracts a 2px safety margin. - Demo button hover effects no longer use
transform— the web-components and React docs pages droppedtransform: translateY(-1px)on.scenario-button:hover(and friends) in favour of a plain background gradient shift.transform/filterpromote the button to its own compositing layer; combined with the host isolation fix this removes both the trigger and the surface for filter-row repaint flicker. - Per-row patch fingerprint cache for selection / focus / expand toggles —
patchExistingRowsnow fingerprints each row's visual state (selection, focus, expand, dirty/saving/error, tree level, per-column validity, entity reference) and skipspatchBodyCellwhen nothing relevant changed. Selection / focus / expand toggles now repaint only the affected row plus the previously- and newly-focused cells, instead ofO(rows × cols). Caches are cleared on full re-mount, slow-path innerHTML rebuild,setFrameworkRenderedSlots, and templateMutationObserverfiring. setFrameworkRenderedSlotsexposed onVanillaUiGridElement— external consumers no longer need to cast the element to call it.controller.getEditingCellKey()is also exposed for the patch path.
Fixed
- Framework-slot wrappers (Angular embedded views, React portals) survive across patch passes — the patch path's per-row fingerprint short-circuit was skipping
stageCellfor unchanged rows, soframeworkSlots.flush()diffed an empty pending set against a full last set and emitted a spuriouscellSlotsChanged removedfor every cell. Custom-rendered cells were torn down on first paint and only reappeared after a scroll triggered a virtual-body rebuild that re-staged everything. AddedFrameworkSlotBridge.carryRowCells(rowId)and call it frompatchExistingRowswhencanSkipis true so the row's known slots carry forward and the diff is a no-op. - Cell selection retention bug across shadow boundaries — click handlers used
closest('.body-cell')which stops at shadow boundaries, so clicks on framework-projected light-DOM cell content (Angularng-template, React render props) never resolved to the body cell. The previously focused cell kept itscell-focusedclass, making multiple cells appear "selected" simultaneously. Replaced everyclosest('.body-cell')call inevents.tswith a newbodyCellFromEvent()helper that walkscomposedPath(), which crosses the shadow boundary correctly. - Expand toggle no longer attaches to the row-selection checkbox cell —
isGridPrimaryColumnreturned true forvisibleColumns[0], but when row selection is enabled the syntheticselectionRowHeaderColis prepended at index 0, so the tree/expand toggle and indent calc attached to the checkbox cell instead of the first data column. Skip theselectionRowHeaderColsentinel inisGridPrimaryColumn(TS and Rust core, kept identical so wasm-parity specs still hold). - React demo page double scrollbar on Linux —
.react-demo-framehadoverflow-x: auto. Per the CSS spec, when one axis is non-visible the other is coerced fromvisibletoauto, so the frame grew its own vertical scrollbar in addition to the grid's body-viewport scrollbar. Switched tooverflow: visible; horizontal overflow is owned by the grid's body viewport internally. - Vanilla
MutationObserverinfinite-loop with framework wrappers — the observer fired on every slot mutation, including the<span slot="cell-…">projection wrappers Angular and React append for cell rendering. Each mutation triggeredensureController→setOptions→refresh→cellSlotsChanged, which made the wrapper append more spans, ad infinitum. The observer now filters to<template>-typed slot mutations (the consumer-template surface it actually cares about). React tests also moved to happy-dom now that the loop is gone. - Rust core ↔ TS core divergences — fixed a set of silently-different outputs that the new parity specs caught:
row_state::ToggleGridRowExpandedResult/ToggleGridTreeRowExpandedResultnow serialize as named-field structs instead of tuples (which produced[bool, {...}]instead of{expanded, nextExpandedRows}).edit::clear_grid_edit_sessionnow returns aClearGridEditSessionResultstruct (was a tuple).edit::find_next_grid_cellnow returnsFindNextGridCellResult { row, column }(was justGridCellPosition; TS callers expect resolved row + column).edit::should_grid_edit_on_focus:GridColumnDef.enable_cell_edit_on_focusis nowOption<bool>so a column withSome(false)correctly opts out even whenGridOptions.enable_cell_edit_on_focusisSome(true)— TS uses??coalescing, so an explicitfalsewins over options-level true.state::GridSavedStatenow skips serializing emptyVec/BTreeMap/Optionfields so empty-input round-trips produce{}rather than{sort: null, pagination: null, columnOrder: [], …}.row_searcher::guess_conditionnow emits a literal-substring regex for the default contains case. Previously emittedComparator(Contains), butrun_column_filterhad noContainsarm in the comparator branch — it fell through to_ => true, so the filter silently matched every row. Tree filtering, pipeline filtering, and the row-searcher contains test were all visibly wrong before.tree::resolve_row_idnow honoursoptions.row_identity_overrides, the hidden serde field populated by the wasm bridge from the JSrowIdentitycallback.c-abifixture regenerated to drop the now-skippedenableCellEditOnFocusdefault-emit so the deterministic engine round-trip stays stable.
v1.0.5 - Sundress
v1.0.5 - Sundress — 2026-05-08
Still gotta work on my meta packaging. sorry. 1.0.5
Changed
- Per-column header icons now hide on opt-out instead of rendering disabled — columns with
sortable: false,enableSorting: false, orenableGrouping: falseno longer render their sort or group buttons in the header, matching the legacy ui-gridng-ifhide pattern and the existing pin behavior. The grid-levelenableSorting/enableGroupingmaster flags still gate the entire feature. - npm publish pipeline now mirrors the runtime dependency graph — the web suite publishes as
core → vanilla → {react, angular}, with the React and Angular jobs waiting onpublish-vanillaand polling the registry for the vanilla tarball before building. - The grid now resizes properly and tracks scrolling properly based on the old grid behavior.
Fixed
- Per-column
enableCellEdit: falseis now honored when the grid is globally enabled —VanillaGridController.beginCellEditguards onisCellEditable, so opted-out columns can no longer enter edit mode via double-click, F2, Enter, printable keys, or the post-Tab/EnterresumeEdithop. Brings the vanilla and Angular hosts in line with the React wrapper, which already enforced this.
v1.0.2 - Mutt
v1.0.2 - Mutt — 2026-05-08
1.0.1 has bad meta and a fix for the column resizing
Added
- Major web-suite feature expansion across Angular, React, and Web Components — the shared grid runtime now ships row selection, keyboard cell navigation, infinite scroll, row edit workflows, cell validation, CSV/JSON import, CSV/Excel/PDF export, pagination, richer i18n coverage, and custom component/template integration across the web hosts.
- Full declarative and imperative Web Component surface —
@ornery/ui-grid-vanillanow exposes a much broader framework-free custom-element API, including stronger attribute/property bridging, standalone mounting helpers, better template projection, and documentation/examples that cover both declarative markup-first usage and programmatic control. - Expanded docs and live examples for the new grid capabilities — the docs app now includes dedicated user-facing guides and demos for exporting, importing, selection, save state, validation, pagination, infinite scroll, keyboard navigation, pinning, column moving, and custom components.
Changed
- 1.0.0 unifies the web packages around one shared runtime — Angular and React now act as thin framework bridges over the same vanilla custom-element engine, giving all three web surfaces closer feature parity and a more consistent behavior model.
- Angular package setup is lighter for consumers —
@ornery/ui-gridnow wraps the shared vanilla runtime directly, reducing Angular-specific package surface and aligning the Angular package more closely with the cross-framework architecture. - React package positioning moved to the shared web-component runtime —
@ornery/ui-grid-reactnow depends on the vanilla package as part of its public integration model, so React consumers inherit the same underlying grid engine and slot/template behavior as the other web hosts.
New feature matrix - Feature parity with angularjs - ui-grid.
As always, everything below ships free and MIT-licensed. No enterprise tier, no license keys, no per-developer fees.
| Feature | UI Grid | ag-Grid Community | ag-Grid Enterprise | Vaadin Grid | Kendo UI | Syncfusion |
|---|---|---|---|---|---|---|
| Sorting | Free | Free | — | Free | Paid | Community* |
| Filtering | Free | Free | — | Free | Paid | Community* |
| Row Grouping | Free | — | ~$999/dev/yr | — | Paid | Community* |
| Tree Data | Free | — | ~$999/dev/yr | Free | Paid | Community* |
| Master/Detail Rows | Free | — | ~$999/dev/yr | — | Paid | Community* |
| Inline Cell Editing | Free | Free | — | Pro ~$159/dev/mo | Paid | Community* |
| Row Selection | Free | Free | — | Free | Paid | Community* |
| Column Resizing | Free | Free | — | Free | Paid | Community* |
| CSV Export | Free | Free | — | — | Paid | Community* |
| Excel Export | Free | — | ~$999/dev/yr | — | Paid | Community* |
| PDF Export | Free | — | ~$999/dev/yr | — | Paid | Community* |
| Virtual Scrolling | Free | Free | — | Free | Paid | Community* |
| Pagination | Free | Free | — | Free | Paid | Community* |
| Column Pinning | Free | Free | — | Free | Paid | Community* |
| Column Reordering | Free | Free | — | Free | Paid | Community* |
| Save/Restore State | Free | Free | — | — | Paid | — |
| Infinite Scroll | Free | Free | — | Free | Paid | Community* |
| Keyboard Cell Nav | Free | Free | — | — | Paid | Community* |
| Row Edit (dirty/save) | Free | — | — | — | — | — |
| Cell Validation | Free | — | — | — | — | — |
| CSV/JSON Import | Free | — | — | — | — | — |
| Shadow DOM | Free | — | — | — | — | — |
| Web Component Build | Free | — | — | Native | — | — |
| Feature Tree-Shaking | Free | — | — | — | — | — |
| SSR Support | Free | — | ~$999/dev/yr | — | — | — |
| i18n (6 locales built-in) | Free | Free | — | Free | Paid | Community* |
| React | Yes | Wrapper | Wrapper | No | Wrapper | Wrapper |
| Rust/egui Native | Yes | No | No | No | No | No |
| C/LVGL Native | Yes | No | No | No | No | No |
| Angular | Yes | Wrapper | Wrapper | No | Wrapper | Wrapper |
| License | MIT | MIT | Commercial | Apache/Comm. | Commercial | Comm./Community |
| Price | $0 | $0 | ~$999/dev/yr | $159/dev/mo (Pro) | ~$799/dev/yr | See below |
v0.1.10 - Dimes
v0.1.10 - Dimes — 2026-05-05
Changed
- Column resizing behavior is now consistent across Angular, React, and vanilla hosts — all three web surfaces now support the same drag-resize, double-click auto-fit, hover indicator, and container-filling demo behavior, including smoother virtualized resizing paths that avoid per-mousemove full rerenders.
- Version sync now covers the full web monorepo with one command — the release sync script now updates npm package manifests, npm lockfiles, internal dependency ranges, and internal peer metadata cleanup in one pass.
- Angular package metadata now aligns with current packaging guidance —
tslibnow ships as a dependency instead of a peer dependency, eliminating the Angular package warning during CI packaging.
Fixed
- Cross-suite resize polish and parity issues — fixed missing React resize handle styling, removed header scrollbar artifacts during resize, and aligned the Angular, React, and vanilla demos so the column resize affordances behave the same across the web suite.
- React keyboard cell editing cancel flow — fixed a React editing-state race where pressing
Escapecould still commit the in-progress value on blur instead of restoring the original cell value. - Angular package compilation for auto-size measurement — replaced the
NodeListiteration pattern in the Angular grid component with a package-compiler-safe traversal so the library build completes cleanly in CI. - Angular custom-element declarative attribute tests under jsdom — fixed the Angular Elements wrapper so declarative attribute/property registration works reliably in the test environment without custom-element constructor failures.
rust-v0.1.10 - Dimes
rust-v0.1.10 Dimes — 2026-05-05
Added
- Stable C-facing ABI over the Rust grid core — added
ui-grid-c-abi, exposing opaque engine lifecycle, JSON and MessagePack transport helpers, projection/state APIs, C smoke examples, and a projection benchmark so native hosts can drive the shared grid engine without embedding Rust types directly. - C++ wrapper for the native ABI — added
ui-grid-cppwith RAII engine management, typed sort/group/pin command builders, JSON and MessagePack projection helpers, and smoke examples for a higher-level native integration surface. - Initial LVGL native C prototype — added
ui-grid-lvgl, including the first LVGL-backed adapter, theme/column extension headers, and an SDL-backed demo app that proves the native widget path end to end. - Native adapter roadmap documentation — added a dedicated plan for the Rust C ABI, C++, Go, and follow-on native adapter work so the non-web host strategy is documented alongside the prototype.
Changed
- Version sync now covers the Rust/native workspace too — the release sync script now updates the Cargo workspace version, crate-to-crate Rust dependency versions, and Cargo.lock alongside the npm package metadata in one pass.
- Project docs and positioning now include native C/LVGL support explicitly — refreshed the root README and native adapter docs so the repo presents Rust/egui and native C/LVGL as first-class delivery targets.
- Projection transport benchmarking now covers binary and text codecs — the native ABI benchmark now reports projection and saved-state transport comparisons for JSON vs MessagePack to guide transport tuning for future native adapters.
Fixed
- Rust/native CI follow-up regression — refreshed the ABI fixture data needed to keep the Rust/native test path green after the new adapter work landed.
- Supporting Rust widget polish for native adapter parity — applied the small
ui-grid-eguifollow-up adjustments needed to keep the native widget layer aligned while the C ABI and LVGL prototype were introduced.
v0.1.9 - B.Y.O.B.
v0.1.9 — B.Y.O.B. - 2026-05-05
Added
- Angular Elements declarative surface parity —
@ornery/ui-gridnow supports declarative HTML attributes, mirrored JS properties, and attribute-to-options synchronization so the Angular-backed custom element can be configured markup-first like the vanilla build. - Custom-element coverage for declarative and imperative mixing — added Angular and vanilla tests that verify declarative
data/column-defsrendering and confirm later imperative augmentation does not discard attribute-derived state. Improved rendering performance using the imperative form for high-frequency updates. - Cross-framework renderer/template docs — expanded the docs app and Web Component docs with Angular
TemplateRefcontext tables, vanilla slot-template token references, and React cell/expandable renderer context examples. - Release version-sync tooling — added a dedicated version-sync workflow for package manifests and npm lockfiles to keep the
0.1.9release metadata aligned across the repo.
Changed
- Web Component documentation now distinguishes the two shipped outputs clearly — refreshed the README, Getting Started, and Web Component docs so Angular Elements and vanilla custom elements are described separately, with their shared declarative surface and their differing runtime expectations called out explicitly.
- Angular home demos now showcase both host surfaces — the home page now has separate Angular Native and Angular Element modes, with dedicated Angular Element scenario harnesses for expandable, tree, templated, pinning, and trading demos.
- Web Components demo host moved to declarative attribute-driven setup — the primary and scenario grids on the web-components page are now configured from declarative attributes first, with template injection and imperative bridge wiring layered on top only where needed.
- Release metadata refreshed for
0.1.9— regenerated the root and package-local npm lockfiles after syncing internal package versions to the next intended web release version.
Fixed
- Vanilla custom-element option augmentation no longer drops declarative data — reading
grid.options, spreading it, and writing it back now preserves attribute-deriveddataandcolumnDefsinstead of resetting the declarative surface. - Angular Element trading terminal now live-updates correctly — the home-page Angular-backed custom element trading harness now drives live ticks and applies the intended colorized cell templates for price and change columns.
- Vanilla trading demo now reattaches slot templates and resumes ticking after mode switches — the web-components Trading scenario correctly reinjects its slot templates and restarts the live-update loop when switching between scenarios.
- Declarative web-component docs and demos now match runtime behavior — the live examples, code snippets, and docs pages were brought back into sync for attribute-driven setup, template slots, and high-frequency data updates.
- Fixing metadata packaging across the entire suite.
rust-v0.1.9 — B.Y.O.B.
rust-v0.1.9 — B.Y.O.B. - 2026-05-05
Maintenance
- Corrected metadata packaging across the suite.
- added plans for slint and iced
v0.1.8-hotfix - Grown So Ugly
v0.1.8-hotfix -Grown So Ugly
v0.1.8-hotfix (web suite) — 2026-05-04
HOTFIX: fixed the theming aliases in the CSS with --ui-grid-* instead of --app-ui-grid-*
Added
- Trading terminal demos across Angular, React, and vanilla docs surfaces — added a shared market-data generator plus live trading-terminal demos to the Angular home page, the React docs page, the Web Components page, and the browser harness so all three web hosts now showcase the same high-frequency update scenario next to the existing pinning demos.
- Declarative vanilla custom-element API —
@ornery/ui-grid-vanillanow supports a full declarative configuration surface on<ui-grid-element>, including observed HTML attributes, mirrored JS properties, and attribute-to-options synchronization for framework-free usage. - Custom header rendering for non-Angular hosts — added
headerRenderersupport through the shared core model and export helpers, with React and vanilla integrations plus tests so wrapper consumers can override header content without forking the grid.
Changed
- Shipped wrappers now render only the grid — moved hero/metrics/toolbar/benchmark chrome out of the React wrapper, Angular component template, and vanilla custom element and into the demo hosts instead, so published package consumers get the grid surface only.
- Benchmark presentation is aligned across the web suite — Angular, React, and vanilla primary demos now expose the same benchmark controls, visible-row metrics, grouping/virtualization summary, and benchmark-average readout for side-by-side comparison.
- Docs and examples refreshed for the new API surface — updated
README.md, Getting Started, API Reference, Web Component, and Rust/WASM documentation to cover the declarative vanilla API, the benchmark/demo host split, and the latest wrapper usage patterns.
Fixed
- Vanilla trading scroll performance — the Web Components trading demo no longer replaces the entire grid render tree on every price tick; it now uses incremental data refresh and virtualization-aware body updates so scrolling stays smooth under live updates.
- React styles packaging and web-suite bundling — fixed package output so
@ornery/ui-grid-react/stylesresolves to an emitted CSS asset and cleaned up bundling/packaging issues across the web suite demo surfaces and library outputs.
rust-v0.1.8 - Grown So Ugly
v0.1.8 -Grown So Ugly
Added
- egui trading terminal demo — the native Rust demo now includes a dedicated trading example with live-ticking sample data and trading-specific columns, expanding the egui showcase beyond the existing customer-grid scenarios.
Changed
- Rust demo app refreshed around the new trading surface — updated the egui example app and shared demo data wiring so the native showcase can present the new trading workflow cleanly alongside the existing grid capabilities.
- Rust docs reorganized around the two Rust delivery paths — refreshed
docs/rust.md,docs/rust-egui.md, and the egui README so Rust/WASM browser usage and native egui usage are documented separately with clearer install, usage, and demo guidance.
Fixed
- egui demo/widget polish — applied the supporting widget and example cleanup needed for the new demo flow, including the small
grid_widget.rsadjustments and Rust hygiene follow-up (cargo fmt/ clippy) that keep the native adapter aligned with the current shared grid behavior.