Commit Graph

224 Commits

Author SHA1 Message Date
4c1ef5019e fix: iOS scroll blocked by enforcement interval + missing touch-action on slots
Three root causes fixed:

1. Scroll enforcement interval (every 50ms for 2s) was the main blocker:
   The setInterval forced gridRef.scrollTop on every frame, making iOS think
   the page was always scrolling programmatically. User touches during those
   2 seconds were overridden. The header appeared 'stuck' because the view
   was frozen. Replaced with a single setTimeout scroll (300ms on first load,
   50ms on subsequent). Added history.scrollRestoration='manual' so Safari
   doesn't fight us with scroll position restoration.

2. touch-action: pan-y was only on .time-grid-wrapper — NOT inherited by CSS.
   Slot child elements had touch-action: auto (default), so iOS still waited
   for JS before committing scroll on day column touches. Added touch-action:
   pan-y directly to .time-slots-container (the actual touched element area).
   Time column labels have no JS handlers so iOS scrolled them freely — this
   explains why time column worked but day columns didn't.

3. align-items: start on .weekly-days-grid was wrong (added in last commit).
   Removed — CSS grid default stretch is correct.

v1.77.4
2026-03-29 16:14:53 +02:00
aef7c291b4 fix: iOS scroll + sticky day headers — remove React onTouchStart from slots
Root cause: React registers onTouchStart props as non-passive listeners at the
app root. iOS Safari sees any non-passive touchstart on an ancestor and blocks
the scroll gesture on those elements, waiting for JS to finish. This is why
the time column (no handlers) scrolled freely but day columns (slots had
onTouchStart) were frozen.

Changes:
- Removed onTouchStart prop from all time-slot divs — no more React touch
  handlers in the time grid, so iOS never blocks scroll
- Added data-slot-blocked attribute to occupied/protected slots
- Moved slot long-press logic into the permanent native touchstart listener
  on document (passive: true), reading slot/date from data attributes
- Added touch-action: pan-y on .time-grid-wrapper — explicitly tells iOS
  that vertical pan = scroll even if child content has touch handlers
- CSS: align-items: start on .weekly-days-grid so sticky headers in each
  day column have a proper scroll context
- Reinforced position:sticky on .time-grid-wrapper .weekly-day-header

v1.77.3
2026-03-29 15:58:18 +02:00
a3a55c9575 fix: day columns were blocking scroll on iOS — remove overflow-y from time-slots-container
.time-slots-container and .time-column-slots had overflow-y: auto which created
independent scroll contexts inside each day column, eating touch events and
preventing the parent time-grid-wrapper from scrolling.

v1.77.1
2026-03-29 15:25:21 +02:00
bf61733317 fix: eliminate iOS scroll bounce by using single scroll container for time grid
The time grid previously had two separate overflow-y:auto scroll containers
(the time-column labels + the day columns grid), synced via JS scrollTop
assignment. On iOS Safari, this caused severe desync and bounce effects:
momentum scroll continued after touch-end, and the programmatic scrollTop
correction fought against native momentum, making the grid stutter/bounce.

Changes:
- time-grid-wrapper is now the SINGLE overflow-y:auto scroll container
  (ref=gridRef, onScroll handler moved here from weekly-days-grid)
- time-column and weekly-days-grid have overflow:visible — they scroll
  with their parent wrapper without fighting each other
- Removed handleTimeColumnScroll, timeColumnRef, timeGridWrapperRef
  (all sync logic now redundant)
- jumpToHour and initial scroll position now set only gridRef.scrollTop
- CSS: weekly-days-grid overflow changed to visible
- CSS: re-enabled position:sticky on .weekly-day-header for mobile —
  sticky now works correctly since scroll container is an overflow-y parent
- CSS: hid time-column-header on mobile (saves vertical space)

v1.76.2
2026-03-29 11:32:47 +02:00
620118e6d5 feat: add cross-provider calendar sync tool
Users can now create sync rules to automatically sync events between
any two connected calendar providers (Google, Apple, Outlook, Synology).

- New Prisma models: CalendarSyncRule + CalendarSyncMapping
- Sync engine in src/lib/calendar-cross-sync.ts: fingerprint-based
  change detection, anti-loop protection, one-way and two-way support
- API routes: GET/POST rules, PATCH/DELETE rule by id, POST run
- CalendarSyncRulesPanel component with rule list, add/edit form,
  toggle enable/disable, Sync Now button with result summary
- New "Sync" tab in settings sidebar (between Connections and Account)
- Sync rules run automatically after each forced calendar cache refresh

v1.76.0
2026-03-29 10:58:07 +02:00
d8c30cdb1f fix: double event on recurring create + mobile sticky day bar
- Skip optimistic UI update for new recurring events (causes duplicate
  when force-sync fetches expanded instances with different IDs)
- Mobile sticky day bar: listen on gridRef scroll instead of window
  (time-grid scrolls inside weekly-days-grid, not window)
- Remove broken position:sticky from mobile day headers (CSS sticky
  doesn't work inside CSS grid scroll containers); use fixed overlay only
- Also propagate isRecurring flag in create response for Google/Outlook

v1.75.8

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-29 09:34:09 +02:00
de3b4a103e fix: show midnight hour label without shifting task positions
Remove translateY on first time-slot-label only (via :first-child) instead
of adding padding-top which broke task alignment. Reverts padding approach.

v1.75.6

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-26 11:16:08 +01:00
b126328536 fix: show midnight "0" hour label - was clipped above scroll area
The first time-slot label's translateY(-50%) pushed it above the container
top edge. Added padding-top to time-column-slots and time-slots-container,
and disabled the translate on the first label. Reverted 00→0.

v1.75.5

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-26 11:06:03 +01:00
245fed5f81 fix: match event font to task font (family, size, weight)
Calendar events now use --weekly-task-font, --weekly-task-size,
and --weekly-task-weight instead of separate event font variables,
so events and tasks always look consistent.

v1.74.5

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 12:57:34 +01:00
8926fe27c2 fix: restore sticky day headers on mobile in simple view
overflow-x: hidden on .simple-view .weekly-day-column was creating a
scrolling context that broke position: sticky on the day header.
Changed to overflow-x: clip which clips content without affecting sticky.

v1.73.2

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 02:57:11 +01:00
e1190a8fe6 fix: attach calendar color to created/updated events for cache + frontend
Events created or updated via the API were missing the calendar's
backgroundColor, causing them to render without their provider color.

v1.72.1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 02:10:11 +01:00
08959c6ddb feat: drag-to-create calendar events, fix rolling tasks, fix Outlook recurring
- Drag on empty time slots to create calendar events with pre-filled time range
- Rolling tasks now work per-task without requiring global autoRolling setting
- Add firstDayOfWeek to Outlook weekly recurrence patterns
- Add debug logging for Outlook recurrence creation

v1.72.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 01:56:16 +01:00
da2ebbedb5 feat: show location in events, fix HTML in notes, fix CalDAV TZID, reduce collapsed all-day space
- Strip HTML tags from descriptions before sending to CalDAV providers (Apple/Synology)
- Show event location underneath time in calendar event blocks (like Google Calendar)
- Fix German umlaut rendering by adding latin-ext font subset
- Fix CalDAV event updates losing TZID on DTSTART/DTEND (Apple Calendar recurring edit fix)
- Add error logging for CalDAV PUT responses
- Reduce wasted space when all-day events section is collapsed (24px max)
- Fix quotes with missing umlauts (ä, ö, ü, ß)

v1.71.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 22:14:21 +01:00
74a8c9a9a9 feat: recurring event edit confirmation (this event / all events)
When editing a recurring calendar event (via modal or drag/resize),
the user is now asked whether changes apply to just this instance or
all events in the series.

- Modal: Save button shows "This event" / "All events" options for
  recurring events
- Drag/resize: centered overlay prompt with same options + cancel
- API PATCH: editMode=all routes update to the series master ID
  (recurringEventId) instead of the instance ID
- Cancel on drag prompt reverts to original position

v1.69.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 12:41:21 +01:00
13bd90bd2a fix: cross-day drag-and-drop + persist showCalendarProviderIcon setting
- Cross-day drag now works: getEventsForSlot uses drag state's current
  start time to assign the dragged event to the correct day column
- Add showCalendarProviderIcon to Prisma schema, profile API GET/PATCH
  so the setting persists across sessions (was frontend-only before)
- DB migration applied via prisma db push

v1.68.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 12:30:42 +01:00
1e789d93ae feat: cross-day drag, note icon, Google recurring fix, no popup on drag
- Fix Google recurring events missing isRecurring flag (recurringEventId
  was not mapped from Google API response)
- Add note icon (FileText) on events with descriptions, tooltip on hover
- Cross-day drag-and-drop: detect day column under cursor and shift date
- Fix event detail popup opening after drag/resize by setting ref before
  async operations
- Add data-date attribute to day columns for drag target detection
- Use CSS class for icon row layout to prevent overlap

v1.67.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 12:03:33 +01:00
13de53fe0a feat: drag-to-move and resize handles for calendar events
Add resize handles (top/bottom) on hover to change event duration, and
drag-to-move support with live preview and 5-minute snapping. Includes
3px dead zone to distinguish clicks from drags, optimistic UI updates
with server rollback on failure, and recurring/provider icons on
time-grid events. Also fixes Google delete 410 Gone and Outlook delete
404/encodeURIComponent issues.

v1.66.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 11:35:01 +01:00
c040dd982d fix: remove CSS left/right overrides preventing side-by-side events
The base .time-slot-event and .simple-view .time-slot-event CSS had
left: 0 and right: 0 (with !important) which overrode the inline
overlap layout positioning. Removed so events can be placed side by
side when they overlap.

v1.65.1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 11:16:46 +01:00
fb7484c357 fix: CalDAV TZID parsing + recurring event icon on all providers
- Add icalTimeToUtcDate() helper to Apple/Synology parsers that
  correctly converts ICAL.Time with unresolved TZIDs to UTC dates
  (fixes +1h shift on Synology/Apple recurring events across DST)
- Add recurring icon (Repeat) to bottom-right of all calendar event
  blocks when event.isRecurring is true

v1.63.2

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 10:24:38 +01:00
57eeb3d8e8 feat: recurring event delete options (this/future/all instances)
When deleting a recurring calendar event, users now choose between
deleting just this instance, this and future instances, or all instances.
Supports Google, Apple (iCloud), and Synology CalDAV providers.

v1.62.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 22:06:23 +01:00
1011aef639 fix: recurring event DST time shift and block height overflow
- Use TZID-based local time (instead of UTC 'Z') for DTSTART/DTEND
  when creating recurring CalDAV events, preventing DST-related time
  shifts (e.g. 13:40 CET showing as 14:40 CEST after clock change)
- Send browser timezone from CalendarEventModal to server
- Guard against NaN event duration (missing/invalid endTime) which
  caused event blocks to stretch to end of day

v1.61.1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 21:23:24 +01:00
c5dc315f82 feat: sync calendar colors from all providers and add custom recurrence
- Store calendar colors (backgroundColor) from Apple and Synology
  during connection setup
- Auto-refresh missing colors for existing Apple/Synology connections
- Show color dots next to calendar names in settings
- Add "Custom..." recurrence option with interval (every N days/weeks/
  months/years) and day-of-week selection for weekly recurrence
- Generate proper RRULE with INTERVAL and BYDAY for all providers
- Generate proper Outlook Graph recurrence with custom intervals

v1.61.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 17:35:22 +01:00
1ab98025a6 feat: add Outlook calendar colors and recurrence end date/count
- Fetch and display Outlook calendar colors from Microsoft Graph API
  instead of hardcoded blue
- Add recurrence end options to calendar event modal: Never, On Date
  (UNTIL), or After X occurrences (COUNT)
- Pass recurrence end parameters through to RRULE generation for all
  providers (Google, Apple, Synology, Outlook)

v1.60.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 17:14:13 +01:00
3da2acadf1 fix: project picker dropdown stays visible and above other tasks
Add picker-open class when project picker is shown to keep task-actions
visible even when mouse leaves the task hover area. Elevate z-index on
picker-open tasks so the dropdown isn't obscured by adjacent tasks.

v1.57.15
2026-03-23 10:28:17 +01:00
8402adbd45 fix: always full-fetch Google Tasks for linked someday lists
The updatedMin optimization skipped tasks that were missed during
initial sync. Now does a full fetch when a someday list is linked,
ensuring all remote tasks are discovered.

v1.57.13

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 01:35:56 +01:00
a009a4953a fix: paginate task sync and unblock connections endpoint
- Google Tasks and Microsoft To-Do sync now paginate through all
  results instead of capping at 100 tasks per list.
- Synology calendar pruning in GET /connections is now fire-and-forget
  so a slow/unreachable NAS doesn't block the entire response.

v1.57.12

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 01:11:23 +01:00
9e7266053b fix: clean up someday lists and tasks when disconnecting a calendar provider
Unlink external references (externalId, externalProvider, externalListId)
from someday lists and tasks when their associated calendar connection
is deleted, so orphaned entries don't persist in the UI.

v1.57.8

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 00:21:16 +01:00
af46c0c21f chore: add debug logging for Synology calendar pruning
Log individual calendar names/URLs from server and stale calendar IDs
to diagnose why deleted calendars persist in stored list.

v1.57.5

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 23:54:08 +01:00
87d78d78b5 fix: handle deleted Google Tasks lists gracefully (404 cleanup)
When a Google Tasks list returns 404 during sync, soft-delete all local
tasks linked to it and unlink the synced someday list instead of spamming
error logs.

v1.57.3

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 23:02:16 +01:00
ba19482a41 fix: prune deleted Synology calendars from settings list
When loading calendar connections, the API now fetches the live calendar
list from Synology and removes entries that no longer exist on the server.

v1.57.2

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 22:48:06 +01:00
f4451bf011 style: compact day header spacing
Reduce day header padding and tighten line-height on date/weekday elements.

v1.57.1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 22:13:16 +01:00
ee4b540558 feat: add Notion provider integration + Apple Reminders deprecation note
- Notion OAuth integration: start/callback routes, calendar-events dispatch,
  CRUD operations (create/update/delete via Notion API)
- New notion-calendar.ts provider library with database discovery
- Onboarding wizard: expanded to 6 steps (header/tasks/display design),
  improved preview fidelity, universal dummy content, Notion in connect step
- Apple Calendar: label changed to "events only", added warning that
  Reminders are unsupported since iOS 13 (no CalDAV/API from Apple)
- Fixed 12h time format on now-line, wizard settings apply on completion

v1.57.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 21:02:25 +01:00
4ac73d3e03 feat: onboarding wizard for first-time users + UI fixes
- 6-step onboarding wizard (welcome, language, connect providers,
  view style, work hours, styling) for new signups
- Added hasCompletedOnboarding field to User schema
- Fixed subtask progress bar in GridTaskBlock (simple/calendar views)
- Fixed kanban drag-and-drop to someday area
- Fixed weather/provider icon overlap in time grid tasks
- Provider icon positioning: inline when weather on, top-right when off

v1.56.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 13:52:29 +01:00
1f90526b5b fix: improved subtask expand/collapse in calendar and kanban views
Kanban cards now have inline subtask expand/collapse with progress bar,
chevron toggle, and checkbox list. Calendar view subtask badge updated
to match with ChevronDown icon, highlight when expanded, and wider
progress bar. Consistent UX across both views.

v1.55.2

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 08:34:43 +01:00
22a193180b fix: kanban detail modal footer layout - delete left, OK/Cancel right
Move trash icon to lower-left corner, add OK and Cancel buttons
in the lower-right corner.

v1.55.1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 08:29:25 +01:00
ca7911c7ef feat: kanban card detail modal with full task editing
Click any kanban card to open a Trello-style detail modal with:
- Title editing
- Project assignment with dropdown
- Kanban stage selector
- Due date picker
- Someday list assignment
- Markdown notes editor
- Subtask management (add, toggle, edit, delete)
- Task deletion
Responsive design: slides up as bottom sheet on mobile.

v1.55.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 22:31:10 +01:00
bce86aeb9b feat: kanban task creation and Google Tasks API quota optimization
Add inline task creation in kanban view columns - creates tasks in a
"Kanban" someday list (or project-named list if filtered by project).
Optimize Google Tasks sync: use updatedMin to fetch only changed tasks,
increase sync interval to 5min, handle 429 quota errors gracefully.

v1.54.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 19:28:15 +01:00
876bd1047b feat: real-time sync across devices via Server-Sent Events
Adds SSE-based push notifications so changes made on one device
appear instantly on all other connected devices for the same user.

- SSE notification hub (src/lib/sse.ts) with per-user client tracking
- Stream endpoint (/api/events/stream) with 30s heartbeat
- Task and list API routes notify connected clients on mutations
- Client auto-connects with 5s reconnect on connection loss
- Existing 2-minute polling sync remains as fallback

v1.53.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 07:44:00 +01:00
234bb25c1e feat: configurable weather display data per view
Users can now pick which weather data to show per time slot: icon,
temperature, feels like, wind speed, gusts, rain probability,
precipitation, humidity, and UV index. API now fetches all data
from Open-Meteo. Also fixed slot height for 20min duration.

v1.52.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-19 22:44:04 +01:00
918d87cbbb fix: credentials login error and all-day resize bar position
- Fix NextAuth CredentialsProvider + PrismaAdapter conflict by stubbing
  adapter session methods (JWT strategy doesn't use DB sessions)
- Improve login error handling with redirect:false for real error messages
- Move all-day section resize bar to top when allDayPosition is "below"
- Fix resize drag direction for top-positioned all-day handle

v1.51.2

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-19 09:02:26 +01:00
2141332bb3 feat: fix per-view settings persistence and add recent weather cities
Per-view settings (cellDuration, showSomeday, etc.) now persist across
page reloads by using a ref to avoid stale closure bugs in saveViewSetting
and removing global state pollution from per-view onChange handlers.
Weather display fixed to use effectiveWeatherEnabled for fetch/render.
Added weatherRecentCities (max 8) as quick-switch pill buttons.
Kanban checkboxes now respect the showTaskCheckboxes per-view setting.

v1.51.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-19 08:32:48 +01:00
4757dc3cdb feat: per-view settings for hour format, sub-hours, weather, checkboxes
Add viewSettings JSON field to User model storing per-view overrides.
Settings like hour label format, sub-hour labels, weather, and task
checkboxes can now be set per view (simple/calendar/list/kanban) or
globally. A clickable badge next to each setting shows "All" (global)
or the current view name (per-view). Click to toggle scope.

Also fixes hourLabelFormat not actually being applied to time column
rendering (was hardcoded, now uses effective per-view value).

v1.49.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-18 01:09:36 +01:00
265eac6f89 feat: inline kanban stage editing, remove from settings sidebar
- Column headers are now editable: click the name to rename, click
  the color dot to change color, hover to reveal delete button
- "+" column at the end to add new stages
- Removed kanban stages section from settings sidebar

v1.48.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-18 00:44:56 +01:00
2ca9503944 fix: restore hour/sub-hour label styling in calendar view
The calendar-view time-slot-label override was clobbering the
hour-start font-weight and sub-hour font-size. Now properly
differentiates hour labels (bolder) from sub-hour labels (smaller,
lighter).

v1.47.5

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-18 00:41:01 +01:00
a51f085ee5 style: adjust calendar and simple view spacing per user tweaks
- Calendar: 4px column margin, margin-top:0 on hour-start slots
- Simple: restore hour-start border, add 10px horizontal column margins

v1.47.4

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-18 00:35:29 +01:00
1a9a2dd585 fix: restore time column in simple view and refine TeuxDeux styling
- Remove display:none on time column so it shows again
- Remove all time-slot grid lines for a cleaner look
- Remove vertical column borders (no right borders)
- Bold uppercase headers with subtle bottom border
- Cleaner task items with more padding

v1.47.3

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-18 00:20:48 +01:00
959efc725b fix: remove half-hour lines in calendar view for cleaner Google Calendar look
Only show horizontal grid lines at full hour boundaries, matching
the clean Google Calendar aesthetic from the reference screenshot.

v1.47.2

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-18 00:19:30 +01:00
43f05160c5 fix: merge kanban filter bar and project chips into single row
Put + icon (create project) on far left, followed by project drop
chips, then a spacer, then search/filters on the right — all in
one unified toolbar row.

v1.47.1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-18 00:16:02 +01:00
855760e39c feat: kanban drag fix, project targets, calendar/simple view polish
- Fix kanban drag: remove confusing card tilt, ensure dragOver always
  calls preventDefault so drops work reliably across all browsers
- Add project drop targets bar in kanban: drag tasks onto project chips
  to assign/unassign projects
- Add "Create Project" button to kanban filter bar
- Right-align kanban filter bar
- Use ProjectIcon (FontAwesome) in kanban cards instead of raw emoji
- Calendar view: Google Calendar-inspired styling (subtle grid lines,
  smaller time labels, cleaner borders)
- Simple view: TeuxDeux-inspired styling (uppercase headers, thick
  bottom border, flat borderless task items, minimal aesthetic)

v1.47.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-18 00:10:38 +01:00
c84fd4c60e feat: mobile UX polish — FA icons, weather fix, header swap, sticky fix
- Replace emoji project icons with FontAwesome solid icons (46 icons)
  with proper icon picker grid and legacy emoji fallback
- Fix weather temperature unreadable on mobile (white on white) by
  adding explicit dark/light color
- Fix weekday sticky header on mobile: correct top offset for
  time-grid scroll container, use overflow-x: clip to not break sticky
- Swap mobile header: quick settings (PanelLeftOpen) on left,
  burger menu (settings) on right, remove search icon (available
  in left sidebar)

v1.46.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 23:57:55 +01:00
183fd6ea48 feat: reorganize mobile UX — projects sidebar, left quick actions, sticky fix
- Create dedicated Projects sidebar (separate from settings) with full
  CRUD, emoji picker, and dark mode support
- Move all quick actions (nav, search, jump to date, calendar event,
  recurring tasks, goal, focus, dark mode, view/days/slot/hours,
  undo/redo/refresh) from right settings sidebar to left quick settings
- Remove projects tab from settings — all project management via sidebar
- Fix iPhone sticky headers: time-column-header no longer sticky on
  mobile, weekly-day-header remains sticky

v1.45.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 22:57:00 +01:00
36c4652f8e feat: add weather display, projects tab, iPhone today fix, stale calendar fix
- Add weather feature with Open-Meteo API: hourly temp/icon overlay on time slots,
  location search via geocoding, weather toggle in settings
- Move project management to dedicated settings tab with emoji icon picker
- Fix iPhone single-day view starting on yesterday instead of today
- Fix deleted Apple calendar events persisting until app reboot by
  scheduling a delayed re-fetch after stale background sync

v1.44.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 12:15:25 +01:00
a8be3361be fix: move themeColor from metadata to viewport export
Resolves Next.js deprecation warnings about unsupported metadata themeColor.

v1.43.1
2026-03-17 11:30:51 +01:00
7e343b29e4 feat: improve project management with emoji icons and better UI
- Add emoji icon picker for projects (40 icons to choose from)
- Redesign project list in settings with color left-border, icon display
- Show project icons on task cards, project picker, and kanban cards
- Add New Project button to desktop header, tablet overflow menu, and mobile FAB
- Remove duplicate unused /api/tasks/projects route

v1.43.0
2026-03-17 11:14:39 +01:00
0248cfbb6c feat: add responsive header with overflow menu for tablet
Desktop shows all action buttons inline. On tablet (≤1024px), secondary
actions collapse into a dropdown overflow menu with proper touch targets,
dark mode support, and fade-in animation.

v1.42.0
2026-03-17 10:55:52 +01:00
18da568b9f feat: transform mobile FAB into quick action menu
FAB now opens a fan menu with 4 options instead of directly adding tasks:
- Task: opens the existing bottom sheet for quick task entry
- Event: opens the calendar event modal
- Focus: enters focus mode
- Search: opens search modal

FAB rotates to X when menu is open, backdrop dismisses on tap.
Each menu item has a colored icon bubble with label.

v1.41.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 10:50:12 +01:00
2d386362ca style: redesign subtask and notes inline UI
- Subtasks: slide-in animation, left border accent, hover highlights,
  mini progress bar in indicator badge, scale effect on checkbox hover
- Notes: slide-in animation, cleaner toolbar with SVG icons instead of
  emoji, proper dark mode support, focus ring on editor, max-height cap
- Both use CSS variables for consistent theming

v1.40.1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 10:47:55 +01:00
85982f06a5 feat: fix iPhone Today button, add all settings to sidebar, fix layout
- Fix goToToday landing on yesterday in single-day view (skip startDayOffset)
- Add quick actions panel to settings sidebar for all screen sizes (not just mobile)
- Add view style switcher, visible hours, search, and new project to sidebar
- Change weekly-container to height:100vh for proper flex layout
- Someday/all-day sections use flex-shrink:0 for stable resize behavior
- Collapse uses height:30px!important to override inline styles

v1.40.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 10:41:12 +01:00
afa2695e0c fix: thin resize handles and fix resizing for both areas
- Use 1px border style instead of thick background bar
- Switch from maxHeight to height for proper resize control
- Fix overflow conflict in expanded someday CSS
- Both all-day and someday areas now properly resizable

v1.39.4

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 03:19:11 +01:00
806061bf47 fix: move someday resize handle to top border and improve visibility
Handle now appears above the someday section as a visible bar with
background color. Dragging up increases height (inverted for top handle).
Handle styling improved with hover/active states for better discoverability.

v1.39.3

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 02:49:27 +01:00
eebc8eb9b6 feat: drag-to-provider sync, recurring task editing, resizable areas, search improvements
- Sync tasks to external provider when dragged to a synced Someday list (Google/Outlook/Synology)
- Add Synology support to POST /api/tasks/sync endpoint
- Edit recurring task series (title, interval, unit, time) all at once via new API
- Make Someday and all-day areas vertically resizable with drag handles (height persisted in cookies)
- Include Someday tasks in search results with list name display
- Instant calendar event appearance after creation (improved optimistic update + immediate cache refresh)
- Fix project color not updating on tasks when project color changes
- Add database backup script for Supabase LXC

v1.39.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 00:50:42 +01:00
43169c0bfc feat: add mobile font scale setting
New setting in Settings > Styling that scales all fonts on mobile
devices (75% / 85% / 100% / 115% / 130%). Applies to day names,
dates, tasks, events, and the mobile header date. Also scales the
CW/date display in the mobile header via scaleRem().

New DB field: mobileFontScale (Float, default 1.0)

v1.38.0
2026-03-16 22:42:09 +01:00
2ad55fe1bd fix: restore sticky weekday headers on mobile
The global overflow-y:visible rule for time-grid-on was overriding
the mobile overflow-y:auto on .weekly-days-grid, which broke
position:sticky on day headers. Wrap desktop overflow rules in a
min-width media query and keep mobile scroll container intact.

v1.37.4
2026-03-16 22:35:37 +01:00
c28fa71e4d fix: settings sidebar text color on mobile and blue theme bar
- Use var(--weekly-bg) and var(--weekly-text) for sidebar background
  and text color so it matches the calendar in both light/dark mode
- Add explicit label color rules for settings sidebar
- Change manifest theme_color from blue (#0ea5e9) to white
- Add responsive themeColor meta tags for light/dark preference

v1.37.1
2026-03-16 21:59:34 +01:00
f9c7893341 feat: add push notifications for calendar event reminders
- Service worker + Web Push API for browser/mobile notifications
- PWA manifest with icons for home screen install (iOS 16.4+)
- Push subscription management (subscribe/unsubscribe API routes)
- Notification toggle in Settings > General
- Push scheduler script (cron) checks cached events and sends
  notifications at reminder times, with dedup tracking
- Test notification endpoint at /api/push/test
- Persists reminders in calendar event cache for scheduler access
- New DB models: PushSubscription, SentNotification
- New user field: notificationsEnabled

Setup: generate VAPID keys with `npx tsx scripts/generate-vapid-keys.ts`
and add to .env, then run scheduler via cron every minute.

v1.37.0
2026-03-16 21:38:15 +01:00
b9c05571be feat: add alerts, invitees, attachments, busy status, and visibility to calendar events
Support extended calendar event properties across all providers:
- Alerts/Reminders: VALARM for CalDAV, reminders API for Google, reminderMinutes for Outlook
- Invitees/Attendees: ATTENDEE for CalDAV, attendees API for Google/Outlook
- Attachments: ATTACH (URL-based) for CalDAV (Apple/Synology)
- Busy Status: TRANSP for CalDAV, transparency for Google, showAs for Outlook
- Visibility: CLASS for CalDAV, visibility for Google, sensitivity for Outlook

Updated CalendarEventModal with new UI fields including expandable
Invitees & Attachments section and reminder/status/visibility dropdowns.

v1.36.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 14:36:37 +01:00
c21fd0bd88 Fix WeeklyView TS errors and Time Grid alignment 2026-03-15 11:21:07 +01:00
376d0efdc2 fix: settings sidebar single-scroll on mobile
Switch sidebar from flex column layout to block on mobile so the
quick actions, tabs, and settings content all flow in one scrollable
container instead of the content being trapped in a tiny flex:1 area.

v1.35.3

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 10:02:42 +01:00
658042c8b3 fix: double date picker on mobile, sidebar scroll, 2-column grid
- Prevent desktop SimpleDatePicker from rendering on mobile (was
  showing two date pickers simultaneously)
- Add overflow-y: auto to settings sidebar at 768px breakpoint so
  the quick actions panel and content are scrollable on all mobile
- Add cols-2 CSS rules for weekly-days-grid and all-day-events-grid
  so the 2-day view spreads columns correctly

v1.35.2

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 09:57:36 +01:00
e663f82c26 feat: add 2-day view, scrollable mobile settings, fix someday on mobile
- Add 2-column option to view days selector (1,2,3,5,7)
- Make settings sidebar scrollable on mobile (overflow-y: auto)
- Fix someday section not visible on mobile by removing maxHeight
  constraint from time-grid-wrapper on mobile devices, allowing
  natural page scrolling to reach the someday area below

v1.35.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 09:48:40 +01:00
fff67cb4af fix: tighten date-weekday gap in above/below layout
Set flex gap to 0px for column layouts (above/below) so the date sits
closer to the weekday. Remove default margin-bottom from .weekly-day-date
CSS to prevent extra spacing.

v1.34.5

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 09:27:29 +01:00
e9a4a0b216 fix: date vertical alignment in day header
Remove default h3 margins from .weekly-day-name and clear margin-bottom
on .weekly-day-date when in horizontal (left/right) layout so that
flexbox alignItems (top/center/bottom) works correctly.

v1.34.1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 08:55:48 +01:00
d28a02c5b5 feat: optimize mobile UX with simplified header and quick actions
Replace crowded 7-element mobile header with clean 3-element layout:
hamburger menu (left), tappable date display (center), search (right).
All touch targets are 44px+ per Apple HIG.

Move navigation, quick actions, view controls, and utilities into a
new mobile quick actions panel at the top of the settings sidebar.
Add safe area insets for notch and home indicator on iOS devices.

v1.34.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 23:39:17 +01:00
892d729e53 fix: side-nav-right visibility and mobile text input color
Move right navigation arrows outside scrollable time-grid-wrapper so
they remain visible on hover. Add explicit -webkit-text-fill-color for
all inputs/textareas to fix invisible text on iOS Safari.

v1.33.6

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 19:56:22 +01:00
0f214040ff fix: scroll to startHour on load and fix time label visibility
- Add timeGridWrapperRef to scroll the correct container (wrapper has
  overflow-y: scroll, inner elements have overflow: visible)
- Scroll wrapper to startHour offset on load and when startHour changes
- Time labels use translateY(-0.4em) so first/last hours aren't clipped
  by the sticky header or container edge
- jumpToHour also targets the wrapper ref

v1.33.5

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 19:04:31 +01:00
ebfe911b81 fix: align time column header, calendar events, all-day events, and swap view icons
- Fix time-column-header height to dynamically match weekly-day-header
- Fix all-day events column alignment (width 50px → 55px to match time column)
- Fix calendar events overflowing weekday columns (remove negative left/right)
- Swap Simple/Calendar view icons in header switcher
- Uncomment headerCustomFormat in API select for instant toggle
- Add response error checking in updateTaskFields for kanban persistence
- Add font/view dependencies to header height ResizeObserver

v1.33.2

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 18:32:09 +01:00
a6acc64ab8 Optimize build process and fix dynamic route collection errors 2026-03-13 14:33:14 +01:00
b244755163 Fix build collector errors and bump to 1.31.3 2026-03-13 14:23:08 +01:00
9e32440f15 Merge branch 'dev' into main 2026-03-13 12:11:37 +01:00
2819068d4d Fix all-day event shifts and header UI overlap 2026-03-13 12:11:12 +01:00
329f082ecf feat: view switcher improvements, header month option, kanban date/time, mobile fixes
- Swap simple/calendar icons in header view switcher
- Add calendar view button to header view switcher
- Reorder header: view switcher first, then days, hours, slot duration
- Add header display setting: calendar week (KW) or month name
- Show kanban stage color border on GridTaskBlock (week/simple views)
- Show date, weekday, and time on kanban cards
- Remove task swipe gestures on mobile (use container swipe for day nav)
- Fix mobile landscape 3-day grid overflow
- Add headerDisplay to schema, API, and settings UI

v1.30.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 20:22:32 +01:00
8703239f0f feat: fix kanban drag persistence, add view switcher and kanban filters
Fix stale closure in updateTaskFields causing tasks to disappear after
dragging between kanban columns. Add view switcher icons (Week/List/Kanban)
in the header on hover. Add search bar and filter dropdowns (project,
someday list, week) to the kanban board. Include someday list tasks in
kanban view.

v1.29.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 13:12:55 +01:00
af2de09f6b feat: add Kanban board view with customizable stages
- New "Kanban" view style alongside Simple, Calendar, and List
- Drag tasks between columns to change their stage
- Customizable stages with colors in Settings > View Style
- Stage colors appear as left border indicators on tasks in weekly view
- Default stages: Backlog, To Do, In Progress, Review, Done
- Stages persist in database (User.kanbanStages as JSON)
- Task stage persists in database (Task.kanbanStage)
- Full i18n support (EN, DE, FR, ES, IT)
- Unassigned tasks shown in separate column

v1.28.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 09:15:11 +01:00
72eafbd63c fix: drag and drop lists onto tabs to assign them
Drag a someday list by its handle and drop it on a tab button to assign
it to that tab. Drop on "All" to unassign. Visual feedback with dashed
outline on hover during drag.

v1.27.1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 08:55:55 +01:00
8959aa7f5a feat: move someday controls to horizontal tab bar, remove label column
Replace the someday-label-column with a unified horizontal tab bar
containing: collapse chevron, "any day" label, new list icon (ListPlus),
new tab icon (FolderPlus), divider, then tab buttons. All icons have
tooltips. Inline input for creating new tabs directly in the bar.

v1.27.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 08:53:30 +01:00
f05a7c9035 fix: show list count badges on someday tab buttons
Display number of lists per tab in a circle badge next to the tab name.
"All" shows total count, each tab shows its filtered count.

v1.26.2

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 08:47:44 +01:00
b2a1981385 fix: tab persistence and move tabs to horizontal bar above someday grid
Fix tabs vanishing on reload by adding missing `tab` field in fetchTasks()
list mapping. Replace cramped vertical tabs in someday-label-column with
a readable horizontal tab bar above the someday grid, working in both
time-grid and non-time-grid modes. Double-click to rename, X to dissolve.

v1.26.1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 08:44:17 +01:00
b56bfdeb52 fix: tab persistence, dissolve tabs, and Synology CalDAV discovery fallback
- Fix someday tabs disappearing on reload (include tab field in fetch mapping)
- Add dissolve/delete tab feature with X button on hover (all 5 languages)
- Fix Synology calendar "cannot find homeUrl" by falling back to derived homeUrl
  when well-known CalDAV discovery fails

v1.25.2

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 21:51:22 +01:00
ff6ed1f949 fix: mobile someday tabs and inline new tab input
Show horizontal scrollable tab bar on mobile (≤768px) above someday
lists. Hide vertical tabs in label column on small screens.
Replace browser prompt for new tab name with inline input field.

v1.25.1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 21:38:38 +01:00
3016293cd9 feat: add someday list tabs and side navigation arrows
Add tab system for someday lists allowing categorization (e.g. Private,
Work, Family). Lists can be assigned to tabs via tag icon dropdown in
list headers. Tabs appear in the someday label column for filtering.
Double-click tab name to rename. Tabs persist in DB via new SomedayList.tab field.

Also add hover-overlay prev/next day/week navigation arrows on left and
right sides of the weekly grid, and fix first hour label clipping.

i18n: tab translations for EN, DE, FR, ES, IT.

v1.25.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 21:15:46 +01:00
627f4c0005 fix: hide reset token, add password confirmation field
Token is now read from URL silently. User enters password twice
with client-side match validation. Shows error for missing/invalid tokens.

v1.23.1
2026-03-10 16:43:27 +01:00
59cfcc7be4 feat: implement password reset flow with email
- API now handles two cases: send reset link (email only) and
  reset password (token + newPassword)
- Generates UUID token stored on user with 1-hour expiry
- Sends styled HTML email with reset link via SMTP
- Prevents email enumeration (always returns success)

v1.23.0
2026-03-10 16:11:30 +01:00
0b68d275d0 feat: multi-language quote selection with per-user language picker
Users can now choose which languages their motivational quotes appear in
via toggle buttons in Settings. Added 45 curated quotes in French, Spanish,
and Italian. Quote language preference is stored per-user in the database.

v1.22.0
2026-03-09 08:11:23 +01:00
9ac7198b24 feat: localization (FR/ES/IT), portal date picker, font matching, quote cleanup
- Add French, Spanish, and Italian translations for full UI localization
- Add Italian to language selector; show native language names
- Fix Jump to Date calendar: use React portal with fixed positioning
  to prevent clipping by overflow:hidden ancestors
- Fix font matching: time grid tasks inherit from task font settings
  when at default values (0.75rem/500), matching someday list fonts
- CSS fallback chain: time-slot-task vars fall through to task vars
- Remove broken recite.vercel.app default quote URL
- Add date-fns locales (fr, es, it) for SimpleDatePicker

v1.21.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 20:54:13 +01:00
4c18d37bec feat: account number display, weekly goals export/import, calendar event fixes
- Show Account Number in Settings > Account for user identification
- Add weekly goals to JSON export/import with upsert-based merge
- Fix calendar events not appearing instantly (await cache ops, prevent
  provider force-refresh from overwriting optimistic updates)
- Add Sign Out button in Settings > Account for mobile accessibility
- Fix dateVerticalAlign persistence in profile API
- Fix quote API error handling for non-JSON responses
- Add Synology to CalendarEvent source type union

v1.20.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 19:56:21 +01:00
9863f8e28e feat: weekday case setting, right-aligned icons, font matching, calendar fixes
- Add weekday case setting (Normal/Capitalize/Uppercase) with DB persistence
- Move provider icons to end of line (right-aligned with marginLeft: auto)
  in both GridTaskBlock and TaskItem
- Make time grid task font inherit from task font settings as fallback
  instead of separate hardcoded defaults (0.75rem/500 → task font values)
- Fix Jump to Date calendar: center-aligned dropdown, dark mode support
  via CSS variables, proper border and shadow styling
- Add weekdayCase to Prisma schema, profile API, and translations (EN/DE)

v1.19.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 13:23:22 +01:00
05dab0720b feat: provider icons in time grid, fix weekday names persistence, calendar z-index
- Add sync provider icons (Google, Microsoft, Apple, Synology) to
  GridTaskBlock so they show in weekday time slots
- Add weekdayFormat and customWeekdayNames fields to Prisma schema
  and profile API so custom weekday names persist across reloads
- Fix Jump to Date calendar z-index by elevating container when open
- Fix someday textarea font to inherit from CSS instead of hardcoded values

v1.18.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 13:09:37 +01:00
7f04750e4a fix: provider icons on all tasks, font size matching, day header z-index
- Show sync provider icons (Google, Microsoft, Apple, Synology) on both
  someday and weekday tasks with fallback detection from externalId
- Remove hardcoded fontSize from someday tasks so they inherit CSS variables
- Remove line-height override for someday task text
- Bump day header z-index to 20 to prevent task overlap when scrolling
- Always propagate externalProvider when dragging tasks between slots

v1.17.2
2026-03-08 12:50:51 +01:00
77daa6e30b chore: release v1.17.0 - Reorganized settings, added Localisation tab, and refined UI layout 2026-03-08 10:30:28 +01:00
2ec09fdcca feat: full Synology bidirectional sync and fix someday list delete button
- Add createSynologyTask: new tasks in synced lists push to Synology CalDAV
- Wire Synology create into POST /api/tasks when somedayList is synced
- Fix someday list title input using width:100% instead of flex:1, which
  pushed the delete button off-screen making lists undeletable
- Slightly improved provider icon styling

v1.16.1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 02:00:55 +01:00