docs: update BACKLOG, SPEC, and design system to reflect v0.9.0–v0.16.3 changes

- BACKLOG: add completed features from v0.7.1 through v0.16.3 (shopping
  widget, priority none, kanban persistence, meal visibility, currency,
  custom categories, recipe links, Spanish/FR/TR/RU/EL/ZH locales,
  settings tabs, CNY/TRY/RUB currencies)
- SPEC: add recipe_url field to Meals table (v0.13.0)
- SPEC: add shopping_categories table (v0.12.0)
- SPEC: fix i18n fallback language from de to en (v0.16.1)
- SPEC: update locale file list to include all 10 languages
- SPEC: document Settings tab navigation (v0.16.0)
- design/system.md: fix priority levels from 4 to 5 (none added v0.9.0)
This commit is contained in:
Ulas
2026-04-13 10:35:33 +02:00
parent e61644702c
commit ddb8294eff
3 changed files with 31 additions and 4 deletions
+1 -1
View File
@@ -163,5 +163,5 @@ Two triggers: `prefers-color-scheme: dark` (system) or `data-theme="dark"` (manu
- **Module-specific CSS:** Each page has its own stylesheet loaded dynamically - keeps initial bundle minimal - **Module-specific CSS:** Each page has its own stylesheet loaded dynamically - keeps initial bundle minimal
- **Page transitions:** Directional slide animations based on navigation order (left/right) - **Page transitions:** Directional slide animations based on navigation order (left/right)
- **Glass overlays:** `rgba(255, 255, 255, 0.18)` surfaces for elements on colored backgrounds (e.g., action buttons on module headers) - **Glass overlays:** `rgba(255, 255, 255, 0.18)` surfaces for elements on colored backgrounds (e.g., action buttons on module headers)
- **Priority system:** Four levels (urgent/high/medium/low) with dedicated color + translucent background tokens - **Priority system:** Five levels (none/low/medium/high/urgent) with dedicated color + translucent background tokens. "None" is the default for new tasks and hides the priority badge entirely.
- **Swipe gestures:** Touch-friendly item interactions (swipe to delete/complete) on mobile - **Swipe gestures:** Touch-friendly item interactions (swipe to delete/complete) on mobile
+14
View File
@@ -37,3 +37,17 @@ New suggestion? → [Open an issue](https://github.com/ulsklyc/oikos/issues/new?
| - | Security hardening: XSS, rate limiter bypass, OAuth CSRF, CSV injection, session invalidation | v0.5.9 | | - | Security hardening: XSS, rate limiter bypass, OAuth CSRF, CSV injection, session invalidation | v0.5.9 |
| - | Budget: Fix update failing when category changes | v0.6.0 | | - | Budget: Fix update failing when category changes | v0.6.0 |
| - | Upgrade bcrypt 5 → 6, ESM migration, structured logger, remove SESSION_SECRET fallback | v0.7.0 | | - | Upgrade bcrypt 5 → 6, ESM migration, structured logger, remove SESSION_SECRET fallback | v0.7.0 |
| - | XSS fix: shared esc() utility, deduplicate escHtml across all modules | v0.7.1 |
| - | Dashboard: Shopping list widget (lists with open items, progress bar, item preview) | v0.8.0 |
| - | Tasks: optional "None" priority level (default for new tasks, hides badge) | v0.9.0 |
| - | Tasks: persist kanban/list view in localStorage; ?view=kanban URL parameter | v0.9.1 |
| - | Meals: customizable meal type visibility (breakfast/lunch/dinner/snack toggles in Settings) | v0.10.0 |
| - | Budget: configurable currency (13 currencies selectable in Settings → Budget) | v0.11.2 |
| - | Swedish (sv) translation contributed by @olsson82 | v0.11.3 |
| - | Shopping: custom categories - add, rename, delete, reorder in Settings | v0.12.0 |
| - | Meals: optional recipe link per meal (recipe_url field, link icon on card) | v0.13.0 |
| - | Spanish (es) translation - all sections fully translated | v0.14.0 |
| - | Settings: categorized tab navigation (General, Meals, Budget, Shopping, Calendar, Account) | v0.16.0 |
| - | Budget: CNY (Chinese Yuan) added to currency list (#42) | v0.16.2 |
| - | i18n: French (fr), Turkish (tr), Russian (ru), Greek (el), Chinese Simplified (zh) locales | v0.16.3 |
| - | Budget: TRY (Turkish Lira) and RUB (Russian Ruble) added to currency list | v0.16.3 |
+16 -3
View File
@@ -44,10 +44,21 @@ Every table: `id INTEGER PRIMARY KEY`, `created_at TEXT`, `updated_at TEXT` (ISO
| list_id | INTEGER | FK → Shopping Lists, NOT NULL | | list_id | INTEGER | FK → Shopping Lists, NOT NULL |
| name | TEXT | NOT NULL | | name | TEXT | NOT NULL |
| quantity | TEXT | e.g. "500g", "2 pieces" | | quantity | TEXT | e.g. "500g", "2 pieces" |
| category | TEXT | Fruit & Vegetables, Dairy, Meat & Fish, Bakery, Drinks, Frozen, Household, Drugstore, Other | | category | TEXT | FK → Shopping Categories (by name) |
| is_checked | INTEGER | 0/1 | | is_checked | INTEGER | 0/1 |
| added_from_meal | INTEGER | FK → Meals, nullable | | added_from_meal | INTEGER | FK → Meals, nullable |
### Shopping Categories
Custom, household-wide category list for shopping items. Replaces the old hardcoded category set.
| Column | Type | Constraint |
|--------|------|-----------|
| id | INTEGER | PRIMARY KEY |
| name | TEXT | NOT NULL |
| sort_order | INTEGER | NOT NULL |
| created_at | TEXT | |
| updated_at | TEXT | |
### Meals ### Meals
| Column | Type | Constraint | | Column | Type | Constraint |
|--------|------|-----------| |--------|------|-----------|
@@ -55,6 +66,7 @@ Every table: `id INTEGER PRIMARY KEY`, `created_at TEXT`, `updated_at TEXT` (ISO
| meal_type | TEXT | breakfast, lunch, dinner, snack | | meal_type | TEXT | breakfast, lunch, dinner, snack |
| title | TEXT | NOT NULL | | title | TEXT | NOT NULL |
| notes | TEXT | | | notes | TEXT | |
| recipe_url | TEXT | nullable, URL to recipe |
| created_by | INTEGER | FK → Users, NOT NULL | | created_by | INTEGER | FK → Users, NOT NULL |
### Meal Ingredients ### Meal Ingredients
@@ -235,6 +247,7 @@ User management and app configuration. Logged-in users only.
- **Calendar integration:** connect/disconnect Google Calendar OAuth, store Apple Calendar (CalDAV) credentials, configure sync interval - **Calendar integration:** connect/disconnect Google Calendar OAuth, store Apple Calendar (CalDAV) credentials, configure sync interval
- **Weather:** configure OpenWeatherMap location - **Weather:** configure OpenWeatherMap location
- **Language:** System (follows `navigator.language`), German, English, Spanish, French, Italian, Swedish, Greek, Russian, Turkish, Chinese - via `oikos-locale-picker` web component; switch without page reload - **Language:** System (follows `navigator.language`), German, English, Spanish, French, Italian, Swedish, Greek, Russian, Turkish, Chinese - via `oikos-locale-picker` web component; switch without page reload
- **Tab navigation:** Settings is organized in six tabs (General, Meals, Budget, Shopping, Calendar, Account). Sticky tab bar, active tab persists in sessionStorage, Calendar tab auto-activates after OAuth callbacks.
- **App info:** version, license - **App info:** version, license
### Budget (`/budget`) ### Budget (`/budget`)
@@ -327,7 +340,7 @@ All UI strings are managed via `public/i18n.js`. No hardcoded text in JS files o
### Architecture ### Architecture
- **Module:** `public/i18n.js` - exports: `initI18n()`, `setLocale()`, `t(key, params?)`, `getLocale()`, `getSupportedLocales()`, `formatDate(date)`, `formatTime(date)` - **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`, `public/locales/it.json`, `public/locales/sv.json` - structure: `{ "module.camelCaseKey": "Value" }` - **Locale files:** `public/locales/de.json` (reference), `public/locales/en.json`, `public/locales/es.json`, `public/locales/fr.json`, `public/locales/it.json`, `public/locales/sv.json`, `public/locales/el.json`, `public/locales/ru.json`, `public/locales/tr.json`, `public/locales/zh.json` - structure: `{ "module.camelCaseKey": "Value" }`
- **Variables:** `{{variable}}` syntax in translation strings, e.g. `t('tasks.assignedTo', { name: 'Anna' })` - **Variables:** `{{variable}}` syntax in translation strings, e.g. `t('tasks.assignedTo', { name: 'Anna' })`
- **Fallback chain:** active locale → German (`de`) → key itself - **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`
@@ -336,7 +349,7 @@ All UI strings are managed via `public/i18n.js`. No hardcoded text in JS files o
1. `localStorage` entry `oikos-locale` (manual selection) 1. `localStorage` entry `oikos-locale` (manual selection)
2. `navigator.languages[0]` (browser language) 2. `navigator.languages[0]` (browser language)
3. Fallback: `de` 3. Fallback: `en`
### Supported Languages ### Supported Languages