v0.1.1 — formula recalc on load, autosave banner fix, formula-bar parser
What's new in v0.1.1 — a tight patch on v0.1.0
Three user-facing bug fixes and a tested formula-bar feature shipped to the v0.1.x line.
🐛 Formula cells render on template load
Bug: Opening any template that ships formulas without cached <v> values (most hand-authored xlsx files) rendered the formula cells as blank in v0.1.0. Users had to click each cell + press Enter to materialise the value.
Fix: UniverSheet now triggers getFormula().executeCalculation() immediately after createUnit on first mount AND after every replaceWorkbook swap. A microtask-defer retry covers the brief window before the formula facade extension registers.
🐛 Autosave-restore banner was hidden behind the grid
Bug: The autosave-restore banner had no explicit grid-area in the .app layout. It fell into an implicit row past the sheet-tabs slot, which .app { overflow: hidden; height: 100dvh } clipped out of view. Users with unsaved work never saw the prompt to restore.
Fix: Added an auto-height banner row to the .app grid template (both the regular and --no-formula-bar variants). Mapped both .autosave-banner and .preview-banner to that area. The row collapses to 0 when no banner is rendered. Also auto-dismisses the home-template-gallery when an autosave record exists, so the user lands directly on the restore prompt.
✨ Excel-style typed input parses as numbers in the formula bar
The formula bar now parses Excel-style decorated input as numbers instead of storing them as text:
| Typed | Stored value |
|---|---|
$2,000 · €1,500.50 · £99.99 · ¥10,000 · ₹50,000 · NT$1,234 · R$1,500 |
the bare number |
15% · 12.5% · -3% |
divided-by-100 (matches Excel) |
(500) · ($1,234.50) |
negative (accounting parentheses) |
+500 · -$1,234 · $-1,234 |
signed |
1,234,567 |
thousands grouping stripped |
100 kr · 250 zł · 1,500 € |
suffix locales |
=SUM(A1:A10) · '42 · Hello world |
unchanged (formula / forced-text / plain text) |
97 unit tests pin the grammar. Only the formula-bar commit path uses the parser in v0.1.1 — the in-cell-grid editor's auto-coercion behind a guard is queued for v0.2.
🛠 Behind the scenes
- E2E suite back to ~17 minutes. v0.1.0's home-template-gallery overlay was silently intercepting pointer events on ~50 e2e tests, blowing CI to 1 h+ runs.
waitForUnivernow dismisses the gallery (with a 250 ms grace window so autosave-driven dismiss + collab-URL suppression can fire first without racing). - Desktop toolbar visibility at phone aligned with the mobile-pass design (single-row scrollable strip, ≤48 px tall).
- Sheet CI back to green end-to-end. Patch was held until the suite ran clean.
📦 Available now
docker run -p 3000:3000 schnsrw/casual-sheets:0.1
# also: schnsrw/casual-sheets:0.1.1Pinning recommendations unchanged: :0.1 rolls forward on patches, :0.1.1 for an exact pin. Multi-arch (amd64 + arm64), OCI-labelled, SBOM + provenance attestations in the manifest.
What's not in v0.1.1
- The in-cell-grid auto-coercion (auto-parse
$2,000as you type it directly in a cell, not just the formula bar). TheInputParserDriveris shipped but unmounted — the globalbeforeCommandExecutedhook needs a targeted guard before it can intercept user-typed mutations without affecting formula-engine writebacks and programmatic seeds. Queued for v0.2. - Backend OIDC / SAML enforcement (schema persists in
/adminconfig — v0.2 adds enforcement). - Horizontal scale-out (collab WebSocket sticky-session + cross-replica awareness).
Upgrade path
0.1.0 → 0.1.1 is a drop-in. No config migration. No on-disk format changes. Just bump your :0.1 tag or pull :0.1.1.
Full diff: v0.1.0...v0.1.1