diff --git a/apps/calendar/apps/web/src/lib/components/calendar/CalendarHeader.svelte b/apps/calendar/apps/web/src/lib/components/calendar/CalendarHeader.svelte index 9ee69b7d8..8475bdc3c 100644 --- a/apps/calendar/apps/web/src/lib/components/calendar/CalendarHeader.svelte +++ b/apps/calendar/apps/web/src/lib/components/calendar/CalendarHeader.svelte @@ -94,11 +94,11 @@ } + 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 af591ef61..7e786232d 100644 --- a/apps/calendar/apps/web/src/lib/components/calendar/CalendarToolbarContent.svelte +++ b/apps/calendar/apps/web/src/lib/components/calendar/CalendarToolbarContent.svelte @@ -19,13 +19,19 @@ // View type labels const viewLabels: Record = { day: 'Tag', + '3day': '3 Tage', '5day': '5 Tage', week: 'Woche', '10day': '10 Tage', '14day': '14 Tage', + '30day': '30 Tage', + '60day': '60 Tage', + '90day': '90 Tage', + '365day': '365 Tage', month: 'Monat', year: 'Jahr', agenda: 'Agenda', + custom: 'Benutzerdefiniert', }; // Views to show in selector diff --git a/apps/calendar/apps/web/src/lib/components/calendar/TagStripModal.svelte b/apps/calendar/apps/web/src/lib/components/calendar/TagStripModal.svelte index 6a4e6ea3a..b40b27e8c 100644 --- a/apps/calendar/apps/web/src/lib/components/calendar/TagStripModal.svelte +++ b/apps/calendar/apps/web/src/lib/components/calendar/TagStripModal.svelte @@ -421,6 +421,7 @@
+
- - {#each eventTagGroupsStore.groups as group (group.id)} @@ -471,6 +472,7 @@
+
- - {#each eventTagGroupsStore.groups as group (group.id)} @@ -524,6 +526,7 @@
+
+ = { day: '1', + '3day': '3', '5day': '5', week: '7', '10day': '10', '14day': '14', + '30day': '30', + '60day': '60', + '90day': '90', + '365day': '365', month: 'M', year: 'Y', agenda: 'A', + custom: '', }; // View titles for tooltip const viewTitles: Record = { day: 'Tagesansicht', + '3day': '3-Tage-Ansicht', '5day': '5-Tage-Ansicht', week: 'Wochenansicht', '10day': '10-Tage-Ansicht', '14day': '14-Tage-Ansicht', + '30day': '30-Tage-Ansicht', + '60day': '60-Tage-Ansicht', + '90day': '90-Tage-Ansicht', + '365day': '365-Tage-Ansicht', month: 'Monatsansicht', year: 'Jahresansicht', agenda: 'Agenda', + custom: 'Benutzerdefiniert', }; // Get enabled views from settings diff --git a/apps/calendar/apps/web/src/lib/components/calendar/ViewModePillContextMenu.svelte b/apps/calendar/apps/web/src/lib/components/calendar/ViewModePillContextMenu.svelte index 38d43c725..01233cba1 100644 --- a/apps/calendar/apps/web/src/lib/components/calendar/ViewModePillContextMenu.svelte +++ b/apps/calendar/apps/web/src/lib/components/calendar/ViewModePillContextMenu.svelte @@ -183,9 +183,10 @@ {#if visible} - + + {#if onEditGroup} {/if} - +
{#if isExpanded(group.id)} diff --git a/apps/calendar/apps/web/src/lib/stores/calendars.svelte.ts b/apps/calendar/apps/web/src/lib/stores/calendars.svelte.ts index bf9489a31..ae9b5e87b 100644 --- a/apps/calendar/apps/web/src/lib/stores/calendars.svelte.ts +++ b/apps/calendar/apps/web/src/lib/stores/calendars.svelte.ts @@ -20,6 +20,7 @@ const birthdayCalendar: Calendar = { color: BIRTHDAY_CALENDAR.color, isDefault: false, isVisible: true, // Visibility controlled by settingsStore.showBirthdays + timezone: 'UTC', createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), }; diff --git a/apps/calendar/apps/web/src/lib/stores/search.svelte.ts b/apps/calendar/apps/web/src/lib/stores/search.svelte.ts index 64c93eddb..8c3c2c924 100644 --- a/apps/calendar/apps/web/src/lib/stores/search.svelte.ts +++ b/apps/calendar/apps/web/src/lib/stores/search.svelte.ts @@ -4,7 +4,8 @@ interface SearchItem { id: string; - [key: string]: unknown; + title?: string; + subtitle?: string; } // State diff --git a/apps/calendar/apps/web/src/routes/(app)/settings/+page.svelte b/apps/calendar/apps/web/src/routes/(app)/settings/+page.svelte index d270cea1c..f8aab5bec 100644 --- a/apps/calendar/apps/web/src/routes/(app)/settings/+page.svelte +++ b/apps/calendar/apps/web/src/routes/(app)/settings/+page.svelte @@ -128,13 +128,19 @@ // View labels const viewLabels: Record = { day: 'Tag', + '3day': '3 Tage', '5day': '5 Tage', week: 'Woche', '10day': '10 Tage', '14day': '14 Tage', + '30day': '30 Tage', + '60day': '60 Tage', + '90day': '90 Tage', + '365day': '365 Tage', month: 'Monat', year: 'Jahr', agenda: 'Agenda', + custom: 'Benutzerdefiniert', }; // Duration options in minutes diff --git a/apps/calendar/apps/web/src/routes/(app)/statistics/+page.svelte b/apps/calendar/apps/web/src/routes/(app)/statistics/+page.svelte index 231dcd38c..bb74b211c 100644 --- a/apps/calendar/apps/web/src/routes/(app)/statistics/+page.svelte +++ b/apps/calendar/apps/web/src/routes/(app)/statistics/+page.svelte @@ -19,6 +19,7 @@ Clock, CalendarCheck, Hourglass, + type Icon as LucideIcon, } from 'lucide-svelte'; import { subDays, addDays } from 'date-fns'; @@ -39,42 +40,42 @@ id: 'eventsToday', label: 'Heute', value: calendarStatisticsStore.eventsToday, - icon: CalendarDays, + icon: CalendarDays as any, variant: 'success', }, { id: 'eventsThisWeek', label: 'Diese Woche', value: calendarStatisticsStore.eventsThisWeek, - icon: Calendar, + icon: Calendar as any, variant: 'primary', }, { id: 'upcoming', label: 'Anstehend (7 Tage)', value: calendarStatisticsStore.upcomingEvents, - icon: CalendarCheck, + icon: CalendarCheck as any, variant: 'info', }, { id: 'busyHours', label: 'Stunden/Woche', value: `${calendarStatisticsStore.busyHoursThisWeek}h`, - icon: Clock, + icon: Clock as any, variant: 'neutral', }, { id: 'calendars', label: 'Kalender', value: calendarStatisticsStore.totalCalendars, - icon: Calendar, + icon: Calendar as any, variant: 'accent', }, { id: 'avgDuration', label: 'Ø Dauer (Min)', value: calendarStatisticsStore.averageEventDuration, - icon: Hourglass, + icon: Hourglass as any, variant: 'info', }, ]); diff --git a/apps/chat/apps/web/src/lib/components/chat/ConversationList.svelte b/apps/chat/apps/web/src/lib/components/chat/ConversationList.svelte index 26e10c394..83b038d2a 100644 --- a/apps/chat/apps/web/src/lib/components/chat/ConversationList.svelte +++ b/apps/chat/apps/web/src/lib/components/chat/ConversationList.svelte @@ -107,6 +107,7 @@ {#if editingId === conv.id}
+
- -
+ Farbe +
{#each TEMPLATE_COLORS as color} + +
diff --git a/apps/chat/apps/web/src/routes/(protected)/templates/+page.svelte b/apps/chat/apps/web/src/routes/(protected)/templates/+page.svelte index deaf8eafa..5a991d86c 100644 --- a/apps/chat/apps/web/src/routes/(protected)/templates/+page.svelte +++ b/apps/chat/apps/web/src/routes/(protected)/templates/+page.svelte @@ -81,11 +81,11 @@ await templatesStore.createTemplate({ userId: authStore.user.id, name: data.name!, - description: data.description ?? null, + description: data.description, systemPrompt: data.systemPrompt!, - initialQuestion: data.initialQuestion ?? null, + initialQuestion: data.initialQuestion, color: data.color!, - modelId: data.modelId ?? null, + modelId: data.modelId, isDefault: false, documentMode: data.documentMode ?? false, }); diff --git a/apps/chat/packages/chat-types/src/index.ts b/apps/chat/packages/chat-types/src/index.ts index fec5145e5..7acfb5c86 100644 --- a/apps/chat/packages/chat-types/src/index.ts +++ b/apps/chat/packages/chat-types/src/index.ts @@ -71,10 +71,10 @@ export interface Template { id: string; userId: string; name: string; - description: string | null; + description?: string; systemPrompt: string; - initialQuestion: string | null; - modelId: string | null; + initialQuestion?: string; + modelId?: string; color: string; isDefault: boolean; documentMode: boolean; diff --git a/apps/clock/apps/web/src/lib/api/feedback.ts b/apps/clock/apps/web/src/lib/api/feedback.ts new file mode 100644 index 000000000..10e8a5dda --- /dev/null +++ b/apps/clock/apps/web/src/lib/api/feedback.ts @@ -0,0 +1,23 @@ +/** + * Feedback Service Instance for Clock Web App + */ + +import { createFeedbackService } from '@manacore/shared-feedback-service'; +import { authStore } from '$lib/stores/auth.svelte'; +import { browser } from '$app/environment'; + +// Get auth URL dynamically at runtime +function getAuthUrl(): string { + if (browser && typeof window !== 'undefined') { + const injectedUrl = (window as unknown as { __PUBLIC_MANA_CORE_AUTH_URL__?: string }) + .__PUBLIC_MANA_CORE_AUTH_URL__; + return injectedUrl || 'http://localhost:3001'; + } + return 'http://localhost:3001'; +} + +export const feedbackService = createFeedbackService({ + apiUrl: getAuthUrl(), + appId: 'clock', + getAuthToken: async () => authStore.getAccessToken(), +}); diff --git a/apps/clock/apps/web/src/lib/components/life-clock/CircularProgress.svelte b/apps/clock/apps/web/src/lib/components/life-clock/CircularProgress.svelte index 8327c6928..d2318567c 100644 --- a/apps/clock/apps/web/src/lib/components/life-clock/CircularProgress.svelte +++ b/apps/clock/apps/web/src/lib/components/life-clock/CircularProgress.svelte @@ -20,7 +20,8 @@ let circumference = $derived(2 * Math.PI * radius); let dashOffset = $derived(circumference - (percentage / 100) * circumference); - // Animation + // Animation - intentionally captures initial circumference for animation start + // svelte-ignore state_referenced_locally let animatedOffset = $state(circumference); let mounted = $state(false); diff --git a/apps/clock/apps/web/src/routes/(app)/+layout.svelte b/apps/clock/apps/web/src/routes/(app)/+layout.svelte index d58c91855..6dffac47f 100644 --- a/apps/clock/apps/web/src/routes/(app)/+layout.svelte +++ b/apps/clock/apps/web/src/routes/(app)/+layout.svelte @@ -69,7 +69,8 @@ try { // Search alarms - const alarms = await alarmsApi.getAll(); + const alarmsResponse = await alarmsApi.getAll(); + const alarms = alarmsResponse.data || []; const matchingAlarms = alarms .filter((alarm) => alarm.label?.toLowerCase().includes(queryLower)) .slice(0, 5) @@ -81,7 +82,8 @@ results.push(...matchingAlarms); // Search timers - const timers = await timersApi.getAll(); + const timersResponse = await timersApi.getAll(); + const timers = timersResponse.data || []; const matchingTimers = timers .filter((timer) => timer.label?.toLowerCase().includes(queryLower)) .slice(0, 5) diff --git a/apps/clock/apps/web/src/routes/(app)/alarms/+page.svelte b/apps/clock/apps/web/src/routes/(app)/alarms/+page.svelte index 16352dabc..ea3b454f4 100644 --- a/apps/clock/apps/web/src/routes/(app)/alarms/+page.svelte +++ b/apps/clock/apps/web/src/routes/(app)/alarms/+page.svelte @@ -265,25 +265,25 @@ }} > -
- +
+ -
- +
+
- +
{$_('alarm.repeat')}
{#each dayNames as day, i}
{#if editingLabelId === focused.id} + stopwatchesStore.delete(focused.id)} + aria-label="Delete stopwatch" > {def.icon}

{def.label}

-

{def.description}

+

{def.emoji}

{#if theme.variant === variant} diff --git a/apps/clock/apps/web/src/routes/(app)/timers/+page.svelte b/apps/clock/apps/web/src/routes/(app)/timers/+page.svelte index 36b3d05a5..6c4284989 100644 --- a/apps/clock/apps/web/src/routes/(app)/timers/+page.svelte +++ b/apps/clock/apps/web/src/routes/(app)/timers/+page.svelte @@ -245,6 +245,7 @@ e.stopPropagation(); handleDelete(timer.id, isLocal); }} + aria-label="Delete timer" > removeCity(clock.id)} + aria-label="Remove city" >

{$_('worldClock.add')}

-