mirror of
https://github.com/storytold/gridcraft.git
synced 2026-11-03 00:41:56 -06:00
* Objects: one selection for charts, pictures, shapes and slicers, with eight resize handles
The sheet tracked the selected object as a bare id in `selected_chart`, so
only charts and text boxes drew a selection frame, only the bottom-right
corner resized, and the kind of the selected object had to be guessed from
the id. The selection is now `SheetApp::selected_object: Option<ObjRef>`,
with `selected_chart()` kept for the Chart Design tab and the Format Chart
pane.
- Model: `ObjKind` (chart, image, shape, slicer) and `ObjRef { kind, id }`;
`Sheet` helpers find, move and remove an object by `ObjRef` and walk every
object's anchor in a fixed order. `next_object_id` saturates instead of
overflowing on an id at `u32::MAX` read from a file.
- Commands: `object.delete`, `object.move` and `object.setAnchorMode` accept
the four kinds through one parameter check, refuse an unknown kind or id
instead of succeeding silently, and clamp hostile offsets. `object.delete`
replies with the deleted object. Arrange and the Selection Pane include
slicers, which stack above the other objects.
- Sheet: the selected object of any kind draws a frame with eight handles
over every object. Each handle resizes only its own edges, which never
cross; the body moves the object, and the first drag frame already applies
the pointer's movement. The pointer shows the handle's resize cursor or a
move cursor, with the diagonals swapped on a right-to-left sheet, where the
frame moves with its object.
- Keys: Escape drops the object selection; Delete and Backspace keep
deleting the selected object (#213). A selection whose object disappears
(undo, redo, delete, sheet switch) is cleared.
- Double-click: `open_object` routes by kind (a text box edits in place, a
chart opens Format Chart).
- Control protocol: `ui.inspect` reports `selectedObject {kind, id}` and
keeps `selectedChart`; `ui.object.select` selects any object and replies
with its rect. The snapshot example takes `--object <id>`.
Tests: engine tests for every kind by kind and id, the Selection Pane and
hostile parameters; UI tests for selecting each kind (a slicer over a chart
takes the click), all eight handles on four kinds, cursors, Delete,
Backspace and Escape, undo and redo, double-click routing, and resizing on a
right-to-left sheet. Existing tests use the new selection API.
* Objects: every kind follows edits; chart series follow cut-moves and sheet deletes
Structural edits and sorts kept three hand-indexed lists (charts, images,
shapes) in step in two places, and slicers were left out of both, so a
slicer stayed put when rows were inserted above it. Chart series were
rewritten for inserted and deleted lines and for sheet renames, but not for
cut-moves or sheet deletes, which left them pointing at the old cells.
- Inserting and deleting rows and columns and sorting walk
`Sheet::object_anchors` and `object_anchors_mut`, one fixed order over
every kind, so slicers now follow their cells by their anchor mode like
the other objects, and a new kind cannot be forgotten in one of the
passes.
- `rewrite_cell_links` is the one place that rewrites the references
floating objects hold (chart series values, categories and names,
and the source block a chart was made from).
`rewrite_all_formulas` calls it, which covers inserting and deleting
lines and cells and cut-moves on one sheet or across sheets; renaming and
deleting a sheet call it too, so a series into a deleted sheet becomes
#REF!, as a formula does.
- Copying a sheet gives its charts, pictures, shapes and slicers fresh ids,
keeping ids unique across the workbook, which object selection and the
`{kind, id}` commands rely on.
Tests: every kind through row and column inserts and deletes, an absolute
shape, a sort and undo; a slicer through inserted rows; chart series
through a cut-move, a sheet rename, a sheet delete and undo; ids after a
sheet copy.
* Objects: bubble sizes follow edits like the other series references
`rewrite_cell_links` rewrote a chart series' values, categories and name
but not its bubble sizes, so inserting or deleting lines, a cut-move or a
sheet rename left a bubble chart's sizes pointing at the old cells. They
are now rewritten with the rest.
Test: bubble sizes through an inserted row, a cut-move and a sheet rename.
* Objects: a resize handle under the headers leaves the press to them
A selected object's handles reach a few points outside it, and a press
was matched against them before any check of where it landed, so a press
on the column or row header beside an object at the sheet's edge resized
the object instead of selecting the column or row. The cursor already
ignored handles outside the cells.
`chartview::selected_handle` finds the selected object's handle under a
point only over the cell area, as `hit` does, and not while objects are
hidden; the press and the cursor both use it.
Test: presses within a handle's reach over the column header and the row
header neither move nor resize the object.
* Objects: each drag of an object is its own undo step
A drag merges its frames into one undo step by dropping a new step whose
label matches the one before it. Its first frame did the same, so a second
drag of an object (a move after a move, or a resize after a move) merged
into the first drag's "Move Object" step, and one undo took back both.
`Drag::Object` records whether the drag has made its step; only the later
frames of the same drag merge into it.
Test: a move and then a resize of a picture take two undos to reverse,
the first restoring the moved picture.
* Objects: the parity and gap docs no longer list chart resizing as missing
gaps.md (§4), target-app-parity.md (the Essentials tier's work, the
Mainstream chart row, the interaction discount and the Essentials chart
task) and chart-parity.md (the element table and the work list) still
described charts as impossible to resize (#190). Charts move and resize
from eight handles like every floating object, so those statements now
say so; the 2026-10-10 revision rows and the 10-10 re-check stay as
history. Scores and the 40-60 h chart estimate are unchanged (resizing
was 1-2 h, within the rounding).
* Objects: one chart evidence paragraph in gaps.md; trendlines are not missing
gaps.md §4 carried two evidence paragraphs, an older one saying PRs #158
and #161 were open and a newer one saying all 2-D kinds survive XLSX round
trip, both repeating the resize, smooth-line, Switch Row/Column and
trendline statements. It is one paragraph with the current status again.
The Mainstream chart row in target-app-parity.md listed trendlines as
missing; they are read, written and drawn (`Series::trendlines`, the XLSX
chart reader and writer, `chart.addElement`), as chart-parity.md records.
The row now says so and keeps "no axis options". No score change.
* Objects: only the selected object's handles resize; a press elsewhere on an object moves it
A primary drag looked for a handle under the press on whatever object it
grabbed, so pressing near the edge or corner of an object that was not
selected started a resize, while the pointer over that spot showed the
Move cursor (handles are only shown, and only offered by the cursor, on
the selected object). The press now takes its handle from
`chartview::selected_handle`, the same lookup the cursor uses; a press on
any other object selects and moves it.
Test: dragging an unselected shape by its bottom-right corner shows the
Move cursor, then selects and moves the shape without resizing it.
* Docs: ui.object.select says what it replies when it clears the selection
* Objects: a test pins that both anchor accessors visit the same objects in the same order
Sorting and row or column edits read every anchor through
`object_anchors`, compute the new ones and write them back through
`object_anchors_mut` in step. Nothing checked that the two accessors
visit the same objects in the same order; a kind of floating object
reaching only one of them would have paired objects with other objects'
anchors silently.
Test: two objects of every kind are inserted in a mixed order, each
anchor is marked with its position through the mutable accessor, the
marks are read back through the shared one in the same sequence, the
count matches the per-kind collections, and the mark is found on the
object `object_anchor` names by kind and id. The test's constructor
matches on `ObjKind` exhaustively, so a new kind does not compile until
the test covers it.
* Objects: sorting keeps the size of a "move and size" picture whose lines swap places
A picture anchored to move and size with cells and spanning two rows
(or columns) was re-fitted between its top-left and bottom-right lines
after a sort. When the sort put the bottom line above the top one, the
fitted extent was negative and the picture collapsed to a zero height
or width. It now keeps its old size on that axis and travels with its
top-left line, like a "move only" picture.
Tests: for a sort by rows and one by columns, "move and size" and
"move only" pictures inside one line travel with it (the first
re-fitted to the same line, the second at its own size), an absolute
picture stays while the cells move under it, a two-line picture whose
lines swap keeps its size, and undo restores every anchor.
* Objects: a copied sheet's objects get free ids even when a file used the largest id
`Workbook::next_object_id` returned one more than the largest id in use,
saturating at `u32::MAX`. A workbook read from a file can carry an object
with that id; every later insert (a chart, picture, shape, table or
slicer) then got `u32::MAX` again, and so did each object of a copied
sheet, whose ids also came from a saturating counter. Lookups and
selection take the first object with an id, and `object.delete` removes
every one.
`Workbook::free_object_ids(count)` now returns distinct unused ids: those
above the largest in use while they last, then the lowest free ones from
1. `next_object_id` takes the first of them, and the sheet copy takes one
per copied object (and refuses if the id space were ever exhausted). The
model test that recorded the saturation now checks the free ids instead,
and a new one covers a file that used the largest ids: the free ids come
from below, 100,000 of them distinct and in order.
Test: object_ids_stay_unique_when_a_file_used_the_largest_id gives a
shape id u32::MAX, inserts two shapes and copies the sheet; every shape id
is distinct across both sheets. It fails without the fix (both new shapes
get 4294967295).
* Objects: main's chart data table compiles with the object selection and the model's object test
Two leftovers of the merge of origin/main (25881a8e), neither a textual
conflict: `Chart` gained a `data_table` field, which the `push_object`
helper of the model's object test did not set (it is `None`, as in
`insert.chart`); and chart_data_table.rs set the `selected_chart` field
this branch replaced by `selected_object`. The test selects its chart as
a floating object, as the branch's other tests do.
* Objects: object.move and chart.set keep a size a file made larger than 10,000
`object.move` clamped `width` and `height` to 10,000 points, the most it
gives a new size, while the XLSX reader accepts anchors far past that.
A resize of a picture a file made 12,000 wide passed 11,990 through the
clamp and jumped to 10,000; `chart.set`, whose Format Chart pane sends
the unchanged dimension back with the edited one, clamped the same way.
Each dimension is now capped at 10,000 or the object's current size,
whichever is larger (`size_cap`): such an object keeps its size when it
is moved, shrinks by what a resize asks and never grows further, and a
hostile size is still capped. The params doc of `object.move` and the
control protocol notes say so.
Tests: an_oversized_imported_object_keeps_its_size_when_moved_and_shrinks_only_by_a_resize
makes a picture 12,000 by 300, writes and reads it back as a file, then
moves it without a size (12,000 stays), asks 12,010 (stays 12,000),
11,990 (11,990, no jump) and 50,000 by 50,000 (11,990 by 10,000).
chart_set_keeps_a_chart_size_a_file_made_larger_than_the_limit does the
same through `chart.set`. Both fail without the fix (width 10,000).
* Objects: dragging an object's body sends its position only, not its size
`drag_object` sent `width` and `height` with every step of a body drag,
so moving a picture a file made 12,000 wide shrank it to the 10,000 that
`object.move` gives a new size. Only a handle drag sends a size now; a
body move leaves the engine's size alone.
Tests (real input): dragging_the_body_of_an_oversized_imported_object_keeps_its_size
reopens the workbook with a 12,000 by 60 picture, drags its body by
30 by 25 and checks the size is untouched, the picture moved with the
pointer and the journaled `object.move` carries no width or height; it
fails without the fix (the journaled command carries both, and without
the engine's cap the picture is 10,000 wide).
a_handle_drag_on_an_oversized_imported_object_resizes_by_the_drag_only
moves the left handle 10 px right: the picture is 10 points narrower in
the window and keeps a width near 12,000, with no jump to the limit.
* Objects: the Format Chart Size fields show a chart's real size and send only the edited dimension
The Width and Height fields ranged 40 to 4,000 and sent both values on
every edit. egui clamps an existing value into a field's range, so a
chart a file made 12,000 wide showed "Width 4000", and typing a new
height sent that 4,000 as the width: the chart shrank although only its
height changed, and the cap `chart.set` keeps for an existing size
cannot help once the pane itself sends 4,000. Each field's range now
reaches the larger of 4,000 and the chart's current size, so the field
shows the real size, and a commit sends only the dimension that differs
from the chart's (`chart.set` reads `width` and `height` independently).
Test (real input): the_size_fields_keep_an_oversized_imported_chart_width_when_the_height_changes
reopens a workbook with a 12,000-wide chart, opens Format Chart Area's
Size section, checks the Width field shows 12000 and types 201 as the
height: the width stays 12,000, the height is 201 and the journaled
chart.set carries no width. Without the fix the field shows
"Width 4000".
227 lines
17 KiB
Markdown
227 lines
17 KiB
Markdown
# Gaps
|
||
|
||
> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-11-02 · **Change:** minor (§4: chart resizing is no longer a gap; earlier: §13: Analysis ToolPak has all 19 tools; earlier: §4: chart data tables implemented with XLSX round-trip and print/PDF; earlier: §13: Solver Options; earlier: §13: Solver Load/Save Model and Reset All) · **Target:** Microsoft Excel (Microsoft 365)
|
||
|
||
Every known shortfall against Excel, one entry each, ranked by user impact (what blocks someone
|
||
using GridCraft for real work first). This is the work list: pick from the top, check the open
|
||
PRs first (50 open on 2026-10-10; several already address entries here), and update the entry
|
||
when you land work. Estimates are Opus 5.5 agent-hours. Area detail lives in the linked parity
|
||
docs; the summary is in [target-app-parity.md](target-app-parity.md).
|
||
|
||
Kinds: **F** feature · **U** UI/UX · **FF** file format · **H** hardware · **L** localization ·
|
||
**P** performance · **S** stability.
|
||
|
||
## Beta blockers
|
||
|
||
No alpha blockers: every core workflow passes the [alpha gate](roadmap.md#alpha-gate).
|
||
|
||
|
||
### 1. XLSX output not proven in Excel or on real files (FF)
|
||
- **Missing:** a run over a real-world XLSX corpus, and confirmation that Excel opens what we save
|
||
with no repair prompt (PivotTables, charts, CF, validation, dynamic arrays, tables).
|
||
- **Evidence:** round-trip tests cover our own files only (`crates/xlsx/src/tests/`); PivotTable
|
||
round-trip noted as "unverified in real Excel" since 10-07; #64 (dynamic-array flag) shows the
|
||
class of bug.
|
||
- **Impact:** the main format; a repair prompt or silent loss destroys trust.
|
||
- **Estimate:** 15–25 h, plus owner time in Excel. [file-format-parity.md](file-format-parity.md)
|
||
|
||
### 2. Large workbooks don't open; recalc is single-threaded (P, H)
|
||
- **Missing:** streaming read for ~100 MB XLSX; multi-threaded recalc; 100k-dependent edit under
|
||
100 ms (was ~0.4 s); whole-sheet operations bounded.
|
||
- **Evidence:** #175; no threading in `crates/calc`; PR #152 (whole-sheet Fill/Remove Duplicates
|
||
out of memory), PR #151 (current region past 10,000 rows).
|
||
- **Impact:** finance and data users routinely have big workbooks.
|
||
- **Estimate:** 25–40 h. [target-app-parity.md](target-app-parity.md#performance), [hardware-parity.md](hardware-parity.md)
|
||
|
||
### 3. Some unmodelled XLSX content is dropped on save (FF)
|
||
- **Missing:** slicers and their caches, timelines, the data model, query tables attached to
|
||
tables, unmodelled `extLst` entries, chart details. Pass-through (#330) keeps custom XML,
|
||
external links, connections, sheet query tables, printer settings, form and ActiveX controls,
|
||
OLE objects and sheet backgrounds; never checked in Excel (repair prompts unknown).
|
||
- **Evidence:** `crates/xlsx/src/passthrough.rs` (what is kept, and why the rest isn't).
|
||
- **Impact:** open-edit-save still simplifies workbooks with slicers, timelines or Power Pivot.
|
||
- **Estimate:** 6–10 h. [file-format-parity.md](file-format-parity.md)
|
||
|
||
### 4. Charts lose options on round trip; shallow chart model (F, FF)
|
||
- **Missing:** axis scaling, label options, error bars, per-point formatting.
|
||
- **Added:** data tables beneath column, bar, line, area and compatible combo charts, with legend keys, border controls, live source values, native XLSX round-trip and print/PDF.
|
||
- **Evidence:** `Chart` holds only title, legend position, two flags and axis titles
|
||
(`crates/model/src/features.rs`); all 2-D kinds survive XLSX round trip (#158, #161); charts
|
||
resize from eight handles (#190). Smooth lines (#62), Switch Row/Column (#116) and trendlines
|
||
(read, written, drawn) landed. Multi-level category axes (year beside month) are read, drawn
|
||
and written back.
|
||
- **Impact:** charts are in most business workbooks.
|
||
- **Estimate:** 25–35 h for beta (40–60 h full). [chart-parity.md](chart-parity.md)
|
||
|
||
### 5. Text in non-Latin scripts doesn't render or export (L)
|
||
- **Missing:** CJK font fallback, complex shaping (Arabic, Devanagari, Thai), bidi, non-Latin PDF.
|
||
- **Evidence:** system-font fallback for CJK, Thai and Hebrew landed in #38 (closed #32); #142
|
||
(Chinese text) awaits confirmation; #54 (symbols as boxes on Fedora); no shaping for Arabic or
|
||
Devanagari; PDF writer uses 14 standard fonts only.
|
||
- **Impact:** blocks most of the world's users even with an English UI.
|
||
- **Estimate:** 12–20 h. [localization-parity.md](localization-parity.md)
|
||
|
||
### 6. Calculation correctness bugs (F)
|
||
- **Missing:** nothing known. The four this entry tracked have landed: 15-significant-digit
|
||
equality (#57, so `=0.1+0.2=0.3` is TRUE and MATCH and COUNTIF agree), spill updates after
|
||
structural edits and cleared blockers (#133, #139; PRs #148, #157), 3-D span deletion (#140),
|
||
and qualified names after a sheet rename (#134). Iterative calculation for circular references
|
||
landed too, with its settings in File › Options › Formulas.
|
||
- **Impact:** wrong numbers are worse than missing features, so this entry is kept until the
|
||
oracle suite of §15 can say the category is clear rather than only these five reports being so.
|
||
- **Estimate:** — [function-parity.md](function-parity.md#formula-language)
|
||
|
||
### 7. Legacy `.xls` only partly read; encrypted workbooks can't be saved with a password (FF)
|
||
- **Evidence:** #121: Excel 97-2003 (BIFF8) `.xls` files now open (values, formulas, number
|
||
formats, merges, sizes, names, and cell formatting: fonts, fills, borders, alignment); exact theme colours (XFExt), charts, pictures, comments, conditional
|
||
formats, validation and BIFF5 files are not read, and `.xls` is never written. Password-encrypted
|
||
`.xlsx` workbooks (Agile and Standard encryption) open with their password since #11, but are
|
||
saved without it: GridCraft can't write an encrypted file yet. Encrypted `.xls` (FILEPASS) and
|
||
RC4-encrypted files are still refused with a message.
|
||
- **Impact:** common in finance, government and anything older than 2007; encrypted files are
|
||
routine in business.
|
||
- **Estimate:** 14–21 h (`.xls` objects 10–15, encryption 4–6). [file-format-parity.md](file-format-parity.md)
|
||
|
||
### 8. PivotTables: no slicers, calculated items, PivotCharts; unverified in Excel (F)
|
||
- **Evidence:** `parity-checklist.md` missing `insert.slicer`, `insert.timeline`,
|
||
`insert.pivotChart`, `table.insertSlicer`; calculated items and GETPIVOTDATA missing (calculated fields
|
||
and values on rows done). Show Details (double-click a value, subtotal or grand total cell) lists
|
||
its source records on a new sheet. The "Enable show details" option (`pivot.options`
|
||
`enableShowDetails`, saved as `enableDrill`) turns it off; it has no PivotTable Options dialog
|
||
yet (command only).
|
||
- **Impact:** pivots are the analyst's main tool.
|
||
- **Estimate:** 20–30 h for beta (25–40 h full).
|
||
|
||
### 9. Keyboard-first users: key tips, shortcuts, context menus (U)
|
||
- Next/previous sheet navigation now skips Hidden and VeryHidden worksheets without activating a
|
||
hidden sheet at the workbook boundary. Other keyboard gaps below remain.
|
||
- **Evidence:** #33, #49 (key tips: initial Home-tab support landed in #43 on 10-10, the rest of the ribbon not yet), #110, #28 (selection),
|
||
59 command shortcuts vs Excel's 200+.
|
||
- **Estimate:** 12–20 h. [ui-parity.md](ui-parity.md)
|
||
|
||
### 10. Crashes and freezes reported from the field (S)
|
||
- **Evidence:** #120 (Intel UHD crash on Windows), #117 (error on close, macOS), #166 (freeze opening
|
||
from Finder; PRs #164, #167), #76 (flashing on Windows 11), #130 (caught panic in table styles).
|
||
- **Estimate:** 8–12 h plus an autosave/recovery soak.
|
||
|
||
## After beta
|
||
|
||
### 11. No localization at all (L)
|
||
- Catalog: ribbon-only in five languages (#31, #104, #82; ~12% of strings each), and 943 strings
|
||
(~43%) in Japanese (10-17) and Brazilian Portuguese, including the dialog labels, messages, File
|
||
view and menus. The remaining dialogs, menus and messages are English; en-US function names and
|
||
separators (#45); German in PR #163. **Estimate:**
|
||
100–165 h including #5. [localization-parity.md](localization-parity.md)
|
||
|
||
### 12. Get & Transform, external data, data model (F)
|
||
- No Power Query editor, connections, refresh, From Web/database/folder sources, relationships or
|
||
data model (`data.fromWeb`, `data.relationships` missing). **Estimate:** 60–100 h.
|
||
|
||
### 13. Analysis tools: Solver, Analysis ToolPak, Forecast Sheet (F)
|
||
- Forecast Sheet (`data.forecastSheet`) and the FORECAST.ETS family are in, including Forecast
|
||
Start (hindcast, #785).
|
||
- Solver (`data.solver`, #327) has Simplex LP with integer/binary branch and bound, a local
|
||
nonlinear method (augmented Lagrangian, not GRG), the Evolutionary method, and Answer and
|
||
Limits reports. Report refusal leaves the solution, saved model and history unchanged; a
|
||
successful solve and its reports share one Undo step (#1050). Load/Save Model writes the
|
||
model on cells of its sheet and reads it back; Reset All removes it. Solver Options sets the
|
||
evaluation limit, Integer Optimality and the Evolutionary options, which are saved with the
|
||
model. AllDifferent constraints and the Sensitivity and Population reports remain.
|
||
- The Analysis ToolPak (`data.analysisToolPak`) has all 19 of Excel's tools; their chart output
|
||
remains. **Estimate:** 12–20 h.
|
||
|
||
### 14. Page Layout view and print polish (U, F)
|
||
- Page Layout view landed (#329): paper view with rulers and in-place header/footer editing.
|
||
Margins are dragged on the rulers (#792). Remaining: pictures in headers/footers, Different First Page / Odd & Even pages. Desktop now submits directly through craft-print with printer choice, copies, duplex and grayscale; browser printing stays available. Print ranges and driver tray/options UI remain. **Estimate:** 5–10 h.
|
||
|
||
### 15. Remaining functions and an oracle suite (F)
|
||
- 18 missing, 9 stubs; no Excel-computed oracle corpus; #137, #138. **Estimate:** 16–26 h.
|
||
- 20 missing, 9 stubs; no Excel-computed oracle corpus; #137, #138. **Estimate:** 17–29 h.
|
||
- 21 missing, 9 stubs; no Excel-computed oracle corpus; #137, #138. **Estimate:** 18–30 h.
|
||
- 18 missing, 9 stubs; no Excel-computed oracle corpus; #137, #138. **Estimate:** 18–30 h.
|
||
[function-parity.md](function-parity.md)
|
||
|
||
### 16. Collaboration and review (F)
|
||
- No co-authoring, Show Changes, comment navigation, notes ↔ comments
|
||
conversion; cloud storage requested (#86). **Estimate:** 35–55 h (co-authoring scope needs the owner).
|
||
|
||
### 17. Insert objects (F)
|
||
- Ink strokes now survive XLSX save/reopen as editable polylines. Inserted icons still lose their
|
||
identity/artwork on save (#551); native Office InkML import is not implemented.
|
||
- SmartArt, WordArt, equations, signature line, objects, 3-D models, screenshot; 8 shape kinds vs
|
||
~170; pictures in cells (#61, PR #105). **Estimate:** 25–40 h.
|
||
|
||
### 18. Accessibility (U)
|
||
- AccessKit on, but no accessible grid/ribbon tree, no high contrast, no checker. **Estimate:** 12–18 h.
|
||
[ui-parity.md](ui-parity.md#accessibility)
|
||
|
||
### 19. XLSB/ODS beyond values; minor formats (FF)
|
||
- XLSB and ODS import values only, no write; no `.prn`, `.dif`, `.slk`, XML Spreadsheet 2003; CSV
|
||
writes raw instead of displayed values; templates saved with the workbook content type.
|
||
**Estimate:** 15–23 h.
|
||
|
||
### 20. Multiple windows; pen pressure (H)
|
||
- Desktop windows done: a native window per workbook window, New Window on the same workbook,
|
||
Switch Windows, Arrange All. Left: Arrange All across monitors, one window on the web, no
|
||
pressure or tilt in ink. **Estimate:** 5–8 h.
|
||
[hardware-parity.md](hardware-parity.md)
|
||
|
||
### 21. Automation and add-ins (F)
|
||
- VBA out of scope (dropped on open, #6); no Office Scripts compatibility; no plugin or custom
|
||
function API. **Estimate:** 25–40 h plus an owner decision.
|
||
|
||
### 22. AI features (F)
|
||
- No in-app assistant, natural-language formulas or Analyze Data; agent control via MCP is
|
||
already strong. **Estimate:** 30–50 h; model choice needs the owner.
|
||
|
||
### 23. Mobile (platform)
|
||
- No iOS, iPadOS or Android layout. **Estimate:** 30–60 h.
|
||
|
||
### 24. Fonts and look (U)
|
||
- Font weights beyond regular/bold (#168), system font list (#4), Calibri metrics (#29), macOS
|
||
chrome (#169, #170), Linux title bar (#54), icon consistency across apps (#173). **Estimate:** 7–12 h.
|
||
|
||
## Revision history
|
||
|
||
| Date | Change | Summary |
|
||
|---|---|---|
|
||
| 2026-11-02 | minor | §4: charts, like every floating object, move and resize from eight handles (#190), so resizing is no longer listed as missing; the evidence is one paragraph again, without the stale "PRs #158, #161 open" |
|
||
| 2026-11-01 | minor | §13: the Analysis ToolPak has all 19 of Excel's tools (two-factor Anova with and without replication, z-Test, Fourier Analysis, Random Number Generation, Sampling); its chart output remains. The stale "`data.solver`, `data.analysisToolPak` missing" and "no Forecast Start" sentences removed |
|
||
| 2026-11-01 | minor | §4: chart data tables implemented for column, bar, line, area and compatible combo charts, with legend keys and border settings, live source values, XLSX round-trip and print/PDF; other chart gaps remain. |
|
||
| 2026-10-31 | minor | §13: Solver Options (Max Evaluations, Integer Optimality and the Evolutionary options), saved with the model |
|
||
| 2026-10-31 | minor | §13: Solver Load/Save Model (`data.solverSaveModel`, `data.solverLoadModel`) and Reset All (`data.solverReset`), with buttons in the Solver Parameters dialog |
|
||
| 2026-10-24 | minor | §8: PivotTable Enable show details: `pivot.options` `enableShowDetails` turns Show Details off for a PivotTable, read and written in XLSX as `enableDrill` |
|
||
| 2026-10-23 | minor | §8: PivotTable Show Details: double-clicking a value cell lists its source records on a new sheet (#2364) |
|
||
| 2026-10-22 | minor | §20: a native window per workbook window, New Window on the same workbook and Arrange All on the desktop; left: Arrange All across monitors, the web's one window, pen pressure (estimate 10–14 h → 5–8 h) |
|
||
| 2026-10-20 | minor | §11: the Japanese catalog covers the dialogs, messages and menus — 943 keys (~43%), matching the pt-BR coverage; a test keeps the two catalogs in step |
|
||
| 2026-10-17 | minor | §6: the five reports it tracked are closed and their PRs merged (#57, #133, #139, #140, #134; PRs #148, #155, #156, #157); the entry stays open for §15's oracle suite |
|
||
| 2026-10-15 | minor | §6: Maximum Iterations and Maximum Change in File › Options › Formulas; dropped the stale "no Options dialog yet" |
|
||
| 2026-10-15 | minor | §13: Solver prepares reports before committing the solution, model and report sheets together; report refusal preserves the workbook and Undo/Redo (#1050) |
|
||
| 2026-10-13 | trivial | §4: multi-level category axes landed |
|
||
| 2026-10-12 | minor | §9: next/previous sheet commands retain the current visible sheet and selection when there is no visible destination |
|
||
| 2026-10-12 | minor | rows auto-fit oversized fonts on open and whole-row/column formatting (#833) |
|
||
| 2026-10-12 | minor | Page Layout view: dragging margins on the rulers (#792) removed from the §14 remainder |
|
||
| 2026-10-12 | minor | §13: Forecast Sheet Forecast Start (hindcast) landed (#785) |
|
||
| 2026-10-12 | minor | §17: ink geometry survives XLSX saves; the icon portion of #551 remains |
|
||
| 2026-10-12 | minor | §8: values on rows (Σ Values in Rows, `dataOnRows`) laid out, moved and round-tripped |
|
||
| 2026-10-12 | minor | Desktop File > Print now discovers printers and submits PDF jobs through pinned craft-print with printer choice, copies, duplex and grayscale; browser printing and PDF export remain available. Remaining print parity includes page ranges and driver-specific tray/options UI; physical printer fidelity needs hardware validation. |
|
||
| 2026-10-11 | minor | §6: iterative calculation for circular references landed (Maximum Iterations, Maximum Change) |
|
||
| 2026-10-11 | minor | §15: trim-reference operators (`A1:.E10`, `A1.:E10`, `A1.:.E10`) parse and evaluate |
|
||
| 2026-10-11 | minor | §4: trendlines (six types, forecast, equation and R²) read, written and drawn |
|
||
| 2026-10-11 | minor | §7: password-encrypted workbooks open with their password; saving with one remains (#11) |
|
||
| 2026-10-11 | minor | §16: comment navigation, Show Comments, Show All Notes and Convert to Comments landed (#281) |
|
||
| 2026-10-11 | minor | §7: `.xls` (BIFF8) import of values, formulas and number formats (#121) |
|
||
| 2026-10-11 | minor | §3: XLSX pass-through keeps custom XML, external links, connections, query tables, printer settings, controls and OLE objects (#330, #324) |
|
||
| 2026-10-11 | minor | §13: Forecast Sheet landed (#322) |
|
||
| 2026-10-11 | minor | §15: ODDFPRICE, ODDFYIELD, ODDLPRICE, ODDLYIELD added (18 functions missing) |
|
||
| 2026-10-11 | minor | §15: PERCENTOF and EUROCONVERT added (20 functions missing) |
|
||
| 2026-10-11 | minor | §15: BAHTTEXT added (21 functions missing) |
|
||
| 2026-10-11 | minor | §15: TRIMRANGE added (21 functions missing; trim-reference operators still missing) |
|
||
| 2026-10-11 | minor | §16: Allow Edit Ranges landed (#307) |
|
||
| 2026-10-11 | minor | §8: calculated fields added |
|
||
| 2026-10-11 | minor | §8: PivotCharts added |
|
||
| 2026-10-11 | minor | §13, §15: FORECAST.ETS family landed (#314) |
|
||
| 2026-10-10 | minor | Updated for the 10-10 merges (#17, #31, #38, #62, #82, #104, #116) and the new chart resize bug (#190) |
|
||
| 2026-10-10 | minor | Noted that no gap blocks the alpha gate |
|
||
| 2026-10-10 | major | Created: 24 ranked gaps with evidence, from the full re-measure and the 60 open issues |
|