Rename project from numbers-study to numolus

- package.json / package-lock.json: package name "numolus"
- README: new title, drop the "Case- und Designstudie" framing, update
  test count (331 -> 528)
- localStorage keys renamed to numolus:doc:v2 / numolus:theme; the old
  numbers-study:* keys are still read as a fallback so existing documents
  and theme choices survive the rename

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
wkh
2026-09-28 01:51:18 +02:00
co-authored by Claude Opus 5.5
parent 3fb3e340ba
commit 86d03346e8
5 changed files with 20 additions and 14 deletions
+6 -7
View File
@@ -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 Eine browserbasierte Tabellenkalkulation nach dem Vorbild von **Apple Numbers**. Zwei Dinge stehen im Mittelpunkt:
Vorbild von **Apple Numbers**. Zwei Dinge stehen im Mittelpunkt:
1. **Handwerk** — eine von Grund auf selbst geschriebene, schlanke Formel-Engine 1. **Handwerk** — eine von Grund auf selbst geschriebene, schlanke Formel-Engine
(Tokenizer, Parser, AST, Abhängigkeitsgraph, Neuberechnung, Zirkelbezug- (Tokenizer, Parser, AST, Abhängigkeitsgraph, Neuberechnung, Zirkelbezug-
@@ -13,7 +12,7 @@ Vorbild von **Apple Numbers**. Zwei Dinge stehen im Mittelpunkt:
```bash ```bash
npm install npm install
npm run dev # Vite-Devserver 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 build # Typecheck + Produktionsbuild
npm run lint # ESLint (flat config) 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) Platzhalter-Modus (`2`) ist nicht unterstützt. `Suchmodus`: `1` (Standard)
erster Treffer zuerst, `-1` letzter Treffer zuerst; Excels binäre erster Treffer zuerst, `-1` letzter Treffer zuerst; Excels binäre
Suchmodi (`2`/`-2`, setzen einen sortierten Bereich voraus) sind nicht 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")`. `=XLOOKUP(B7; A2:A6; C2:C6; "unbekannt")`.
**Fehlermodell** (propagiert an abhängige Zellen): **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 = > **Hinweis zur Aufgabenstellung:** Die Akzeptanzliste nennt „Übersicht!B2 =
> 6070". Die explizit angegebene Nord-Zeile ergibt jedoch > 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 demonstrierte Verhalten (Sofort-Propagierung durch Übersicht, „Gesamt" und
> das Diagramm bei Änderung von `Umsatz!B2`) ist davon unberührt. > das Diagramm bei Änderung von `Umsatz!B2`) ist davon unberührt.
## Tests ## Tests
`npm run test` — Vitest, 331 Tests: `npm run test` — Vitest, 528 Tests:
- **lexer / parser** — Präzedenz & Assoziativität (`^` vor `*/` vor `+-`, `^` - **lexer / parser** — Präzedenz & Assoziativität (`^` vor `*/` vor `+-`, `^`
rechts, `-2^2 = -(2^2)`), lokale/qualifizierte/quoted Bezüge, `!` **und** `::`, rechts, `-2^2 = -(2^2)`), lokale/qualifizierte/quoted Bezüge, `!` **und** `::`,
+2 -2
View File
@@ -1,11 +1,11 @@
{ {
"name": "numbers-study", "name": "numolus",
"version": "1.0.0", "version": "1.0.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "numbers-study", "name": "numolus",
"version": "1.0.0", "version": "1.0.0",
"dependencies": { "dependencies": {
"chart.js": "^4.4.6", "chart.js": "^4.4.6",
+1 -1
View File
@@ -1,5 +1,5 @@
{ {
"name": "numbers-study", "name": "numolus",
"private": true, "private": true,
"version": "1.0.0", "version": "1.0.0",
"type": "module", "type": "module",
+6 -2
View File
@@ -2,8 +2,12 @@ import { ref, watchEffect } from 'vue';
type Mode = 'system' | 'light' | 'dark'; type Mode = 'system' | 'light' | 'dark';
const KEY = 'numbers-study:theme'; const KEY = 'numolus:theme';
const stored = (localStorage.getItem(KEY) as Mode | null) ?? 'system'; /** 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<Mode>(stored); const mode = ref<Mode>(stored);
watchEffect(() => { watchEffect(() => {
+5 -2
View File
@@ -80,7 +80,9 @@ import { defaultTableView, DEFAULT_ROW_H, MIN_GRID_SIZE, MAX_GRID_SIZE } from '.
import { createSeedDocument } from '../data/seed'; import { createSeedDocument } from '../data/seed';
import { validateDocument } from '../io/json'; 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 const CASCADE = 28; // px offset for successive inserted objects
@@ -523,7 +525,8 @@ function rewriteRefsForRename(
function loadInitial(): DocumentState { function loadInitial(): DocumentState {
try { try {
const raw = localStorage.getItem(STORAGE_KEY); const raw =
localStorage.getItem(STORAGE_KEY) ?? localStorage.getItem(LEGACY_STORAGE_KEY);
if (raw) { if (raw) {
// validateDocument migrates v1, validates + *normalises* v2 (fills in // validateDocument migrates v1, validates + *normalises* v2 (fills in
// `view` and other defaults for documents saved by an older build). // `view` and other defaults for documents saved by an older build).