Cassava v0.0.1-rc20
Bug Fixes
- update to sign local macos builds correctly
- io: strip leading UTF-8 BOM from first CSV cell
- filter: reject non-finite numbers when parsing
- expr: parse CSV-formatted numbers in cell references
- search: preserve $$ literal-dollar escape in regex replacement
- format: harden numeric formatting for large and tiny values
- chart: show one pie slice per label instead of per series
- chart: log corrupt chart definitions instead of skipping silently
- analysis: order empty-value row after real values on count ties
- grid: avoid NaN panic in column scroll math
- grid: make compare_cell_values a total order
- grid: stop scroll-snap from overscrolling past content
- chart: note unmatched rows in cross-document join
- chart: give None-aggregate series a non-blank name
- document: keep manual sizes aligned across structural undo/redo
- grid: type shifted characters when starting a cell edit
- status: pluralize row/column/cell/value counts
- clipboard: make copy/paste status reflect what happened
- grid: polish keyboard navigation (Escape, Cmd+Home/End, F2)
- grid: edit the clicked cell on double-click without altering selection
- grid: cmd-click a selected header to deselect it
- fix failing test
- sql: collision-safe table names, per-frame copy, unique catalog
- sql: reliably autofocus the editor on panel open
- sql: load non-UTF-8 CSVs instead of erroring
- sql: transcode non-UTF-8 CSVs to a UTF-8 temp copy
- sql: keep queryable-tables list in sync as sheets open/close
- sql: non-blocking per-file loads, read-only queries, Enter to run
- sql: address code-review findings on the query panel
- selection: keep active outline beneath frozen panes
- find: clarify current-file search state
- find: apply large-file search policy at the shared chokepoint
- selection: split overlay layers across the frozen-cells boundary
- goto: support range references in the go-to-cell overlay
- function-bar: stop blur handler from fighting focus-region navigation
- search: preserve semantic replace formatting
- pivot: address review — capped allocation, durable paths, key escaping
- ui: secondary button hover contrast; range-capture mode affordances
- grid: stop secondary jumps at frozen panes
- pivot: fixed two-decimal money format; custom value names
- ui: stop simple-grid frame doubling panel chrome borders
- ui: content-bounded simple-grid frame; pad the pivot result grid
- pivot: reset relink state whenever a pivot model is applied
- pivot: clear the configured range when switching source documents
- header-freeze: apply initial freeze consistently
- close correctness gaps found in a code-quality audit
- settings: pin search box above scrollable results, fixing a collapse
- render: request a follow-up frame when any grid's scroll bounds are unmeasured
- ci: stabilize bundled DuckDB builds
- release: handle empty feature matrix entry
Documentation
- todo: note find-all panel render performance with many results
- update ISSUES.md and PRD status for v1 accessibility/automation work
- pivot: mark PIVOTS.md implemented; fix clippy redundant guard
- defer execute_command_palette_action decomposition to Section 4
Features
- update to generate appcast with multiple platform support
- update to generate appcast with multiple platform support
- workspace: add shared bottom panel shell for SQL
- sql: add query runner panel with DuckDB results
- sql: cap preview rendering for wide results
- sql: open query results as a new sheet
- sql: add highlighted editor keyboard shortcuts
- sql: polish query panel layout and copy
- sql: make the SQL panel resizable
- sql: query JSON and never-saved sheets (Phase 1)
- sql: gate in-memory sheet re-staging on Arc identity (Phase 2)
- sql: surface in-memory sheets in the panel (Phase 3)
- sql: make the open-tables panel scrollable, copyable, clickable
- sql: add gated performance logging for load/query/render
- sql: show a per-table loading indicator while sheets import
- panels: refactor find panel to behave more like our other panels, add sql to footer
- sql: add stop button to cancel long-running sql queries
- perf: improve loading/unloading window performance
- ux: improve toggle button state clarity for open panels
- a11y: add focus region commands
- a11y: add focus region traversal
- ui: add first-party button component
- a11y: expose shell accessibility metadata
- a11y: expose grid accessibility snapshot
- find: make find-in-all-files results keyboard-navigable
- commands: expose cell formats through the command palette
- ui: add first-party toggle component
- panels: unify right/bottom panel lifecycle and add per-panel focus commands
- xtask: add demos compile command to validate AppleScript demos
- update search results to include frozen headers
- search: match formatted numbers in find
- search: add value-aware find toggle
- search: preserve formats during replace
- pivot: composite-key grouping and pure pivot materialization
- pivot: editable model, persistence, store, and source resolver
- grid: selection → GridRangeRef conversion for range capture
- pivot: pivot table panel with live cached results
- pivot: charts-style lifecycle — multiple pivots, save/load, relink
- pivot: Open as CSV export of the materialized table
- pivot: resolve saved pivots as templates with a source hint
- pivot: explicit whole-file / range scope toggle
- clean up footer contents
- go to cell buffer now tries to locate the traveled-to cell in a nicer location
- pivot: per-value display formats (Auto/Number/Money/Percent)
- icons: update icons in find panel
- intelligently freeze inferred header rows
- grid: add rainbow mode accessibility setting
- cli: add shell launcher and stdin support
- release: gate local releases before publishing
Performance
- sql: load only the tables a query references
- find: virtualize all-open results and debounce large-file current-file search
- find: O(1) large-file gate and drop dead clones in live search
- pivot: stop redundant row/col and range-column recompute
- grid: avoid full-grid clones on shuffle/fill/sort hot paths
- ci: use prebuilt DuckDB for checks
- release: vendor prebuilt DuckDB libraries
Refactoring
- licensing: extract and document fail-open revocation
- ui: group panels into a coherent self-contained layout
- ui: thin out shell.rs action wiring and reuse Kbd
- ui: relocate misplaced modules out of src/ui top level
- promote the Workspace view out of src/ui/ into src/workspace/
- workspace: split the 1619-line types.rs into a types/ module
- ui: split virtual simple grid by axis
- sql: move workspace queries onto DuckDB file catalog
- sql: drop dead metrics, share one connection per run
- sql: align query panel layout with find panel
- panels: group resizable bottom-panel sizes into a struct
- sql: derive panel state and split helpers
- grid: unify simple grids into one bidirectional component
- grid: single-source the scrollbar thickness across grids
- ui: name button click handler type
- find: move find options to Toggle controls, dedupe result navigation
- grid: share sign-handling logic across money formatters
- search: share percent scaling, drop redundant round
- chart: extract generic OpenItemCollection from ChartWorkspace
- data: shared column-ref and range-bounds homes
- pivot: value formats reuse the grid's CellFormat machinery
- grid: reuse mix() for rainbow tint, drop redundant text_color param
- grid: unify row/column axis logic behind a shared LineAxis
- dedupe chart/pivot stores, open-item lifecycle, Button/Toggle, atomic writes
- data: share whole-number and boolean-literal checks
- data: wrap GridAddressParseError instead of flattening it
- workspace: macro-collapse palette-only Action impls
- workspace: collapse SwitchTab1..9 into one indexed action
- pivot: extract shared value-cell loops in pivot_table_to_rows
- logging: collapse Profile::start()/log() triplets with timed()
- dedupe hit-test predicate, pluralization, and pivot field resolution
- fix inspect()-as-counter and add JSON cell inference fast-path
- pivot: decompose materialize_pivot into named helpers
- io: extract open_reader/read_rows_with_progress/strip_leading_bom
- workspace: split command_palette_items_for into per-category functions
- workspace: decompose spawn_active_doc_save
- workspace: extract escape-collapse and start-typing-to-edit
- ui: decompose render_virtual_simple_grid along its comment boundaries
- chart: decompose materialize_chart_preview_data_with_policy
- grid: extract split_rect_excluding from toggle_cell
- document: extract manual-size shift/delete primitives
- document: extract set_dimension from set_col_width/set_row_height
Style
- panels: normalize chart/pivot panel UX
- rustfmt
- rustfmt + fix clippy lints
Testing
- data: cover money and thousands-separator parser edge cases
- grid: declare reorder drop-boundary invariants and cover helpers
- grid: cover toggle_cell rectangle decomposition
- grid: assert finite-input invariant for selection aggregates
- search: assert centered_window invariants
- json: characterize numeric round-trip and type inference
- csv: cover delimiter detection
- aggregate: assert finite-input invariant for percentile and median
- workspace: assert persisted rows and journal are mutually exclusive
- chart: cover suggest_chart_config edge cases
- data: cover aggregate_group out-of-range indices
- grid: add co-located hit_test_grid_cell coverage
- data: pin US-first parsing of ambiguous slash dates
- grid: assert render_plan column-geometry subset invariant