- toast__undo: add :active scale + tap-highlight-color for reliable tap feedback
- task titles: animate text-decoration-color instead of snapping for smoother done-state
- modal forms: auto-add btn--loading on submit; rAF guard removes it on validation fail;
MutationObserver removes it on error re-enable; btnSuccess clears it before checkmark
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Shows a 3-screen modal overlay on first dashboard visit explaining key
features; dismissed state is persisted to localStorage so it never
reappears.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
When navigating to a secondary module (Budget, Recipes, Contacts, Settings),
the More button now displays the module's label and icon instead of "More".
This provides clearer navigation feedback to the user.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace local state mutation after list deletion with loadLists() so the
tab bar stays in sync with the server. Also add a renderTabs() call in
the error path so the UI recovers correctly on API failure.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- widget__empty: column → row layout, icon 28→20px, padding space-5 → space-3
saves ~40px vertical space per empty widget on mobile, keeps populated widgets
visible above the fold
- widget__body: bottom padding space-3 → space-4 for slightly more breathing room
- rebuildList() now uses document.startViewTransition with prefers-reduced-motion
guard; each customize-row gets a stable view-transition-name for smooth reorder
animation without a JS animation library
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Delete public/doc-assets/swagger.html and swagger-init.js (CDN dependency violates project constraints)
- Remove /docs route from server/index.js
- Revert styleSrc and fontSrc in CSP to not include cdn.jsdelivr.net
- Translate all 22 settings.apiToken* keys in de.json from English to German
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove .codex (Codex CLI artifact, not part of project)
- Restore CHANGELOG.md v0.23.17 entry (was deleted by contributor's fork)
- Restore version to 0.23.17 in package.json and package-lock.json
- Restore native translations for catFood, catLeisure, catEducation in ar, el,
hi, ja, ru, sv, tr, uk, zh (PR had replaced them with English strings)
- Replace Portuguese seed names in migration 16 with English (housing, food,
transport, personal_health, leisure, shopping_clothing, education,
financial_other and all subcategory display names)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Resolves#82
nav.more, calendar.ics.reset/resetToast, settings.ics.*, tasks.filter*,
tasks.swiped*, search.* and reminders.* keys were missing in all 14
non-German locale files, causing the app to fall back to German strings.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
When OPENWEATHER_UNITS=imperial, OpenWeatherMap returns wind speed in
mph directly — the server was incorrectly multiplying by 3.6 (m/s→km/h)
on top of that. All locale strings also hardcoded the unit label instead
of using a {{windUnit}} placeholder, so the label always read km/h.
Resolves#79
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add --color-warning-translucent and --color-soon tokens to tokens.css
- Replace hardcoded font-size 1.4rem with var(--text-xl) in dashboard.css
- Replace hardcoded rgba color with var(--color-warning-translucent)
- Remove duplicate .task-item__meta--overdue rule
- Fix hardcoded 'de-DE' locale: use formatTime() from i18n.js
- Fix formatDueDate: don't show time (23:59) when no due_time is set
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
After navigating to tasks/calendar/shopping/notes via FAB, the page's
primary add-button is programmatically clicked so the new-item modal
opens without a second tap. FAB container right-margin doubled to avoid
overlap with the browser's edge-swipe gesture zone.
Header shows current date and time instead of user name + separate date line.
urgentCount replaced by overdueCount (overdue tasks) and dueSoonCount (due today/soon),
each with a distinct chip color. formatDueDate updated to accept due_time and return
accurate overdue/soon states against the current moment.
dashboard grid expands to 4 columns at 1280px instead of 1440px.