From 67567605fafda15c02e8c3477a1e3e7ec0ca8028 Mon Sep 17 00:00:00 2001 From: Till JS Date: Thu, 2 Apr 2026 12:46:37 +0200 Subject: [PATCH] feat(manacore/web): add DateStrip to calendar module Port the horizontal scrolling DateStrip from the standalone calendar app with all features: event indicator dots, moon phases, weekend highlighting, month dividers, lazy-loading virtual scroll, smart today button, and view range highlighting. Co-Authored-By: Claude Opus 4.6 (1M context) --- apps/manacore/apps/web/package.json | 2 + .../calendar/components/DateStrip.svelte | 527 ++++++++++++++++++ .../src/routes/(app)/calendar/+page.svelte | 4 + 3 files changed, 533 insertions(+) create mode 100644 apps/manacore/apps/web/src/lib/modules/calendar/components/DateStrip.svelte diff --git a/apps/manacore/apps/web/package.json b/apps/manacore/apps/web/package.json index 5c6928b96..53116e5f9 100644 --- a/apps/manacore/apps/web/package.json +++ b/apps/manacore/apps/web/package.json @@ -72,10 +72,12 @@ "@manacore/spiral-db": "workspace:*", "@manacore/subscriptions": "workspace:*", "@manacore/wallpaper-generator": "workspace:*", + "@types/suncalc": "^1.9.2", "@zitare/content": "workspace:*", "date-fns": "^4.1.0", "dexie": "^4.0.11", "marked": "^17.0.5", + "suncalc": "^1.9.0", "svelte-dnd-action": "^0.9.68", "svelte-i18n": "^4.0.0" }, diff --git a/apps/manacore/apps/web/src/lib/modules/calendar/components/DateStrip.svelte b/apps/manacore/apps/web/src/lib/modules/calendar/components/DateStrip.svelte new file mode 100644 index 000000000..5b6d8717a --- /dev/null +++ b/apps/manacore/apps/web/src/lib/modules/calendar/components/DateStrip.svelte @@ -0,0 +1,527 @@ + + +
+
+ +
+ + {#if !isTodayVisible} + + {/if} + {visibleMonth} + +
+ + +
+ {#each days as day} + {@const dayIsToday = isToday(day)} + {@const dayIsSelected = isSameDay(day, currentDate)} + {@const dayIsWeekend = day.getDay() === 0 || day.getDay() === 6} + {@const dayInRange = isWithinInterval(day, { + start: viewRange.start, + end: viewRange.end, + })} + {@const dayIsRangeStart = isSameDay(day, viewRange.start)} + {@const dayIsRangeEnd = isSameDay(day, viewRange.end)} + {@const isFirstOfMonth = day.getDate() === 1} + {@const moonPhase = isSignificantMoonPhase(day)} + {@const eventCount = getEventCount(day)} + {#if isFirstOfMonth} +
+ {/if} + + {/each} +
+
+
+ + diff --git a/apps/manacore/apps/web/src/routes/(app)/calendar/+page.svelte b/apps/manacore/apps/web/src/routes/(app)/calendar/+page.svelte index 4f28e3898..f446e4c87 100644 --- a/apps/manacore/apps/web/src/routes/(app)/calendar/+page.svelte +++ b/apps/manacore/apps/web/src/routes/(app)/calendar/+page.svelte @@ -13,6 +13,7 @@ import type { Calendar, CalendarEvent } from '$lib/modules/calendar/types'; import CalendarHeader from '$lib/modules/calendar/components/CalendarHeader.svelte'; + import DateStrip from '$lib/modules/calendar/components/DateStrip.svelte'; import WeekView from '$lib/modules/calendar/components/WeekView.svelte'; import MonthView from '$lib/modules/calendar/components/MonthView.svelte'; import AgendaView from '$lib/modules/calendar/components/AgendaView.svelte'; @@ -118,6 +119,9 @@ + + +