Skip to content

Releases: orneryd/uiGrid

rust-v1.0.6 - Black Math

20 May 23:13

Choose a tag to compare

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)

  • rowIdentity JS callback bridge — closures can't cross the wasm boundary via serde, so build_grid_rows_js, build_pipeline_js, and resolve_grid_row_id_js now pluck the JS callback off the live JsValue and pre-resolve identities (recursively, for tree mode) into row_identity_overrides before deserialization. Rust drops the row_id_field lookup entirely; TS drops the bridge bypass in grid.core.wasm-bridge.ts.
  • Identity-cached buildGridRows — mirrors the TS rowsCache keyed on (data, options, hidden, expanded, rowSize) reference identity. Public surface: get_cached_grid_pipeline_rows, clear_grid_pipeline_rows_cache. Cache is cleared on mark_dirty() and at the start of run_grid_benchmark so stale entries from recycled allocator addresses can't cause false hits.
  • Prepared-filter fast pathprepare_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 validatorsRunGridCellValidatorsRunner::{Pending, Ready} and run_grid_cell_validators_async mirror the TS Promise<string[]> shape without pulling in a Rust async runtime. Hosts step the runner manually or call run_to_completion.
  • GridValidatorRegistry.set_validator / get_validator bridged through wasm with HostValidatorMarker + RegisteredValidatorMessage. Closures stay JS-side; the bridge calls back into JS for non-built-in validators while Rust's built-in required / minLength / maxLength short-circuit locally.
  • KeyOverrideSpec — Rust analog of TS GridKeyEventOverride. GridOptions::key_down_overrides: Vec<KeyOverrideSpec> lets consumers opt out of any built-in keydown (Ctrl+A, F2, Home/End, Space, etc.). Match supports key_code, key, and modifier combinations.
  • SortKind::DeferToHostguess_sort_kind returns this variant for columns with sortingAlgorithm. 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.rs with register_grid_exporter / unregister_grid_exporter / export_grid and a thread-safe OnceLock<RwLock<HashMap<String, Arc<dyn GridExporter>>>>. GridExportScope::{Visible, All, Selected}, GridRegisteredExportContext, GridExportResult, GridExporter trait. Built-in CSV exporter auto-registered via init_default_grid_exporters so export_grid("csv", ctx) works without setup.
  • run_grid_benchmark — host-agnostic Rust analog of TS gridApi.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_value ported from TS so Rust hosts (egui) compute exporter filenames and templated header values identically to the web suite.
  • Column-width persistence in GridSavedStatecolumn_width_overrides: BTreeMap<String, String> mirrors the TS columnWidthOverrides (gated by saveWidths). Save / restore round-trips the user's resize state across hosts.
  • has_sorting_algorithm flag on GridColumnDef — 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 selectionRowHeaderCol injected when enable_row_selection + enable_row_header_selection are on. Per-row checkbox + select-all header. Width auto-scales to 2 × 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+A selects all selectable rows; Space toggles 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, enableSelectionBatchEvent honored.
  • Validation chrome — invalid cells (rows whose $$invalid<col> flag is set by runGridCellValidators) get a red border + tinted background. Hover shows the joined error messages tooltip via get_grid_cell_error_messages. enable_select_all honoured; the select-all checkbox auto-disables when no rows are selectable.
  • Row-edit lifecycle decorationmark_row_dirty, mark_row_saving, mark_row_clean, mark_row_error paint 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, returns GridGroupRowAction (defaults: None, returns Toggle when 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 = true for select-all).
  • Per-column hooks on EguiColumnExt:
    • with_filter_renderer(fn) — replace the default filter TextEdit with any control (dropdown, range slider, etc.). Mutate &mut String and return true to re-run the pipeline.
    • with_header_controls_renderer(fn) — caller paints the sort / group / pin / move chrome; signals intent by pushing EguiHeaderAction::{ToggleGrouping, CycleSort, PinLeft, PinRight, Unpin, MoveLeft, MoveRight}.
    • with_cell_editor(fn) — replace the default editor; returns true when 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 (jiff Date), boolean columns use a checkbox, numeric columns use a numeric TextEdit. Hosts can still override via with_cell_editor.
  • Keyboard navigation — Arrow keys / Tab / Shift-Tab move focus; Enter and F2 begin edit; Home / End jump to row start/end; Ctrl+Home / Ctrl+End to 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 reads paginationPageSizes from 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_wrap and writes the result into column_widths. Reserves 28px per visible header control (sort / group / pin) so the title isn't clobbered.
  • column_widths overrides synced from drag-resize — each header cell's actual rendered width is captured back into the shared column_widths map 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_widths map; 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 columnprimary_data_column_index skips 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_widthsEguiGrid::column_width_overrides() reader + set_column_width_override writer; round-trips through GridSavedState.
  • Theme fields for selection + validation + row-edit chromeGridTheme gained row_selected_background, row_selected_indicator, `cell_invalid_bo...
Read more

v1.0.6 - Black Math

18 May 23:34

Choose a tag to compare

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 JS rowIdentity callback off the live JsValue and pre-resolves identities (recursively, for tree mode) before serde deserializes. build_grid_rows_js / build_pipeline_js and resolve_grid_row_id_js now 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 through setData() 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: auto override 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:host now sets isolation: isolate and contain: 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: auto plus sub-pixel rounding on the host box made tracks resolve ~1–2px wider than the actual renderable width, surfacing a spurious default horizontal scrollbar. setViewportWidth now floors and subtracts a 2px safety margin.
  • Demo button hover effects no longer use transform — the web-components and React docs pages dropped transform: translateY(-1px) on .scenario-button:hover (and friends) in favour of a plain background gradient shift. transform/filter promote 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 togglespatchExistingRows now fingerprints each row's visual state (selection, focus, expand, dirty/saving/error, tree level, per-column validity, entity reference) and skips patchBodyCell when nothing relevant changed. Selection / focus / expand toggles now repaint only the affected row plus the previously- and newly-focused cells, instead of O(rows × cols). Caches are cleared on full re-mount, slow-path innerHTML rebuild, setFrameworkRenderedSlots, and template MutationObserver firing.
  • setFrameworkRenderedSlots exposed on VanillaUiGridElement — 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 stageCell for unchanged rows, so frameworkSlots.flush() diffed an empty pending set against a full last set and emitted a spurious cellSlotsChanged removed for 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. Added FrameworkSlotBridge.carryRowCells(rowId) and call it from patchExistingRows when canSkip is 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 (Angular ng-template, React render props) never resolved to the body cell. The previously focused cell kept its cell-focused class, making multiple cells appear "selected" simultaneously. Replaced every closest('.body-cell') call in events.ts with a new bodyCellFromEvent() helper that walks composedPath(), which crosses the shadow boundary correctly.
  • Expand toggle no longer attaches to the row-selection checkbox cellisGridPrimaryColumn returned true for visibleColumns[0], but when row selection is enabled the synthetic selectionRowHeaderCol is prepended at index 0, so the tree/expand toggle and indent calc attached to the checkbox cell instead of the first data column. Skip the selectionRowHeaderCol sentinel in isGridPrimaryColumn (TS and Rust core, kept identical so wasm-parity specs still hold).
  • React demo page double scrollbar on Linux.react-demo-frame had overflow-x: auto. Per the CSS spec, when one axis is non-visible the other is coerced from visible to auto, so the frame grew its own vertical scrollbar in addition to the grid's body-viewport scrollbar. Switched to overflow: visible; horizontal overflow is owned by the grid's body viewport internally.
  • Vanilla MutationObserver infinite-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 triggered ensureControllersetOptionsrefreshcellSlotsChanged, 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 / ToggleGridTreeRowExpandedResult now serialize as named-field structs instead of tuples (which produced [bool, {...}] instead of {expanded, nextExpandedRows}).
    • edit::clear_grid_edit_session now returns a ClearGridEditSessionResult struct (was a tuple).
    • edit::find_next_grid_cell now returns FindNextGridCellResult { row, column } (was just GridCellPosition; TS callers expect resolved row + column).
    • edit::should_grid_edit_on_focus: GridColumnDef.enable_cell_edit_on_focus is now Option<bool> so a column with Some(false) correctly opts out even when GridOptions.enable_cell_edit_on_focus is Some(true) — TS uses ?? coalescing, so an explicit false wins over options-level true.
    • state::GridSavedState now skips serializing empty Vec / BTreeMap / Option fields so empty-input round-trips produce {} rather than {sort: null, pagination: null, columnOrder: [], …}.
    • row_searcher::guess_condition now emits a literal-substring regex for the default contains case. Previously emitted Comparator(Contains), but run_column_filter had no Contains arm 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_id now honours options.row_identity_overrides, the hidden serde field populated by the wasm bridge from the JS rowIdentity callback.
    • c-abi fixture regenerated to drop the now-skipped enableCellEditOnFocus default-emit so the deterministic engine round-trip stays stable.

v1.0.5 - Sundress

09 May 02:55

Choose a tag to compare

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, or enableGrouping: false no longer render their sort or group buttons in the header, matching the legacy ui-grid ng-if hide pattern and the existing pin behavior. The grid-level enableSorting / enableGrouping master 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 on publish-vanilla and 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: false is now honored when the grid is globally enabledVanillaGridController.beginCellEdit guards on isCellEditable, so opted-out columns can no longer enter edit mode via double-click, F2, Enter, printable keys, or the post-Tab/Enter resumeEdit hop. Brings the vanilla and Angular hosts in line with the React wrapper, which already enforced this.

v1.0.2 - Mutt

08 May 18:39

Choose a tag to compare

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-vanilla now 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-grid now 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-react now 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

06 May 05:07

Choose a tag to compare

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 guidancetslib now 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 Escape could still commit the in-progress value on blur instead of restoring the original cell value.
  • Angular package compilation for auto-size measurement — replaced the NodeList iteration 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

06 May 04:33

Choose a tag to compare

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-cpp with 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-egui follow-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.

05 May 21:13

Choose a tag to compare

v0.1.9 — B.Y.O.B. - 2026-05-05

Added

  • Angular Elements declarative surface parity@ornery/ui-grid now 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-defs rendering 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 TemplateRef context 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.9 release 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-derived data and columnDefs instead 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.

05 May 21:14

Choose a tag to compare

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

04 May 18:30

Choose a tag to compare

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-vanilla now 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 headerRenderer support 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/styles resolves 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

04 May 18:32

Choose a tag to compare

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.rs adjustments and Rust hygiene follow-up (cargo fmt / clippy) that keep the native adapter aligned with the current shared grid behavior.