From 0badca21ae20bcd1ccc1a1797707c35f70c2db1d Mon Sep 17 00:00:00 2001 From: Till-JS <101404291+Till-JS@users.noreply.github.com> Date: Sun, 14 Dec 2025 21:29:03 +0100 Subject: [PATCH] feat(calendar): add configurable ViewModePill for quick view switching MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a View Mode Pill component next to the toolbar FAB that allows quick switching between calendar views. Users can configure which views appear in the quick switcher via right-click context menu. - Add ViewModePill component with icons for each view type - Add ViewModePillContextMenu for configuring visible views - Add quickViewPillViews setting (default: week, month, agenda) - Position pill to the left of the toolbar FAB 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../calendar/CalendarToolbar.svelte | 6 + .../components/calendar/ViewModePill.svelte | 205 ++++++++++++++++++ .../calendar/ViewModePillContextMenu.svelte | 104 +++++++++ .../web/src/lib/stores/settings.svelte.ts | 14 ++ 4 files changed, 329 insertions(+) create mode 100644 apps/calendar/apps/web/src/lib/components/calendar/ViewModePill.svelte create mode 100644 apps/calendar/apps/web/src/lib/components/calendar/ViewModePillContextMenu.svelte diff --git a/apps/calendar/apps/web/src/lib/components/calendar/CalendarToolbar.svelte b/apps/calendar/apps/web/src/lib/components/calendar/CalendarToolbar.svelte index a997b1683..a583fd6c1 100644 --- a/apps/calendar/apps/web/src/lib/components/calendar/CalendarToolbar.svelte +++ b/apps/calendar/apps/web/src/lib/components/calendar/CalendarToolbar.svelte @@ -1,6 +1,7 @@ + + +
+ {#each enabledViews as view} + + {/each} +
+ + + + diff --git a/apps/calendar/apps/web/src/lib/components/calendar/ViewModePillContextMenu.svelte b/apps/calendar/apps/web/src/lib/components/calendar/ViewModePillContextMenu.svelte new file mode 100644 index 000000000..2068219d8 --- /dev/null +++ b/apps/calendar/apps/web/src/lib/components/calendar/ViewModePillContextMenu.svelte @@ -0,0 +1,104 @@ + + + diff --git a/apps/calendar/apps/web/src/lib/stores/settings.svelte.ts b/apps/calendar/apps/web/src/lib/stores/settings.svelte.ts index 5fb620daf..96860581c 100644 --- a/apps/calendar/apps/web/src/lib/stores/settings.svelte.ts +++ b/apps/calendar/apps/web/src/lib/stores/settings.svelte.ts @@ -34,6 +34,7 @@ export interface CalendarAppSettings { dateStripShowMonthDividers: boolean; // Show vertical dividers between months dateStripCompact: boolean; // Use compact/smaller DateStrip dateStripShowWeekNumbers: boolean; // Show week numbers at start of week + dateStripCollapsed: boolean; // Whether DateStrip is minimized to FAB // Birthday settings (cross-app integration with Contacts) showBirthdays: boolean; // Show contact birthdays in calendar @@ -42,6 +43,9 @@ export interface CalendarAppSettings { // UI settings sidebarCollapsed: boolean; + // Quick View Pill settings + quickViewPillViews: CalendarViewType[]; // Views shown in quick switcher + // Event defaults defaultEventDuration: number; // in minutes defaultReminder: number; // in minutes before event @@ -65,11 +69,15 @@ const DEFAULT_SETTINGS: CalendarAppSettings = { dateStripShowMonthDividers: true, dateStripCompact: false, dateStripShowWeekNumbers: false, + dateStripCollapsed: false, // Birthday defaults showBirthdays: true, showBirthdayAge: true, // UI defaults sidebarCollapsed: false, + // Quick View Pill defaults + quickViewPillViews: ['week', 'month', 'agenda'], + // Event defaults defaultEventDuration: 60, defaultReminder: 15, }; @@ -189,6 +197,9 @@ export const settingsStore = { get dateStripShowWeekNumbers() { return settings.dateStripShowWeekNumbers; }, + get dateStripCollapsed() { + return settings.dateStripCollapsed; + }, // Birthday settings get showBirthdays() { return settings.showBirthdays; @@ -205,6 +216,9 @@ export const settingsStore = { get sidebarCollapsed() { return settings.sidebarCollapsed; }, + get quickViewPillViews() { + return settings.quickViewPillViews; + }, get cloudSyncEnabled() { return cloudSyncEnabled; },