diff --git a/apps/manacore/apps/web/src/lib/api/services/mukke.test.ts b/apps/manacore/apps/web/src/lib/api/services/music.test.ts similarity index 100% rename from apps/manacore/apps/web/src/lib/api/services/mukke.test.ts rename to apps/manacore/apps/web/src/lib/api/services/music.test.ts diff --git a/apps/manacore/apps/web/src/lib/modules/calendar/components/CalendarHeader.svelte b/apps/manacore/apps/web/src/lib/modules/calendar/components/CalendarHeader.svelte index c6204aefc..3ae1a2b01 100644 --- a/apps/manacore/apps/web/src/lib/modules/calendar/components/CalendarHeader.svelte +++ b/apps/manacore/apps/web/src/lib/modules/calendar/components/CalendarHeader.svelte @@ -1,7 +1,17 @@
{/if} - {formattedTime} +
+ + {#if event.blockType === 'task'} + + {:else if event.blockType === 'timeEntry'} + + {:else if event.blockType === 'habit' && habitIconComponent} + + + + {:else if event.blockType === 'focus'} + + {/if} + + {formattedTime} +
{event.title || (isDraft ? 'Neuer Termin' : '')} {#if event.location} {event.location} @@ -144,6 +167,50 @@ outline-offset: 1px; } + /* ─── Block-type visual differentiation ─── */ + + .event-card.block-type-task { + border-left: 3px solid rgba(255, 255, 255, 0.6); + } + + .event-card.block-type-habit { + border-radius: var(--radius-sm, 4px) 8px 8px var(--radius-sm, 4px); + } + + .event-card.block-type-timeEntry { + border-style: solid; + border-width: 1px; + border-color: rgba(255, 255, 255, 0.3); + background-image: repeating-linear-gradient( + -45deg, + transparent, + transparent 4px, + rgba(255, 255, 255, 0.05) 4px, + rgba(255, 255, 255, 0.05) 8px + ); + } + + .event-card.block-type-focus { + border: 2px dashed rgba(255, 255, 255, 0.5); + } + + /* Live/running indicator */ + .event-card.live { + animation: pulse-border 2s ease-in-out infinite; + } + + @keyframes pulse-border { + 0%, + 100% { + box-shadow: 0 0 0 0 rgba(255, 255, 255, 0.4); + } + 50% { + box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.1); + } + } + + /* ─── Drag/resize states ─── */ + .event-card.dragging { cursor: grabbing; opacity: 0.9; @@ -177,6 +244,21 @@ background-color: hsl(var(--color-primary) / 0.3) !important; } + /* ─── Content ─── */ + + .event-header-row { + display: flex; + align-items: center; + gap: 3px; + } + + .type-icon { + display: flex; + align-items: center; + opacity: 0.85; + flex-shrink: 0; + } + .event-time { display: block; font-size: 0.6rem; @@ -201,6 +283,8 @@ text-overflow: ellipsis; } + /* ─── Resize handles ─── */ + .resize-handle { position: absolute; left: 0; 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 c02df9595..10a3bee00 100644 --- a/apps/manacore/apps/web/src/routes/(app)/calendar/+page.svelte +++ b/apps/manacore/apps/web/src/routes/(app)/calendar/+page.svelte @@ -11,6 +11,7 @@ getCalendarColor, } from '$lib/modules/calendar/queries'; import type { Calendar, CalendarEvent } from '$lib/modules/calendar/types'; + import { goto } from '$app/navigation'; import CalendarHeader from '$lib/modules/calendar/components/CalendarHeader.svelte'; import DateStrip from '$lib/modules/calendar/components/DateStrip.svelte'; @@ -78,6 +79,21 @@ let quickCreatePosition = $state({ x: 0, y: 0 }); function handleEventClick(event: CalendarEvent) { + // Cross-module navigation: external items open in their source module + if (event.calendarId === '__external__') { + const routeMap: Record = { + todo: '/todo', + times: '/times', + habits: '/habits', + }; + const route = routeMap[event.sourceModule]; + if (route) { + goto(route); + return; + } + } + + // Native calendar events: open detail modal selectedEvent = event; } diff --git a/packages/shared-branding/src/logos/MukkeLogo.svelte b/packages/shared-branding/src/logos/MusicLogo.svelte similarity index 100% rename from packages/shared-branding/src/logos/MukkeLogo.svelte rename to packages/shared-branding/src/logos/MusicLogo.svelte