Commit Graph

297 Commits

Author SHA1 Message Date
Ulas e61644702c feat: add French, Turkish, Russian, Greek and Chinese UI languages + TRY/RUB currencies 2026-04-13 09:40:38 +02:00
Ulas 01d1f583b8 feat: add CNY (Chinese Yuan) to supported currencies (#42) 2026-04-13 09:22:42 +02:00
Ulas d68226d11e fix: timezone-aware CalDAV sync and English as i18n fallback (#43)
- Apple CalDAV: ICS events with TZID parameter are now converted to UTC
  using the Intl API instead of being stored as floating local time,
  fixing wrong start times for events synced from iOS Calendar
- i18n: fallback language for unsupported browser locales changed from
  German to English
2026-04-13 09:20:27 +02:00
Ulas 61e663ef72 feat: add categorized settings tabs (#30)
Six tabs (General, Meals, Budget, Shopping, Calendar, Account) replace
the flat single-page layout. Active tab persists via sessionStorage.
Calendar tab auto-activates on OAuth redirect. Tab bar is sticky.
All labels translated in de/en/es/it/sv.
2026-04-06 14:33:49 +02:00
Ulas 81ee1eaf18 chore: release v0.15.0
Update CHANGELOG for modal grid system and visual polish.
2026-04-06 14:11:11 +02:00
ulsklyc 4bfea29b05 Merge pull request #40 from ulsklyc/add-claude-github-actions-1775476601348
Add Claude Code GitHub Workflow
2026-04-06 13:58:28 +02:00
ulsklyc ab94ca323b Merge pull request #39 from ulsklyc/copilot/add-categorized-settings-tabs
[WIP] Add categorized settings tabs for improved navigation
2026-04-06 13:57:19 +02:00
ulsklyc 76ba1d5744 "Update Claude Code Review workflow" 2026-04-06 13:56:43 +02:00
ulsklyc 3d93ea4651 "Update Claude PR Assistant workflow" 2026-04-06 13:56:42 +02:00
copilot-swe-agent[bot] 7c923470c7 Initial plan 2026-04-06 11:51:50 +00:00
ulsklyc 0c7d538e96 Merge pull request #38 from ulsklyc/copilot/update-modal-design-box-alignment
Refresh shared modal styling and standardize two-column modal layout for consistent box alignment
2026-04-06 12:35:43 +02:00
copilot-swe-agent[bot] ce348ba702 style: reorder modal panel visual properties
Agent-Logs-Url: https://github.com/ulsklyc/oikos/sessions/7153de23-b6c6-423d-974c-cf3b961cbbad

Co-authored-by: ulsklyc <108589275+ulsklyc@users.noreply.github.com>
2026-04-06 10:33:35 +00:00
copilot-swe-agent[bot] 8d1227cfec refactor: remove non-tokenized modal title letter spacing
Agent-Logs-Url: https://github.com/ulsklyc/oikos/sessions/7153de23-b6c6-423d-974c-cf3b961cbbad

Co-authored-by: ulsklyc <108589275+ulsklyc@users.noreply.github.com>
2026-04-06 10:32:59 +00:00
copilot-swe-agent[bot] 26919e2ee3 feat: modernize modal styling and align two-column modal boxes
Agent-Logs-Url: https://github.com/ulsklyc/oikos/sessions/7153de23-b6c6-423d-974c-cf3b961cbbad

Co-authored-by: ulsklyc <108589275+ulsklyc@users.noreply.github.com>
2026-04-06 10:31:54 +00:00
copilot-swe-agent[bot] d4f72f426f Initial plan 2026-04-06 10:25:36 +00:00
Ulas 8079c81e22 fix(pwa): disable pinch-to-zoom and block residual body scroll (#16)
- Added user-scalable=no, maximum-scale=1 to viewport meta tag to prevent
  pinch-to-zoom in standalone PWA mode
- Added overflow: hidden to html, body so any minimal content overflow
  cannot make the body scrollable (belt-and-suspenders alongside
  overscroll-behavior: none)
- Service worker cache bumped to v28/v27
2026-04-06 10:56:45 +02:00
Ulas dd6c8a313a fix(pwa): fix remaining iOS scroll bleed and safe-area height overflow (#16)
Root cause 1 (scroll bleed): padding-top was applied to body in standalone
mode. Since .app-shell has height: 100dvh, body-padding shifted the shell
beyond the viewport bottom - enabling body-level scrolling.
Fix: moved padding-top from body to .app-shell in the standalone media query.

Root cause 2 (content overflow): fixed-height page containers
(Calendar, Shopping, Meals, Notes, Budget, Contacts) calculated height as
100dvh - nav-bottom - safe-area-inset-bottom, but never subtracted the top
safe area. This caused each page to overflow .app-content by exactly
env(safe-area-inset-top) pixels in standalone mode.
Fix: added --safe-area-inset-top token and subtracted it in all 6 height
calculations.

Service worker cache bumped to v27/v26.
2026-04-06 10:10:01 +02:00
Ulas f4268ce696 fix(modal): fix modal not closing in iOS PWA (#29)
- Add cursor:pointer to .modal-overlay so iOS Safari fires click events
  on the backdrop (iOS ignores clicks on non-interactive divs without it)
- Add touchend fallback listener on overlay for belt-and-suspenders iOS support
- Enlarge close button from target-sm (32px) to target-md (40px) to meet
  Apple touch-target guidelines; remove now-redundant ::before expansion
- Swipe-to-close now only activates from the top handle zone (< 48px) or
  when the panel is scrolled to top, preventing accidental dismissal while
  scrolling form content downward
2026-04-06 09:59:37 +02:00
Ulas 0505ce406c fix(ui): fix overlapping header elements on narrow screens (#31)
- Calendar toolbar now wraps view buttons to a second row on viewports
  < 580px so nav controls and label stay readable on all iOS devices
- Tasks toolbar title no longer bleeds over action buttons; uses
  min-width:min-content so flex-wrap kicks in before overflow occurs
- Shopping list-header name gets flex:1/overflow:hidden so it truncates
  cleanly instead of colliding with the clear-checked / delete buttons
2026-04-06 09:46:03 +02:00
Ulas 8fd5ec983a chore(changelog): add v0.14.0 entry for Spanish translation 2026-04-05 22:18:07 +02:00
Ulas 6702bc5291 feat(i18n): add Spanish (Español) language support 2026-04-05 22:17:08 +02:00
Ulas 3799a7f952 feat(meals): add optional recipe link to meal cards (#18)
- New optional recipe_url field in the meal modal (below Notes)
- Link icon appears on meal cards when a URL is set, opens in new tab
- DB migration v6: ALTER TABLE meals ADD COLUMN recipe_url TEXT
- API: recipe_url supported in POST /meals and PUT /meals/:id
- i18n: new keys recipeUrlLabel, recipeUrlPlaceholder, openRecipe (de, en, sv, it)
2026-04-05 18:03:05 +02:00
Ulas 2dc8984c3e feat(shopping): custom categories - add, rename, delete and reorder (#26)
- New DB table shopping_categories (migration v5) seeds 9 default
  categories with Lucide icons and sort_order
- Backend CRUD routes: GET/POST/PUT/DELETE /shopping/categories
  plus PATCH /shopping/categories/reorder
- Category validation now uses DB instead of hardcoded constant;
  items of deleted category are moved to the next available one
- Frontend shopping page loads categories from API, dropdown and
  grouping reflect custom order dynamically
- Settings -> Shopping section: list categories with up/down buttons,
  click-to-rename, delete with confirmation; add new categories inline
- i18n keys added in de/en/sv/it
2026-04-05 17:24:06 +02:00
Ulas 517e4454d0 fix(docker): exclude database files from Docker build context
*.db files were missing from .dockerignore - local builds could
accidentally include the live oikos.db with real user data.
2026-04-05 16:36:45 +02:00
Ulas cde511da1d docs: update README, installation guide and GitHub Pages
- README: GHCR badge, Kanban quick-status buttons and configurable
  currency mentioned in highlights
- installation.md: Option A (pre-built image, no clone) as primary path,
  Option B (build from source) as alternative; Updates section updated;
  SQLCipher troubleshooting tip added
- index.html: Get Started block now shows pre-built image path;
  task and budget feature cards updated (EN + DE translations)
2026-04-05 16:29:12 +02:00
Ulas 7292b14945 feat(docker): use pre-built GHCR image in docker-compose by default (#25)
docker-compose.yml now references ghcr.io/ulsklyc/oikos:latest so users
can start the app with a single 'docker compose up' without cloning or
building locally. The build: . entry is retained for contributors who
want to build from source with --build.

README Quick Start updated to document both the no-clone path (curl
docker-compose + .env.example) and the build-from-source path.
2026-04-05 16:20:24 +02:00
Ulas 19a7161307 feat(tasks): add quick-status button to kanban cards (#24)
Adds a small button on each kanban card that cycles the task status
(open → in_progress → done → open) without requiring drag-and-drop.
Useful for touch devices and kiosk browsers (e.g. Fully Kiosk Browser)
where drag-and-drop is unavailable. All four locales updated.
2026-04-05 16:16:46 +02:00
Ulas 31a9538518 chore: bump version to 0.11.6 2026-04-05 14:47:12 +02:00
ulsklyc 0785ca120f Merge pull request #23 from olsson82/main
fix: Updated Swedish translation
2026-04-05 14:46:35 +02:00
Andreas Olsson 670851ac07 fix: Updated Swedish translation 2026-04-05 14:16:34 +02:00
Ulas 751ef4d24c docs: update changelog for 0.11.5 2026-04-05 13:50:16 +02:00
Ulas a8275f5ec9 chore: bump version to 0.11.5 2026-04-05 13:50:03 +02:00
Ulas 5b8ab7303f fix(i18n): translate shopping categories and recurrence UI fields
- Shopping category dropdown options now use CATEGORY_LABELS() for
  translated display text instead of raw German internal keys
- rrule-ui.js now imports t() from /i18n.js; all hardcoded German
  strings (freq options, weekday labels, form labels, unit labels)
  replaced with i18n keys under the new 'rrule' namespace
- Added 'rrule' section to de.json and en.json with 22 new keys

Fixes #21
2026-04-05 13:49:44 +02:00
ulsklyc d7a79d9194 Merge pull request #22 from ulsklyc/add-claude-github-actions-1775389197820
Add Claude Code GitHub Workflow
2026-04-05 13:40:23 +02:00
ulsklyc a5cb4e63f1 "Claude Code Review workflow" 2026-04-05 13:39:59 +02:00
ulsklyc 2a2726cb04 "Claude PR Assistant workflow" 2026-04-05 13:39:58 +02:00
Ulas 014873f516 chore: bump version to 0.11.4 2026-04-05 13:24:17 +02:00
Ulas 1722e70e7f fix(ux): microinteraction fixes - swipe hint, locale loading, haptics, weather toast, FAB backdrop
- tasks.js: add maybeShowSwipeHint (long loop, max 3x) - matches shopping.js pattern
- tasks.js: vibrate(15) on task status toggle
- oikos-locale-picker: show disabled/loading state for both reload and setLocale paths
- dashboard: show success toast after weather refresh (all 4 locales)
- dashboard: add semi-transparent FAB backdrop to signal open mode
2026-04-05 13:23:16 +02:00
Ulas 796fe38913 fix(test): use bare matchMedia() instead of window.matchMedia() for Node ESM compat
global.window assignment doesn't expose 'window' as an identifier in ESM modules
in Node.js 22. matchMedia() is a global in browsers - no window. prefix needed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 13:06:18 +02:00
Ulas 205ff603d4 fix(test): mock window.matchMedia and document.createElementNS in modal-utils tests 2026-04-05 12:58:53 +02:00
Ulas a5ae0bac7e fix(ux): locale reload feedback, submit validation, dedup blur logic
- Locale-Picker: disable select + fade before location.reload() (system mode)
  gives visual feedback before the page jumps
- Extract _validateField() helper from wireBlurValidation to avoid duplication
- Add validateAll(formContainer): validates all required fields on demand,
  marks inline errors, focuses first invalid field
- tasks.js: call validateAll() at submit to catch untouched required fields
2026-04-05 12:33:57 +02:00
Ulas 44e5a879b9 fix(ux): replace native confirm() dialogs, add undo-toast, fix prefers-reduced-motion
- Replace all 13 native confirm() calls with confirmModal() across 7 page modules
- Add confirmModal() to modal.js (Promise-based, danger variant, focus management)
- Fix double-confirm bug in contacts.js and budget.js (modal + deleteContact/deleteEntry)
- Extend showToast() with onUndo callback and max-3-toast limit
- Implement optimistic undo-toast (4s window) for shopping item and bulk-checked delete
- Add prefers-reduced-motion guard to btnSuccess() and btnError() in modal.js
- Add btn--error-static CSS class as motion-reduced fallback for btnError()
- Add toast__undo button styles to layout.css
- Add common.confirm and common.undo i18n keys (de, en, it, sv)
- Add shopping.itemDeletedToast i18n key (de, en, it, sv)
2026-04-05 12:31:16 +02:00
Ulas 3a7d6d0e0a docs: update language references to include Italian and Swedish
README, SPEC.md, and BACKLOG.md now list all four supported locales:
German (de), English (en), Italian (it), Swedish (sv).
2026-04-05 12:03:58 +02:00
Ulas 3a6ae4a64a feat(i18n): add Swedish (sv) translation and Italian as explicit language option (#19)
Swedish translation contributed by @olsson82 (PR #19), integrated with
minor corrections (dayShortSunday: Sun → Sön, amountLabel aligned with
v0.11.2, new v0.11.2 currency keys added).

Italian was already supported server-side but is now explicitly listed
in the locale picker alongside German, English, and Swedish.
2026-04-05 12:01:16 +02:00
Ulas 446b9b1388 feat(budget): configurable currency in settings (#20)
Add household-wide currency preference for the budget section.
Users can select from 13 currencies (EUR, USD, GBP, SEK, NOK, DKK,
CHF, PLN, CZK, HUF, JPY, AUD, CAD) in Settings → Budget.

- preferences API (GET/PUT) now includes currency field
- budget page loads currency from preferences on render
- formatAmount() uses locale-aware Intl.NumberFormat with chosen currency
- settings page gains a Budget section with a currency select
- all three locales (de, en, it) updated with new i18n keys
2026-04-05 11:55:38 +02:00
Ulas 212a8bdb0a fix(dashboard): filter todayMeals by visible_meal_types preference (#14)
The dashboard meal widget was showing all meal types regardless of the
household meal visibility settings configured in Settings > Meal Plan.

Root cause: the todayMeals SQL query in dashboard.js did not read
visible_meal_types from sync_config. The Meals page applied this filter
client-side, but the dashboard API returned unfiltered data.

Fix: read visible_meal_types from sync_config before the query and inject
the active types as IN (?) placeholders. Falls back to all four types when
no preference is stored.
2026-04-05 03:12:01 +02:00
Ulas 0940afc170 chore(release): v0.11.0
Bump version and update CHANGELOG for release v0.11.0.
2026-04-05 03:09:06 +02:00
Ulas 3b9459cf10 fix(layout): fix touch scroll by using height instead of min-height on app-shell
min-height: 100dvh lets the shell grow unbounded, so app-content never
overflows and touch scroll has nothing to scroll. height: 100dvh constrains
the shell to exactly the viewport, making overflow-y: auto on app-content work.
2026-04-05 01:52:51 +02:00
Ulas 1dccba8d96 fix(ux): add inputmode and autocomplete attributes for mobile UX
- inputmode=decimal on budget amount input for correct decimal keyboard
- inputmode=numeric on rrule interval input for numeric keyboard
- autocomplete attributes on contacts form (name, tel, email, street-address)
2026-04-05 01:39:01 +02:00
Ulas 72515c5a69 fix(styles): resolve design system audit violations and touch scrolling
- Replace hardcoded px values with design tokens (--space-0h, --space-px,
  --space-1, --target-sm/md/lg) across layout, calendar, dashboard CSS
- Fix rgba(255,255,255,0.35) spinner border to use var(--color-glass-hover)
- Fix modal close icon from off-grid 18px to 16px
- Fix touch scrolling on mobile: add min-height: 0 and
  -webkit-overflow-scrolling: touch to .app-content
2026-04-05 01:23:38 +02:00