12.0.7 - 2026-10-08
Fixes
- Chart adopts the
ViewStartandViewEndaViewChangehandler assigns during a mouse wheel zoom or scrollbar pan. The callbacks fired while the internal zoom guard was active, so a handler that re-anchored the bound range, for example to keep the latest data in view, updated the parent state while the chart kept rendering the cursor-centered range until the next unrelated render. AfterViewStartChanged,ViewEndChangedandViewChangecomplete the chart now takes the range it received, clamps it and raisesZoomChangedagain if the zoom level moved. - DatePicker with
ShowDays="false"is usable again with the drill-down navigation. The month and year grids were rendered inside the sameShowDaysblock as the day table, so a month or year picker showed only the header: the title cycled through the month and year views with nothing drawn, the year-range view had no way back and its arrows moved the current date by twelve years. The grids are now rendered regardless ofShowDaysand only the day table is gated by it. WithShowDaysfalse the calendar opens in the month grid, the title drills up to the year grid, a year cell returns to the month grid and a month cell stays there with the picked month highlighted and focused. Picking a month changesCurrentDateand raisesCurrentDateChangedas the v11 header dropdowns did; the boundValueis not committed, so existing handlers keep working.DropDownnavigation withShowDaysfalse still renders only the header dropdowns. - Spreadsheet loads workbooks whose formulas reference large, mutually overlapping ranges without overflowing the stack, and computes them like Excel. Each referenced cell was evaluated recursively and every range expanded eagerly, so
INDEX($W$7:$W$521,...)in column V andINDEX($V$31:$V$521,...)in column W recursed through the whole block and crashed with a stack overflow in WebAssembly. Recalculation now follows a calculation chain: only the cells dirtied by a change are recalculated, every other formula cell is read from its stored value, and a formula that reads a dirty precedent not yet calculated is re-queued after it, so stack depth is bounded by formula nesting instead of data size and cycles are detected at calculation time. Cell and range expressions evaluate to references that are dereferenced only where values are needed, soINDEX,ROW,COLUMN,ROWS,COLUMNS,VLOOKUP,HLOOKUPandXLOOKUPread only the cells they use, andIF,IFERROR,IFNA,IFS,SWITCHandCHOOSEevaluate only the branch they take, soROW(A5)in A5 is 5 instead of#CIRCULARandCHOOSE(1,5,1/0)is 5. An error criterion inCOUNTIF,SUMIF,AVERAGEIFand the*IFSfunctions matches cells holding the same error instead of failing the formula. The dependency graph stores each distinct range once with the formulas that read it, which cut building it for the reported workbook from 23.8 s to 0.3 s. All formula cells of the three attached workbooks match the values Excel saved (#2750). - Spreadsheet loads large formula workbooks faster. During a recalculation the values of a range are read once and later reads get a copy, unless the range holds a cell that is still pending or a self or circular read, so the 2,333 range reads made while loading the workbook from #2750 no longer read 3.8 million cells. The formula lexer allocates trivia lists only for tokens that have trivia, shared formulas reuse the parsed master formula instead of parsing it again for every cell, and unpopulated cells share a single empty instance. Worksheets are read with a streaming
XmlReaderinstead of loading each sheet part into anXDocument, so the cell elements are never materialized asXElementandXAttributeobjects. Loading that workbook in WebAssembly allocates 244 MB instead of 535 MB and takes 10.7 s instead of 20.4 s.