diff --git a/apps/calendar/apps/web/src/lib/components/calendar/AgendaView.svelte b/apps/calendar/apps/web/src/lib/components/calendar/AgendaView.svelte new file mode 100644 index 000000000..6fc284435 --- /dev/null +++ b/apps/calendar/apps/web/src/lib/components/calendar/AgendaView.svelte @@ -0,0 +1,303 @@ + + +
+ {#if groupedEvents.length === 0} +
+ + + +

Keine Termine in diesem Zeitraum

+
+ {:else} +
+ {#each groupedEvents as group} +
+

+ {formatDateHeader(group.date)} +

+ +
+ {#each group.events as event} + + {/each} +
+
+ {/each} +
+ {/if} +
+ + 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 607f9d473..e198d25ed 100644 --- a/apps/calendar/apps/web/src/lib/components/calendar/CalendarToolbar.svelte +++ b/apps/calendar/apps/web/src/lib/components/calendar/CalendarToolbar.svelte @@ -1,5 +1,5 @@ -{#if !isCollapsed} - - + +
+ + - + + {#if !isCollapsed} +
+ - -
- -
+
+ +
- -{/if} - - -{#if isCollapsed} - -{/if} + {/if} +
diff --git a/apps/calendar/apps/web/src/lib/components/calendar/CalendarToolbarContent.svelte b/apps/calendar/apps/web/src/lib/components/calendar/CalendarToolbarContent.svelte index dd5d4461d..d44f6fc0a 100644 --- a/apps/calendar/apps/web/src/lib/components/calendar/CalendarToolbarContent.svelte +++ b/apps/calendar/apps/web/src/lib/components/calendar/CalendarToolbarContent.svelte @@ -37,6 +37,7 @@ '14day', 'month', 'year', + 'agenda', ]; // Convert to ViewOptions for PillViewSwitcher diff --git a/apps/calendar/apps/web/src/lib/components/calendar/DayView.svelte b/apps/calendar/apps/web/src/lib/components/calendar/DayView.svelte index f1c692594..abae9e796 100644 --- a/apps/calendar/apps/web/src/lib/components/calendar/DayView.svelte +++ b/apps/calendar/apps/web/src/lib/components/calendar/DayView.svelte @@ -914,12 +914,17 @@ .day-view { display: flex; flex-direction: column; + align-items: center; + height: 100%; + overflow: hidden; } .all-day-section { display: flex; border-bottom: 1px solid hsl(var(--color-border)); padding: 0.5rem 0; + width: 100%; + max-width: 800px; } .all-day-label { @@ -960,13 +965,14 @@ .all-day-block-event { position: absolute; top: 0; - left: 4px; - right: 4px; + left: 8px; + width: calc(100% - 16px); + max-width: 400px; bottom: 0; padding: 8px 12px; color: white; border: none; - border-radius: var(--radius-sm); + border-radius: var(--radius-md); text-align: left; cursor: pointer; z-index: 0; @@ -1002,16 +1008,19 @@ .time-grid { flex: 1; display: flex; + width: 100%; + max-width: 800px; + overflow-y: auto; } .time-column { - width: var(--time-column-width); + width: 50px; flex-shrink: 0; } .time-label { height: var(--hour-height); - padding-right: 0.5rem; + padding-right: 0.75rem; text-align: right; font-size: 0.75rem; color: hsl(var(--color-muted-foreground)); @@ -1020,9 +1029,9 @@ } .time-gutter { - width: var(--time-column-width); + width: 50px; flex-shrink: 0; - padding-right: 0.5rem; + padding-right: 0.75rem; text-align: right; } @@ -1030,6 +1039,7 @@ flex: 1; position: relative; border-left: 1px solid hsl(var(--color-border)); + max-width: 600px; } .day-column.today { @@ -1044,8 +1054,9 @@ .event-card { position: absolute; - left: 4px; - right: 4px; + left: 8px; + width: calc(100% - 16px); + max-width: 400px; color: white; border: none; text-align: left; @@ -1054,11 +1065,12 @@ display: flex; flex-direction: column; gap: 2px; - padding: 4px 8px; - border-radius: var(--radius-sm); + padding: 6px 10px; + border-radius: var(--radius-md); overflow: hidden; touch-action: none; user-select: none; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); transition: box-shadow 150ms ease, opacity 150ms ease; diff --git a/apps/calendar/apps/web/src/lib/components/calendar/MonthView.svelte b/apps/calendar/apps/web/src/lib/components/calendar/MonthView.svelte index 936c5b755..19d0c844c 100644 --- a/apps/calendar/apps/web/src/lib/components/calendar/MonthView.svelte +++ b/apps/calendar/apps/web/src/lib/components/calendar/MonthView.svelte @@ -338,12 +338,15 @@ .month-view { display: flex; flex-direction: column; + height: 100%; + overflow: hidden; } .weekday-headers { display: grid; grid-template-columns: repeat(var(--column-count, 7), 1fr); border-bottom: 1px solid hsl(var(--color-border)); + background: hsl(var(--color-background)); } .weekday-header { @@ -359,6 +362,7 @@ flex: 1; display: flex; flex-direction: column; + overflow-y: auto; } .week-row { diff --git a/apps/calendar/apps/web/src/lib/components/calendar/MultiDayView.svelte b/apps/calendar/apps/web/src/lib/components/calendar/MultiDayView.svelte index 2348ea8ae..b28339807 100644 --- a/apps/calendar/apps/web/src/lib/components/calendar/MultiDayView.svelte +++ b/apps/calendar/apps/web/src/lib/components/calendar/MultiDayView.svelte @@ -1168,6 +1168,10 @@ .day-headers { display: flex; border-bottom: 1px solid hsl(var(--color-border)); + position: sticky; + top: 0; + z-index: 10; + background: hsl(var(--color-background)); } .time-gutter { diff --git a/apps/calendar/apps/web/src/lib/components/calendar/WeekView.svelte b/apps/calendar/apps/web/src/lib/components/calendar/WeekView.svelte index ab7380493..acee36ff2 100644 --- a/apps/calendar/apps/web/src/lib/components/calendar/WeekView.svelte +++ b/apps/calendar/apps/web/src/lib/components/calendar/WeekView.svelte @@ -1181,6 +1181,10 @@ .day-headers { display: flex; border-bottom: 1px solid hsl(var(--color-border)); + position: sticky; + top: 0; + z-index: 10; + background: hsl(var(--color-background)); } .time-gutter { diff --git a/apps/calendar/apps/web/src/routes/(app)/+layout.svelte b/apps/calendar/apps/web/src/routes/(app)/+layout.svelte index 97a90580a..bd34a6d46 100644 --- a/apps/calendar/apps/web/src/routes/(app)/+layout.svelte +++ b/apps/calendar/apps/web/src/routes/(app)/+layout.svelte @@ -143,7 +143,7 @@ let isSidebarMode = $state(false); let isCollapsed = $state(false); - let isToolbarCollapsed = $state(false); + let isToolbarCollapsed = $state(true); // Default to collapsed - FAB next to InputBar // Use theme store's isDark directly let isDark = $derived(theme.isDark); @@ -198,7 +198,6 @@ // Base navigation items for Calendar const baseNavItems: PillNavItem[] = [ { href: '/', label: 'Kalender', icon: 'calendar' }, - { href: '/agenda', label: 'Agenda', icon: 'list' }, { href: '/tasks', label: 'Aufgaben', icon: 'check-square' }, { href: '/tags', label: 'Tags', icon: 'tag' }, { href: '/statistics', label: 'Statistiken', icon: 'bar-chart-3' }, @@ -411,13 +410,7 @@ appIcon="calendar" primaryColor="#3b82f6" autoFocus={true} - bottomOffset={showCalendarToolbar - ? isSidebarMode - ? '0px' - : '130px' - : isSidebarMode - ? '0px' - : '70px'} + bottomOffset={isSidebarMode ? '0px' : '70px'} />
@@ -430,6 +423,10 @@ } .main-content { + flex: 1; + display: flex; + flex-direction: column; + min-height: 0; transition: all 300ms ease; position: relative; /* Space for QuickInputBar at bottom */ @@ -468,6 +465,8 @@ } .content-wrapper { + flex: 1; + min-height: 0; max-width: 100%; margin-left: auto; margin-right: auto; @@ -496,5 +495,7 @@ padding: 0; display: flex; flex-direction: column; + flex: 1; + min-height: 0; } diff --git a/apps/calendar/apps/web/src/routes/(app)/+page.svelte b/apps/calendar/apps/web/src/routes/(app)/+page.svelte index 446464bc3..29a62bb74 100644 --- a/apps/calendar/apps/web/src/routes/(app)/+page.svelte +++ b/apps/calendar/apps/web/src/routes/(app)/+page.svelte @@ -13,6 +13,7 @@ import MonthView from '$lib/components/calendar/MonthView.svelte'; import MultiDayView from '$lib/components/calendar/MultiDayView.svelte'; import YearView from '$lib/components/calendar/YearView.svelte'; + import AgendaView from '$lib/components/calendar/AgendaView.svelte'; import TodoSidebarSection from '$lib/components/calendar/TodoSidebarSection.svelte'; import QuickEventOverlay from '$lib/components/event/QuickEventOverlay.svelte'; import { CalendarViewSkeleton } from '$lib/components/skeletons'; @@ -175,6 +176,8 @@ {:else if viewStore.viewType === 'year'} + {:else if viewStore.viewType === 'agenda'} + {:else} {/if} @@ -201,6 +204,7 @@ display: flex; gap: 1.5rem; width: 100%; + height: 100%; position: relative; } @@ -305,10 +309,12 @@ display: flex; flex-direction: column; min-width: 0; + min-height: 0; background: hsl(var(--color-surface)); border-radius: var(--radius-lg); border: 1px solid hsl(var(--color-border)); transition: all 300ms cubic-bezier(0.4, 0, 0.2, 1); + overflow: hidden; } .calendar-main.expanded { @@ -318,6 +324,8 @@ .calendar-content { flex: 1; + min-height: 0; + overflow: hidden; } @media (max-width: 1024px) { diff --git a/apps/calendar/apps/web/src/routes/(app)/agenda/+page.svelte b/apps/calendar/apps/web/src/routes/(app)/agenda/+page.svelte deleted file mode 100644 index b7c80f940..000000000 --- a/apps/calendar/apps/web/src/routes/(app)/agenda/+page.svelte +++ /dev/null @@ -1,238 +0,0 @@ - - - - Agenda | Kalender - - -
- - - {#if loading} - - {:else if groupedEvents.length === 0} -
-

Keine Termine in den nächsten 30 Tagen

- -
- {:else} -
- {#each groupedEvents as group} -
-

- {formatDateHeader(group.date)} -

- - {#each group.events as event} - - {/each} -
- {/each} -
- {/if} -
- -