Skip to content

Add persistent frozen leading rows and columns - #117

Closed
jonaraphael wants to merge 11 commits into
codex/fix-high-contrastfrom
codex/feat-frozen-panes
Closed

jonaraphael wants to merge 11 commits into
codex/fix-high-contrastfrom
codex/feat-frozen-panes

Conversation

@jonaraphael

@jonaraphael jonaraphael commented Oct 17, 2026 •

Copy link
Copy Markdown
Owner

Files with multiple header rows lose their identifying rows while scrolling, and users cannot keep leading data columns visible. This adds per-file frozen leading row/column counts, remembered after reopening.

Use CSV: Freeze Leading Rows (csv.changeFrozenRows) or CSV: Freeze Leading Columns (csv.changeFrozenColumns), or right-click a cell to freeze through that row/column. Enter 0 or choose Unfreeze to clear an axis. Row counts start after hidden metadata rows; the existing single frozen header remains the default. The serial index freezes alongside data columns.

Sticky offsets follow measured multiline row heights and column widths, updating after zoom, resizing, row-height changes and chunk arrival. Leading frozen rows exclude the virtual append row and request later chunks when needed. Corners stack above frozen rows/columns; opaque theme surfaces retain selection and find highlights; high-contrast themes use outlines without obscuring datatype colors. The half-border correction at the frozen block's top edge and divider-colored paint on every frozen row prevent scrolling text from showing above or between pinned rows. The paint follows the existing table/contrast divider color, includes serial and corner cells, and cannot intercept pointer input. Measured row spacing and datatype colors remain unchanged. Freeze changes preserve the current DOM, active draft and caret. Commands and README are synchronized.

Addresses #79. Depends on the narrowed #114 (codex/fix-high-contrast), which preserves datatype palettes and explicit color mode and limits accessibility overrides to high-contrast themes. Includes the shared stacked-PR CI correction.

Validation:

  • Node 20.20.0: npm run compile and npm test pass all 187 branch tests. npm run lint: 0 errors, 87 existing warnings. git diff --check passes.
  • Actual provider and shipped-script jsdom tests cover multiline/fractional row offsets, collapsed 1px/2px/0px borders, separate-border tables, zoom, column-width changes, header-off/hidden-row behavior, serial offsets/corner stacking, URI persistence, explicit zero/unfreeze cleanup, context actions, ResizeObserver updates, chunk loading and active draft/focus/caret preservation.
  • The combined integration checkout at d800392 passes compilation and all 531 tests; lint has 0 errors and 86 existing warnings, and git diff --check passes. Its filter integration preserves visible source-row order and the measured filter-bar inset.
  • Real Chromium QA used generated provider HTML and the shipped webview JavaScript with a mocked VS Code message bridge. Actual sticky painting and scrolling passed at scrollTop 720 and 727, including every internal frozen-row seam, fractional row heights, zoom, headers off, hidden metadata, filter-bar integration and horizontal frozen corners. Additional pixel comparisons across six scroll positions reproduce and remove the internal text slivers; checks in all four theme classes confirm the paint uses the existing divider color. The final combined build also passes header-off/hidden-metadata/filter QA at 110% in-view zoom. This establishes browser rendering behavior; it is not a native VS Code webview smoke test.

Verified multiple-row divider rendering (generated provider HTML and shipped scripts in Chromium, synthetic data):

Opaque dividers between every frozen row

Palette-stack verification: inherited the narrowed #114 without changing this PR's feature logic. Compile, full tests and lint pass on the current head; the browser confirms high-contrast frozen selection/find states retain datatype colors, and theme transitions preserve live/queued edits in the combined candidate. Combined verification head: d800392.

@jonaraphael
jonaraphael changed the base branch from codex/fix-column-sizing to codex/fix-high-contrast October 17, 2026 04:28
@jonaraphael
jonaraphael marked this pull request as ready for review October 17, 2026 04:31
@jonaraphael
jonaraphael marked this pull request as draft October 17, 2026 07:02
@jonaraphael
jonaraphael marked this pull request as ready for review October 17, 2026 07:08
@jonaraphael
jonaraphael marked this pull request as draft October 17, 2026 13:37
@jonaraphael
jonaraphael marked this pull request as ready for review October 17, 2026 14:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant