diff --git a/README.md b/README.md index bc78039..2f14cd3 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ -# Numbers-Studie — Tabellenkalkulation mit eigener Formel-Engine +# numolus — Tabellenkalkulation mit eigener Formel-Engine -Eine browserbasierte Tabellenkalkulation als **Case- und Designstudie** nach dem -Vorbild von **Apple Numbers**. Zwei Dinge stehen im Mittelpunkt: +Eine browserbasierte Tabellenkalkulation nach dem Vorbild von **Apple Numbers**. Zwei Dinge stehen im Mittelpunkt: 1. **Handwerk** — eine von Grund auf selbst geschriebene, schlanke Formel-Engine (Tokenizer, Parser, AST, Abhängigkeitsgraph, Neuberechnung, Zirkelbezug- @@ -13,7 +12,7 @@ Vorbild von **Apple Numbers**. Zwei Dinge stehen im Mittelpunkt: ```bash npm install npm run dev # Vite-Devserver -npm run test # Vitest-Suite (Engine + Store + IO), 331 Tests +npm run test # Vitest-Suite (Engine + Store + IO), 528 Tests npm run build # Typecheck + Produktionsbuild npm run lint # ESLint (flat config) ``` @@ -961,7 +960,7 @@ gefunden wurde, ein Fehler darin schlägt bei einem Treffer also nie durch. Platzhalter-Modus (`2`) ist nicht unterstützt. `Suchmodus`: `1` (Standard) erster Treffer zuerst, `-1` letzter Treffer zuerst; Excels binäre Suchmodi (`2`/`-2`, setzen einen sortierten Bereich voraus) sind nicht -unterstützt — bei den Tabellengrößen dieser Studie ohne Vorteil. Beispiel: +unterstützt — bei den Tabellengrößen von numolus ohne Vorteil. Beispiel: `=XLOOKUP(B7; A2:A6; C2:C6; "unbekannt")`. **Fehlermodell** (propagiert an abhängige Zellen): @@ -1075,13 +1074,13 @@ Grundrechenarten: `Übersicht!B2 = =SUM(Umsatz!B2:E2)`, `D2 = =B2-C2`, > **Hinweis zur Aufgabenstellung:** Die Akzeptanzliste nennt „Übersicht!B2 = > 6070". Die explizit angegebene Nord-Zeile ergibt jedoch -> `1200+1450+1600+1720 = 5970`. Die Studie hält sich an die explizite Tabelle; +> `1200+1450+1600+1720 = 5970`. numolus hält sich an die explizite Tabelle; > das demonstrierte Verhalten (Sofort-Propagierung durch Übersicht, „Gesamt" und > das Diagramm bei Änderung von `Umsatz!B2`) ist davon unberührt. ## Tests -`npm run test` — Vitest, 331 Tests: +`npm run test` — Vitest, 528 Tests: - **lexer / parser** — Präzedenz & Assoziativität (`^` vor `*/` vor `+-`, `^` rechts, `-2^2 = -(2^2)`), lokale/qualifizierte/quoted Bezüge, `!` **und** `::`, diff --git a/package-lock.json b/package-lock.json index 8e5f1fb..55a347c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "numbers-study", + "name": "numolus", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "numbers-study", + "name": "numolus", "version": "1.0.0", "dependencies": { "chart.js": "^4.4.6", diff --git a/package.json b/package.json index f5c5441..d188172 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "numbers-study", + "name": "numolus", "private": true, "version": "1.0.0", "type": "module", diff --git a/src/composables/useTheme.ts b/src/composables/useTheme.ts index 752ceda..ac71eb5 100644 --- a/src/composables/useTheme.ts +++ b/src/composables/useTheme.ts @@ -2,8 +2,12 @@ import { ref, watchEffect } from 'vue'; type Mode = 'system' | 'light' | 'dark'; -const KEY = 'numbers-study:theme'; -const stored = (localStorage.getItem(KEY) as Mode | null) ?? 'system'; +const KEY = 'numolus:theme'; +/** Key used before the rename to numolus -- still read as a fallback. */ +const LEGACY_KEY = 'numbers-study:theme'; +const stored = + ((localStorage.getItem(KEY) ?? localStorage.getItem(LEGACY_KEY)) as Mode | null) ?? + 'system'; const mode = ref(stored); watchEffect(() => { diff --git a/src/store/document.ts b/src/store/document.ts index 280e625..dc387ee 100644 --- a/src/store/document.ts +++ b/src/store/document.ts @@ -80,7 +80,9 @@ import { defaultTableView, DEFAULT_ROW_H, MIN_GRID_SIZE, MAX_GRID_SIZE } from '. import { createSeedDocument } from '../data/seed'; import { validateDocument } from '../io/json'; -const STORAGE_KEY = 'numbers-study:doc:v2'; +const STORAGE_KEY = 'numolus:doc:v2'; +/** Key used before the rename to numolus -- still read as a fallback. */ +const LEGACY_STORAGE_KEY = 'numbers-study:doc:v2'; const CASCADE = 28; // px offset for successive inserted objects @@ -523,7 +525,8 @@ function rewriteRefsForRename( function loadInitial(): DocumentState { try { - const raw = localStorage.getItem(STORAGE_KEY); + const raw = + localStorage.getItem(STORAGE_KEY) ?? localStorage.getItem(LEGACY_STORAGE_KEY); if (raw) { // validateDocument migrates v1, validates + *normalises* v2 (fills in // `view` and other defaults for documents saved by an older build).