CSS:
- Active tab no longer shows accent underline; instead border-bottom matches
the someday area bg (#f9f9f9 / #1a1a1b dark), creating a raised browser-tab
look where the active tab visually merges with the content below
- margin-bottom: -1px to cover the tab bar border-bottom on active tab
JSX:
- Double-click on any tab now opens TabVisualsPopover (edit tab)
- Pencil icon and dissolve-X button removed from tab wrappers
- TabVisualsPopover extended with: rename input, dissolve button
(dissolve removes the tab grouping; lists are kept)
- onRename and onDissolve props added to TabVisualsPopover
v1.107.3
Inactive: white bg, subtle border, rounded top corners (6px 6px 0 0)
Active: same white bg + 3px accent-colored bottom border
Tab bar: align-items flex-end + 1px border-bottom so tabs sit flush
v1.107.2
Tabs:
- Pill-shaped tabs (border-radius: 20px) with proper background on inactive
- Inactive tabs now use readable dark text (--weekly-text) instead of
barely-visible --weekly-text-light
- Active tab: accent color + white text + glow shadow (box-shadow)
- Count badges: larger, higher contrast, 700 font-weight
- Tab bar: taller padding (8px), thicker bottom border (2px)
Cards:
- Rounded corners (10px), border + subtle drop shadow
- Cards now 240px wide (was 300px) for better density
- Grid padding changed from padding-bottom only to full 12px padding
- List header has subtle tinted background + reduced height (48px)
- Title font tweaked to 0.85rem/700 (was 1.15rem/800) to match card size
- Add-task button padding aligned to card edges (12px horizontal)
- Removed p-2 Tailwind class that was double-padding the card
v1.107.0
Trim desktop header height (py-2 → py-1.5) and switch border to --line
token. Update .weekly-header CSS class to use --line. Add baseline
letter-spacing: -0.005em to body. No logic, structure, or API changes.
v1.105.1
Add --ink-*, --accent, --line, --bg, --paper, --tasks-bg, calendar-source
event palette, and all-day chip palette as CSS custom properties. Tokens
alias existing --weekly-* vars where a match exists so no existing styles
are affected. Also adds docs/design/ to .gitignore.
v1.105.0
Pull-sync now runs on visibilitychange + window focus (in addition to mount
and the slow 15-min safety-net interval), throttled to one call per 5s. The
moment the user returns to the tab the app reconciles, so an Outlook-side
checkbox/star/title change shows up within a second of refocusing the tab
instead of after a 15-minute wait.
To keep this cheap, the Microsoft Graph delta endpoint
(/me/todo/lists/{id}/tasks/delta) is used when we have a stored deltaToken
for a synced list — typically a few hundred bytes per call when nothing
changed. Tokens are persisted on SomedayList.syncDeltaToken (new column,
migration applied) and refreshed each call. On 410 Gone (token expired
>30 days) we fall back to a full fetch and prime a new chain. Delta also
brings remote deletions (@removed) so they propagate locally without
needing a full list scan.
v1.104.0
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The previous timestamp gate (`if (remoteUpdated <= localUpdated) continue`)
hid genuine remote-side changes because every prior no-op pull bumped
lastSyncedAt to "now", making it newer than the Outlook lastModifiedDateTime
of a subsequent star toggle. Now the pull does a per-field comparison and
only writes lastSyncedAt when at least one field actually changed. Same fix
applied to the Google Tasks pull branch for consistency.
Also run a pull-sync once on mount instead of waiting up to 15 min, so
remote-side changes show up immediately on next page load.
v1.103.2
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Outlook recurring delete: also delete the specific instance after the master
to clean up orphaned first occurrences.
- CachedCalendarEvent gains busyStatus column (migration applied) so showAs
changes from Outlook flow back into the weekly view.
- Outlook create/update now round-trip the full event (busyStatus, visibility,
attendees, reminders, recurrence link) via a shared response mapper.
- MS To-Do importance ('high' star) ⇄ local importance flag in pull-sync,
push-sync, initial import, and local-task POST/PATCH; dueDateTime ⇄
scheduledDate added to pull-sync.
- Local task PATCH now fires a best-effort push to Outlook/Google/Synology so
any field change keeps both sides aligned.
- AnyDay list delete dialog now offers Cancel / hide locally / delete on both
sides; new deleteMsTodoList + deleteGoogleTaskList helpers.
v1.103.0
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Wave-3 user feedback (points 1–3):
- Email templates: extract de/en/fr/es/it copy into emailTemplates.ts
and pick the user's language. Signup forwards navigator.language and
the API also respects Accept-Language; resend/reset reuse user.language.
- Verify link: the email button now points at the client page instead of
the API GET handler, so corporate inbox scanners (M365 Safe Links etc.)
can no longer pre-fetch and silently consume the one-shot token. The
client page requires a real click before calling PATCH /api/auth/
verify-email. The legacy GET handler now just redirects to the client
page so old in-flight emails keep working.
- Code expired UX: when users land via an expired-link redirect we no
longer leave them with a blank email field — the page exposes an email
input so the resend button has something to act on. The verify-email
redirect also forwards the email param.
Misc: tsconfig migrated to moduleResolution=bundler and dropped
downlevelIteration to clear the TS 7.0 deprecation errors.
v1.101.0
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Wave-1 user feedback (points 7–10):
- Settings: new Projects tab with full CRUD (name, color, icon picker)
- Priority Icons render in simple/calendar/list views with style-specific
visuals (Eisenhower icons, ABCDE letters, Ivy Lee 1–6, Pareto star).
Toggle + style selector in Settings; Ivy Lee ranks now persist to
task.priority so cross-view badges stay consistent.
- Someday Lists gain optional icon (left of title) and color (left
border tint), edited via a pencil-popup with IconPicker + color picker.
- Tabs gain optional icon and color, stored in user.viewSettings JSON
and edited via the same popup pattern.
Schema: SomedayList.color/icon, User.showPriorityIcons/priorityStyle.
v1.99.0
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- tsconfig: remove deprecated downlevelIteration (es2017 has native iterators),
change moduleResolution from node to bundler
- auth: set allowDangerousEmailAccountLinking=false on all OAuth providers,
restrict debug mode to development only
- prisma: replace new PrismaClient() with singleton import in 10 API routes
to prevent connection pool exhaustion
- goal API: validate user-supplied quote URLs to block SSRF (private IPs,
non-http(s) schemes)
- email: guard DEV verification/reset link console.logs behind NODE_ENV check
v1.98.0
Apple Calendar encodes calendar icons as =h=g / =i=g escape sequences in
iCalendar SUMMARY fields during CalDAV sync. Helvetica cannot render the
underlying glyphs, causing the raw escape bytes to appear verbatim in the
PDF. Add pdfTitle() helper that strips these patterns along with emoji
and Apple private-use area characters before rendering any title text.
The calendar color chip/dot already provides the visual calendar identity.
v1.97.3
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add page header per PDF page: KW + date range (headline font/accent
color) + motivational quote (right-aligned italic, from local quotes)
- Move all-day strip above weekday/date header to match webapp layout
- Increase font sizes across the board (task titles 7.5pt, time labels
7.5pt, day date 8pt) to better match the web view
- Remove time prefix from task rows (hour-row label already provides
context); completed tasks get strikethrough styling
- Calendar event chips in all-day strip now use solid calendar color +
white text + small dot indicator (replaces 📅 emoji, which Helvetica
cannot render in PDFs)
- Fix multi-day all-day events: expand CachedCalendarEvents across every
day they span (iCal endDate is exclusive); deduplicate by title to
prevent double-rendering when the same event exists in both Task and
CachedCalendarEvent tables
- Someday page is now landscape (matches main week pages)
- Print modal: fetch available someday tabs on open; show pill-checkbox
filter below "Aufgaben ohne Uhrzeit" toggle when multiple tabs exist;
selected tabs are passed to the export route as noTimeTabs param
- New API endpoint GET /api/user/someday-tabs for fetching tab list
- Export route filters someday lists by noTimeTabs when provided
v1.97.2
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Layout — switched from absolute-positioned calendar grid to agenda/list:
- Each day column divided into equal-height hour rows (flex: 1)
- Tasks listed as text rows within their hour slot (time + title inline)
- No absolute positioning, no background stripes, no floating blocks
- External calendar events: light tinted row with left border + bold title
- User tasks with project: left border in project color
- User tasks without project: plain text, no border
- Time column updated to flex rows, stays aligned with day column rows
Weather — switched to hourly API data (temperature_2m + weather_code):
- Small colored circle + temperature shown in top-right of each hour row
- Color encodes condition: amber=clear, gray=cloudy, blue=rain,
pale-blue=snow, purple=thunderstorm
- Removed WMO text dictionaries (no more written-out condition text)
v1.96.3
- Fix weather toggle disabled when lat/lon set but weatherEnabled=false:
now enabled whenever a weather location is configured
- Default task duration: no-endTime tasks default to 30min (not 60min)
- Tasks without a project: remove left border entirely — only project-
assigned tasks show a colored left border; this matches the user's
explicit request that only calendar events have background/indicators
- Header order: show date first (top), then weekday name below — matches
webapp "above" date layout setting
- Lighten grid lines (#ececec) and stripes (#fafafa/#f0f7ff) to reduce
the heavy calendar-grid appearance; remove half-hour separator lines
- Lighten outer grid border and time-column border/bg to match
v1.96.1
- Query CachedCalendarEvent table for all-day and timed external calendar
events (Google/MS/Apple), so GANZ-TAG strip now shows actual events
- Regular user tasks: remove white background — transparent with left
border only, matching the webapp's simple view style
- All-day strip: calendar events show light tinted chip, user tasks show
left-border text only (no fill background)
- Add 'Im Browser drucken / Print in Browser' button to the print modal
(opens PDF inline in new tab so browser print dialog can be triggered)
- Fix Content-Disposition to 'inline' when ?inline=1 param is passed
- Update modal preview to show left-border task style (not solid blocks)
v1.96.0
Per webapp behavior: regular user tasks render as white background with a
thin colored left border (clean/minimal); external calendar events
(externalProvider != null) get a light tinted background box. Completed
tasks use a subtle gray style. The all-day strip keeps solid bars for all
entries (matching the webapp's ALL DAY section).
v1.95.5
- Fix all-day events: remove externalProvider distinction — ALL tasks with
scheduledDate but no startTime belong in the GANZ-TAG strip regardless of
source; was incorrectly routing them to a separate noTime strip that didn't
show external-provider=null events
- Remove noTime calendar strip: it was a wrong concept; tasks outside the
time window are simply not shown; someday page handles unscheduled tasks
- Solid task blocks: revert from light+border back to solid fill (matching
the webapp); use contrastColor() helper to pick white or dark text
automatically based on background luminance
- All-day strip also uses solid blocks (same style as webapp's ALL DAY bars)
- Someday page: group lists by their tab with a tab header row; query now
sorts by [tab, order]; lists without a tab get a General/Allgemein header
- Show up to 5 all-day tasks per column (was 4)
v1.95.4
- Always use full weekday names (MONTAG, DIENSTAG…) at all column counts;
adaptive font size 8.5pt–16pt based on number of columns
- Fix Oswald detection: Font.getRegisteredFontFamilies() doesn't exist in
react-pdf — now use module-level _oswaldRegistered flag set on successful
Font.register() call, so Oswald actually gets applied
- Fix headline fallback: Helvetica-Bold (not plain Helvetica) when no Oswald
- Increase strip heights: ALL_DAY_H 38→40, NO_TIME_H 28→52, DAY_HDR_H 40→44
- Show 4 tasks in both all-day and anyday strips (was 2/3)
- Add someday page: last page (portrait) with all SomedayList tasks grouped
by list, shown when showNoTime is enabled
v1.95.3
- Separate all-day (external calendar events) from anyday (user tasks
without time) using externalProvider field; each gets its own strip
- Increase ALL_DAY_H from 22→38px and add NO_TIME_H=28px so both rows
are actually visible
- Task blocks switch from solid fill to light-tinted background + colored
left border (Google Calendar style) — much easier to read in print
- Use user's taskColor setting as fallback instead of hardcoded indigo
- Show up to 3 items in all-day strip, 2 in anyday strip with overflow count
- GRID_H now accounts for both optional strips in height calculation
v1.95.2
The PDF was showing all day headers in the same weekdayColor. The webapp
uses three separate color settings: weekdayColor (Mon–Fri), weekendColorSat,
and weekendColorSun. Fetch both weekend colors from DB and apply via
dayColor() helper based on d.getDay().
v1.95.1
Adds a print/export modal (WeekPrintModal) accessible via a Printer icon
in the header toolbar. Users can configure date range, time window (startHour–endHour),
number of days, and toggle all-day, no-time, and weather sections. A live
CSS-grid preview updates as settings change. The PDF is generated server-side
via @react-pdf/renderer on the /api/user/export-week-view route:
- Landscape A4 with absolute-positioned time-spanning task blocks
- Day headers use the user's weekdayColor/dateColor/headlineFontWeight from DB
- Oswald font loaded dynamically from Google Fonts (falls back to Helvetica-Bold)
- Timezone-aware task grouping (±1 day query buffer + local date key)
- Optional weather line (Open-Meteo) and all-day strip
- Footer with date range, username, and page numbers
v1.95.0
Added @react-pdf/renderer for server-side PDF generation.
PDF report (/api/user/export-pdf):
- Indigo cover band: title, user name, period, export date
- Summary cards: total tasks / calendar weeks / projects
- Per-week sections with indigo header bar showing week label + count
- Goal of the week banner (blue left-border callout) when set
- Task table: priority-color dot, title, then selected columns
- Alternating row shading, column headers in grey
- Page numbers in footer
- A4, respects same field selection as CSV
CSV report updated:
- Added 'Goal of the week' as a section marker row (italic prefix)
- weekGoal field is default-on alongside week grouping
Both exports:
- New 'weekGoal' field in EXPORT_FIELDS (default on): shows the weekly
goal text only when the user has customised it (skips default placeholder)
- Language-aware (de/en) labels and date formats
Settings UI:
- Two download buttons: CSV (plain) + PDF (indigo, prominent)
- weekGoal checkbox in field picker grid
v1.93.0
Users can now choose exactly which columns appear in the CSV:
- Title (always included)
- Calendar week grouping header
- Completed date, Scheduled date, Created date
- Project, List
- Priority (Eisenhower label or ABCDE grade)
- Link / URL
- Notes, Description
- Delegated to, Delegation note
- Start time, Kanban stage
UI additions in Settings > Data Export:
- 2-column checkbox grid with Select All / Default reset buttons
- Quick date presets: This week / This month / Last month / This year
- Download button shows the active column count
Default-on fields: week, completed date, scheduled date,
project, list, priority. All others opt-in.
API: fields passed as comma-separated ?fields= param; falls back to
defaults when omitted. Column headers are language-aware (de/en).
v1.92.0
Priority View: filter panel (project / list / timespan) is now always
visible in the right column of every priority mode — Eisenhower,
ABCDE, Ivy Lee, and 80/20. Removed the collapse toggle. An 'active'
indicator in the header shows when any filter is set. On mobile the
filter appears above the main content.
Work Report CSV (Settings > Data Export):
- Columns: Week / Completed / Scheduled / Created / Task / Project /
List / Priority / Delegated to / Notes
- Rows grouped by calendar week (ISO week, most recent first), with a
section header row showing "KW 14 — 2026 (30 Mär – 05 Apr)"
- Priority shows Eisenhower label (Sofort erledigen / Planen /
Delegieren / Eliminieren) or ABCDE grade
- Includes project name, Someday list name, delegation info and notes
- UTF-8 BOM prepended so Excel opens German umlauts correctly
- Language-aware column headers (de/en) via ?lang= param
- Filename: arbeitsbericht_YYYY-MM-DD_bis_YYYY-MM-DD_date.csv
v1.91.0
Disconnecting a synced list (Google/Outlook/Synology) now uses a
soft-disconnect: tasks are soft-deleted and the external link is
cleared, but the SomedayList record is kept with its tab assignment
intact. When the user reconnects, the import route finds the list by
title, re-links the external provider, and restores tasks (clearing
deletedAt). Tabs survive the full disconnect/reconnect cycle without
the user needing to drag lists back to tabs.
Also clears deletedAt on task re-import so previously disconnected
tasks become visible again on reconnect.
v1.89.0
- Export now includes kanbanStage, url, urgency, importance, priority,
delegatedTo, delegationNote, recurrenceDays so backups are complete
- Import now handles those same fields (round-trip fidelity)
- Error handler returns the actual error message instead of the generic
"Import failed. Please check the file format." — makes failures diagnosable
- Guard against empty task title with fallback '(untitled)'
v1.87.2
New "Priority View" (Target icon in toolbar) fusing four prioritization
frameworks into a single, filterable view:
- Eisenhower Matrix: 4 quadrants (Do/Schedule/Delegate/Delete) based on
urgency × importance; unclassified tasks shown below for quick assignment
- ABCDE Method: five collapsible groups (A=Critical → E=Eliminate) with
inline grade assignment buttons
- Ivy Lee Method: pick exactly 6 tasks for tomorrow, ordered by priority
- Pareto 80/20: highlights the important 20% of tasks with a progress bar
and one-click "mark as important" for the rest
New DB fields: urgency (Boolean), importance (Boolean), priority (A–E),
delegatedTo, delegationNote — all persisted via Prisma + API.
Filters: by project, someday list (incl. scheduled / unscheduled), and
timespan (today / this week / next week / all).
Delegation modal: assign to a named person or to AI with optional
instruction notes; displayed as inline badge on task cards.
v1.87.0
- 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
- Add zitat-service.de as built-in multilingual fallback in goal API:
tries the user's preferred language (de/en/es) automatically before
falling back to ZenQuotes (EN) and then local curated quotes
- Parser now also handles {quote, authorName} response format from
zitat-service.de alongside all previously supported formats
- Preset source pills in settings: add Zitat-Service (DE), (EN), (ES)
(supports de, en, es — no fr/it available from that API)
- Remove Forismatic from presets (unreliable, often returns empty)
- Update hint text to reflect DE/EN/ES API availability vs FR/IT local
v1.84.1
Goal API (route.ts):
- Now actually uses profile.quoteSourceUrls — tries each user-configured URL
in order before falling back to ZenQuotes
- Universal JSON parser handles ZenQuotes [{q,a}], Quotable {content,author},
Forismatic {quoteText,quoteAuthor}, generic {text/quote/body, author/by},
nested {data:{...}}, and advice-slip {slip:{advice}} formats
- ZenQuotes remains the built-in EN fallback when no user URLs are configured
SettingsSidebar:
- Adds clickable preset-source pill buttons below the "Add source" button:
ZenQuotes, Stoic Quotes, Quotable, Forismatic (EN), Advice Slip
- Pills show ✓ and are disabled when the URL is already in the list
- Note explains DE/FR/IT/ES are served from the curated local collection
quotes.ts:
- Updated PRESET_QUOTE_SOURCES to match the 5 working English APIs
- +14 French quotes (Marcus Aurelius, Lombardi, Ali, MLK, Picasso, etc.)
- +13 Spanish quotes (Collier, Eliot, Darwin, Voltaire, Ashe, etc.)
- +13 Italian quotes (Collier, Eliot, Ali, MLK, Aurelius, da Vinci, etc.)
v1.84.0
- Fix onNotes prop in all three TaskItem render sites: was calling
setSelectedTaskForNotes (ignoring HTML), now correctly calls
updateTaskNotes so inline RichTextEditor saves on every change
- NotesSidebar: replace plain markdown textarea+toolbar with RichTextEditor;
add URL field with open/clear actions
- Kanban detail modal: add URL field; replace plain textarea with RichTextEditor
- Tasks API: add sanitizeUrl() helper — strips javascript:/data: schemes,
normalises missing protocol to https:// before storing
- Remove dead code in TaskItem: notesRef, handleNotesBlur, insertMarkdown
(all replaced by RichTextEditor)
v1.83.0
Option A — URL field per task:
- New url String? column in Task schema (migration: 20260403_add_task_url)
- Link icon button in GridTaskBlock action bar; click to open inline URL popup
with input, clear (×) button, and open-in-new-tab shortcut
- Blue link indicator shown inline on the task card when a URL is set
- updateTaskUrl() in WeeklyView persists to DB via PATCH /api/tasks
Option B — Rich text notes with inline hyperlinks:
- GridTaskBlock notes popup upgraded from plain markdown textarea to
RichTextEditor (Tiptap), which already has bold/italic/underline/
bullet/blockquote/link toolbar and full link support
- Notes now save on every change via onChange (no blur required)
v1.82.0
Project icons (faHeart, faBriefcase etc.) were rendering as literal text in
GridTaskBlock because the lookup skipped the legacy "faX" → "x" normalization
that ProjectIcon does. Added the same normalization before allIcons.find().
Someday list tabs now survive provider disconnects and reconnects:
- customTabs (empty tabs) saved to viewSettings in DB instead of localStorage only
- assignListToTab saves a title→tab mapping in viewSettings.somedayTabPrefs
- Profile load merges DB customTabs with localStorage for migration
- Import route reads somedayTabPrefs and auto-applies tab when creating/
relinking a SomedayList by title match
v1.81.20
All handlers in someday-lists/route.ts and calendar/events/route.ts were
using (session.user as any).id which can be stale after DB restore/migration.
Fixed to look up by session.user.email instead — matching the pattern already
established in tasks/route.ts and calendar/sync/route.ts.
This was causing other users to see empty someday lists while their tasks
(fetched via the already-fixed tasks route) still had somedayListId references,
triggering false RESCUE recoveries on every load.
Also fixed outlook/callback/route.ts fallback which could still use stale ID.
v1.81.19
API routes (goal, weather, calendar/sync, calendar/events):
- All user lookups now use session email instead of session ID so stale
JWTs after DB restore/migration no longer break requests (P2003 FK error)
WeeklyView QuickSettings sidebar:
- effectiveCellDuration now uses local cellDuration state as fallback
instead of stale profile.cellDuration — slot buttons now actually update
the time grid
- Added 20m slot option to all three button groups (sidebar, header, mobile)
- Added :15/:30/:45 sub-hour slots toggle to QuickSettings sidebar
- Slot controls now highlight using effectiveCellDuration (per-view aware)
- Someday and All-day toggles now use effective value, not global profile
v1.81.15
- Weather API returns empty hourly data (200) when lat/lon not configured,
matching the 502 fix — no more browser console errors for weather
- Calendar sync route falls back to email lookup when session user ID
doesn't match a DB record (handles stale JWT after DB restore/migration)
v1.81.14
- All-day label column uses flex-start so label is visible in small area
- Weather API returns empty data (200) instead of 502 when forecast range
is out of bounds, suppressing console noise on future/past navigation
- QuickSettings toggles for project icons and checkboxes now use effective
(per-view-aware) value, consistent with other toggles
v1.81.13
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
Both fields existed in the DB but were missing from schema.prisma,
so the Prisma client didn't know about them. The client has been
regenerated (prisma db push). Added both fields to:
- prisma/schema.prisma (with correct defaults)
- GET select, PATCH destructure, updateData, PATCH select in route.ts
This resolves the 500 errors on PATCH /api/user/profile that occurred
when saveSetting() tried to persist these fields.
v1.81.8
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
- Rename options to be clearer:
- "Vollständiges Datum" → "Heutiges Datum" (always today's date)
- "Aktueller Tag" → "Selektierter Tag" with custom format input
- "Benutzerdefiniert" → "Woche Benutzerdefiniert" (week-based tokens)
- Add custom format input for "Selektierter Tag" (headerCurrentDayFormat)
with tokens: DDDD, DDD, DD, MMMM, MMM, MM, YYYY, WW
- Add separate header display settings for Mobile Portrait and
Mobile Landscape (mobilePortraitHeaderDisplay, mobileLandscapeHeaderDisplay)
- Move refresh/sync icon to fixed-width slot right of date — date no
longer shifts when the icon appears or the spinner replaces it
- Add 3 new Prisma fields (db push required on deploy)
- All 5 languages updated (EN, DE, FR, ES, IT)
v1.81.0
- tasks/route.ts: add per-unit instance cap for virtual task projection
(daily: 60, weekly: 26, monthly: 12, yearly: 3) to prevent unbounded
generation from high-frequency recurring tasks
- WeeklyView: extract calendarEditabilityMap as a separate useMemo keyed
on connections; replace O(n²) nested find() loop with O(1) Map.get()
lookup in the calendarEvents deduplication useMemo
v1.79.0
- tasks/sync GET: batch Google/Outlook/Synology credential fetches with
Promise.all instead of sequential awaits; move per-list Synology
findMany outside the loop to eliminate N+1
- calendar/sync: replace fire-and-forget background refresh with 800ms
Promise.race so fast refreshes return fresh data without blocking
- Extract icon data to iconRegistry.ts; lazy-load IconPicker via
next/dynamic so picker UI code is deferred until needed
v1.78.0
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