Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
360 commits
Select commit Hold shift + click to select a range
0f06e70
calc: linear dependency extraction for range-operator chains (#2183)
Higgs32584 Oct 22, 2026
6f3d586
xlsx/csv: cap secondary reader allocations (#2159)
Higgs32584 Oct 22, 2026
79214fd
link: require confirmation for programmatic link.open (#2181)
Higgs32584 Oct 22, 2026
6aeef0e
links: spawn the Windows opener by absolute path (#2176)
Higgs32584 Oct 22, 2026
baa9d98
calc: drop wall-clock timing from precedents tests (clippy)
Higgs32584 Oct 22, 2026
3d016fb
links: rename opener enum variant (clippy)
Higgs32584 Oct 22, 2026
9551d2b
ui: leave desktop_theme Link alone (covered by #2141)
Higgs32584 Oct 22, 2026
402706a
Merge main (06920de) into the branch
neilcawse Oct 22, 2026
0c95ade
Fix merge follow-up formatting and imports
neilcawse Oct 22, 2026
477ea56
Merge main (06920de) into the branch
neilcawse Oct 22, 2026
1a8fe2b
Merge main (06920de) into the branch
neilcawse Oct 22, 2026
10a5813
Fix differential format serialization
neilcawse Oct 22, 2026
727c727
Merge main (06920de) into the branch
neilcawse Oct 22, 2026
2b297cd
Fix hidden PivotTable header location
neilcawse Oct 22, 2026
4f5c230
Preserve default dxf protection
neilcawse Oct 22, 2026
f8c4dac
Merge main (06920de) into the branch
neilcawse Oct 22, 2026
32b2bbe
Fix PivotTable page header location
neilcawse Oct 22, 2026
65b7a90
Preserve main formula analyzer fixes
neilcawse Oct 22, 2026
77cfbda
docs: order parity revision history
neilcawse Oct 22, 2026
12c08d7
Fix hidden Values row with page filters
neilcawse Oct 22, 2026
d6bef5a
Fix parity documentation merge ordering
neilcawse Oct 22, 2026
f3a7c72
Format: number formats widen columns that weren't sized by hand (#1077)
vedran-dobos Oct 22, 2026
d342612
Order file-format revision history
neilcawse Oct 22, 2026
d51a6de
Merge upstream main into fix/1834-autosum-edit-mode
kezmdor Oct 22, 2026
4e85a1f
CSV: an Excel `sep=` first line names the delimiter (#1446)
vedran-dobos Oct 22, 2026
a6870d0
Preserve Values row setting on round trip
neilcawse Oct 22, 2026
0a65999
Adjust Values row round-trip test
neilcawse Oct 22, 2026
91ca945
Merge main (06920de) into i18n-ru-catalog
Oct 22, 2026
995a4f8
i18n: drop catalog keys the merge left twice (German keeps main's Aut…
Oct 22, 2026
110b587
macOS: show file pickers as sheets, not a modal loop inside winit
Aimarmndz Oct 22, 2026
f30c206
Format: Format Cells' number formats widen columns too, as in Excel (…
vedran-dobos Oct 22, 2026
0143699
macOS file sheets: save and export the workbook that asked
Aimarmndz Oct 22, 2026
db459f2
macOS file sheets: commit a text-box draft before saving another work…
Aimarmndz Oct 22, 2026
34ec8af
Merge origin/main into fix/2159-secondary-reader-caps
Higgs32584 Oct 22, 2026
949c7f2
Merge origin/main into fix/2173-xlsx-memory-amplification
Higgs32584 Oct 22, 2026
a4638e3
Merge origin/main into fix/2183-linear-dependency-extraction
Higgs32584 Oct 22, 2026
594557e
Merge origin/main into fix/2181-link-open-confirmation
Higgs32584 Oct 22, 2026
ebc986f
#223: test that the title bar's Save includes the cell being typed
skylartaylor Oct 22, 2026
524ce91
#360: test that Watch Window stays inside the Formulas ribbon
skylartaylor Oct 22, 2026
bc0cd89
#1485: test that the PivotTable field-list scrollbar sits at the pane…
skylartaylor Oct 22, 2026
6535174
XLSX: write spilled text as cached strings, not shared strings (#2285)
MarekSpodBiedry Oct 22, 2026
fda3ed0
XLS: a defined name that uses a skipped name is skipped too, through …
alexanderalber Oct 22, 2026
6ce1ce9
Format: widening looks at the target's stored cells and spills, and i…
vedran-dobos Oct 22, 2026
60c758a
CSV: keep a sep= delimiter only if it would be detected again; a firs…
vedran-dobos Oct 22, 2026
edd64e9
View: zooming is not an undo step (fixes #2313)
marcoarnulfo Oct 22, 2026
3940572
MCP: the stdio server keeps at most 16 MB of a message (#2164)
nihilist-narwhal Oct 23, 2026
08dfc78
PivotTables: the aggregation budget counts every value field (#2169)
nihilist-narwhal Oct 23, 2026
ffa4030
JSON workbooks: loaded ranges are ordered and on the sheet, arrays ho…
nihilist-narwhal Oct 23, 2026
6c5a2d9
Tables never hold merged cells, which Excel removes the table for on …
nihilist-narwhal Oct 23, 2026
b21dd91
Keep the zoom when undoing or redoing a sheet rename
marcoarnulfo Oct 23, 2026
42ad67a
Keep the zoom per step when undoing or redoing several steps
marcoarnulfo Oct 23, 2026
7e4f2c4
Merge branch 'main' into fix/linux-titlebar-adwaita
azislamayuda Oct 23, 2026
db2fffa
Print: Print Selection in File > Print > Settings, several selected a…
marcoarnulfo Oct 23, 2026
d164190
XLS: skipped-name chains follow Lbl indices, and a name without a for…
alexanderalber Oct 23, 2026
0ee8c0d
Merge remote-tracking branch 'origin/main' into test/backfill-regress…
skylartaylor Oct 23, 2026
df2b24d
Print Selection: split a multi-area range at its commas before droppi…
marcoarnulfo Oct 23, 2026
2c052d0
Read cell formatting from .xls files
Harrison-Booth Oct 23, 2026
dec4394
Merge main into the .xls notes, hyperlinks and panes branch
Harrison-Booth Oct 23, 2026
ad2e3ac
Check duplicate .xls style names in linear time
Harrison-Booth Oct 23, 2026
fd6d6ce
Merge origin/main into gc-extlst-passthrough
Harrison-Booth Oct 23, 2026
c2c4389
Merge main into the nested-command journal and undo change
Harrison-Booth Oct 23, 2026
8278063
Fix DAYS360 US method when both dates are last day of February
Silvertree2010 Oct 24, 2026
8b51308
test: header AutoFit check measures the text as AutoFit did
pick2510 Oct 22, 2026
f61b247
calc: circular references keep the value they show, as in Excel
pick2510 Oct 22, 2026
e3046bb
calc: a circular array formula keeps its value without spilling
pick2510 Oct 22, 2026
39d8071
test: the fuzz XLSX round trip allows a loop's #CALC! or #SPILL! back…
pick2510 Oct 24, 2026
e5c472b
test: the header AutoFit UI check measures with the app's fonts, whic…
pick2510 Oct 24, 2026
bf85ba4
Align .xls estimate in gaps with file-format parity
Harrison-Booth Oct 24, 2026
96f4e66
XLS: notes read from .xls files start with no note box
Harrison-Booth Oct 24, 2026
154273a
Merge remote-tracking branch 'origin/main' into gc-extlst-passthrough
Harrison-Booth Oct 24, 2026
b118010
Merge origin/main into gc-pivot-cache-warnings
Harrison-Booth Oct 24, 2026
7b75de6
Bound undo history while a command runs
Harrison-Booth Oct 24, 2026
9ed1001
Merge remote-tracking branch 'origin/main' into gc-xls-cell-styles
Harrison-Booth Oct 24, 2026
f037463
Merge main into the .xls notes, hyperlinks and panes branch
Harrison-Booth Oct 24, 2026
ec77c81
XLSX: report sheet extensions with unmodelled children as dropped; co…
Harrison-Booth Oct 24, 2026
ba28ed8
XLS: index hyperlink tooltips and cap copied hyperlink target bytes p…
Harrison-Booth Oct 24, 2026
0287078
XLS: build the hyperlink byte-cap test from records that fit BIFF's r…
Harrison-Booth Oct 24, 2026
caacdc2
Merge newer main into the nested-command change
Harrison-Booth Oct 24, 2026
4ab994b
XLS: count tooltips in the hyperlink copy cap and shrink its test to …
Harrison-Booth Oct 24, 2026
06ea9f1
XLS: fix formatting in the hyperlink cap test
Harrison-Booth Oct 24, 2026
15097a6
Journal Run Script's steps: count journaled commands, not all commands
Harrison-Booth Oct 24, 2026
d07795e
Merge origin/main into gc-sort-exact-number-order
Harrison-Booth Oct 24, 2026
0b7deaa
XLSX: the XML element cap counts only elements kept in the tree
RedBearAK Oct 25, 2026
19a0963
fix(web): distinguish PDF exports in host save messages (#2452)
Zaxaerith Oct 25, 2026
6cd25f3
Animation effects: Use system setting, On and Off in File › Options
JeremyYao Oct 19, 2026
5041f6c
Animation effects: agents keep `ui.animations` and the Animations label
JeremyYao Oct 19, 2026
9b1ecf7
Animation effects: say how the Windows switch was tried, and why idle…
JeremyYao Oct 19, 2026
a7a59c4
Animation effects: plainer command handling and comments
JeremyYao Oct 20, 2026
8ff32ec
Animation effects: the Windows Settings test in the parity row
JeremyYao Oct 22, 2026
1707be4
Merge main (17b9f6ff) into i18n-ru-catalog
Oct 25, 2026
0d0529a
Charts: add Pareto charts
alosslessdev Oct 18, 2026
10dc2d0
Charts: address Pareto review findings
alosslessdev Oct 18, 2026
5c9934e
Charts: cap Pareto cumulative line and guard signed values
alosslessdev Oct 18, 2026
ef85642
Charts: fix the Pareto axis at 0–100% (#1826)
Oct 23, 2026
fa637b2
Charts: translate the Pareto labels into every catalog (#1826)
Oct 23, 2026
ec7f82c
Docs: drop the duplicate parity rows after the rebase
alosslessdev Oct 25, 2026
e3394ed
Charts: count Pareto in the chart lists
alosslessdev Oct 25, 2026
2c0e276
Linux: the title bar carries the window controls, as in Excel
gyurix Oct 10, 2026
2096c0e
fix(linux): translate title bar controls
gyurix Oct 25, 2026
3682a21
style: format window frame
gyurix Oct 25, 2026
93e2816
fix(ui): keep title control paint arms typed
gyurix Oct 25, 2026
5964268
fix(ui): satisfy strict clippy checks
gyurix Oct 25, 2026
7d1e1f8
fix(ui): reserve title controls and restore docs
gyurix Oct 25, 2026
413a202
fix(ui): route window actions through commands
gyurix Oct 25, 2026
8ebf917
fix(ui): restore maximized caption label and translations
gyurix Oct 25, 2026
65dc7c1
Set ő, ű and other Latin Extended-A letters in the Latin PDF font
Silvertree2010 Oct 25, 2026
40929d8
Merge branch 'main' into fix/2181-link-open-confirmation
Higgs32584 Oct 25, 2026
d5dcb67
XLSX: rows with a duplicate, out-of-order or wrong-row cell address a…
zyzabruh Oct 25, 2026
67c50b1
Charts: use the second theme accent for the Pareto line fallback (#1826)
alosslessdev Oct 25, 2026
0736eb1
XLSX: a row element that repeats a row number keeps none of its cells…
zyzabruh Oct 25, 2026
5f80876
Docs: keep main's rows and drop duplicates after the rebase (#1826)
alosslessdev Oct 25, 2026
c9b63f7
XLSX: a rejected row element does not move the row order (review #2578)
zyzabruh Oct 25, 2026
c693db2
Conditional formatting: colour-scale editor and New Rule list (part o…
alosslessdev Oct 23, 2026
fded60a
Conditional formatting: refuse non-numeric colour-scale stop values (…
alosslessdev Oct 23, 2026
516b19c
Conditional formatting: require a formula for formula scale stops (#1…
alosslessdev Oct 23, 2026
a327501
Conditional formatting: cover the new rule labels in the remaining ca…
alosslessdev Oct 25, 2026
6cfd7d8
Contributors: add alosslessdev (#1822)
alosslessdev Oct 25, 2026
8b17f1e
Conditional formatting: rustfmt after the rebase (#1822)
alosslessdev Oct 25, 2026
81a8abc
New Formatting Rule: pick grid references for formula rules and keep …
alosslessdev Oct 25, 2026
5a035ac
Conditional formatting: keep the opening scope for colour scales and …
alosslessdev Oct 25, 2026
5ac2747
Merge remote-tracking branch 'upstream/main' into gc-mg-2496
Harrison-Booth Oct 25, 2026
a5b1415
Conditional formatting: translate the rule editor's Edit and More Rul…
alosslessdev Oct 25, 2026
234e6c8
XLSX: a repeated row element merges the way Excel merges it (review #…
zyzabruh Oct 25, 2026
eca1933
XLSX: a scalar import clears a picture it replaces (review #2578)
zyzabruh Oct 25, 2026
f18d711
Merge main (ad10881) into the branch
neilcawse Oct 25, 2026
c0bc784
Merge main (ad10881) into the branch
neilcawse Oct 25, 2026
17944b3
Merge main (ad10881) into the branch
neilcawse Oct 25, 2026
2a50662
Merge main (ad10881) into the branch
neilcawse Oct 25, 2026
80b8786
Merge main (ad10881) into the branch
neilcawse Oct 25, 2026
99f5a2c
Web: page host mode, so a page can host GridCraft in its own document…
helenkwok Oct 25, 2026
3382d0b
Undo and redo keep each sheet's view (Normal, Page Layout, Page Break…
prxnvt Oct 25, 2026
ce35c1c
Fuzzer: switching Normal, Page Layout or Page Break Preview isn't an …
prxnvt Oct 25, 2026
18f1187
Tests: restore the data validation dialog test the rebase dropped (#1…
alosslessdev Oct 25, 2026
dd13606
Paste Special: a transposed paste turns formula references as Excel d…
zyzabruh Oct 26, 2026
a534838
Formula: document transpose_ref's turn and its #REF! contract (review…
zyzabruh Oct 26, 2026
a730e10
Merge main (42bbf6b) into the branch
neilcawse Oct 26, 2026
f32eb77
Merge upstream main into the nested-command journal change
Harrison-Booth Oct 26, 2026
918afd1
Subtotal: run its steps in one undo group so a failed run changes not…
Harrison-Booth Oct 26, 2026
28d9825
UI: Formulas › Function Library as labelled buttons with category menus
prxnvt Oct 12, 2026
36f2161
Engine: Recently Used follows the formulas entered; Insert Function c…
prxnvt Oct 25, 2026
7281e09
UI: Insert Function lets Tab reach the category list
prxnvt Oct 25, 2026
de8f36e
fix(ui): left-align font name in Home ribbon (#2454)
Zaxaerith Oct 26, 2026
a1eb9f5
i18n: Paste Special's Add and Text to Columns' Comma get their own keys
nihilist-narwhal Oct 26, 2026
cf5a97f
i18n: the key-split test lets a catalog translate the two uses differ…
nihilist-narwhal Oct 26, 2026
5fcc45c
Merge main (d8c5f58) into the branch
neilcawse Oct 26, 2026
712a17f
Merge main (d8c5f58) into the branch
neilcawse Oct 26, 2026
15661dc
Cap text at 32,767 characters like Excel: & and CONCATENATE cut, CONC…
Harrison-Booth Oct 26, 2026
9cc1264
Match Excel for YEARFRAC basis 0, MOD, NUMBERVALUE and PERCENTRANK ed…
Harrison-Booth Oct 26, 2026
0ddd868
Move cap_text above the test module
Harrison-Booth Oct 26, 2026
551ec65
Fix literal grouping in the MOD test
Harrison-Booth Oct 26, 2026
571bdf6
Keep the clipboard budget test within the cell limit
Harrison-Booth Oct 26, 2026
a75b19e
MOD test: use the literal Excel reads (15 significant digits)
Harrison-Booth Oct 26, 2026
568d07e
perf: win back formula-entry and XLSX-save time lost since 23829d8c
nihilist-narwhal Oct 26, 2026
5ed5c09
NUMBERVALUE: a leftover dot is a decimal point, not a date separator
Harrison-Booth Oct 26, 2026
7155ced
Cap text after parsing the apostrophe prefix and in text-formatted ce…
Harrison-Booth Oct 26, 2026
c72f5a4
PERCENTRANK test: check the fifteenth digit with a tight tolerance
Harrison-Booth Oct 26, 2026
62e5f63
Whole-column borders: keep the line format instead of a cell per row,…
Harrison-Booth Oct 26, 2026
2fbe968
Cap range.setValues text when parse is false
Harrison-Booth Oct 26, 2026
6a75608
Fix clippy clone_on_copy in the borders test
Harrison-Booth Oct 26, 2026
7369738
Dependencies: quick-xml 0.41 to 0.42 (names, values and text are &str)
Harrison-Booth Oct 26, 2026
955237e
Whole-column borders: derive ends before the line changes, reach styl…
Harrison-Booth Oct 26, 2026
b0ff1c7
Whole-line none: clear the facing edge on blank neighbours that inher…
Harrison-Booth Oct 26, 2026
b754711
Merge upstream main (d8c5f588) into format-widens-columns
vedran-dobos Oct 26, 2026
334bfb3
Merge branch 'storytold:main' into fix/2176-windows-opener-absolute-path
Higgs32584 Oct 26, 2026
793420b
Merge branch 'storytold:main' into fix/2170-shape-font-attr-escape
Higgs32584 Oct 26, 2026
de0c5a0
Merge branch 'storytold:main' into fix/2181-link-open-confirmation
Higgs32584 Oct 26, 2026
0760bb5
Merge branch 'storytold:main' into fix/2183-linear-dependency-extraction
Higgs32584 Oct 26, 2026
8e83ac5
Merge origin/main into fix/2183-linear-dependency-extraction
Higgs32584 Oct 27, 2026
e80304f
Merge origin/main into fix/2173-xlsx-memory-amplification
Higgs32584 Oct 27, 2026
af6557d
Merge origin/main into fix/2159-secondary-reader-caps
Higgs32584 Oct 27, 2026
65257b7
Merge main (45f5ab1) into the branch
neilcawse Oct 27, 2026
9ac6b67
Merge origin/main into fix/2181-link-open-confirmation
Higgs32584 Oct 27, 2026
4da6910
Merge main (45f5ab1) into the branch
neilcawse Oct 27, 2026
554a5df
Merge main (45f5ab1) into the branch
neilcawse Oct 27, 2026
9dae419
Merge origin/main into paste-transpose-refs
zyzabruh Oct 27, 2026
af3b87e
Merge main (45f5ab1) into the branch
neilcawse Oct 27, 2026
efac07d
Merge main into gc-fix-deps (carry the quick-xml 0.42 edits into the …
Harrison-Booth Oct 27, 2026
c31e4af
Merge branch 'storytold:main' into fix/2170-shape-font-attr-escape
Higgs32584 Oct 27, 2026
c3d2889
Merge branch 'storytold:main' into fix/2176-windows-opener-absolute-path
Higgs32584 Oct 27, 2026
cbf571d
Merge main (89ac453) into the branch
neilcawse Oct 27, 2026
5c987d1
Merge remote-tracking branch 'upstream/main' into gc-extlst-passthrough
Harrison-Booth Oct 27, 2026
0e643e9
Merge remote-tracking branch 'upstream/main' into gc-xls-cell-styles
Harrison-Booth Oct 27, 2026
c1f1fae
Merge remote-tracking branch 'upstream/main' into gc-xls-comments-lin…
Harrison-Booth Oct 27, 2026
f348a4c
Merge upstream main into gc-pivot-cache-warnings
Harrison-Booth Oct 27, 2026
2d20b00
Merge main into the nested-command journal and undo change
Harrison-Booth Oct 27, 2026
73d36ee
Merge remote-tracking branch 'origin/main' into gc-fix-text-cap
Harrison-Booth Oct 27, 2026
d853b05
Merge upstream main into gc-fix-text-cap
Harrison-Booth Oct 27, 2026
66f8b05
Merge upstream main into gc-fix-functions
Harrison-Booth Oct 27, 2026
6fe8a65
Merge upstream main into fix/1834-autosum-edit-mode
kezmdor Oct 28, 2026
6531650
Merge upstream main into exact number sorting
Harrison-Booth Oct 28, 2026
2c6ba8a
Merge upstream main into extension passthrough
Harrison-Booth Oct 28, 2026
437b7f2
Merge origin/main into paste-transpose-refs
zyzabruh Oct 29, 2026
4f69f67
i18n: share locale data and adapt Russian formulas and errors
reeeji Oct 29, 2026
a4148f1
i18n: deduplicate catalog keys introduced by current main
reeeji Oct 29, 2026
dc81f4e
docs: document localized formula boundaries and regression tests
reeeji Oct 29, 2026
8094a49
Merge remote-tracking branch 'origin/main' into gc-xls-comments-links…
Harrison-Booth Oct 29, 2026
2316a03
Merge upstream main into xls import branch
Harrison-Booth Oct 29, 2026
14fbd97
Merge origin/main into paste-transpose-refs
zyzabruh Oct 29, 2026
7e78bad
Merge main (68a4b1a) into the branch
neilcawse Oct 30, 2026
3e48e5c
Merge main (68a4b1a) into the branch
neilcawse Oct 30, 2026
399a7c1
Merge main (68a4b1a) into the branch
neilcawse Oct 30, 2026
a5d6efa
Merge main (68a4b1a) into the branch
neilcawse Oct 30, 2026
3512794
Integrate 50 GridCraft parity and bugfix PRs for combined testing
FredApps Oct 30, 2026
5eb0508
fix(build): combine shared Unix dependency sections
FredApps Oct 30, 2026
bc7c4d4
style: apply combined integration formatting reported by CI
FredApps Oct 30, 2026
59bfa79
fix(ci): split import checks and assert PDF cross-reference validation
FredApps Oct 30, 2026
15dd5f2
fix(ci): isolate macro guards and border planning helpers
FredApps Oct 30, 2026
87245e0
fix(ci): reconcile UI APIs and duplicated translation entries
FredApps Oct 30, 2026
46ddf30
fix(ui): use shared category combo in function dialog
FredApps Oct 30, 2026
aff949c
fix(integration): adapt pivot and animation UI tests to current API
FredApps Oct 30, 2026
211ce09
test(integration): preserve current NUM recursion-limit expectations
FredApps Oct 31, 2026
4019e17
fix(integration): separate script journaling from macro recording
FredApps Oct 31, 2026
04916e1
fix(integration): enforce link confirmation in active command handler
FredApps Oct 31, 2026
6949445
fix(integration): retain evaluated circular references in history sna…
FredApps Oct 31, 2026
0118780
fix(integration): match extended command snapshot in recorder
FredApps Oct 31, 2026
a77e98d
style(integration): apply CI formatting for group snapshots
FredApps Oct 31, 2026
bc90d0c
test(integration): use a valid merged-cell fixture for sheet spill co…
FredApps Oct 31, 2026
40334a3
fix(integration): expose title bar Save button and target its bounds …
FredApps Oct 31, 2026
7d93515
fix(integration): distinguish toolbar Save from dialog action
FredApps Oct 31, 2026
5c47073
test(integration): confirm proposed AutoSum formulas before checking …
FredApps Oct 31, 2026
c7a6fdf
test(integration): install pinned fonts in pivot pane harness
FredApps Oct 31, 2026
b916ba3
test(integration): order legacy formula fixture cells in their correc…
FredApps Oct 31, 2026
4ab3b2a
fix(integration): preserve Cargo canonical lockfile package ordering
FredApps Oct 31, 2026
3fbf838
fix(integration): preserve slicer filter levels and surviving formula…
FredApps Oct 31, 2026
1b9ba5e
fix(csv): count delimiter declaration toward export byte limit
FredApps Oct 31, 2026
3b7e4e3
fix(xlsx): preserve case-sensitive pivot formulas when sharing caches
FredApps Oct 31, 2026
0be7411
Merge gridcraft #722: preserve pivot refresh layout alongside slicers
FredApps Oct 31, 2026
9fac867
style: apply CI formatting to pivot integration
FredApps Oct 31, 2026
fccd140
Merge gridcraft #2271: automatic number-format widths into refactored…
FredApps Oct 31, 2026
20f0b64
style: order size helper imports as CI requires
FredApps Oct 31, 2026
9bccffc
fix(test): distinguish pivot session and workbook reopen helpers
FredApps Oct 31, 2026
ea77d07
fix(test): compare pivot filter membership independently of item order
FredApps Oct 31, 2026
6467753
fix(test): share membership comparison across slicer round trips
FredApps Oct 31, 2026
d86c4f6
Merge PR #2371: reconcile multi-area Print Selection with current mod…
FredApps Oct 31, 2026
18c610b
style: match CI formatting for print scope imports
FredApps Oct 31, 2026
1cee3b2
refactor: name the print preview cache key
FredApps Oct 31, 2026
dcfa992
Merge PR #2278: reconcile asynchronous file pickers with current app …
FredApps Oct 31, 2026
3d6de0c
Merge PR #1822: reconcile color-scale rule editor with current UI mod…
FredApps Oct 31, 2026
ff6a8e1
fix(integration): use shared combo boxes and deduplicate Russian keys
FredApps Oct 31, 2026
43a7cfc
Merge #2645: contextual Paste Special and delimiter labels
FredApps Oct 31, 2026
1829b2a
Guard structural edits and replay expanded verification failures in CI
FredApps Oct 31, 2026
0d18656
Preserve modern XLSX errors and invalidate cleared spill anchors
FredApps Oct 31, 2026
b17f6ce
Reconcile competing spill footprints and collect all verification fai…
FredApps Oct 31, 2026
33d2c3e
Apply CI formatting to spill conflict detection
FredApps Oct 31, 2026
7a8d47c
Bound fuzz undo episodes by retained memory as well as entry count
FredApps Oct 31, 2026
be2318b
Localize the dialog labels identified in integration verification
FredApps Oct 31, 2026
0ea6a39
Integrate reviewed reader hardening and linear precedent extraction (…
FredApps Oct 31, 2026
c8fb42b
Adapt slicer resolution to borrowed worksheet metadata
FredApps Oct 31, 2026
b930ffe
Apply CI formatting to shared number-format lookups
FredApps Oct 31, 2026
bfdefe8
Adapt imported CSV cap regression to optional delimiters
FredApps Oct 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 54 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ gridcraft-pdf = { path = "crates/pdf" }
# craft-update: app-specific pretend versions apply to startup and manual checks.
craft-update = { git = "https://github.com/storytold/craft-libs", rev = "04aa1703b32d299e54f78fcde4182f2b393a9116", version = "=0.1.0", features = ["egui"] }

craft-i18n = { git = "https://github.com/storytold/craft-libs", rev = "92d392cff132eaf53e13afff77f38b5c11b73aa0", version = "=0.1.0" }

# foundation
thiserror = "2"
serde = { version = "1", features = ["derive", "rc"] }
Expand All @@ -39,7 +41,7 @@ chrono = { version = "0.4.45", default-features = false, features = ["std", "clo
web-time = "1.1.0"
rayon = "1"
regex = { version = "1", default-features = false, features = ["std", "unicode", "perf"] }
quick-xml = "0.41"
quick-xml = "0.42"
zip = { version = "3", default-features = false, features = ["deflate"] }
sha2 = { version = "0.11", default-features = false }
# Decrypting password-protected workbooks ([MS-OFFCRYPTO]): AES and SHA-1, pure Rust (wasm-safe).
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ cargo run --release -p gridcraft -- --sample sales --control 7979 # + JSON con
cargo xtask ci # fmt, clippy, tests, assets, layering, wasm
```

Choose Español under View → Interface language for [Spanish formula names, decimal commas, and semicolon arguments](docs/formula-input.md).
Choose Español or Русский under View → Interface language for [localized formula names, decimal commas, and semicolon arguments](docs/formula-input.md).
Workbooks, clipboard exchange, and programmatic APIs retain canonical English syntax.

### Web
Expand Down
27 changes: 24 additions & 3 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

**Stage: alpha** · next: beta, ~25 points of "ready for real work" and ~160–240 h away

> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-25 · **Change:** minor (AutoSum over a selected row puts its total to the right, and fills a selection's empty last row and column; earlier: macro engine and `macro.*` commands; macro interface on the Automate tab) · **Target:** Microsoft Excel (Microsoft 365)
> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-25 · **Change:** minor (transpose formula references with the pasted cell; web page host integration; XLS notes, hyperlinks and frozen panes; Animation effects follows the system setting; Function Library and recently used functions; AutoSum over a selected row puts its total to the right, and fills a selection's empty last row and column; earlier: macro engine and `macro.*` commands; macro interface on the Automate tab) · **Target:** Microsoft Excel (Microsoft 365)

GridCraft aims at full Microsoft Excel parity, and at being better in places: faster, open (XLSX
is the native format), fully scriptable by agents (MCP, control channel, CLI), and on the web.
Expand Down Expand Up @@ -135,8 +135,13 @@ Ranked; estimates in Opus 5.5 agent-hours. Detail and the full beta-gate list in

| Date | What landed |
|---|---|
| 2026-10-26 | Paste Special ▸ Transpose turns a formula's references with the cell that carries it, as Excel does: the row offset becomes the column offset and the other way round, so `=A3+1` copied from A3:A4 and pasted at C3 reads the cell to its left (`=C3+1`) instead of keeping the offset it had in the column; a reference pinned with `$` is left standing, a whole row or column comes back as a cell range open to the sheet's edge, and one off the grid is `#REF!` (#2450) |
| 2026-10-26 | Text past 32,767 characters behaves like Excel (#2635): `&` and CONCATENATE cut their result there, CONCAT and TEXTJOIN give `#CALC!`, and a typed or CSV-read cell is cut, so GridCraft never writes a cell Excel refuses to open |
| 2026-10-25 | AutoSum over a selection does what Excel does: a selected row gets one total to its right (in its last cell if that is empty), not a one-cell total under each cell; a block whose last column is empty gets each row's total there, one whose last row is empty each column's, and with both the corner gets the total of the block; otherwise totals go under each column as before |
| 2026-10-24 | Macro interface ([macros.md](docs/macros.md#in-the-window)): an Automate › Macros group (Record Macro, which turns into Stop Recording, Use Relative References, Run Macro with recent macros); "Recording · N steps" with Stop in the status bar; a Record Macro dialog (checked name, free Ctrl+Shift shortcut, description); the Macros dialog lists macros beside Automate scripts and a VBA project, with Run, Step Into, Edit, Create, Delete and Options; Ctrl+Shift+letter macro shortcuts; questions that offer Run, Overwrite, Shift Down or Shift Right; a step editor with a breakpoint gutter, drag to reorder, a command picker, reference boxes that switch between relative tokens and absolute references, Inputs and Output tabs, a debug bar (Check, Run, Step, Continue, Run to Here, Stop with keep or undo) and grid overlays for inputs, writes, conflicts and the current step |
| 2026-10-24 | Animation effects setting in File › Options (Use system setting, On, Off): GridCraft follows the system's animation setting (Windows Animation effects, macOS Reduce motion, the Linux/BSD desktop's setting, the browser's), and Off stops eased scrolling and zooming, the selection glide and the marching dashes |
| 2026-10-24 | Recently Used lists the functions most recently entered in a formula from any source (ribbon, control channel, MCP, scripts), kept with the preferences and returned by `formulas.recentlyUsed`; the Insert Function dialog takes Excel's title and a working category list (Most Recently Used, All, each category) |
| 2026-10-24 | Formulas › Function Library as a big Insert Function button, the AutoSum split button and three columns of labelled small buttons, each category book in its own colour; category menus end with Insert Function… on that category; More Functions cascades into the remaining categories; Home › Editing shares the AutoSum menu; the MR key tip opens Recently Used |
| 2026-10-25 | Page host mode: a page can host GridCraft in its own document (no iframe) with `data-host="page"` on the canvas, talking over DOM `CustomEvent`s with the same messages as the `?host=parent` parent bridge, which is now documented in the hosting guide |
| 2026-10-24 | Go To lists the named ranges of every sheet (`Sheet2!Name` for a name scoped to another sheet; hidden names, constants and formulas left out) and the references entered before, a double-click goes to an entry, and the Reference box takes several names or references separated by commas (`Price, Type`, `B14:C22,F19:G30`) |
| 2026-10-24 | Status bar: a right-click opens a menu that sets which selection statistics show (Average, Count and Sum by default; Numerical Count, Minimum and Maximum are new), kept with the preferences (`view.statusBar`) |
| 2026-10-24 | Ctrl+Shift+U (Control+Shift+U on a Mac) expands and collapses the formula bar, on the grid and while editing (`view.expandFormulaBar`); on Windows and Linux it used to underline |
Expand Down Expand Up @@ -164,12 +169,18 @@ Ranked; estimates in Opus 5.5 agent-hours. Detail and the full beta-gate list in
| 2026-10-15 | File › Options › Formulas: Maximum Iterations and Maximum Change fields for iterative calculation, disabled while it is off, with Excel's limits (1 to 32767, 0 or more) |
| 2026-10-15 | Function help follows the interface language: argument hints, autocomplete, Insert Function (search and readable categories) and the Formulas-tab menus read per-language tables of descriptions and argument names; Spanish keeps its 10 functions in the new format |
| 2026-10-15 | Row auto-fit counts a cell's line breaks only when the cell wraps, as Excel does: a file whose unwrapped cells hold multi-line text no longer opens with tall rows (typing a break still turns wrap on and grows the row) |
| 2026-10-14 | XLSX import warns when a pivot cache is missing, malformed or too large, naming the cache and saying its PivotTable was kept as plain cells, instead of dropping the PivotTable silently (#1039) |

| 2026-10-14 | SORT, SORTBY and Data > Sort order numbers exactly like Excel, so 0.3 sorts before `=0.1+0.2` whatever the input order; `=` and COUNTIF keep their 15-digit comparison |
| 2026-10-14 | Lookups (MATCH, XMATCH, VLOOKUP, HLOOKUP, XLOOKUP, LOOKUP) compare numbers exactly like Excel, so a computed key such as `=0.1+0.2` no longer finds 0.3; `=` and COUNTIF/SUMIF keep their 15-digit comparison |
| 2026-10-14 | Functions: EOMONTH, EDATE, WORKDAY, NETWORKDAYS, YEARFRAC, WEEKNUM, the bond and coupon functions, DISC, BIN2DEC, IM* and the other Analysis ToolPak functions give `#VALUE!` for a reference to more than one cell in a value argument, as Excel 365 does, instead of spilling; array constants and computed arrays still lift |
| 2026-10-14 | Protect Sheet on a protected sheet: Home › Format, its keytips (HOP, RPS) and the tab menu now read Unprotect Sheet… and unprotect (straight away without a password); a protected sheet that forbids selecting locked (or unlocked) cells is enforced for clicks, arrows and Go To, and the Protect Sheet dialog has the select options (#1346) |
| 2026-10-14 | XLSX self-contained `extLst` entries are kept on save: x15 and x14 workbook properties, the workbook compatibility version and Excel for Mac entries, alongside calcFeatures; extensions that point at other content (slicers, timelines, data model, Google Sheets data) stay dropped and are named in an open warning |
| 2026-10-14 | `.xls` (Excel 97-2003) files open with their formatting: fonts, solid and pattern fills, borders (with diagonals), alignment (rotation, indent, wrap, shrink), locked and hidden cells, the workbook's custom colour palette, its Normal font and its user-defined cell styles |
| 2026-10-14 | XLSX: formulas opened with dynamic-array metadata (`cm`) keep it on save, with `xl/metadata.xml`. Before, a formula returning one value lost it (11 of 40 corpus files that have the part lost it entirely), and Excel recalculated some of them with implicit intersection (`SUMPRODUCT(IFERROR(...))` changed value) |
| 2026-10-14 | Recalculation: a dynamic array's anchor given a new formula that reads its old spill area (`A1` was `=SEQUENCE(3)`, becomes `=SUM(A2:A3)+1` or `=SEQUENCE(1,A2+1)`) sees that area empty instead of the old values |
| 2026-10-14 | Recalculation: when two arrays of one recalculation want the same empty cells, the formulas that read the one laid out second (at its anchor or over the cells it would have spilled into) read `#SPILL!` and empty cells instead of its values |
| 2026-10-14 | `.xls` import reads cell notes (author, multi-line text, shown or hidden), hyperlinks (web, mailto, absolute and relative files, places in the workbook, tooltips) and frozen panes, plus gridlines and the other sheet display options (#121) |
| 2026-10-14 | Border keytips: each Alt, H, B letter applies the preset Excel's Borders menu gives it (H,B,O bottom, H,B,B bottom double, H,B,N no border, H,B,A all borders and the rest); they all drew a bottom border before. H,B,M opens Format Cells on the Border tab |
| 2026-10-13 | Formula-entry Command/Ctrl-click inserts another reference with the locale's argument separator; Shift-click extends from a stable, sheet-aware anchor. Pointer tests cover repeated clicks, reversed ranges, ordinary replacement, typed separators, Spanish syntax, sheet switches and keyboard continuation. Readiness estimates unchanged. |
| 2026-10-13 | `formulas.evaluate` (`gridcraft-cli eval`, MCP `evaluate_formula`) refuses what entering the formula in a cell refuses, with the reason (`=SUM(1;2)`: "expected `,` or `)`"), instead of `#NAME?` for any formula that doesn't parse |
Expand Down Expand Up @@ -245,8 +256,11 @@ Ranked; estimates in Opus 5.5 agent-hours. Detail and the full beta-gate list in
| Date | Change | Summary |
|---|---|---|
| 2026-10-25 | minor | Progress log: AutoSum over a selected row, and a selection's empty last row and column |
| 2026-10-24 | minor | Macro interface on the Automate tab; progress log row |
| 2026-10-24 | minor | Animation effects setting that follows the system's; progress log row |
| 2026-10-24 | minor | Macro engine and `macro.*` commands; catalog 275 / 291 → 276 / 292 (View › Macros › Record Macro); progress log row |
| 2026-10-24 | minor | Progress log: Recently Used and Insert Function categories |
| 2026-10-24 | minor | Progress log: Function Library |
| 2026-10-25 | minor | Page host mode (`data-host="page"` on the canvas): host GridCraft in its own document over DOM `CustomEvent`s, same messages as the `?host=parent` parent bridge; progress log row |
| 2026-10-23 | minor | Progress log: accounting negatives in number text |
| 2026-10-23 | minor | Progress log: INDEX with one index on a 2-D reference is #REF! |
| 2026-10-22 | trivial | Progress log: formula hardening (#2163, #2162) |
Expand All @@ -258,15 +272,22 @@ Ranked; estimates in Opus 5.5 agent-hours. Detail and the full beta-gate list in
| 2026-10-20 | minor | Dutch (nl) listed under other shipped languages; progress log row |
| 2026-10-19 | minor | Progress log: long flat operator chains (#916) |
| 2026-10-19 | trivial | Progress log: desktop theme portal read timeout |
| 2026-10-17 | minor | Conditional formatting: 2-/3-colour scale editor with per-stop type/value/colour, and in-place rule editing (part of #1165) |
| 2026-10-16 | minor | Progress log: undo steps share picture and macro bytes |
| 2026-10-16 | minor | Progress log: floating pictures' textures bounded and kept per workbook |
| 2026-10-16 | trivial | Progress log: web preferences kept between visits (#1562) |
| 2026-10-16 | minor | Progress log: interface fonts held once instead of twice |
| 2026-10-14 | trivial | Progress log: pivot cache import warnings (#1039) |
| 2026-10-14 | minor | Progress log: `.xls` import reads cell formatting |

| 2026-10-14 | minor | Progress log: sorts order numbers exactly |
| 2026-10-14 | minor | Progress log: lookups compare numbers exactly |
| 2026-10-14 | minor | Progress log: Analysis ToolPak value arguments reject multi-cell references |
| 2026-10-14 | trivial | Progress log: XLSX self-contained extLst entries kept on save |
| 2026-10-14 | minor | XLSX dynamic-array `cm` metadata kept on save; progress log row |
| 2026-10-14 | minor | Progress log: spill anchor reading its old spill area |
| 2026-10-14 | minor | Progress log: formulas reading an array that loses a spill conflict |
| 2026-10-14 | minor | Progress log: `.xls` import of notes, hyperlinks and frozen panes (#121) |
| 2026-10-13 | trivial | Progress log: More Colors… and Recent Colors in the colour menus (#928) |
| 2026-10-13 | minor | Multi-level category axes (read, drawn, written); progress log row |
| 2026-10-13 | trivial | Progress log: shared pictures written once on XLSX export (#985) |
Expand Down
19 changes: 8 additions & 11 deletions apps/gridcraft-cli/src/check/package.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,8 @@ pub(super) const REBUILT_KINDS: [&str; 1] = ["calcchain"];

// ---------------------------------------------------------------- package validation

fn local_name(name: &[u8]) -> &[u8] {
match name.iter().rposition(|&b| b == b':') {
Some(i) => name.get(i + 1..).unwrap_or(name),
None => name,
}
fn local_name(name: &str) -> &str {
name.rsplit(':').next().unwrap_or(name)
}

/// `(element local name, attributes)` for every start/empty element of an XML part.
Expand All @@ -37,12 +34,12 @@ fn xml_elements(xml: &[u8]) -> Result<Vec<XmlElement>, String> {
.map(|a| {
let v = match a.normalized_value(quick_xml::XmlVersion::Explicit1_0) {
Ok(v) => v.into_owned(),
Err(_) => String::from_utf8_lossy(&a.value).into_owned(),
Err(_) => a.value.to_string(),
};
(String::from_utf8_lossy(local_name(a.key.as_ref())).into_owned(), v)
(local_name(a.key.as_ref()).to_string(), v)
})
.collect();
out.push((String::from_utf8_lossy(local_name(e.name().as_ref())).into_owned(), attrs));
out.push((local_name(e.name().as_ref()).to_string(), attrs));
}
Ok(Event::Eof) => break,
Ok(_) => {}
Expand Down Expand Up @@ -303,9 +300,9 @@ fn holds_something_uncached(zip: &mut Zip<'_>, name: &str, marker: &'static str,
let take = f.size().min(MAX_XML_PART).min(*budget);
*budget -= take;
let mut reader = quick_xml::Reader::from_reader(std::io::BufReader::new(f.take(take)));
let wanted: Option<&'static [u8]> = match marker {
"comment" => Some(b"comment"),
"shape" => Some(b"shape"),
let wanted: Option<&'static str> = match marker {
"comment" => Some("comment"),
"shape" => Some("shape"),
_ => None,
};
let mut buf = Vec::new();
Expand Down
Loading
Loading