Commit Graph

562 Commits

Author SHA1 Message Date
Ulas Kalayci e5669fec24 docs: update SPEC, BACKLOG, and README for v0.20–v0.23 changes
- SPEC.md: add Recipes + Recipe Ingredients tables, recipe_id FK on Meals,
  External Calendars table, calendar_ref_id FK on Calendar Events, Recipes
  module section, recipe integration in Meals module, external calendar
  name/color badge and location display in Calendar module
- BACKLOG.md: add completed entries for ICS subscriptions, web/CLI installer,
  bootstrap setup endpoint, Recipes module, external calendar names/colors,
  event location, and Tasks/Dashboard improvements
- README.md: add Recipes to module list and Highlights section

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 08:02:52 +02:00
Ulas Kalayci eaf48eb5fb chore: release v0.23.4 2026-04-22 07:57:11 +02:00
ulsklyc 794df989be fix(weather): correct wind speed value and unit label for imperial units
fix(weather): correct wind speed value and unit label for imperial units
2026-04-22 07:42:48 +02:00
Ulas Kalayci a58e45683e chore: release v0.23.3 2026-04-22 07:40:47 +02:00
Ulas Kalayci e1ea0bdb7e fix(weather): show correct wind speed and unit for imperial units
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>
2026-04-22 07:39:13 +02:00
Ulas Kalayci 6a4ef09912 chore: release v0.23.2
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 07:34:23 +02:00
Ulas Kalayci 8d92b59c73 chore: release v0.23.1 2026-04-22 00:05:34 +02:00
Ulas Kalayci a4ad10a872 fix(installer): validate host/port input before use in DOM
Prevents unvalidated user input from reaching DOM sinks (href, template
literals). Host is checked against a strict hostname regex; port is
parsed as an integer and range-checked to 1-65535. An inline error
message is shown on validation failure.

Resolves CodeQL js/xss-through-dom alert #7.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 00:05:08 +02:00
Ulas Kalayci cad779ffa4 chore: release v0.23.0 2026-04-21 23:40:09 +02:00
Ulas Kalayci 7b04d5a48a fix: resolve design token violations and locale bug
- 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>
2026-04-21 23:38:56 +02:00
Konrad M. d9be970e9d chore: remove optional encoding/iconv-lite peer deps from package-lock.json 2026-04-21 22:18:14 +02:00
Konrad M. 04b22cb466 chore(sw): bump cache to oikos-shell-v50 / oikos-pages-v45 / oikos-assets-v45 2026-04-21 22:18:14 +02:00
Konrad M. bc8acea12a fix(i18n): add task due-date locale keys for all 16 supported languages
Adds overdue, dueSoon, dueToday, dueTomorrow, and noDueDate keys to
the tasks section of every locale file used by formatDueDate().
2026-04-21 22:18:14 +02:00
Konrad M. 9f092ff633 fix(dashboard): FAB shortcut opens add modal directly on target page
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.
2026-04-21 22:18:14 +02:00
Konrad M. f3a576a072 fix(dashboard): open task quick-action modal on task click
Tasks in the urgent-tasks widget now open a small modal with Edit and
Done actions instead of navigating directly to /tasks?open=<id>.
2026-04-21 22:18:14 +02:00
Konrad M. eede4a9708 fix(dashboard): flatten header; replace greeting with date+time; split overdue/soon chips
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.
2026-04-21 22:18:14 +02:00
Konrad M. 8f36c359aa fix(dashboard): fix widget nav button on iOS; lift header above backdrop-filter
widgetHeader replaces <a href> with <button type="button"> so iOS Safari
does not intercept the touch event before the JS click handler fires.
widget__header gets position: relative; z-index: 2 to appear above the
backdrop-filter ::after pseudo-element stacking context.
2026-04-21 22:18:14 +02:00
Konrad M. c6c02f0f30 fix(dashboard): show external calendar name and location in upcoming events
Imports fmtLocation; renderUpcomingEvents adds event-item__cal span for
cal_name and shows location with normalized ICS escapes via fmtLocation().
Event color dot gets filter: saturate(0.4) to match calendar view style.
2026-04-21 22:18:14 +02:00
Konrad M. e729bc9c4e fix(layout): refactor page transition animations; expand sidebar at 1440px
Page-in animations drop 'forwards' fill mode — a .page-transition base class
(opacity:0) serves as the initial state, and .page-transition--in-{left,right}
force opacity:1 after the animation ends, preventing a flash-back-to-invisible
on some WebKit versions. Sidebar expands at 1440px instead of 1280px.
Glass desktop toolbar loses the rounded card border in favour of a flat
accent-top-border + bottom border consistent with other module headers.
2026-04-21 22:18:14 +02:00
Konrad M. 68645d2483 fix(layout): prevent horizontal overflow in modals, sheets, and input fields
Modal overlay gets overflow: hidden; sheet scroll container gets overflow-x: hidden
to stop content bleed on narrow viewports. Inputs get min-width: 0 and
box-sizing: border-box so they cannot overflow two-column grid containers.
2026-04-21 22:18:14 +02:00
Konrad M. 28e2ca6b01 fix(pwa): fix bottom nav safe-area padding causing extra gap on iOS
pwa.css safe-area padding-bottom rule and body::after fill-overlay commented out.
glass.css nav-bottom uses margin-bottom: 0 instead; --hidden state uses
translateY(100%) + negative margin so the bar disappears without leaving a gap.
layout.css removes redundant padding-bottom from .nav-bottom rule.
2026-04-21 22:18:14 +02:00
Konrad M. 25d2b42ba3 fix(router): auto-reload page 8 s after SW update toast is shown 2026-04-21 22:18:14 +02:00
Konrad M. 879485c588 feat(ui): add module accent top border to shopping and budget page headers
Adds border-top: 3px solid var(--module-accent) to .list-tabs-bar
and .budget-nav, matching the visual style of other module toolbars.
2026-04-21 22:18:14 +02:00
Konrad M. ab35d6fb93 fix(reminders): use minmax grid columns to prevent field overflow 2026-04-21 22:18:14 +02:00
Konrad M. 88a1a78743 fix(tasks): reorder toolbar buttons; wrap list in tasks-body; remove flex-wrap on mobile
group-mode toggle moved before view toggle in markup order.
Filter panel, task list, and FAB wrapped in .tasks-body for scroll containment.
tasks-toolbar flex-wrap removed — actions stay on one line on narrow screens.
2026-04-21 22:18:14 +02:00
Konrad M. e703bc8acf fix(tasks): default filter to open tasks on first load 2026-04-21 22:18:14 +02:00
Konrad M. 583d2543fb fix(tasks): overdue always first; sort by due date, priority as tiebreaker
effectiveDue() and sortTasks() added — same logic on client (tasks.js)
and server (dashboard.js urgentTasks moved from SQL to JS sort).
Applies in list-group, Kanban, and dashboard widget views.
SQLite DATE('now') replaced with new Date() for timezone-safe due_time.
2026-04-21 22:18:14 +02:00
Konrad M. 030bf30b14 fix(tasks): show due time on task cards; use current moment for overdue state
formatDueDate now accepts due_time; displays it on today/tomorrow entries.
Overdue state is computed against the current moment, not midnight, so a
task due at 09:00 is correctly marked overdue once that time has passed.
2026-04-21 22:18:14 +02:00
Konrad M. bf1df5d8e0 fix(calendar): constrain allday-cell width; change agenda event indicator to full-height bar
allday-cell gets min-width: 0; overflow: hidden so long event titles
no longer stretch week-view column widths beyond their grid allocation.
Agenda event color dot replaced by a 3px full-height left bar matching
the dashboard upcoming-events style (align-items: stretch on parent).
2026-04-21 22:18:14 +02:00
Konrad M. 123b85d08d fix(calendar): show external calendar name and location; remove color fallback
Event popup, agenda, month, week, and day views now show the external
calendar name as an event-cal-label badge. Event popup and dashboard
event list display the location via fmtLocation(). Incorrect
|| 'var(--color-accent)' fallback removed from all five rendering sites.
2026-04-21 22:18:14 +02:00
Konrad M. 209b75f408 feat(utils): add fmtLocation to normalize ICS LOCATION strings for display
Strips RFC 5545 backslash-escapes (\n, \,, \;, \\) and collapses
semicolons and newlines into comma-separated inline text.
2026-04-21 22:18:14 +02:00
Konrad M. 69c72f3abd feat(calendar): track external calendar name and color through Google/Apple sync
Google and Apple sync services now fetch calendar metadata and persist it via
upsertExternalCalendar(). The /calendar and /upcoming endpoints JOIN on
external_calendars to return cal_name and cal_color with every event.
2026-04-21 22:18:14 +02:00
Konrad M. 6cae070061 feat(db): add external_calendars table and link to calendar events (migration v14)
Stores display name and color per synced Google/Apple calendar.
calendar_events gains a calendar_ref_id FK for join-based name/color lookup.
2026-04-21 22:18:14 +02:00
Konrad M. d3710c5276 docs(changelog): add Unreleased section and sync upstream entries up to v0.22.2 2026-04-21 22:18:14 +02:00
Konrad M. 1e438af5a7 fix(modal): fix sheet swipe tap-cancel and modal close race condition on iOS
Sheet swipe: add 10 px dead zone before transform, reset via rAF in touchend
so iOS WebKit does not cancel subsequent click events on child buttons.

Modal close: capture active overlay before animation to prevent race where
_doClose() removes the new modal instead of the old one when a confirm dialog
opens immediately after another modal closes (delete button not responding).
2026-04-21 22:17:28 +02:00
Ulas Kalayci 6416bbf245 chore(release): v0.22.3
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 20:23:59 +02:00
ulsklyc 4bc43b2141 Merge pull request #76 from baragoon/dev
fix(docs): update setup commands formatting for better readability
2026-04-21 20:22:48 +02:00
Serhiy Bobrov e8e4a63898 fix(docs): update setup commands formatting for better readability 2026-04-21 19:20:47 +03:00
Ulas Kalayci 9f321851f8 chore: release v0.22.2
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 17:23:30 +02:00
Ulas Kalayci 40252ee0dc fix(sw): bump cache versions, add recipes to pre-cache, guard init IIFE
Resolves #72

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 15:41:46 +02:00
Ulas Kalayci a253f0a7fa chore: release v0.22.0
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 14:23:53 +02:00
Serhiy Bobrov 0b54fe255b feat: add recipes module with CRUD functionality and integrate with meals
- Implemented new recipes page with UI for managing recipes.
- Added REST API routes for recipes including create, read, update, and delete operations.
- Introduced database schema for recipes and recipe ingredients.
- Updated meals to link with recipes, allowing meals to reference specific recipes.
- Enhanced validation for recipe-related fields in meals.
- Added styles for the recipes page and components.
2026-04-21 14:15:39 +02:00
Ulas Kalayci 41467a84b6 chore: release v0.21.1
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 14:03:33 +02:00
Ulas Kalayci b40f47bc8b chore: release v0.21.0
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-21 13:24:38 +02:00
Ulas Kalayci 196e8a7d17 chore: add installer files to .dockerignore and update docs
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-21 13:23:51 +02:00
Ulas Kalayci 7795a737c5 feat(installer): add web-based installer server and UI
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-21 13:23:06 +02:00
Ulas Kalayci 1ef4783902 feat(installer): add CLI install script
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-21 13:13:46 +02:00
Ulas Kalayci 7b663e08d4 chore: release v0.20.43
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-21 13:10:47 +02:00
Ulas Kalayci e4b97368fb feat(api): add first-run setup endpoint for admin bootstrap
POST /api/v1/auth/setup — unauthenticated, only succeeds when the
users table is empty. Enables first-admin creation via HTTP for
Docker deployments without shell access to the container volume.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-21 13:10:41 +02:00
Ulas Kalayci 143582458e docs(installer): add reconnaissance findings and implementation plan 2026-04-21 12:49:45 +02:00