diff --git a/CHANGELOG.md b/CHANGELOG.md index 07d8ce5..313ef35 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.26.3] - 2026-04-27 + +### Fixed +- Birthdays: "Discard changes?" dialog appeared immediately after successfully saving a birthday because `closeModal()` was called without `force: true`, triggering the dirty-form check on a programmatic close +- Dashboard (PWA): widget items (tasks, events, meals, notes, birthdays, shopping lists) occasionally blocked vertical swipe-to-scroll; added `touch-action: pan-y` so the browser passes vertical pan gestures through to the scroll container + ## [0.26.2] - 2026-04-27 ### Fixed diff --git a/package-lock.json b/package-lock.json index fc2af28..303df73 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "oikos", - "version": "0.26.2", + "version": "0.26.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "oikos", - "version": "0.26.2", + "version": "0.26.3", "license": "MIT", "dependencies": { "bcrypt": "^6.0.0", diff --git a/package.json b/package.json index a50279e..a269756 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "oikos", - "version": "0.26.2", + "version": "0.26.3", "description": "Self-hosted family planner - calendar, tasks, shopping, meal planning, budget and more. Private, open-source, no subscription.", "main": "server/index.js", "type": "module", diff --git a/public/pages/birthdays.js b/public/pages/birthdays.js index 7f20434..08f707f 100644 --- a/public/pages/birthdays.js +++ b/public/pages/birthdays.js @@ -366,7 +366,7 @@ function openBirthdayModal({ mode, birthday = null }) { renderUpcoming(); renderSuggestions(); renderList(); - closeModal(); + closeModal({ force: true }); } catch (err) { window.oikos?.showToast(err.message, 'danger'); saveBtn.disabled = false; diff --git a/public/styles/dashboard.css b/public/styles/dashboard.css index e65356f..93f1a15 100644 --- a/public/styles/dashboard.css +++ b/public/styles/dashboard.css @@ -427,6 +427,7 @@ padding: var(--space-2) 0; border-bottom: 1px solid var(--color-border-subtle); cursor: pointer; + touch-action: pan-y; transition: opacity var(--transition-fast); } @@ -507,6 +508,7 @@ padding: var(--space-2) 0; border-bottom: 1px solid var(--color-border-subtle); cursor: pointer; + touch-action: pan-y; transition: opacity var(--transition-fast); } @@ -594,6 +596,7 @@ padding: var(--space-2) var(--space-1); background-color: var(--color-surface); cursor: pointer; + touch-action: pan-y; transition: background-color var(--transition-fast); text-align: center; min-height: 72px; @@ -683,6 +686,7 @@ * -------------------------------------------------------- */ .shopping-widget-list { cursor: pointer; + touch-action: pan-y; transition: background-color var(--transition-fast); border-radius: var(--radius-sm); padding: var(--space-2) 0; @@ -794,6 +798,7 @@ border-radius: var(--radius-sm); padding: var(--space-3); cursor: pointer; + touch-action: pan-y; transition: opacity var(--transition-fast), transform var(--transition-fast); border-left: 3px solid var(--note-color, var(--color-accent)); background-color: color-mix(in srgb, var(--note-color, var(--color-accent)) 6%, var(--color-surface-2)); @@ -2262,6 +2267,7 @@ border: 1px solid color-mix(in srgb, var(--color-border) 72%, transparent); background: var(--color-surface-2); cursor: pointer; + touch-action: pan-y; } .birthday-widget-item + .birthday-widget-item {