- Fix heading hierarchy: modal titles h3→h2 (RecurrenceModal, two WeeklyView dialogs),
SettingsSidebar h4→h3 for Localisation, Data Export, Backup & Restore sections
- Add keyboard resize handle: role=slider, tabIndex, aria-valuemin/max/now/text,
ArrowUp/Down keys to adjust task duration in 15-min increments
- Add aria-label to CalendarEventModal notes textarea fallback
- Color contrast: raise --weekly-text-light from #a6a6a7 (~2.4:1) to #767676 (~4.5:1)
on white background to meet WCAG AA
v1.86.0
When the active header display is 'current_day' (selected day) AND
viewDays === 1, the in-column weekday header duplicates the information
already shown in the top header bar. Added 'header-current-day-single'
class to the container under that condition, then CSS display:none on
.weekly-day-header. With multiple columns visible the header is shown
normally so each day column is still identifiable.
v1.81.9
1. cellDuration indicator: compare against local `cellDuration` state
(not effectiveCellDuration which reads stale profile.cellDuration
since saveSetting bails early for DEVICE_SETTINGS_KEYS)
2. viewDays on mobile now uses orientation instead of fixed width:
portrait (h > w) → 1 day, landscape → 3 days, for ≤768px.
Applied consistently in useEffect, early profile load, and cookie
override blocks so the responsive value is never overridden by
the saved DB preference on mobile.
3. list-view day header on mobile: changed from sticky to
position:relative so it flows with content and never covers tasks
4. time/day column scroll sync: weekly-days-grid was overflow-y:auto
on mobile, creating an independent scroll container that drifted
from the time column. Changed to overflow-y:visible so only
time-grid-wrapper scrolls. Added touch-action:pan-y to day columns
so iOS handles pan immediately without waiting for JS.
v1.81.7
- Added solid background to .list-view .weekly-day-header so tasks
don't bleed through the transparent sticky header while scrolling
- On mobile, offset sticky top by 48px + safe-area-inset to sit
below the mobile header bar instead of overlapping it
v1.81.6
The .time-grid-wrapper .weekly-day-header was set to position:sticky, causing
the day name (MITTWOCH 1. APR.) to appear as a ghost header while scrolling.
The correct sticky element on mobile is the existing day-bar overlay (DO 2.4.)
at the top. Reverted .weekly-day-header to position:relative.
v1.77.6
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
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
.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
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
- 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>
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>
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>
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>
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>
- 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>
- 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>
- 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>
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>
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>
- 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>
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
- 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>
- 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>
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>
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>
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>
- 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>
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>
- 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>
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>
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>
- 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>
- 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>
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
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>
- 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>
- 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>
- 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>
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>
- 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>
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
- 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
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>
- 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>
- 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>
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>