Files
gridcraft/docs/ui-parity.md
T
PranavandFredApps 7bb397a3c1 UI: RefEdit reference boxes in dialogs (Goal Seek, Solver, Data Analysis) (#494)
* UI: RefEdit reference boxes in dialogs; Goal Seek picks its cells on the grid

A reference box (RefEdit) is a text field that takes a range by selection
on the grid. While a box is the one being picked into (it was clicked into
or collapsed), clicking or dragging on the sheet writes the absolute
reference into it, with the sheet name when the selection is on another
sheet; typing still edits it, and the box takes the keyboard back after a
pick. Focusing another text field of the dialog ends picking.

The collapse button beside each box shrinks the dialog to that box, at the
dialog's top-left corner, so the sheet is free for selecting. Escape,
Enter or the expand button restore the dialog. The sheet and selection
from before picking are restored before the dialog runs its command
(references without a sheet name mean the sheet the dialog was opened
on) and when it closes. The button is focusable, works with Space and
Enter, and is named for screen readers; the icons are drawn in code.

Goal Seek's Set cell and By changing cell are reference boxes. The
snapshot example's --refedit key=range collapses the open dialog to a box
and selects a range, to render the collapsed state.

* UI: Solver and Data Analysis take their ranges with RefEdit boxes

Form dialogs gain a Ref field, drawn as a reference box with its collapse
button. Data Analysis uses it for the input, variable, X and Y and bin
ranges, and for Output Range, where picking or typing a reference also
chooses that output option. Solver Parameters uses reference boxes for
the objective, the variable cells and both sides of a new constraint.

* UI: Data Analysis keeps New Worksheet Ply when chosen after picking an Output Range

The Output Range box chose its option on every frame while it was the box
being picked into, so clicking New Worksheet Ply after using the box
reverted to Output Range on the next frame. The box now chooses Output
Range only when it is clicked into or its text changes (typed or picked),
and choosing another output option ends picking into it, so a later
selection on the grid doesn't fill it either.

* UI: RefEdit boxes remember the dialog's sheet by name

The sheet a dialog was opened on was kept by index, so a sheet inserted
or moved while picking (the ribbon stays usable) made a range on the new
sheet lose its sheet name, and closing the dialog went back to whichever
sheet now had that index. The sheet is now kept by name, as New
Formatting Rule's formula box does.

* UI: switching sheets while picking into a RefEdit box doesn't fill it

A reference on another sheet carries the sheet name, so after a click on
another sheet tab the selection never matched the one last seen, and the
switch alone wrote that sheet's remembered selection into the box,
replacing a typed reference. The box now notes which sheet its last seen
selection was on: showing another sheet only refreshes it, and a
selection made on that sheet still fills the box.

* UI: a RefEdit box for one reference takes only the area being selected

A selection of several areas (Ctrl+click) was written into every box as
a comma-joined union, which Goal Seek, Solver's objective and
constraints, and Data Analysis then refused as an invalid reference.
Solver's variable cells still take every area; the other boxes take the
area being selected.

* UI: RefEdit boxes follow the dialog's sheet when it is renamed

The dialog's own sheet was kept by name only, so renaming it while a
reference box picked made references on it carry the new name as if it
were another sheet, and running or closing the dialog could not put the
selection back. The sheet's index and the sheet count are now kept with
the name: when the name disappears while the count stays the same, the
sheet at that index was renamed and its new name is taken. Inserting,
moving or deleting other sheets still follows the name.

* UI: a deleted dialog sheet is never taken for another sheet

The dialog's own sheet was taken as renamed whenever its name was gone
and the sheet count matched the last frame's, so deleting it was read as
a rename a frame later (or after a sheet was inserted), and the
surviving sheet at that index became the dialog's sheet: unqualified
references ran against it and Cancel put the old selection on it.

The sheet names of the last frame are now kept in order. A rename is
taken only when the list keeps its length and only the home sheet's entry
changed; any other loss of the name marks the sheet as deleted for good.
Once it is deleted, picks carry their sheet's name, closing leaves the
selection where it is, and OK is refused with a message, since
references without a sheet name would otherwise run against whichever
sheet is shown.

* UI: RefEdit dialogs keep their sheet until they close

OK put the saved selection back and dropped the dialog's sheet with it.
When the command then failed, the dialog stayed open without its sheet:
a later deletion of that sheet went unnoticed and a second OK ran
references without a sheet name against the sheet shown, as it also did
when the person had only moved to another sheet after the failed OK.

The sheet is now kept, and followed through renames and deletion, until
the dialog closes; only the saved selection is put back once. A later
OK or Cancel shows the dialog's sheet again (or is refused once it is
deleted), and picking again on that sheet saves its selection anew.

* UI: Solver's Model Range is a RefEdit box

* UI: a collapsed RefEdit box keeps picking when something else is clicked

* UI: a dialog opened over a picking RefEdit dialog puts the selection back

* UI: arrow keys select on the grid while a dialog is collapsed to a RefEdit box

* UI: F4 cycles the anchors of the reference in a RefEdit box

* UI: tests for Enter while collapsed and OK after a cross-sheet pick

* Docs: RefEdit boxes' keyboard route, Model Range and click-elsewhere behaviour

* UI: a confirmed RefEdit dialog stays on the sheet its command showed

* UI: scripted dialog cancel and confirm end a RefEdit pick like the buttons

* UI: RefEdit boxes run their selection and sheet commands through the app

* Docs: RefEdit dialogs after OK, scripted cancel and confirm

* UI: a RefEdit dialog's OK stops when the picked sheet's draft cannot be saved

* Docs: ui.dialog.confirm applies to command-backed dialogs; a draft that cannot be saved stops OK

* UI: Cancel of a RefEdit dialog is never a confirmation, and says when it cannot go home

* Docs: cancelling a RefEdit dialog when its sheet cannot be shown again

* UI: a RefEdit dialog follows its sheet's rename only through the engine's recorded steps

* UI: F4 in a RefEdit box splits areas only at commas outside quoted sheet names

* Docs: how a RefEdit dialog follows its sheet's rename

* UI: a RefEdit dialog's sheet is told from a new sheet given its name

The dialog followed its sheet by name and read the recorded steps only once the name was gone, so a sheet deleted and recreated under its own name between two frames was taken for the dialog's sheet, and OK resolved unqualified references against the replacement. The home sheet is now followed through every recorded step since the dialog last looked: a sheet with its name is the same sheet only while its file id is unchanged (a sheet inserted in the session has none), a rename keeps the file id and the cells, and a deleted sheet is remembered as it was, so only an undo that brings that very sheet back revives it. When the steps are not accounted for, a sheet with the name is taken for it, as before. A sheet never saved to a file and replaced inside one undo group is the one case nothing in the model tells apart; the code comment says so.

* Docs: how a RefEdit dialog tells its sheet from a new sheet given its name

* UI: a RefEdit dialog follows a sheet that came from a file by its file id

A sheet read from a file keeps the file's sheetId, which no step changes and which a sheet inserted in the session lacks, so the dialog's sheet is found by it wherever a recorded step puts it and whatever the step renames it to: a group that renames the sheet and inserts a new one under its old name follows the rename instead of refusing OK. When the step also copied the sheet (a copy keeps the id), the one keeping the name is taken. A sheet never saved to a file is still followed by name, with the rename rule as before.

* Docs: a RefEdit dialog follows a sheet that came from a file by its file id

* UI: a RefEdit box the dialog stops showing is no longer picked into

A reference box compares the grid selection with the one it last saw only while it is drawn, so a box hidden while it was the one being picked into (Solver's Options view, the constraint value once the operator is int or bin) took a selection made meanwhile when it came back. After the dialog's window is drawn, a target box that was not drawn in the frame ends the pick, whatever hid it; Model Range no longer needs its own rule when the Load/Save area is hidden.

* UI: the Name Box keeps its keys while a dialog is collapsed to a RefEdit box

The collapsed picker took Escape, Enter and the arrow keys out of the frame's input whoever had the keyboard. The Name Box, drawn before the dialogs, had already read an arrow when the picker removed the same event and moved the grid selection, and the box then took that selection and the keyboard; its Escape expanded the dialog instead of only leaving the box. The picker now acts on those keys only when no other text field owns the keyboard, judged by the focus at the end of the frame before as well as now, since egui drops the focus for Escape before anything is drawn. The other field's Escape and Enter are still used up, so the dialog neither closes nor confirms on them.

* Docs: a sentence break in the ui.dialog row of the control protocol

* UI: a RefEdit dialog keeps its sheet by the sheet's identity, not by file id or history

The dialog's sheet was followed by name through the recorded undo steps, with the file's sheet id telling a saved sheet from a new one; a copy made with sheet.move keeps that id, so once the original was deleted the copy, as the only sheet of the id, was taken for the dialog's sheet and OK ran against it. The model now gives every sheet an identity while the app runs (SheetUid: fresh for every sheet added, inserted, copied or read, kept through renames, moves, undo and redo), so Home keeps the sheet's uid and finds the sheet by it each time it is needed. The history walk, the rename rule and the file-id and Arc comparisons are gone, with the undetectable single-step case they left: a sheet given the name, a replacement inside one undo group and a copy are all other sheets, and an undo that brings the original back makes it the dialog's again. Nothing of the unaccounted-steps fallback is kept, since the identity always answers. Regression test: copy the dialog's sheet, delete the original, OK is refused; undo, OK runs on the original. The identity tests no longer need a workbook that came through a file.

* UI: Solver's Reset All, Load, Save and Replace act on the dialog's sheet, as Solve does

Only Solve went through the dialog's home-sheet checks before running (dialogs::show): Reset All, Load Model, Save Model and Replace ran their commands straight from the form, on whichever sheet was active. After a reference box picked on another sheet and the dialog expanded, that sheet was still shown, so Reset All removed its model instead of the dialog's sheet's, and Load and Save read and wrote the model range on it. The four buttons now run only after the same checks as Solve: the dialog's sheet must still exist (else the command is refused with the deleted-sheet message) and is shown again with the selection from before picking put back (a failure to show it, a text-box draft that could not be saved, is shown as the dialog's error and the command does not run). Goal Seek has no other buttons, and Data Analysis's Replace goes through the confirm path that Solve uses, so neither needed a change. Regression tests: after a cross-sheet pick, Reset All clears the dialog's sheet's model and leaves the other sheet's; Save and Replace write the dialog's sheet; Load reads it.

* UI: Protect Sheet opened while a reference box picks on another sheet acts on the dialog's sheet

* Docs: a scripted Goal Seek after a cross-sheet pick cancels the dialog before data.goalSeek

* UI: the Protect Sheet labels follow the dialog's sheet while a reference box picks on another

* Docs: a scripted Goal Seek checks that the dialog's sheet still exists after cancel

* Control: ui.dialog.cancel replies sheetDeleted when the dialog's own sheet is gone, even if its name was reused

* M2: allow shared-runner variance in the pathological math timing gate

* M2: refuse sheet protection actions after a reference dialog home is deleted

---------

Co-authored-by: FredApps <FredApps@users.noreply.github.com>
2026-11-02 21:23:18 +01:00

56 KiB
Raw Blame History

UI parity

Last reviewed: 2026-10-10 · Last updated: 2026-11-02 · Change: minor (RefEdit reference boxes in dialogs: Goal Seek, Solver and Data Analysis use them, the arrow keys select while a dialog is collapsed and F4 cycles a reference's anchors; earlier: Python cells: Python mode in the formula bar; earlier: Insert › Equation and the equation editor; earlier: every floating object selects, resizes from eight handles and deletes with the keyboard; earlier: Formulas › Error Checking › Trace Error; trace arrows stay through a zoom (#3097); earlier: Page Setup sets the page order, Down, then over or Over, then down, which printing, the print preview, Page Break Preview and Page Layout view follow; earlier: Formulas › Function Library as labelled buttons with category menus; Recently Used and the Insert Function categories; Esc leaves a File-page text field before closing the view; earlier: checkbox cells print as boxes; Ctrl+arrow and Ctrl+Shift+arrow while pointing a formula reference; editing a hyperlink loads its existing fields; AutoSum over a selected row puts its total to the right; ribbon catalog count 276 / 292) · Target: Microsoft Excel (Microsoft 365), Excel for Mac 16.113.4

Interaction, controls and feel, against Excel. Part of target-app-parity.md. UI/UX fidelity: ~55% ready, 50–80 h (estimated). Ribbon command coverage is measured separately in parity-checklist.md (277 / 292).

Sources: crates/ui-egui/src (ribbon, grid, editor, formula bar, dialogs, panes), crates/engine/src/cmd (shortcuts in command specs), the owner's black-box notes (plan/excel/observed-ui.md, local only) and user issues.

Window and chrome

Element Excel GridCraft Status
2026-10-14 minor Dialogs (Find and Replace, Go To, Format Cells, Sort and the rest) move by their title bar instead of staying pinned to the centre (#1250)
Title bar, Quick Access Toolbar, AutoSave toggle yes yes done; macOS window controls misaligned (#170), Dock icon size (#169)
Ribbon: tabs, groups, split buttons, galleries, contextual tabs yes yes (Table Design, Chart Design, Format, PivotTable, Header & Footer tabs); Fill Color, Font Color and the Format Cells colour pickers end with Recent Colors and More Colors… (#928); large split buttons (Formulas › AutoSum); arrows at the card's edges scroll a tab wider than the window done; missing contextual tabs for pictures, shapes, sparklines, slicers; groups do not collapse when narrow
Ribbon collapse, simplified ribbon, customize ribbon/QAT yes partial customization missing (File ▸ Options is the one missing File command)
Formulas › Function Library Insert Function, AutoSum, Recently Used and a menu per function category yes (10-24): a big Insert Function button and three columns of labelled small buttons, the layout Excel uses when the window is not wide enough for a big button per category; each category's book icon has its own colour; a category menu shows each function's description on hover and ends with Insert Function…, which opens the dialog on that category; More Functions cascades into Statistical, Engineering, Cube, Information, Compatibility and Web; AutoSum is a split button whose menu (Sum, Average, Count Numbers, Max, Min, More Functions…) Home › Editing shares; Recently Used has the MR key tip the wide layout with a big button per category is not offered; a function counts as recently used once its formula is entered, not when Insert Function's OK is pressed
Ribbon: tabs, groups, split buttons, galleries, contextual tabs yes yes (Table Design, Chart Design, Format, PivotTable tabs) done; missing contextual tabs for pictures, shapes, sparklines, header/footer, slicers
Ribbon collapse, simplified ribbon, customize ribbon/QAT yes partial customization missing
Key tips (Alt / F10 then letters) yes, every ribbon control initial (#43, 10-10): Alt or F10 shows key tips on Home for alignment, Paste Special and AutoFit plus legacy Alt sequences; other tabs and controls not yet (#33, #49) 3–5 h
Formula bar with Name Box, expand, function hints yes yes; grows with its content from one to five lines (Alt+Enter, wrapped text, or viewing a multi-line cell), then scrolls with the caret in view, the Name Box and buttons staying on the first line; the chevron pins it at five; the in-cell editor shows every line done; no drag-to-resize handle
Sheet tabs: rename, reorder, colour, hide, scroll yes yes Ctrl-drag (Cmd or Option on macOS) drops a copy (#971); active tab revealed on navigation and resize (#681); manual wheel/trackpad browsing preserved; rename focus bug on macOS (#145)
Formula bar with Name Box, expand, function hints yes yes done; dynamic-array spill children show the source formula muted and read-only, using current spill ownership
Python cells: Python mode yes yes (11-01): Ctrl+Alt+Shift+P (Cmd+Option+Shift+P on a Mac), =PY then Tab, or editing a Python cell edits the code in the formula bar's code editor, with a PY badge beside fx; Enter starts a new line with the indentation, Tab and Shift+Tab indent, Ctrl+Enter (Cmd+Enter) puts the code in the cell through python.set, Esc cancels. Deleting all the code and committing clears a Python cell, as an empty entry clears any other cell. The formula bar shows while a Python edit is open, also when View › Formula Bar hides it. On a protected sheet, a Python cell formatted Hidden shows no code in the formula bar and starts no edit, as a hidden formula shows none this build stores Python code and doesn't run it: new or changed code shows #BLOCKED!; no xl() pointing on the sheet yet
Formulas › Error Checking arrow: Trace Error, Circular References yes yes: the button opens Error Checking and its arrow opens a menu with Error Checking…, Trace Error and Circular References. Trace Error (formulas.traceError, 11-01) follows the active cell's error back through the first reference showing the same error (in a range, its first cell showing it) to the cell it starts in, and draws red arrows along the way and blue ones from that cell's own references, as measured in Excel; on a cell without an error it draws nothing and the arrows shown stay. Circular References lists a cell on each circular reference as Sheet!A1, up to 100, and selects the one picked, on its own sheet (unavailable when there are none) done; the Error Checking… item and the limit of 100 are GridCraft's own; a new trace replaces the arrows shown, where Excel adds to them, and there is no Remove Precedent Arrows
Sheet tabs: rename, reorder, colour, hide, scroll yes yes active tab revealed on navigation and resize (#681); manual wheel/trackpad browsing preserved; rename focus bug on macOS (#145)
Sheet tabs: rename, reorder, colour, hide, scroll yes yes active tab revealed on navigation and resize (#681); New sheet (+) right after the last tab, the strip capped at 60% of the bar (#943); manual wheel/trackpad browsing preserved; next/previous skips Hidden and VeryHidden sheets and retains the current sheet and selection when no visible destination exists; rename focus bug on macOS (#145)
Status bar: Sum/Count/Average and more, view buttons, zoom yes yes; a right-click on the status bar opens a menu that turns the statistics on and off (Average, Count, Numerical Count, Minimum, Maximum, Sum; view.statusBar) done for the statistics; the other status bar options are not customizable
Task panes (Format Chart, Comments, Watch, Selection, PivotTable fields) yes yes; PivotTable source-field list scrollbar sits at the right edge of its pane element-level Format pane for shapes and pictures missing
Backstage (File) view: Info, New with templates, Open recent, Export, Options yes partial template gallery missing
Dark mode, system appearance yes yes done (10-09); follows the system on first run, title-bar switch and File › Display theme (#194, #239); icons, reference colours, primary buttons and the comments pane follow the theme, and a unit test holds every token pair to WCAG 2 contrast in both themes
Backstage (File) view: Info, New with templates, Open recent, Export, Options yes yes (#174, 10-11): the File tab opens a full-window view (Esc or the back arrow return; Esc in a text field first cancels editing and leaves the field, #3035) with Home, New (blank + the three samples), Open (recent + Browse; the recent list tells when each workbook was last changed, 10-12), Info (location, properties, Protect Workbook), Save, Save As, Print (page preview, active sheet or workbook, fit to page, Page Setup), Export (PDF, CSV, web page), Close and Options (file.options: theme, language, formula bar, AutoSave, calculation mode and iterative calculation with Maximum Iterations and Maximum Change, 10-15) no Account, Share or template gallery beyond the samples; Options applies at once (no OK/Cancel dialog) and holds only the settings GridCraft has
Dark mode, system appearance yes yes done (10-09)
Page Layout view (paper view with rulers and header editing) yes yes (#329, 10-11): per-sheet view saved in XLSX, pages with margins and gaps on the print pagination, "Click to add data" pages, rulers (inches or centimetres), headers and footers drawn and edited in place with a Header & Footer tab, whose Different First Page and Different Odd & Even Pages give the first page and the even pages their own header and footer (#344), and whose Scale with Document and Align with Page Margins set whether header and footer text follows the print scale and the side margins, on paper and in the view margins drag on the rulers (#792, with header and footer margins); header/footer pictures missing (1–3 h). Unverified: with Align with Page Margins off, header and footer text sits 0.7 in from the paper edge, a value not yet measured in the target app
Multiple windows per workbook yes yes (10-22, desktop): each workbook window is a native window of its own (New, Open and New Window open one; titles "Book1", or "Book1:1" / "Book1:2" for a workbook's second window, with " — Edited" while unsaved). Each window keeps its own cell draft, dialog, Backstage view, message and grid state, and its ribbon acts on it; on macOS the menu bar acts on the window focused last. Leaving a window enters its draft as Enter would. A window's close button closes that window: one of several on a workbook closes without asking, a workbook's last asks Save / Don't Save / Cancel when unsaved. Quit asks about each unsaved workbook in its window, and Cancel stops it. The last window closed quits on Windows and Linux; macOS keeps running with the menu bar until New or Open. View › Arrange All (dialog: Tiled, Horizontal, Vertical, Cascade, Windows of active workbook; view.arrangeAll tiles by default) lays the visible windows out over the main window's monitor, the active one first. Web: one window Arrange All uses one monitor; a hidden window (View › Hide) has no native window; every window repaints when one does; see hardware-parity.md
Switch Windows, New Window, unsaved workbooks on quit yes yes (10-22): View › New Window opens another window on the same workbook (no copy: saving from either saves it), each with its own selection, active sheet and scroll (showing different sheets copies nothing and leaves the workbook unchanged; Save records the sheet of the window used last); a workbook with several windows titles them "Book1:1", "Book1:2"; File › Close closes one of them without asking and asks only for the last; View › Switch Windows and the macOS Window menu list the open windows (active one checked, unsaved ones marked •) and bring the chosen one forward (view.switchWindows {window}, or {doc} for a workbook's most recent window); a cell being typed is entered into its own window and workbook before New, Open, Close, Save, Print and window switches (also between two windows on one workbook), and a refused entry stays open and stops the command; quitting (Cmd+Q, the macOS Quit item, the Dock) asks Save / Don't Save / Cancel for each unsaved workbook

Grid interaction

AutoFit column width includes dropdown space only for filter header cells (tables and ordinary AutoFilters), then takes the maximum against body cells. Windows Excel 16.0 build 20326, observed using synthetic workbooks via its public automation API on 2026-10-11, reserves 12.5 points at 100-200% zoom and 25 points at 50%, independently of row height. GridCraft uses that allowance in its grid units; its existing approximate font measurement remains. Header text aligns and clips before the button. Command and header-double-click paths share this logic, with one undo step.

Behaviour Status
Click/drag/Shift/Ctrl selection, multi-area selection rectangular drag works in one direction only in some cases (#28)
Cursor while dragging cells, headers, freeze handles and objects stable for the active drag (#936); Draw tools keep their crosshair; header arrows and a custom cell cursor remain unimplemented
Selection outline glides to a new selection (Excel: "Provide feedback with animation") done (10-11): 0.12 s, decelerating, with the fill and fill handle; View ▸ Animations (view.animations) turns it off. The timing is an estimate, not yet measured against Excel; the system's reduced-motion setting isn't followed yet
Fill handle: drag to fill series, double-click to fill down, right-drag menu fill done (Ctrl+drag swaps copy and series; month patterns use the workbook's 1900 or 1904 date system); right-drag menu partial: Copy Cells, Fill Series, Fill Formatting Only, Fill Without Formatting, and from a date Fill Days, Fill Weekdays, Fill Months and Fill Years, then Series…; a left-drag leaves an Auto Fill Options button with the same fill choices (gone once the workbook changes or the selection moves); Linear/Growth Trend and Flash Fill missing
Drag-move and drag-copy cells (border drag, Ctrl/Option, Shift to insert) done (M3)
In-cell editing, Enter/Tab movement, Alt/Option+Enter line breaks done
Point mode (click/drag/arrow references), reference colouring, F4 done; Command/Ctrl-click adds separate arguments with the edit's locale separator, and Shift-click extends the current reference from a fixed anchor on the same sheet. Pointer-event regressions cover repeated/reversed selections, manual separators, sheet switches and keyboard continuation.
Number-format colors ([Green], [Color1]–[Color56]) Rendered in grid and PDF from shared RGB mappings (#1452)
Point mode (click/drag/arrow references), reference colouring, F4 done
AutoComplete in columns, function autocomplete and argument tips done; cell helpers clip to the worksheet and hide when the editor scrolls out (#200)
Header resize and double-click AutoFit done (#42, #88 for header dividers)
Data › Advanced Filter dialog offers in-place or copy-to filtering, list and optional criteria ranges, and unique records; Alt+A,Q opens it (#1622). The engine's copy-to path clears only the result footprint and rejects worksheet overflow (#1031).
Outline symbols for grouped rows / columns (band beside the headers, brackets, − / +, level buttons 1…n+1) done (#373): clicks run data.hideDetail / data.showDetail / data.showLevels, frozen panes and right-to-left sheets included; Data › Outline › Settings (data.outlineSettings) puts summary rows above and summary columns left of their detail, saved as outlinePr (the dialog's Automatic styles check box and Apply Styles button are missing), View › Show Outline Symbols (Ctrl+8) hides the bands and is saved with the sheet, and a block of cells still groups rows without the Rows / Columns dialog
Reorder selected whole columns by dragging their headers done (10-11)
Freeze panes, split panes freeze done; split to verify
A Table's header names and filter buttons in the column headings once its header row scrolls away done (#1423): with the active cell in the Table, as in Excel; the button opens the column's filter menu, the rest of the heading still selects the column. Plain AutoFilter ranges keep their letters (Excel does the same)
Copy as HTML table for other apps done (#36, 10-10)
Context menu on cells 16 items (Cut, Copy, Paste, Paste Special, Insert, Delete, Clear Contents, Filter by value, Sort, New Comment, New Note, Format Cells, Pick From Drop-down List, Define Name, Link). Insert Copied Cells (Insert Cut Cells for whole rows/columns) while the clipboard holds a copy (#21). Show Details on a PivotTable's value, subtotal or grand total cell (pivot.showDetails). Missing: Insert Cut Cells for a cell block, paste-option icons, Quick Analysis, Get Data from Table, Show Changes, Smart Lookup
Move and resize charts, pictures and shapes done (#190, #213): charts, pictures, shapes, equations and slicers select with a frame of eight handles; each handle resizes only its own edges (they never cross), the body moves the object, and the pointer shows a resize or move cursor; Delete or Backspace deletes the selected object and Escape drops the selection; double-click edits a text box, opens Format Chart for a chart. Rotation handle, Shift for proportional resizing, Alt to snap to cells and multi-object selection missing
Context menus on row/column headers, sheet tabs, charts, shapes headers and tabs done; objects partial
Quick Analysis (Ctrl+Q) missing
Smooth scrolling, scrollbars done; vertical scrollbar added 10-09 (#73); horizontal scrollbar in the tab bar (60/40 split, drag, track click pages) 10-13 (#176, #840); dragging the handle at the scrollbar's left edge gives the tabs more or less of the bar; each workbook keeps its share while it is open (not saved in the file)
Text overflow into empty neighbours, wrap, rotation, shrink to fit done

Keyboard

Area Excel GridCraft
Shortcuts bound to commands 200+ documented shortcuts per platform 59 command shortcuts plus grid and editor keys (55 distinct keys handled in ui-egui)
Ctrl+arrow, Ctrl+Shift+arrow, Ctrl+Home/End, Page Up/Down, Alt+Page yes done
Ctrl+1, Ctrl+; and Ctrl+Shift+; , Ctrl+D/R, Ctrl+E, Ctrl+T, Ctrl+K, Ctrl+Shift+L yes most done; audit pending
F2, F4, F5, F9 family, Shift+F3, F11 yes most; F11 chart sheet missing (no chart sheets)
Mac-specific (Cmd variants, Fn keys) yes Cmd mapping done
Delete selected charts, pictures and shapes yes done (#213)
Shortcuts bound to commands 200+ documented shortcuts per platform audited below (#110): shortcuts whose feature exists are bound, with the exceptions listed; the rest wait for their features
Ctrl+arrow, Ctrl+Shift+arrow, Ctrl+Home/End, Ctrl+Shift+Home/End, Page Up/Down, Alt+Page yes done
Ctrl+1, Ctrl+; and Ctrl+Shift+; , Ctrl+D/R, Ctrl+E, Ctrl+T/L, Ctrl+K, Ctrl+Shift+L, Ctrl+Shift+~!@#$%^&_ yes done
F2, F3, F4, F5, F7, F9 family, Shift+F2/F3/F10/F11, F12 yes done; F11 chart sheet, F8 extend mode, F4 Repeat missing
Mac-specific (Cmd variants, Control variants, Fn keys) yes done where a feature exists (keymap.rs picks the Mac variant)
Sequential Alt access keys (Alt, H, N, …) on every ribbon tab yes 364-sequence keytip table for all tabs: per-control badges, prefix waiting, dropdowns open for editing (type/arrows/Enter), pending bindings for not-yet-built commands; letters also work with left Alt held (Alt+H, O, A), as in Excel; each Borders letter (H, B, …) draws its own preset, H, B, M opens Format Cells on the Border tab, and Erase Border, Line Color and Line Style are reserved; QAT/Backstage excluded
Requests — #110 (more shortcuts and hot keys), #33 (sequential Alt; initial support landed in #43)

Shortcut audit (#110)

Checked against Microsoft's published "Keyboard shortcuts in Excel" (Windows and Mac tables, 2026-10-11). Alt key-tip sequences are tracked separately (#33). Bindings live in crates/ui-egui/src/grid.rs (navigation, editing keys), ribbon::shortcut (Ctrl/Cmd letters), keymap.rs (everything added in #110, with a lookup table that tests cover) and formula_bar.rs (keys while editing). "Ctrl" means Cmd on a Mac unless the Mac column says otherwise. Number-format and border keys match the physical key (Ctrl+Shift+4, wherever $ is).

Shortcut (Windows) Mac Action Status
Ctrl+C / X / V, Ctrl+Z / Y, Ctrl+A, Ctrl+B / I / U same with Cmd clipboard, undo/redo, select all, bold/italic/underline present
Ctrl+S, Ctrl+Shift+S, Ctrl+O, Ctrl+N, Ctrl+W Cmd save, save as, open, new, close present
Ctrl+F, Ctrl+H, Ctrl+G, Ctrl+K, Ctrl+T Cmd (Ctrl+H) find, replace, go to, hyperlink, table present
Ctrl+D, Ctrl+R, Ctrl+E, Ctrl+1, Ctrl+9 / 0, Ctrl+Shift+9 / 0 Cmd (Ctrl+E on Mac: see below) fill down/right, Flash Fill, Format Cells, hide/unhide present
Ctrl+- , Ctrl+Shift+= , Ctrl+numpad + Cmd Delete / Insert cells dialog present
Ctrl+; , Ctrl+` Control+; current date, show formulas present (Mac Control+; added)
Arrows, Shift / Ctrl / Ctrl+Shift+arrows, Home, Ctrl+Home / End, Page Up / Down, Ctrl+Page Up / Down Cmd+arrows navigation and extension present
Tab, Shift+Tab, Enter, Shift+Enter, Ctrl+Space, Shift+Space, Delete, Esc same entry and selection present
F2, F9, F10 (key tips), F4 / Alt+Enter / Ctrl+Enter / Ctrl+Shift+Enter while editing same edit, calculate, references, new line, fill, array present
Ctrl+Shift+~ ! @ # $ % ^ Control+Shift General, Number, Time, Date, Currency, Percent, Scientific added
Ctrl+Shift+& / Ctrl+Shift+_ Cmd+Option+0 / Cmd+Option+- (and Cmd+Option+arrows for one side) outline border / remove borders added
Ctrl+2 / 3 / 4 / 5 — bold / italic / underline / strikethrough added
Ctrl+6 Control+6 hide / show objects (charts, pictures, shapes, slicers), saved as workbookPr showObjects added
Ctrl+Shift+: Cmd+; current time added
Ctrl+' / Ctrl+Shift+" Control formula / value from the cell above added
Ctrl+L Cmd+L is Align Left, Cmd+E Center, Control+E Flash Fill create table added
Ctrl+Shift+L Cmd+Shift+F (present) / Control+Shift+L filter added
Ctrl+Shift+F, Ctrl+Shift+G — Format Cells Font tab, Workbook Statistics added
— Cmd+Shift+H, Cmd+Shift+R, Cmd+Shift+K / J, Control+L, Control+U replace, sort, group / ungroup, Define Name, edit cell added
Alt+Shift+Right / Left Option+Right / Left is next/previous sheet group / ungroup added
Ctrl+Shift+* (Ctrl+Shift+8), Ctrl+Shift+Space Cmd+Shift+Space current region, select all added
Ctrl+Shift+Home / End, Shift+Home same extend to A1 / last used cell / row start added
Ctrl+P Cmd+P print added
Ctrl+Shift+> / < Cmd+Shift+> / < font size added
Ctrl+Alt+V Cmd+Control+V, Cmd+Option+V Paste Special added
Ctrl+Alt+= / Ctrl+Alt+- — zoom in / out (10% steps) added
Alt+=, Alt+Down, Alt+Page Down / Up Option+Down, Option+Page Down / Up AutoSum, drop-down list, one screen right / left added
Alt+Down on a filter header Option+Down Open the existing AutoFilter popup; validation dropdowns keep priority added (AutoFilter portion of #441; Ribbon dropdowns and column value picker are separate work)
Alt+F1, Alt+Shift+F1, Shift+F11 Shift+F11 embedded chart, new sheet added
Shift+F2, Ctrl+Shift+F2 Shift+F2, Cmd+Shift+F2 note, threaded comment added
Shift+F3, Ctrl+F3, Ctrl+Shift+F3 Shift+F3, Cmd+F3 (Define Name), Cmd+Shift+F3 Insert Function, Name Manager, Create from Selection added
F5, Shift+F5 (Mac), F7, Shift+F9, Ctrl+Alt+F9, F12, Ctrl+F4 same Go To, Find, Spelling, calculate sheet / all, Save As, close added
Shift+F10, Alt+Shift+F10, Ctrl+F1 Shift+F10, Cmd+Option+R context menu, Error Checking, ribbon added
Ctrl+Alt+Shift+P Cmd+Option+Shift+P Python mode on or off added
F3 not checked Paste Name dialog, only when the workbook has names: OK puts the name at the caret of the formula being edited (or starts =Name), Paste List writes each name and what it refers to from the active cell (formulas.pasteName) added
F1, F4 (repeat), F6 / Shift+F6, F8 / Shift+F8, F11, End mode same help, Repeat, pane cycling, extend/add mode, chart sheet missing (no such feature yet)
Ctrl+Q, Ctrl+A after a function name, Ctrl+Shift+U, Ctrl+Alt+P same Quick Analysis, Function Arguments, formula bar height, tooltips missing
F1, F3, F4 (repeat), F6 / Shift+F6, F8 / Shift+F8, F11, End mode same help, Paste Name, Repeat, pane cycling, extend/add mode, chart sheet missing (no such feature yet)
Ctrl+Q, Ctrl+A after a function name, Ctrl+Alt+P same Quick Analysis, Function Arguments, tooltips missing
Ctrl+Shift+A after a function name Control+Shift+A argument names: =SUMIF( becomes =SUMIF(range,criteria,sum_range), the ( added when missing; one Undo takes them back added
Ctrl+Shift+U Control+Shift+U expand or collapse the formula bar (view.expandFormulaBar), on the grid and while editing; on Windows and Linux it no longer underlines added
Alt+F8, Ctrl+Shift+letter Option+F8, Cmd+Shift+letter Macros dialog, a macro's own shortcut (letters GridCraft uses keep their meaning) added
Ctrl+Shift+Page Up / Down, Ctrl+Alt+5, Ctrl+Shift+F1, Ctrl+F5–F10, Alt+F11 / F12 same group sheets, shape cycling, full screen, window keys, VBA, Power Query missing
— Cmd+= (calculate), Cmd+T (references while editing; F4 works), Shift+F7, Cmd+Shift+L Mac-only extras missing (Cmd+= is egui's zoom key; no thesaurus or Modify Cell Style)

On Windows, AltGr arrives as Ctrl+Alt: a Ctrl+Alt key that also types a character is treated as text, so AltGr symbols (e.g. ~ on a German layout) and user-defined Ctrl+Alt+letter hotkeys that type a character (e.g. Ctrl+Alt+A for ä) never trigger a shortcut, Ctrl+letter ones like Select All included.

Dialogs

Insert Hyperlink loads an existing cell link's address, display text and ScreenTip for editing (#2876). Keeping the display text unchanged preserves the cell's number or formula; Cancel keeps the original link and an edit can be undone in one step.

Format Cells, Insert Function (search, Most Recently Used, All and each category), Find and Replace, Go To and Go To Special, Sort, Name Manager, Data Validation, Paste Special, Conditional Formatting manager, Page Setup (margins and the page order), Goal Seek, Scenario Manager, Data Analysis, Forecast Sheet, Macros (macros, Automate scripts and a note on a VBA project; Run, Step Into, Edit, Create, Delete, Options), Record Macro, the macro step editor (Excel's VBA editor has no counterpart here) and others exist. Missing or partial: Options, Solver, Power Query editor, Insert Object, Protect/Allow Edit Ranges, Workbook Links, Accessibility checker. Like Excel's, every dialog opens centred and moves by its title bar, keeping its place while it is open (#1250). Go To lists the named ranges of every sheet (a name scoped to another sheet as Sheet2!Name) and the references entered before; a double-click goes to one. Its Reference box takes several names or references separated by commas (Price, Type, B14:C22,F19:G30) and selects them all. New Formatting Rule's formula box points like the formula bar: a click on the grid writes the cell's absolute reference at the caret (=$B$2) and a drag a range, leaving the selection the rule applies to as it is (#2348).

Reference boxes (RefEdit) take a range by selection on the grid: while a box is the one being picked into, clicking or dragging on the sheet writes the absolute reference into it (with the sheet name, quoted when it needs quotes, when the selection is on another sheet: 'Rates Table'!$A$2:$A$4), and typing still edits it. The box's collapse button shrinks the dialog to the box while the person selects; Escape, Enter or the expand button restore it (Enter there does not press OK, which is not shown while collapsed). Cancel, Escape, a ribbon command that opens another dialog over it, and a scripted ui.dialog.cancel put the sheet and selection from before picking back; OK (and ui.dialog.confirm, for a dialog whose OK runs a command; Goal Seek presses its own OK and is scripted with data.goalSeek) puts them back before its command runs and then stays where the command leaves things, so a Data Analysis report written to a new sheet stays in view. Solver's Reset All, Load, Save and Replace go back the same way before they run, since they act on the dialog's sheet, and are refused like OK once that sheet was deleted. A text-box draft left open on the sheet picked on is saved before the sheet changes, as any sheet switch saves it; when it cannot be saved (a script showed another sheet meanwhile), OK does not run its command and the dialog stays open with the reason, while Cancel still closes the dialog, shows the reason and leaves the draft and the selection where they are (a scripted ui.dialog.cancel fails and keeps the dialog instead, so the script can act). While collapsed, the arrow keys move the selection on the grid, Shift+arrow extends it and Ctrl+arrow (Cmd on a Mac) jumps to the edge of the data, and the box follows; expanded, the arrows edit the box. F4 in a focused box cycles the anchors of its reference (A1, $A$1, A$1, $A1; a whole column or row between A:A and $A:$A). A click elsewhere (the Name Box, the ribbon) neither expands nor closes a collapsed dialog, and the box keeps picking, while the arrow keys and Escape belong to the Name Box as long as it has the keyboard; a command that moves the selection (Undo, Go To) moves the reference with it. A box the dialog stops showing (Solver's Options view, the Model Range of a hidden Load/Save area, the constraint value once the operator is int or bin) is no longer picked into: a selection made meanwhile does not land in it when it is shown again. The dialog follows the sheet it was opened on by the sheet's identity while the app runs (fresh for every sheet added, inserted, copied or read from a file; kept through renames, moves, undo and redo), wherever it is moved and whatever it is renamed to. A sheet deleted and another inserted in its place or given its own name, or a copy of it, even in one script batch or one undo step, is not taken for it: OK is refused and Cancel leaves the selection where it is; an undo that brings the sheet back makes it the dialog's again. The collapse button is reachable from the keyboard and named for screen readers. Goal Seek, Solver (objective, variable cells, both sides of a new constraint and the Model Range of Load/Save) and Data Analysis (input, variable, X and Y, bin and output ranges) use reference boxes; the other dialogs that take ranges (Forecast Sheet, Allow Edit Ranges, Define Name, Sparklines, Advanced Filter) still take typed references.

Accessibility

AccessKit is enabled, but the grid, ribbon and dialogs are not exposed as an accessible tree with cell addresses and values, so screen readers can't navigate a sheet; there is no high-contrast theme or accessibility checker. Excel is strong here. 12–18 h. The light and dark themes' colour pairs (text 4.5:1, glyphs 3:1) are checked by theme::contrast_tests.

Feel

Pixel comparison against Excel screenshots hasn't been run since M1; fonts depend on the system (no Calibri; Carlito would match metrics, #29, #4, #168 for weights); icons are GridCraft's own by rule and will never match Office's, by design.

Work (50–80 h)

Key tips 3–5 · remaining shortcuts with their features 2–4 · context menus and Quick Analysis 5–8 · Page Layout view 8–12 · Options dialog and ribbon/QAT customization 6–10 · accessibility 12–18 · selection and scrollbar bugs 2–4 · pixel/feel pass against observed Excel 7–12.

Revision history

Date Change Summary
2026-11-02 minor RefEdit reference boxes in dialogs: pick a range on the grid, collapse the dialog while selecting; Goal Seek, Solver (with the Model Range of Load/Save) and Data Analysis use them; while collapsed the arrow keys move the selection and Shift+arrow extends it, F4 cycles a reference's anchors, a click elsewhere keeps the box picking, a dialog opened over a picking one puts the selection back, OK stays on the sheet its command showed, and scripted cancel and confirm end a pick like the buttons; the dialog's sheet is followed through the recorded undo steps, so a sheet deleted and recreated under its name is not taken for it and an undo of the deletion brings it back; a box the dialog stops showing is no longer picked into
2026-11-02 minor Python mode edits a cell's code in the formula bar's code editor (Ctrl+Alt+Shift+P, =PY then Tab, editing a Python cell), with the PY badge beside fx; its keys apply in input order, also several in one frame, and Ctrl+Enter commits through python.set (empty code clears the cell), keeping the code and showing the command's message when the code is refused
2026-11-02 minor Insert › Symbols: Equation split button (access keys N E), a gallery of examples, and an equation editor with quick-insert buttons, the error underlined at its position and a live preview; double-clicking an equation edits it
2026-11-02 minor Floating objects: one selection for charts, pictures, shapes and slicers, eight resize handles with matching cursors (right-to-left sheets included), Escape drops the selection
2026-11-01 minor Chart Design › Add Chart Element offers Data Table with/no legend keys and None; Format Chart Area has a Data Table section with visibility, legend keys, horizontal/vertical borders and outline. Both use engine commands.
2026-11-01 minor Page Setup has a Page order choice (Down, then over, the default, or Over, then down) with a small picture of the order, also when Print Titles opens it on its Sheet tab; OK sets it with the margins in one undo step. Printing, PDF export, the print preview, Page Break Preview's page numbers and Page Layout view's headers and footers follow the order. The dialog is in German now too
2026-11-01 minor Formulas › Error Checking › Trace Error (formulas.traceError): red arrows from the cell an error starts in to the selected cell, through the first reference showing the same error at each step, and blue arrows from that cell's own references, as measured in Excel; the command returns the source and the arrows
2026-11-01 minor Trace arrows stay when the sheet is zoomed (View › Zoom, the status bar, Ctrl+wheel), as in Excel; every zoom used to remove them (#3097)
2026-10-31 minor Esc in a File-page text field leaves the field and cancels editing; the next Esc returns to the sheet (#3035)
2026-10-31 minor Recently Used lists the functions most recently entered in a formula from any source, kept with the preferences; the Insert Function dialog is titled as in Excel, its category list (Most Recently Used, All, each category) works, and its category column follows the widest name shown
2026-10-31 minor Formulas › Function Library: Insert Function, the AutoSum split button and three columns of labelled small buttons with category colours; category menus end with Insert Function…; More Functions cascades; Home › Editing shares the AutoSum menu; MR key tip for Recently Used
2026-10-30 minor Checkbox cells print and export to PDF as boxes, as on screen: unchecked white with a grey outline, checked green with a white tick (#2972). They printed their value as TRUE or FALSE; other values in a checkbox cell still print as text
2026-10-29 minor Formula pointing from the keyboard: Ctrl+arrow (⌘arrow) moves the pointed cell to the edge of its data and Ctrl+Shift+arrow (⌘⇧arrow) extends the pointed range there, as the same keys move and extend the selection, so typing =COUNTIF(, clicking the top of a column and pressing ⌘⇧↓ points at the whole column of data; the keys used to move or extend by one cell. A range reaching the sheet edge is written as whole columns or rows (A:B). The editor reads the modifiers of the arrow's own key event, so a keystroke pressed and released within one frame (a control client's ui.key, an automation tool) keeps its Shift and Ctrl
2026-10-29 minor Insert Hyperlink opens with an existing link's address, display text and ScreenTip (#2876). An address-only edit preserves the cell's content and formula; Cancel leaves the link unchanged, and Undo restores the edit
2026-10-27 minor Ctrl with the numpad's + inserts rows, columns or cells as Ctrl+Shift+= does, as in Excel; it did nothing because the numpad key arrives without Shift
2026-10-25 minor AutoSum (Alt+=, Home › AutoSum) over a selected row puts its total to the right of the row, or in its last cell when that is empty, as in Excel; it wrote a one-cell total under each cell. A selection's empty last column takes each row's total and its empty last row each column's, with the block's total in the corner when both are empty
2026-10-25 minor Paste Name lays out only the names in view, so a workbook with thousands of names opens it at once; the arrow keys still scroll the chosen name into view. Go To matches a Sheet2!Name reference and hides a workbook name behind the active sheet's own name in any case and script (Größe = GRÖSSE), as formulas do. The two Page Layout view rows are one; the 0.7 in side margin used when Align with Page Margins is off is marked unverified
2026-10-24 minor Macro step editor: step list with breakpoints, drag to reorder and a command picker, an inspector with reference boxes, a debug bar and grid overlays
2026-10-24 minor Automate › Macros group (Record Macro, Use Relative References, Run Macro), recording status in the status bar, Macros dialog with macros beside scripts, Record Macro dialog, Ctrl+Shift+letter macro shortcuts; View › Macros keytips open the dialogs
2026-10-24 minor Ribbon catalog count 275 / 291 → 276 / 292 (View › Macros › Record Macro)
2026-10-24 minor Go To lists the named ranges on every sheet, as Excel's does ("The Go to popup window shows named ranges on every worksheet in your workbook"): a name scoped to another sheet appears as Sheet2!Name, and hidden names, constants and formulas are left out. It keeps the references entered (newest first, ten at most), and a double-click on an entry goes there. The Reference box and edit.goTo take several names or references separated by commas (Price, Type, B14:C22,F19:G30,H21:H29) and select them all; edit.goTo {list: true} returns the list
2026-10-24 minor Right-clicking the status bar opens a menu of its statistics, as in Excel ("If you want to customize the status bar, right-click it, and then click the options that you want"): Average, Count and Sum are on by default, and Numerical Count, Minimum and Maximum are new and off by default. The choice is a preference (view.statusBar), kept in prefs.json
2026-10-24 minor Ctrl+Shift+U (Control+Shift+U on a Mac) expands or collapses the formula bar, as in Excel ("Expand or collapse the formula bar. Ctrl+Shift+U"), on the grid and in the cell editor or formula bar while editing. On Windows and Linux it used to underline the selection, as Ctrl+U does. The command is view.expandFormulaBar ({on?}, toggles without it)
2026-10-24 minor Right-clicking a PivotTable's value, subtotal or grand total cell offers Show Details in the cell menu, as in Excel ("Right-click a field in the values area of the PivotTable, and then click Show Details"): it lists the cell's source records on a new sheet, as double-clicking the cell does (pivot.showDetails). Labels and headers of a current report don't offer it; in a report that is out of date every cell offers it, and choosing it asks for a refresh
2026-10-24 minor Sheet tabs: the handle at the horizontal scrollbar's left edge shows the resize cursor, and dragging it moves the boundary, as in Excel ("Hover the mouse pointer at the edge of the scrollbar until you see the double-headed arrow"). Dragging it right gives the tabs more of the bar, until the scrollbar is 100 px wide (the scrollbar stays 100 px wide after the window is narrowed); dragging it left gives the scrollbar more, down to the New sheet button. Room the tabs don't fill stays empty, with New sheet after the last tab. Each open workbook keeps its own share; a workbook starts at the default (tabs up to 60%)
2026-10-24 minor Outline Settings (Data ▸ Outline ▸ Settings, data.outlineSettings): clearing Summary rows below detail or Summary columns to right of detail puts the − / + buttons on the line above or left of each group, and Hide Detail, Show Detail and the level buttons mark that line collapsed. Changing a direction moves the marks of collapsed groups. Read and written as outlinePr summaryBelow / summaryRight
2026-10-23 minor F3, Formulas › Use in Formula › Paste Names… and Alt+M, S, P open the Paste Name dialog (F3 only when the workbook has names). It lists the workbook's names and the active sheet's own in alphabetical order, hidden names left out; OK or a double-click puts the selected name at the caret of the formula being edited, in place of selected text, or starts =Name in the active cell (formulas.pasteName {name}), and Paste List writes each name and the text of what it refers to in two columns from the active cell ({list: true}). While a dialog is open over the edit, the cell editor takes no keys, and Cancel leaves the selected text selected. The Use in Formula menu lists the same names and inserts at the caret too (formulas.useInFormula); it used to list hidden names and other sheets' names, the menu added the name at the end of the text, and the command replaced the text being edited
2026-10-23 minor Conditional Formatting ▸ New Rule, formula: clicking a cell on the grid writes its absolute reference at the formula box's caret (=$B$2, an empty box starts with =), a drag writes a range ($B$2:$C$4) and a second click replaces the reference just written, as in Excel ("Selecting cells on the worksheet inserts absolute cell references"). The selection the rule applies to doesn't move, and the box keeps the keyboard. After an operand (=A1>5) the click does nothing (#2348)
2026-10-23 minor Frozen panes: Page Up, Ctrl+Up and Shift variants that move from the scrolled rows into the frozen ones bring the scrolled rows back to the top, so the rows in between are seen again (Page Up from far down used to end on row 1 with the view still a page down); Ctrl+Left and Alt+Page Up do the same for frozen columns. Other ways of selecting a frozen cell (click, Find, Go To, Undo, formula pointing) leave the view where it is
2026-10-23 minor After a left-drag of the fill handle an Auto Fill Options button sits below the filled cells; its menu redoes the fill as Copy Cells, Fill Series, Fill Formatting Only or Fill Without Formatting (undoes the drag's fill, then edit.autoFill in that mode). It goes away when the workbook changes or the selection moves (#1403)
2026-10-24 minor When the fill starts from a date, the right-drag fill menu and the Auto Fill Options button also offer Fill Days, Fill Weekdays (Saturday and Sunday skipped), Fill Months and Fill Years (edit.autoFill with mode set to days, weekdays, months or years). A lone date steps by one unit; two or more dates step by the difference between the first two in that unit, or one unit when they fall in the same one. Fill Months and Fill Years keep the day of the month, clamped to the month's last day. Every fill by months or years (these two, a drag of dates a month apart, and Series by Month or Year) keeps the time of day of a date with a time, which used to be dropped
2026-10-22 minor Show Outline Symbols (view.showOutlineSymbols, Ctrl+8): a sheet can hide the outline's level buttons and brackets while keeping its outline, as Excel saves with showOutlineSymbols="0" (read and written); the grid then gives the bands no room
2026-10-22 minor A number in a repeat-fill format (*, as in the Accounting format) that is too wide for its column shows #### like any other number, instead of the fill rebuilding the value so its leading digits were cut off (2,509.00 CHF drawn as "509.00 CHF")
2026-10-22 minor View › New Window and Arrange All on the View ribbon; Arrange All tiles, stacks or cascades the native windows; two windows on one workbook keep their own sheet without copying the workbook; a dialog opened in one window stays there when a command run from it switches windows
2026-10-22 minor One native window per workbook window on the desktop: per-window drafts, dialogs and ribbons; menu bar commands go to the focused window; closing one of several windows on a workbook doesn't ask; Quit asks in each unsaved workbook's window; the last window closed quits (Windows, Linux) or leaves macOS running
2026-10-22 minor New Window opens a second window on the same workbook instead of a copy that saved over the original; windows keep their own selection, sheet and scroll; titles Name:1 / Name:2; Switch Windows, Hide and Unhide work by window; File › Close closes one window of several without asking
2026-10-22 minor New workbook no longer loses the first one: the cell being typed is entered into its own workbook before any File or window command (an entry the workbook refuses stays open and the command doesn't run; an untouched F2 draft changes nothing), the editor is tied to its workbook, View › Switch Windows and the macOS Window menu list the open workbooks, and the macOS Quit item asks about unsaved workbooks like the close button
2026-10-21 minor Background error checking, first part (#1994): a constant whose text would be a number if typed (signs, thousands, currency, percent, exponent, parenthesised negative) gets Excel's green corner triangle; the active cell then shows a warning button whose menu names the problem and offers Convert to Number for the selection (formulas.convertToNumber). Dates, times and fractions kept as text and formula results are not flagged, as in Excel
2026-10-21 minor Paste Special laid out as Excel's: Paste and Operation options each in two columns inside a frame, Skip blanks and Transpose side by side, Paste Link as a button that pastes references at once; labels translated (the generic form didn't translate them) and the window no longer runs past the screen
2026-10-21 minor Form dialogs (conditional-format quick rules, New Name, Remove Duplicates, Text to Columns and every other Dialog::form) fit their content: OK and Cancel sit in a row under the last field instead of a right-to-left layout that took the screen's whole height and left the buttons floating halfway down
2026-10-20 minor Esc and Enter close a message over the cell editor, such as a data validation alert, and the entry stays open to fix, with the keyboard back in it. Before, the editor took them (the first Esc cancelled the edit behind the alert and only the second closed it), and after the message typing went nowhere until the cell was clicked
2026-10-19 minor Ctrl+Enter (range.fill) gives each cell what typing the input there gives: a General cell gets the automatic number format (5%, $5, 3/4/2026, =TODAY()) even when it already held a value, and a cell with its own format, a formatted row or column, or Text keeps it. Cells that held a value used to keep General (5% showed 0.05), and empty cells took the active cell's format
2026-10-19 trivial While a mouse button is held (a click or a drag selecting cells) the selection outline is drawn on its cells at once instead of gliding after the pointer, which read as lag; keyboard moves still glide
2026-10-18 minor Keytip letters typed with left Alt held continue the sequence (Alt+H, O, A / Alt+H, O, I ran nothing before: Alt+letter cancelled keytips); other Alt combinations, AltGr and macOS Option are unchanged (#1846)
2026-10-17 minor A Ctrl+Alt+letter key that types a character (a user-defined Windows hotkey such as Ctrl+Alt+A for ä) types it instead of running the Ctrl+letter shortcut, e.g. Select All (#1530)
2026-10-16 minor Right-drag on the fill handle opens the fill menu on release: Copy Cells, Fill Series, Fill Formatting Only, Fill Without Formatting, Series…; Esc cancels the drag or closes the menu without filling
2026-10-16 minor With the active cell in a Table whose header row is scrolled out of view, the column headings show the header names and their filter buttons in place of the letters (#1423)
2026-10-16 minor Ctrl+6 hides every object (charts, pictures, shapes, slicers) and shows them again; hidden objects are not drawn, take no clicks and drop their selection, and the setting is saved with the workbook (workbookPr showObjects)
2026-10-16 minor Ctrl+Shift+A (Control+Shift+A on a Mac) after a function name, or after its (, inserts the argument names and the closing parenthesis, as in Excel; one Undo in the editor takes them back
2026-10-16 minor Advanced Filter ribbon dialog, optional criteria for unique-only extraction (#1622); safe copy-to output (#1031)
2026-10-16 minor Remove Duplicates shows an editable Range field initialized from the selection and passes it to the engine on OK (#1388). Live range-picking outside the dialog remains unsupported
2026-10-16 minor Web printing registers one-shot afterprint cleanup before opening the dialog; missing content windows and setup, listener or print failures also release the hidden iframe and PDF blob URL (#1054)
2026-10-16 minor The shared UI clock delegates to the core Unix-millisecond clock, which reads Date.now() on wasm, instead of returning zero there (#1026). Native clock contract tested; browser timing remains unverified
2026-10-16 trivial Web: preferences (theme, interface size, language, editing options…) are kept in the browser's localStorage between visits, as the desktop app keeps ui.json and prefs.json; before, a reload brought back light mode and the defaults (#1562)
2026-10-15 minor File › Options › Formulas: Maximum Iterations (1 to 32767) and Maximum Change (0 or more) under Enable iterative calculation, disabled while it is off; invalid entries are refused with a message
2026-10-15 minor Number-format named colors use their RGB values; indexed [Color1]–[Color56] resolve through the shared legacy palette in grid and PDF (#1452)
2026-10-14 minor Spill-child formula bar uses the anchor formula with disabled theme text and blocks formula-bar edit entry; selection and recalculation restore ordinary behavior
2026-10-14 minor PivotTable source-field list fills the pane width so its scrollbar stays at the list's right edge
2026-10-14 minor Alt, H, B border keytips apply the preset each letter names in Excel's Borders menu (they all drew a bottom border, so H,B,N No Border added one): keytips.json entries take optional params; H,B,M opens Format Cells on the Border tab; Erase Border, Line Color and Line Style stay reserved
2026-10-13 minor Dragging a sheet tab with Ctrl held (Cmd or Option on macOS) drops a copy of the sheet where the tab is released, with the copy cursor (#971)
2026-10-13 trivial More Colors… and Recent Colors (#928)
2026-10-13 minor Grid drags keep their own cursor over selection borders, fill handles and outside the grid; hover resumes on release (#936)
2026-10-13 minor AutoFill month patterns retain the workbook's date system, preventing shifted dates in 1904 workbooks when filling forward or backward
2026-10-13 minor Sheet tab bar: the tab strip shrinks to its tabs, up to 60% of the bar, so New sheet (+) sits right after the last tab and the horizontal scrollbar takes the rest (part of #943)
2026-10-13 minor Horizontal scrollbar in the sheet tab bar: drag, track click pages, frozen columns excluded from the page (#840)
2026-10-13 minor Formula-entry Command/Ctrl-click adds arguments and Shift-click extends references; ordinary replacement and dragging retain their behavior. Readiness estimates unchanged.
2026-10-12 minor Next/previous sheet navigation no longer activates hidden worksheets at either workbook boundary; command tests cover Hidden, VeryHidden and selection retention
2026-10-12 minor The File view's recent list tells when each workbook was last changed, read off the UI thread
2026-10-12 minor Ctrl+wheel zoom steps along a ladder of percentages about 20% apart that never skips 100%, gliding to each step with animations on, so a notch out undoes a notch in (it drifted: 100 → 122 → 101); Excel steps 15 points, see decisions.md
2026-10-12 minor Page Layout view: left/right/top/bottom margins are dragged on the rulers (#792)
2026-10-12 minor Alt+Down opens the active filter header's existing popup, with validation priority and mirrored anchoring on right-to-left sheets (part of #441)
2026-10-12 minor Paste from the ribbon (button and options menu), the cell and header context menus and the macOS menu bar's Edit menu pastes what is on the system clipboard, as Cmd/Ctrl+V does, instead of only GridCraft's own copy (the web build, which can't read the clipboard on request, still pastes GridCraft's copy). Copy and Cut by keytip (H,C / H,X) publish to the system clipboard like the ribbon buttons. After a control-channel or MCP copy, which leaves the system clipboard alone, Paste pastes that copy until other text is copied. Once a cut has been pasted, Paste (ribbon, menus or Cmd/Ctrl+V) doesn't paste the cut's clipboard text again over the moved cells (Excel pastes a cut once), and the Paste keytip (H,V,P) pastes the system clipboard like the button. Regression test for the Paste button click freeze in 0.5.0 (#273, fixed by #272); the Paste button gets an accessible "Paste" name for screen readers
2026-10-11 minor Ribbon: scroll arrows on a tab wider than the window, Formulas › AutoSum as a split button with its function menu, View › Show in two columns so Headings is no longer cut off
2026-10-11 minor Theme tokens for icon, reference, on-accent and sheet-control colours; WCAG 2 contrast test over both themes (dark danger red and selected header text adjusted)
2026-10-11 minor AutoFit accounts for table and ordinary filter dropdowns, including low zoom; header text excludes the button area
2026-10-11 minor Outline band for grouped rows and columns, Show / Hide Detail on the Data tab, numpad navigation keys in shortcuts (#373)
2026-10-11 minor Shift+Space / Ctrl+Space no longer start an edit; Control+Space selects the column on Mac (#338)
2026-10-11 minor Selected whole columns can be reordered by dragging their headers to an insertion point
2026-10-11 minor Page Layout view with rulers and in-place headers and footers (#329)
2026-10-11 minor Forecast Sheet dialog (#322)
2026-10-11 minor Delete and Backspace now remove the selected chart, picture or shape (#213)
2026-10-10 minor Keep formula helpers inside the worksheet when scrolling (#200)
2026-10-11 trivial Theme: title-bar light/dark switch, File › Display theme, system appearance on first run (#194, #239)
2026-10-11 minor Keyboard shortcut audit against Microsoft's Windows and Mac lists; missing shortcuts for existing features added (#110)
2026-10-11 minor File tab Backstage view and File › Options (#174)
2026-10-11 minor Selection outline glide and the Animations setting
2026-10-11 major Sequential Alt keytips: full-tab table (364 sequences), badges on every control, dropdowns open for typing/arrow editing, colour-palette arrows, real-Excel corrections (issues #33, #49)
2026-10-10 minor Chart resize bug (#190)
2026-10-10 major Created: chrome, grid, keyboard, dialogs, accessibility; key tips, Page Layout view and accessibility tree flagged