Commit Graph

217 Commits

Author SHA1 Message Date
Ulas d866d32336 feat: Apple CalDAV credentials form + connect/disconnect UI (BL-04)
Admin can now enter CalDAV URL, Apple-ID and app-specific password
directly in Settings; credentials are tested live before saving and
stored in sync_config (take precedence over .env); disconnect clears
DB-stored credentials without server restart. Auto-sync interval
(15 min, configurable via SYNC_INTERVAL_MINUTES) was already in place.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 10:27:07 +02:00
Ulas 6fd209ba5e feat: meals drag & drop between slots and days (BL-03)
Pointer Events-based drag & drop (touch + mouse compatible):
- Ghost element follows pointer; drops on empty slots move the meal,
  drops on occupied slots swap both meals via concurrent PUT requests
- prefers-reduced-motion: no ghost animation, interaction still works
- Suppress-click guard prevents accidental edit modal after drag

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 10:23:39 +02:00
Ulas 6a860f2c13 feat(calendar): expand recurring events in GET /calendar and /upcoming
expandRecurringEvents() iterates from the event's original start date,
generating all occurrences within the requested window using the existing
nextOccurrence() service (max 1000 iterations). The SQL query is extended
to also fetch recurring events that started before the window. Event
duration is preserved across instances. Virtual instances carry
is_recurring_instance=1 and are shown with a repeat icon in the agenda
view. /upcoming expands across a 90-day forward window.

Closes BL-01.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 10:17:39 +02:00
Ulas 82e5b2cd85 feat(budget): auto-generate recurring entry instances per month
Adds schema migration v3 (recurrence_parent_id column + budget_recurrence_skipped
table). On every GET /api/v1/budget, the server checks all recurring originals
(is_recurring=1, no parent) and creates missing instances for the requested month
using the same day-of-month (clamped to the last day). Deleted instances are
recorded in budget_recurrence_skipped so they are not recreated on the next visit.
Generated instances are shown with a ↩ indicator in the transaction list.

Closes BL-05.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 10:13:37 +02:00
Ulas 26d3d12a22 feat(budget): add month-over-month comparison to summary cards
Each summary card (Einnahmen, Ausgaben, Saldo) now shows a trend line
comparing the current month to the previous one. The previous month's
summary is fetched in parallel via the existing /budget/summary endpoint,
so there is no extra round-trip latency. Positive deltas render in green
(▲), negative in red (▼), unchanged in neutral grey (—).

Closes BL-02.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 22:54:04 +02:00
Ulas ca377e8441 docs: add BACKLOG.md with 10 entries (3 SPEC gaps, 3 medium, 4 ideas)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 22:41:51 +02:00
Ulas 675a0ff2b7 chore: bump to v0.2.1, finalize CHANGELOG
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 22:37:09 +02:00
Ulas 3e25339c86 fix: resolve event-listener leaks and CSS gaps found in code quality audit
- notes.js (Critical): move grid click listener from renderGrid() to
  render() — was re-registered on every save/pin/delete, causing
  multiple API calls per user action after several interactions
- dashboard.js (Major): introduce AbortController (_fabController) so
  the anonymous document click listener from initFab() is cancelled on
  each new render() cycle; also remove the redundant initFab() call on
  the skeleton render
- layout.css (Major): extend .label selector to include .form-label,
  covering usage in notes.js and settings.js without a mass-rename
- test-modal-utils.js (Major): 12 unit tests for wireBlurValidation,
  btnSuccess, btnError; registered as test:modal-utils in package.json
- notes.js (Minor): add btnError() shake feedback to save error handler
- calendar.js (Minor): add popup.isConnected guard to closePopup so
  the listener self-removes correctly after navigation without a click

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 22:26:49 +02:00
Ulas 36de5fa477 feat: merge UX polish v0.2.0 (14 tasks, 4 layers) 2026-03-30 22:02:03 +02:00
Ulas 656c1290dc chore: bump to v0.2.0, finalize CHANGELOG, update SPEC with UX patterns 2026-03-30 21:59:51 +02:00
Ulas 5aea8ca7f2 docs: update CHANGELOG for UX polish layer 1-4 changes 2026-03-30 21:23:48 +02:00
Ulas 0ac2769fac feat: blur-triggered inline validation and submit button feedback
Task 13: wireBlurValidation() activates error/valid state on required
fields after blur. Task 14: btnSuccess() shows a checkmark for 700ms
then closes the modal; btnError() triggers a shake animation on failure.
Both wired into the tasks form submit handler.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 21:22:36 +02:00
Ulas 1684215da8 feat: bottom sheet modal on mobile with swipe-to-close and Enter-key form navigation
- Add sheet drag handle (::before pseudo-element) and closing animation (sheet-out keyframe) for mobile < 768px in layout.css
- Add prefers-reduced-motion support disabling all modal animations
- Refactor closeModal() to extract _doClose() and play slide-out animation on mobile before removing the overlay
- Add _wireSheetSwipe() for touch drag-to-dismiss (threshold 80px)
- Extend trapFocus() Enter handler: advances focus through inputs/selects and triggers primary button on last field

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 21:19:25 +02:00
Ulas b9ec36611d feat: consistent vibration feedback via vibrate() utility across modules
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 21:18:44 +02:00
Ulas 499ce2cd29 feat: delay install prompt, reset counter on dismiss, scroll inputs into view
- Install prompt now waits for 2 interactions before showing
- Dismiss duration reduced from 30d to 7d
- Interaction counter reset on dismiss (clean slate after 7d)
- Virtual keyboard: focused inputs scroll into view in modals (300ms delay)
2026-03-30 21:16:36 +02:00
Ulas e3e0b8081b feat: scroll focused inputs into view on virtual keyboard open 2026-03-30 17:31:09 +02:00
Ulas 4eacba2edd feat: delay install prompt until 2 interactions, reduce dismiss to 7 days
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 17:30:05 +02:00
Ulas 168cd387b4 fix: remove stale .meals-empty CSS, add .meal-slot--empty rule 2026-03-30 17:28:04 +02:00
Ulas 0eab480a0e style: unify all empty states to shared .empty-state class across all modules
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 17:25:13 +02:00
Ulas eb0ac95e1d fix: scope stagger selector to #budget-list in budget.js 2026-03-30 17:21:53 +02:00
Ulas bc6e759b79 feat: staggered fade-in for list items across all modules
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 17:19:33 +02:00
Ulas b2327375b8 fix: remove unnecessary --experimental-vm-modules flag from test:ux-utils 2026-03-30 17:16:20 +02:00
Ulas f4eb567219 feat: add stagger() and vibrate() UX utilities with tests
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 17:14:15 +02:00
Ulas 20792e9894 fix: sync ROUTE_ORDER with nav order, guard against navigation race condition
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 17:11:53 +02:00
Ulas bc3f855fa9 feat: directional slide-x page transitions in router
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 17:08:49 +02:00
Ulas 0dbea82a22 fix: wire page-fab and fab-main to module-accent token 2026-03-30 17:02:05 +02:00
Ulas 194728bbe9 style: tie FAB colors to per-module accent tokens
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 16:55:33 +02:00
Ulas 624f3ab763 style: unify card padding to 16px across all modules 2026-03-30 16:43:05 +02:00
Ulas 5cc29cdc16 chore: add .worktrees/ to .gitignore 2026-03-30 16:37:55 +02:00
Ulas a5d8ae3f5f docs: add UX polish implementation plan (14 tasks across 4 layers)
Covers: card-padding consistency, module FAB accents, directional slide-x
page transitions, staggered list fade-in, unified empty states across all
modules, swipe-reveal proportional opacity, install prompt timing, virtual
keyboard scroll, vibration utility, bottom sheet modals, Enter-navigation,
blur validation, submit feedback animations.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 16:36:03 +02:00
Ulas fd5ffe3380 docs: add UX polish design spec (4-layer approach)
Defines the UX improvement strategy for Oikos post-v0.1.0:
Layer 1 — Design language & consistency (tokens, typography, module accents)
Layer 2 — Animations & transitions (page transitions, staggering, micro-interactions)
Layer 3 — Mobile PWA & native feel (install prompt, scroll, vibration, keyboard)
Layer 4 — Forms & modals (auto-focus, inline validation, bottom sheets, submit feedback)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 16:23:28 +02:00
Ulas 235b793d4b Add missing Login and Settings module specs to SPEC.md
Both pages exist in the codebase but were undocumented in the product
specification.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 16:02:57 +02:00
Ulas d1bbc9c8bb Fix inconsistent text alignment in meal cards
Force left-alignment at every level: meal-slot container, meal-card,
title, meta, and actions. Use align-self: stretch and explicit
text-align: left to prevent any parent from overriding alignment.
Left-aligned text is the correct UX choice for small scannable cards.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-29 16:20:12 +02:00
Ulas d3becbcf13 Remove global min-size touch target rule from pwa.css
The blanket 44px min-height/min-width on all buttons, links, and
checkboxes conflicted with the existing token-based touch target
system (--target-sm/md/lg + ::before pseudo-element expansion).
This caused oversized checkboxes in calendar (all-day toggle),
budget (recurring), and other form controls across all modules.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-29 15:57:33 +02:00
Ulas 26a42d001b Fix oversized task checkboxes and inconsistent meal text alignment
Exclude small buttons (task checkboxes, action buttons, color swatches)
from the 44px min-size rule in pwa.css — they already expand touch area
via ::before pseudo-elements. Force consistent left-alignment on meal
card titles, ingredients, and type labels.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-29 15:51:28 +02:00
ulsklyc 29c9292d2d Revise contributing guidelines for clarity and detail
Updated contributing guidelines to clarify architectural constraints and development setup instructions.
2026-03-29 15:43:49 +02:00
Ulas a4cc520342 Add CHANGELOG.md for initial v0.1.0 release
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-29 15:39:18 +02:00
Ulas 41e88e0acf Add PWA native feel: manifest, meta tags, install prompt, SW optimization, dynamic theme-color
Configure manifest.json with scope, maskable icons, and categories. Add iOS/Android
meta tags for standalone behavior. Create pwa.css for native touch/scroll handling
and safe area insets. Add oikos-install-prompt Web Component with Chrome install
flow and iOS guidance. Optimize service worker with network-first navigation and
expanded precache (v19). Add dynamic theme-color per route and modal overlay dimming
in standalone mode. Generate placeholder icons via sharp script.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-29 15:35:01 +02:00
Ulas 5838fb9243 Fix README screenshots: add dark mode support, fix broken image paths, normalize sizing
- Wrap all screenshots in <picture> elements with dark/light source variants
- Replace non-existent mobile-light-shopping.png with mobile-light-household.png
- Replace non-existent tablet-light-calendar.png with mobile dashboard screenshot
- Set consistent width="240" and width="33%" on all mobile screenshot cells

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-29 01:50:28 +01:00
ulsklyc 396050e2cf Aktualisieren von README.md 2026-03-29 01:17:56 +01:00
Ulas 8e01d4c749 Add theme-adaptive screenshots to README and fix manifest icons
Replace old screenshots with new mobile/tablet variants in light and dark
mode. README now uses <picture> elements with prefers-color-scheme so
screenshots automatically match the viewer's GitHub theme. Split manifest
icon purpose field into separate "any" and "maskable" entries per PWA spec.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-29 00:42:24 +01:00
ulsklyc 2139a678af Change email for vulnerability reports
Updated contact email for reporting vulnerabilities.
2026-03-28 14:28:15 +01:00
ulsklyc a8edd5afc0 Add files via upload 2026-03-28 14:27:31 +01:00
Ulas 2fc96a0805 chore: remove CLAUDE.md from tracking 2026-03-28 14:21:01 +01:00
ulsklyc ed605eb181 Add files via upload 2026-03-28 13:41:57 +01:00
ulsklyc 9b3bd96f69 Create bug report issue template
Add a bug report template for GitHub issues.
2026-03-28 13:41:32 +01:00
ulsklyc d1444414ba Add files via upload 2026-03-28 13:34:12 +01:00
ulsklyc 37da2858c6 Aktualisieren von README.md 2026-03-28 13:18:53 +01:00
Ulas 4a0fd73684 refactor: split CLAUDE.md into agent instructions + product spec 2026-03-28 10:42:32 +01:00
Ulas cb8b108d3c fix: Notizen-Toolbar erweitert + Essen-Widget 2×2-Grid auf Desktop
Pinnwand: Pflichtfeld-Stern entfernt, Markdown-Hinweis ergänzt,
Formatierungs-Toolbar um Unterstreichen, Durchgestrichen, Überschrift,
nummerierte Liste, Checkliste, Link, Code, Zitat und Trennlinie erweitert.
Dashboard: Essen-Widget nutzt ab Desktop 2×2-Layout statt 4×1 für
bessere Lesbarkeit der Mahlzeiten-Labels.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-27 15:31:50 +01:00