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}
+
{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