From 1122bd269b56d1e341cecb93e470c98250001b7c Mon Sep 17 00:00:00 2001 From: Ulas Date: Fri, 3 Apr 2026 17:04:39 +0200 Subject: [PATCH] style: replace em dashes with hyphens throughout codebase MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace all — with - in all source files (JS, CSS, HTML, JSON, Markdown) for consistency and readability. Co-Authored-By: Claude Sonnet 4.6 --- .env.example | 2 +- .github/ISSUE_TEMPLATE/feature_request.md | 2 +- CHANGELOG.md | 2 +- CONTRIBUTING.md | 2 +- SECURITY.md | 2 +- docs/SPEC.md | 24 +++--- docs/claude-md-audit.md | 24 +++--- docs/index.html | 12 +-- docs/repo-audit-2026-04-02.md | 32 ++++---- package.json | 2 +- public/components/modal.js | 12 +-- public/components/oikos-install-prompt.js | 2 +- public/components/oikos-locale-picker.js | 2 +- public/i18n.js | 6 +- public/index.html | 4 +- public/locales/de.json | 10 +-- public/locales/en.json | 10 +-- public/locales/it.json | 10 +-- public/pages/dashboard.js | 6 +- public/pages/meals.js | 2 +- public/pages/shopping.js | 6 +- public/pages/tasks.js | 6 +- public/robots.txt | 2 +- public/router.js | 8 +- public/styles/dashboard.css | 4 +- public/styles/layout.css | 30 ++++---- public/styles/meals.css | 2 +- public/styles/pwa.css | 2 +- public/styles/settings.css | 2 +- public/styles/shopping.css | 4 +- public/styles/tasks.css | 2 +- public/styles/tokens.css | 68 ++++++++--------- public/sw.js | 4 +- public/utils/ux.js | 8 +- scripts/generate-icons.js | 2 +- scripts/seed-demo.js | 90 +++++++++++------------ server/auth.js | 2 +- server/db-schema-test.js | 2 +- server/db.js | 4 +- server/index.js | 4 +- server/routes/budget.js | 2 +- server/routes/calendar.js | 2 +- server/routes/dashboard.js | 4 +- server/routes/meals.js | 8 +- server/routes/weather.js | 2 +- server/services/apple-calendar.js | 24 +++--- server/services/google-calendar.js | 20 ++--- setup.js | 2 +- test-browser-loader.mjs | 2 +- test-calendar.js | 2 +- test-db.js | 4 +- test-meals.js | 2 +- test-modal-utils.js | 2 +- test-notes-contacts-budget.js | 2 +- test-shopping.js | 8 +- test-ux-utils.js | 6 +- 56 files changed, 256 insertions(+), 256 deletions(-) diff --git a/.env.example b/.env.example index 3953df0..26ef421 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,4 @@ -# Oikos — Umgebungsvariablen +# Oikos - Umgebungsvariablen # Kopiere diese Datei nach .env und passe die Werte an. # Server diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index ad6d1ae..dad01e0 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -12,7 +12,7 @@ What problem does this solve? Describe the use case from a family member's persp ## Proposed Solution -How do you envision this working? Be as specific as you like — UI sketch, API shape, interaction flow. +How do you envision this working? Be as specific as you like - UI sketch, API shape, interaction flow. ## Alternatives Considered diff --git a/CHANGELOG.md b/CHANGELOG.md index 3adfb53..a9deedb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [0.5.8] - 2026-04-03 ### Added -- Add Italian (Italiano) localization — full translation of all 497 i18n keys (thanks @albanobattistella, PR #7) +- Add Italian (Italiano) localization - full translation of all 497 i18n keys (thanks @albanobattistella, PR #7) - Add Italian as selectable language in Settings locale picker ## [0.5.7] - 2026-04-03 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d0c6db5..4be0f6f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -184,7 +184,7 @@ PRs are reviewed by the maintainer. Expect feedback within a few days. Once appr ### Frontend - Web Component prefix: `oikos-` (one component per file) -- All UI text via i18n keys (`t('key')`) — never hardcode text in components. German (`de`) is the reference locale. +- All UI text via i18n keys (`t('key')`) - never hardcode text in components. German (`de`) is the reference locale. - Date format: `DD.MM.YYYY` - Time format: `HH:MM` (24h) - CSS uses design tokens from `public/styles/tokens.css` - never hardcode values - Pages export a `render()` function, no side effects on import diff --git a/SECURITY.md b/SECURITY.md index d599414..2326b9f 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -43,7 +43,7 @@ Oikos uses a flat family authorization model: - **Admin** can create, edit, and delete all user accounts and all shared data. - **Member** can read and write all shared data (tasks, shopping lists, meals, calendar events, notes, contacts, budget entries) but cannot manage user accounts. -There is no per-user data isolation — all family members see and can edit all data. This is intentional: Oikos is a shared family planner, not a multi-tenant application. +There is no per-user data isolation - all family members see and can edit all data. This is intentional: Oikos is a shared family planner, not a multi-tenant application. ## Supported Versions diff --git a/docs/SPEC.md b/docs/SPEC.md index 66ee342..b087984 100644 --- a/docs/SPEC.md +++ b/docs/SPEC.md @@ -1,4 +1,4 @@ -# Oikos — Product Specification +# Oikos - Product Specification Self-hosted family planner web app for a single household (2–6 people). No app store, no public access. Deployment via Docker on a private Linux server behind an Nginx reverse proxy with SSL. @@ -217,7 +217,7 @@ Masonry grid with colored sticky notes. ### Login (`/login`) -Unauthenticated users are redirected here. No public registration form — admin creates users via setup wizard (`setup.js`) or Settings. +Unauthenticated users are redirected here. No public registration form - admin creates users via setup wizard (`setup.js`) or Settings. - Username + password form - Error display for wrong credentials @@ -232,7 +232,7 @@ User management and app configuration. Logged-in users only. - **User management (admin):** create new users, edit/delete existing users, assign roles (admin/member) - **Calendar integration:** connect/disconnect Google Calendar OAuth, store Apple Calendar (CalDAV) credentials, configure sync interval - **Weather:** configure OpenWeatherMap location -- **Language:** System (follows `navigator.language`), German, English — via `oikos-locale-picker` web component; switch without page reload +- **Language:** System (follows `navigator.language`), German, English - via `oikos-locale-picker` web component; switch without page reload - **App info:** version, license ### Budget (`/budget`) @@ -299,14 +299,14 @@ User management and app configuration. Logged-in users only. - **Cards:** `var(--color-surface)`, `var(--radius-md)`, `var(--shadow-sm)`. Consistent padding `var(--space-4)` (16px) across all modules. - **Buttons:** Primary = accent + white. Secondary = outline. Min-height 44px. Submit buttons show success (checkmark, 700ms green via `.btn--success`) and error (shake via `.btn--shaking`). - **Inputs:** `var(--radius-sm)`, 1.5px border, padding 12px 16px. `[required]` fields receive validation status on blur (`.form-field--error` / `.form-field--valid`). Enter moves focus to the next field; Enter on the last field triggers submit. -- **FAB (Floating Action Button):** Color follows the module accent token (`--module-accent`) — each module defines its own accent color. Hidden when the virtual keyboard is open (`visualViewport.resize`, threshold 75% of window height). -- **Module accent colors:** `--module-accent` is applied on three visual layers — (1) active nav tab (bottom bar + sidebar stripe), (2) toolbar `border-top: 3px`, (3) cards/rows `border-left: 3px`. The active accent is written to `--active-module-accent` on `:root` on every navigation change. Falls back to `--color-accent` for pages without a module context. +- **FAB (Floating Action Button):** Color follows the module accent token (`--module-accent`) - each module defines its own accent color. Hidden when the virtual keyboard is open (`visualViewport.resize`, threshold 75% of window height). +- **Module accent colors:** `--module-accent` is applied on three visual layers - (1) active nav tab (bottom bar + sidebar stripe), (2) toolbar `border-top: 3px`, (3) cards/rows `border-left: 3px`. The active accent is written to `--active-module-accent` on `:root` on every navigation change. Falls back to `--color-accent` for pages without a module context. - **Navigation:** Bottom tab bar on mobile (Dashboard, Tasks, Calendar, Meals, More). Sidebar on desktop. - **Transitions:** Directional slide-X animation on page change (forward = from right, back = from left, 200ms). Respects `prefers-reduced-motion`. - **Empty states:** Consistent `.empty-state` class across all modules (icon + title + description, centered). Compact variant `.empty-state--compact` for meal slots. -- **Modals:** Centered panel on desktop. On mobile (< 768px) bottom sheet — slides in from below, sheet handle visible, swipe-to-close (> 80px downward). `focusin` scrolls inputs into view when the virtual keyboard is open. -- **List animation:** Staggered fade-in on load (`stagger()` from `public/utils/ux.js`) — max 5 elements staggered (30ms gap), rest appear immediately. -- **Vibration:** `vibrate()` from `public/utils/ux.js` — short pulses for light actions (10–40ms), pattern `[30, 50, 30]` for destructive actions (delete). Respects `prefers-reduced-motion`. +- **Modals:** Centered panel on desktop. On mobile (< 768px) bottom sheet - slides in from below, sheet handle visible, swipe-to-close (> 80px downward). `focusin` scrolls inputs into view when the virtual keyboard is open. +- **List animation:** Staggered fade-in on load (`stagger()` from `public/utils/ux.js`) - max 5 elements staggered (30ms gap), rest appear immediately. +- **Vibration:** `vibrate()` from `public/utils/ux.js` - short pulses for light actions (10–40ms), pattern `[30, 50, 30]` for destructive actions (delete). Respects `prefers-reduced-motion`. - **PWA install prompt:** Appears only after 2 user interactions. Dismiss window 7 days; interaction counter resets after dismiss. - **PWA offline fallback:** Service worker serves `/offline.html` when the network is unreachable and `index.html` is not cached. Includes a reload button. @@ -323,11 +323,11 @@ All UI strings are managed via `public/i18n.js`. No hardcoded text in JS files o ### Architecture -- **Module:** `public/i18n.js` — exports: `initI18n()`, `setLocale()`, `t(key, params?)`, `getLocale()`, `getSupportedLocales()`, `formatDate(date)`, `formatTime(date)` -- **Locale files:** `public/locales/de.json` (reference), `public/locales/en.json` — structure: `{ "module.camelCaseKey": "Value" }` +- **Module:** `public/i18n.js` - exports: `initI18n()`, `setLocale()`, `t(key, params?)`, `getLocale()`, `getSupportedLocales()`, `formatDate(date)`, `formatTime(date)` +- **Locale files:** `public/locales/de.json` (reference), `public/locales/en.json` - structure: `{ "module.camelCaseKey": "Value" }` - **Variables:** `{{variable}}` syntax in translation strings, e.g. `t('tasks.assignedTo', { name: 'Anna' })` - **Fallback chain:** active locale → German (`de`) → key itself -- **Date format:** `Intl.DateTimeFormat` with current locale — use `formatDate()` and `formatTime()` from `i18n.js` +- **Date format:** `Intl.DateTimeFormat` with current locale - use `formatDate()` and `formatTime()` from `i18n.js` ### Language Detection @@ -343,4 +343,4 @@ All UI strings are managed via `public/i18n.js`. No hardcoded text in JS files o ### Locale Switching -`setLocale(locale)` saves the selection, loads the new locale file, and fires the `locale-changed` custom event. All page modules and web components listen to this event and re-render — no page reload required. +`setLocale(locale)` saves the selection, loads the new locale file, and fires the `locale-changed` custom event. All page modules and web components listen to this event and re-render - no page reload required. diff --git a/docs/claude-md-audit.md b/docs/claude-md-audit.md index fbe087f..1c2b47c 100644 --- a/docs/claude-md-audit.md +++ b/docs/claude-md-audit.md @@ -1,4 +1,4 @@ -# CLAUDE.md Audit — Oikos +# CLAUDE.md Audit - Oikos **Datum:** 2026-04-02 **Aktuelle Länge:** 109 Zeilen (exkl. Leerzeilen) @@ -17,7 +17,7 @@ **Fehlend:** - Kein expliziter Hard-Constraints-Block. "No SPA framework" ist in einen Fließtext-Absatz eingebettet statt als nicht-verhandelbare Regel markiert. -- `public/utils/ux.js` wird von 7 Seiten importiert — kein Wort davon. +- `public/utils/ux.js` wird von 7 Seiten importiert - kein Wort davon. - `public/i18n.js` wird als System erwähnt, aber nicht als kanonische Datei referenziert. - `offline.html` fehlt im Architecture-Tree. @@ -27,7 +27,7 @@ **Redundanzen mit CONTRIBUTING.md:** - Project Structure: fast identischer Tree in beiden Dateien -- Code Conventions: ES modules, Semicolons, Header comments, try/catch — alles doppelt +- Code Conventions: ES modules, Semicolons, Header comments, try/catch - alles doppelt - Testing: identische Beschreibung in beiden - Changelog: gleiche Anweisung in beiden - Migration append-only: in beiden Dateien @@ -37,9 +37,9 @@ ### 1.3 Signalqualität **Probleme:** -- "No SPA framework" ist deskriptiv formuliert statt imperativ — ein LLM könnte es als Kontextinfo statt als harte Regel lesen. +- "No SPA framework" ist deskriptiv formuliert statt imperativ - ein LLM könnte es als Kontextinfo statt als harte Regel lesen. - Security Model ist eine Faktenbeschreibung. Kein Satz sagt "tu X" oder "tu niemals Y". -- Backend-Dependency-Liste ist reines Inventar — Claude kann `package.json` lesen. +- Backend-Dependency-Liste ist reines Inventar - Claude kann `package.json` lesen. - Deployment-Dockerfile-Snippet: rein informativ, kein Handlungsbezug. - `node:20-slim` im CLAUDE.md-Deployment-Block, aber Dockerfile verwendet tatsächlich `node:22-slim` → **falsche Information**. @@ -47,7 +47,7 @@ | Erwähnt in CLAUDE.md | Tatsächlicher Zustand | Problem | |---|---|---| -| `public/assets/` (apple-touch-icon, favicons) | Verzeichnis existiert nicht — Icons in `public/icons/` | **Falscher Pfad** | +| `public/assets/` (apple-touch-icon, favicons) | Verzeichnis existiert nicht - Icons in `public/icons/` | **Falscher Pfad** | | `scripts/generate-icons.js` | Existiert ✅, aber `scripts/seed-demo.js` fehlt im Tree | Unvollständig | | Dockerfile `node:20-slim` | Dockerfile nutzt `node:22-slim` | **Falsche Version** | | Components: `modal.js`, `oikos-install-prompt.js` | Auch `oikos-locale-picker.js` existiert | Unvollständig | @@ -64,7 +64,7 @@ |-----------|--------|------------| | Nur verhaltenssteuernd, keine Spec-Duplikation | ⚠️ | Security Model, Deployment, Dependency-Liste sind rein informativ | | Harte Constraints klar abgegrenzt | ❌ | Kein separater Block; "no framework" in Fließtext versteckt | -| Referenztabelle vollständig & aktuell | ❌ | Keine Referenztabelle vorhanden — nur ein Einzeiler zu SPEC.md | +| Referenztabelle vollständig & aktuell | ❌ | Keine Referenztabelle vorhanden - nur ein Einzeiler zu SPEC.md | | Pfade/Module korrekt | ❌ | `public/assets/` existiert nicht, Dockerfile-Version falsch | | Keine Redundanz mit CONTRIBUTING.md | ❌ | ~40% Überlappung (Structure, Conventions, Testing, Changelog) | | Keine Redundanz mit docs/ | ✅ | SPEC.md wird referenziert, nicht dupliziert | @@ -96,12 +96,12 @@ Siehe `CLAUDE.md.proposed` im Repo-Root. | Was | Warum verhaltensrelevant | |-----|--------------------------| -| Expliziter Hard Constraints Block | Claude muss sofort wissen, was nicht verhandelbar ist — nicht erst aus Fließtext erschließen. | +| Expliziter Hard Constraints Block | Claude muss sofort wissen, was nicht verhandelbar ist - nicht erst aus Fließtext erschließen. | | `public/utils/ux.js` als kanonische Utility | Wird von 7 Pages importiert. Ohne dieses Wissen würde Claude Utility-Funktionen duplizieren. | -| `public/i18n.js` + `public/locales/` in Structure | Kanonische Orte für i18n — Claude muss wissen, wo Locale-Keys definiert werden. | +| `public/i18n.js` + `public/locales/` in Structure | Kanonische Orte für i18n - Claude muss wissen, wo Locale-Keys definiert werden. | | `offline.html` im Tree | Existiert, wird vom Service Worker referenziert, fehlte komplett. | | Reference Documents Tabelle | Claude muss wissen, wo welche kanonische Wahrheit liegt, statt zu raten. | -| `oikos-locale-picker.js` in Components | Existierende Komponente fehlte — Claude könnte sie unwissentlich neu bauen. | +| `oikos-locale-picker.js` in Components | Existierende Komponente fehlte - Claude könnte sie unwissentlich neu bauen. | ### Umformuliert @@ -115,6 +115,6 @@ Siehe `CLAUDE.md.proposed` im Repo-Root. | Was | Von | Nach | Grund | |-----|-----|------|-------| -| Security Model Details | CLAUDE.md | Bereits in Code (middleware, auth.js) | Kein eigenes Dokument nötig — Code ist die Wahrheit | +| Security Model Details | CLAUDE.md | Bereits in Code (middleware, auth.js) | Kein eigenes Dokument nötig - Code ist die Wahrheit | | Deployment env vars, Dockerfile | CLAUDE.md | README.md (bereits dort vorhanden) | Ops-Information, nicht Entwicklungsverhalten | -| Detaillierter Project Structure Tree | CLAUDE.md | CONTRIBUTING.md (bereits dort vorhanden) | Duplikation eliminieren — CONTRIBUTING.md hat den vollständigen Tree | +| Detaillierter Project Structure Tree | CLAUDE.md | CONTRIBUTING.md (bereits dort vorhanden) | Duplikation eliminieren - CONTRIBUTING.md hat den vollständigen Tree | diff --git a/docs/index.html b/docs/index.html index 04f2b28..9cd9484 100644 --- a/docs/index.html +++ b/docs/index.html @@ -3,21 +3,21 @@ - Oikos — The Self-Hosted Family Planner + Oikos - The Self-Hosted Family Planner - - + + - - + + @@ -568,7 +568,7 @@

Oikos

The self-hosted family planner

-

Manage your household together. Tasks, shopping, meals, calendar, budget — all in one place. Self-hosted, private, yours.

+

Manage your household together. Tasks, shopping, meals, calendar, budget - all in one place. Self-hosted, private, yours.

View on GitHub diff --git a/docs/repo-audit-2026-04-02.md b/docs/repo-audit-2026-04-02.md index 4e27aba..3e98033 100644 --- a/docs/repo-audit-2026-04-02.md +++ b/docs/repo-audit-2026-04-02.md @@ -1,4 +1,4 @@ -# Repository Hygiene Audit — Oikos +# Repository Hygiene Audit - Oikos **Datum:** 2026-04-02 **Version:** 0.5.2 (Tag `v0.5.2`) @@ -12,7 +12,7 @@ | # | Datei | Status | Begründung | Empfehlung | |---|-------|--------|------------|------------| -| 1 | `.worktrees/feature/` | Verwaist | Leeres Verzeichnis — Überrest eines abgeschlossenen Git-Worktree. Kein Inhalt. | **Löschen** (`rm -rf .worktrees/feature/`) | +| 1 | `.worktrees/feature/` | Verwaist | Leeres Verzeichnis - Überrest eines abgeschlossenen Git-Worktree. Kein Inhalt. | **Löschen** (`rm -rf .worktrees/feature/`) | **Keine verwaisten JS/CSS/HTML-Dateien gefunden.** Alle Module in `public/pages/`, `public/components/`, `public/styles/` und `server/routes/` sind korrekt referenziert: @@ -29,7 +29,7 @@ | # | Datei | Status | Begründung | Empfehlung | |---|-------|--------|------------|------------| -| — | — | — | Keine gefunden. | — | +| - | - | - | Keine gefunden. | - | Keine `.bak`, `.old`, `.tmp`-Dateien vorhanden. Sauber. @@ -40,7 +40,7 @@ Keine `.bak`, `.old`, `.tmp`-Dateien vorhanden. Sauber. | 1 | `.env` | OK | Existiert lokal, **nicht** von Git getrackt, in `.gitignore` gelistet. | Kein Handlungsbedarf | | 2 | `.claude/` | OK | In `.gitignore`, nicht getrackt. | Kein Handlungsbedarf | | 3 | `.worktrees/` | OK | In `.gitignore`, nicht getrackt. Leeres `feature/`-Verzeichnis (s. 1.1). | Leeres Subdir löschen | -| 4 | `docs/superpowers/` | OK | In `.gitignore`, nicht getrackt. Enthält 7 Plandokumente (3076 Zeilen) lokal. | Kein Handlungsbedarf — `.gitignore` greift | +| 4 | `docs/superpowers/` | OK | In `.gitignore`, nicht getrackt. Enthält 7 Plandokumente (3076 Zeilen) lokal. | Kein Handlungsbedarf - `.gitignore` greift | ### 1.4 Prompt-Dateien @@ -50,15 +50,15 @@ Keine `.bak`, `.old`, `.tmp`-Dateien vorhanden. Sauber. | # | Datei | Status | Begründung | Empfehlung | |---|-------|--------|------------|------------| -| — | — | — | Keine leeren oder Stub-Dateien gefunden. | — | +| - | - | - | Keine leeren oder Stub-Dateien gefunden. | - | ### 1.6 Sonderfall: Hilfs-/Script-Dateien | # | Datei | Zeilen | Genutzt von | Empfehlung | |---|-------|--------|-------------|------------| -| 1 | `server/db-schema-test.js` | 185 | Allen 7 Test-Dateien (`test-*.js`) | **Behalten** — aktiv genutzte Test-Infrastruktur | -| 2 | `scripts/seed-demo.js` | 343 | Manuell (CLI-Script für Screenshots) | **Behalten** — nützliches Dev-Tool | -| 3 | `test-browser-loader.mjs` | — | `package.json` test:modal-utils | **Behalten** — aktiv genutzt für Browser-API-Mocks | +| 1 | `server/db-schema-test.js` | 185 | Allen 7 Test-Dateien (`test-*.js`) | **Behalten** - aktiv genutzte Test-Infrastruktur | +| 2 | `scripts/seed-demo.js` | 343 | Manuell (CLI-Script für Screenshots) | **Behalten** - nützliches Dev-Tool | +| 3 | `test-browser-loader.mjs` | - | `package.json` test:modal-utils | **Behalten** - aktiv genutzt für Browser-API-Mocks | --- @@ -75,9 +75,9 @@ Keine `.bak`, `.old`, `.tmp`-Dateien vorhanden. Sauber. | `SECURITY.md` | ✅ Vorhanden & vollständig | Vulnerability Reporting via GitHub Private Advisories, Scope-Definition, Security-Features-Übersicht, Supported-Versions-Policy. | | `CHANGELOG.md` | ⚠️ Vorhanden, kleiner Fehler | Keep a Changelog Format, retroaktive Versionierung ab 0.1.0 ✅. **Problem:** Compare-Links am Dateiende: `[Unreleased]` verweist auf `v0.5.1...HEAD` statt `v0.5.2...HEAD`. Außerdem fehlt der `[0.5.2]`-Compare-Link. | | `CLAUDE.md` | ✅ Vorhanden & aktuell | Behavioral guide (109 Zeilen), nicht von Git getrackt (in .gitignore). Beschreibt Architektur, Konventionen, Security, DB, Deployment, Implementation Status. Keine Duplikation von SPEC.md. | -| `BACKLOG.md` | ✅ Vorhanden & aktuell | Enthält erledigte Features als Referenztabelle (BL-01 bis BL-10 mit Versionszuordnung). Aktiv keine offenen Einträge — korrekt für aktuellen Projektstand. | +| `BACKLOG.md` | ✅ Vorhanden & aktuell | Enthält erledigte Features als Referenztabelle (BL-01 bis BL-10 mit Versionszuordnung). Aktiv keine offenen Einträge - korrekt für aktuellen Projektstand. | | `docs/SPEC.md` | ✅ Vorhanden | Nicht im Detail geprüft (Umfang), aber von CLAUDE.md und README.md referenziert und zentral für alle Module. | -| `.dockerignore` | ⚠️ Vorhanden, kleiner Fehler | Sinnvolle Ausschlüsse. **Problem:** Referenziert `docs/social-preview.html` — diese Datei existiert nicht (nur `docs/social-preview.png` existiert). Harmlos (Ausschluss einer nicht-existenten Datei), aber irreführend. | +| `.dockerignore` | ⚠️ Vorhanden, kleiner Fehler | Sinnvolle Ausschlüsse. **Problem:** Referenziert `docs/social-preview.html` - diese Datei existiert nicht (nur `docs/social-preview.png` existiert). Harmlos (Ausschluss einer nicht-existenten Datei), aber irreführend. | | `docker-compose.yml` | ✅ Vorhanden | Nicht im Detail geprüft, aber vorhanden und funktional laut README/CHANGELOG. | | `Dockerfile` | ✅ Vorhanden | Nicht im Detail geprüft, vorhanden. | | `.github/ISSUE_TEMPLATE/bug_report.md` | ✅ Vorhanden & vollständig | Gutes Template mit Description, Steps to Reproduce, Expected/Actual Behavior, Environment, Logs (collapsible), Additional Context. | @@ -89,7 +89,7 @@ Keine `.bak`, `.old`, `.tmp`-Dateien vorhanden. Sauber. | Datei | Status | Bewertung | |-------|--------|-----------| | `docs/` Verzeichnis | ✅ Vorhanden | Enthält SPEC.md, logo.svg, social-preview.png, Screenshots (4 Varianten × 9 Module = 36 Screenshots). | -| `manifest.json` | ✅ Vorhanden | `public/manifest.json` — PWA-Manifest. | +| `manifest.json` | ✅ Vorhanden | `public/manifest.json` - PWA-Manifest. | | Service Worker | ✅ Vorhanden | `public/sw.js` + `public/sw-register.js`. | | `.nvmrc` | ✅ Vorhanden | Inhalt: `22`. Konsistent mit `engines.node: ">=22.0.0"` in package.json. | | `.env.example` | ✅ Vorhanden & vollständig | 39 Zeilen. Alle dokumentierten Env-Vars abgedeckt: PORT, NODE_ENV, SESSION_SECRET, SESSION_SECURE, DB_PATH, DB_ENCRYPTION_KEY, OpenWeather, Google Calendar, Apple CalDAV, Sync-Intervall, Rate-Limiting. | @@ -100,7 +100,7 @@ Keine `.bak`, `.old`, `.tmp`-Dateien vorhanden. Sauber. | Element | Status | Bewertung | |---------|--------|-----------| -| Git Tags | ✅ Konsistent | v0.1.0 bis v0.5.2 — alle CHANGELOG-Versionen haben entsprechende Tags. | +| Git Tags | ✅ Konsistent | v0.1.0 bis v0.5.2 - alle CHANGELOG-Versionen haben entsprechende Tags. | | `scripts/` | ✅ Sinnvoll | `generate-icons.js` (Dev-Tool) und `seed-demo.js` (Screenshot-Generierung). Beide in `.dockerignore` exkludiert. | | `entrypoint.sh` | ✅ Vorhanden | Docker-Entrypoint. | | `setup.js` | ✅ Vorhanden | Admin-Setup-Wizard, in README dokumentiert. | @@ -111,7 +111,7 @@ Keine `.bak`, `.old`, `.tmp`-Dateien vorhanden. Sauber. | Kriterium | Status | Bewertung | |-----------|--------|-----------| -| Projektname und Kurzbeschreibung | ✅ Vorhanden | Logo + "Oikos" + "The self-hosted family planner that respects your privacy." — klar und prägnant. | +| Projektname und Kurzbeschreibung | ✅ Vorhanden | Logo + "Oikos" + "The self-hosted family planner that respects your privacy." - klar und prägnant. | | Badges | ✅ Vorhanden | 7 Badges: Release, License, Node.js, Docker, SQLCipher, PWA, i18n. flat-square Style. | | Screenshots/Demo | ✅ Vorhanden & hervorragend | 9 Mobile-Screens (dark/light auto-switch via ``), 8 Tablet-Screens in collapsible Section. Alle 4 Varianten (mobile-dark, mobile-light, tablet-dark, tablet-light). | | Features-Übersicht | ✅ Vorhanden | 8 Module in 2-Spalten-Tabelle + "And also"-Absatz mit Querschnittsfunktionen. | @@ -145,7 +145,7 @@ Keine `.bak`, `.old`, `.tmp`-Dateien vorhanden. Sauber. - **Aufwand**: 5 Minuten - **Dateien**: `CHANGELOG.md` (Zeilen 139–147) -### [P2] .dockerignore — Phantomreferenz entfernen +### [P2] .dockerignore - Phantomreferenz entfernen - **Was**: `.dockerignore` exkludiert `docs/social-preview.html`, aber diese Datei existiert nicht (nur `docs/social-preview.png` existiert). - **Warum**: Irreführend bei Code-Review oder Wartung. Kein funktionaler Impact. @@ -165,12 +165,12 @@ Keine `.bak`, `.old`, `.tmp`-Dateien vorhanden. Sauber. | Kategorie | Ergebnis | |-----------|----------| -| **Verwaiste Dateien** | 1 Fund (leeres Worktree-Dir) — P3 | +| **Verwaiste Dateien** | 1 Fund (leeres Worktree-Dir) - P3 | | **Superseded Files** | 0 Funde | | **Dev Artifacts** | Korrekt durch .gitignore abgedeckt | | **Prompt-Dateien** | Keine im Repo | | **Leere Dateien** | 0 Funde | -| **Projektdateien** | 2 Minor-Issues (CHANGELOG-Links, .dockerignore Phantom) — P2 | +| **Projektdateien** | 2 Minor-Issues (CHANGELOG-Links, .dockerignore Phantom) - P2 | | **README** | Vollständig, keine Lücken | | **P0-Findings** | 0 | | **P1-Findings** | 0 | diff --git a/package.json b/package.json index 3fd19f1..8b8cd0b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "oikos", "version": "0.5.8", - "description": "Selbstgehosteter Familienplaner — Kalender, Aufgaben, Einkauf, Essensplan, Budget und mehr. Privat, offen, ohne Abo.", + "description": "Selbstgehosteter Familienplaner - Kalender, Aufgaben, Einkauf, Essensplan, Budget und mehr. Privat, offen, ohne Abo.", "main": "server/index.js", "engines": { "node": ">=22.0.0" diff --git a/public/components/modal.js b/public/components/modal.js index 83e4ebd..49b5205 100644 --- a/public/components/modal.js +++ b/public/components/modal.js @@ -138,7 +138,7 @@ function _wireSheetSwipe(panel) { } // -------------------------------------------------------- -// _doClose — gemeinsame Cleanup-Logik +// _doClose - gemeinsame Cleanup-Logik // -------------------------------------------------------- function _doClose() { @@ -169,12 +169,12 @@ function _doClose() { * Öffnet ein Modal mit dem Shared-System. * * @param {Object} opts - * @param {string} opts.title — Titel im Modal-Header - * @param {string} opts.content — HTML-String für den Modal-Body - * @param {Function} [opts.onSave] — Callback, wird nach Einfügen in DOM aufgerufen + * @param {string} opts.title - Titel im Modal-Header + * @param {string} opts.content - HTML-String für den Modal-Body + * @param {Function} [opts.onSave] - Callback, wird nach Einfügen in DOM aufgerufen * (zum Binden von Form-Events) - * @param {Function} [opts.onDelete] — Falls vorhanden, wird ein Löschen-Button eingebaut - * @param {string} [opts.size='md'] — 'sm' | 'md' | 'lg' + * @param {Function} [opts.onDelete] - Falls vorhanden, wird ein Löschen-Button eingebaut + * @param {string} [opts.size='md'] - 'sm' | 'md' | 'lg' */ export function openModal({ title, content, onSave, onDelete, size = 'md' } = {}) { // Vorheriges Modal schließen (kein Stacking) diff --git a/public/components/oikos-install-prompt.js b/public/components/oikos-install-prompt.js index 5b5a3ff..ee3689b 100644 --- a/public/components/oikos-install-prompt.js +++ b/public/components/oikos-install-prompt.js @@ -27,7 +27,7 @@ class OikosInstallPrompt extends HTMLElement { } connectedCallback() { - // Bereits im Standalone-Modus — nichts anzeigen + // Bereits im Standalone-Modus - nichts anzeigen if ( window.matchMedia('(display-mode: standalone)').matches || navigator.standalone === true diff --git a/public/components/oikos-locale-picker.js b/public/components/oikos-locale-picker.js index 883d1c2..fedee5f 100644 --- a/public/components/oikos-locale-picker.js +++ b/public/components/oikos-locale-picker.js @@ -1,5 +1,5 @@ /** - * oikos-locale-picker — Sprachauswahl-Web-Component + * oikos-locale-picker - Sprachauswahl-Web-Component * Zeigt ein