diff --git a/apps/manacore/apps/web/src/lib/components/page-carousel/PageCarousel.svelte b/apps/manacore/apps/web/src/lib/components/page-carousel/PageCarousel.svelte
index 8ac19f5ce..665fb75d3 100644
--- a/apps/manacore/apps/web/src/lib/components/page-carousel/PageCarousel.svelte
+++ b/apps/manacore/apps/web/src/lib/components/page-carousel/PageCarousel.svelte
@@ -161,9 +161,9 @@
/* Carousel track */
.fokus-track {
display: flex;
- gap: 1.5rem;
+ gap: 1rem;
overflow-x: auto;
- padding: 1rem calc(50% - var(--sheet-width) / 2);
+ padding: 0.5rem 0;
scrollbar-width: none;
flex: 1;
}
diff --git a/apps/manacore/apps/web/src/lib/components/workbench/app-registry.ts b/apps/manacore/apps/web/src/lib/components/workbench/app-registry.ts
index cb29f2004..0060815f3 100644
--- a/apps/manacore/apps/web/src/lib/components/workbench/app-registry.ts
+++ b/apps/manacore/apps/web/src/lib/components/workbench/app-registry.ts
@@ -63,12 +63,20 @@ export const APP_REGISTRY: AppEntry[] = [
name: 'Times',
color: '#F59E0B',
load: () => import('$lib/modules/times/ListView.svelte'),
+ views: {
+ list: { load: () => import('$lib/modules/times/ListView.svelte') },
+ detail: { load: () => import('$lib/modules/times/views/DetailView.svelte') },
+ },
},
{
id: 'zitare',
name: 'Zitare',
color: '#EC4899',
load: () => import('$lib/modules/zitare/ListView.svelte'),
+ views: {
+ list: { load: () => import('$lib/modules/zitare/ListView.svelte') },
+ detail: { load: () => import('$lib/modules/zitare/views/DetailView.svelte') },
+ },
},
{
id: 'cards',
diff --git a/apps/manacore/apps/web/src/lib/modules/times/ListView.svelte b/apps/manacore/apps/web/src/lib/modules/times/ListView.svelte
index 6ddd42192..86c29c12f 100644
--- a/apps/manacore/apps/web/src/lib/modules/times/ListView.svelte
+++ b/apps/manacore/apps/web/src/lib/modules/times/ListView.svelte
@@ -1,17 +1,36 @@
-
- {#if running}
-
-
-
-
{running.description || 'Timer läuft'}
+
+
+
+
handleDescriptionInput((e.target as HTMLInputElement).value)}
+ placeholder="Was trackst du?"
+ class="min-w-0 flex-1 rounded-md border border-white/10 bg-white/5 px-2.5 py-1.5 text-xs text-white/90 placeholder:text-white/30 focus:border-white/20 focus:outline-none"
+ />
+ {#if timerStore.isRunning}
+
+
+
+ {formatDuration(timerStore.elapsedSeconds)}
+
-
{projectName(running.projectId)}
-
- {/if}
+ {/if}
+
- Heute: {todayEntries.length} Einträge
- {formatDuration(totalToday)}
+ Heute: {todayEntries.length} Eintr{todayEntries.length === 1 ? 'ag' : 'age'}
+ {fmtCompact(totalToday)}
{#each todayEntries as entry (entry.id)}
-
+
+
{/each}
- {#if todayEntries.length === 0 && !running}
-
Noch keine Zeiteinträge heute
+ {#if todayEntries.length === 0 && !timerStore.isRunning}
+
Noch keine Zeiteinträge heute
{/if}
diff --git a/apps/manacore/apps/web/src/lib/modules/times/views/DetailView.svelte b/apps/manacore/apps/web/src/lib/modules/times/views/DetailView.svelte
new file mode 100644
index 000000000..33087b245
--- /dev/null
+++ b/apps/manacore/apps/web/src/lib/modules/times/views/DetailView.svelte
@@ -0,0 +1,524 @@
+
+
+
+
+ {#if !entry}
+
Eintrag nicht gefunden
+ {:else}
+
+
+ (focused = true)}
+ onblur={saveField}
+ placeholder="Beschreibung..."
+ />
+
+
+
+ {#if entry.startTime || entry.endTime}
+
+ {#if entry.startTime}{fmtTime(entry.startTime)}{/if}
+ {#if entry.startTime && entry.endTime}
+ –
+ {/if}
+ {#if entry.endTime}{fmtTime(entry.endTime)}{/if}
+
+ {/if}
+
+
+
+
+ Datum
+ (focused = true)}
+ onblur={saveField}
+ />
+
+
+
+
+
+ Projekt
+
+
+
+
+ Abrechenbar
+
+
+
+ {#if selectedProject}
+
+
Projekt
+
+
+ {selectedProject.name}
+
+
+ {/if}
+
+ {#if selectedClient}
+
+ Kunde
+ {selectedClient.name}
+
+ {/if}
+
+
+
+
+ {#if entry.createdAt}
+ Erstellt: {new Date(entry.createdAt).toLocaleDateString('de')}
+ {/if}
+ {#if entry.source?.app}
+ Quelle: {entry.source.app}
+ {/if}
+
+
+
+
+ {#if confirmDelete}
+
Eintrag wirklich loschen?
+
+
+
+
+ {:else}
+
+ {/if}
+
+ {/if}
+
+
+
diff --git a/apps/manacore/apps/web/src/lib/modules/zitare/ListView.svelte b/apps/manacore/apps/web/src/lib/modules/zitare/ListView.svelte
index 45c80723e..340f78e83 100644
--- a/apps/manacore/apps/web/src/lib/modules/zitare/ListView.svelte
+++ b/apps/manacore/apps/web/src/lib/modules/zitare/ListView.svelte
@@ -1,13 +1,31 @@
-
-
-
- «{todayQuote.text}»
+
+
+ handleTagDrop(p.data as unknown as TagDragData),
+ canDrop: (p) => !currentTagIds.includes((p.data as unknown as TagDragData).id),
+ }}
+>
+ {#if quote}
+
+ «{quotesStore.getText(quote)}»
-
— {todayQuote.author}
-
+ — {quote.author}
-
- {favorites.length} gespeicherte Zitate
-
+
+ {#if currentTags.length > 0}
+
+ {#each currentTags as tag (tag.id)}
+
+
+ {tag.name}
+
+ {/each}
+
+ {/if}
+
+
+ {/if}
+
+
diff --git a/apps/manacore/apps/web/src/lib/modules/zitare/types.ts b/apps/manacore/apps/web/src/lib/modules/zitare/types.ts
index 5d1c3c21c..555bf4784 100644
--- a/apps/manacore/apps/web/src/lib/modules/zitare/types.ts
+++ b/apps/manacore/apps/web/src/lib/modules/zitare/types.ts
@@ -6,6 +6,7 @@ import type { BaseRecord } from '@manacore/local-store';
export interface LocalFavorite extends BaseRecord {
quoteId: string;
+ tagIds?: string[] | null;
}
export interface LocalQuoteList extends BaseRecord {
diff --git a/apps/manacore/apps/web/src/lib/modules/zitare/views/DetailView.svelte b/apps/manacore/apps/web/src/lib/modules/zitare/views/DetailView.svelte
new file mode 100644
index 000000000..f410c0226
--- /dev/null
+++ b/apps/manacore/apps/web/src/lib/modules/zitare/views/DetailView.svelte
@@ -0,0 +1,250 @@
+
+
+
+
+ {#if !quote}
+
Zitat nicht gefunden
+ {:else}
+
+
+ “{quoteText}”
+
+
+
+
+ — {quote.author}
+ {#if authorBio()}
+
+ {/if}
+
+
+ {#if showBio && authorBio()}
+
{authorBio()}
+ {/if}
+
+
+
+ {categoryLabels[quote.category]}
+ {#if quote.source || quote.year}
+
+ {#if quote.source}{quote.source}{/if}
+ {#if quote.source && quote.year}
+ ·
+ {/if}
+ {#if quote.year}{quote.year}{/if}
+
+ {/if}
+
+
+
+
+
+
+
+ {/if}
+
+
+
diff --git a/apps/manacore/apps/web/src/routes/(app)/+page.svelte b/apps/manacore/apps/web/src/routes/(app)/+page.svelte
index d2a9f556e..8ab46766a 100644
--- a/apps/manacore/apps/web/src/routes/(app)/+page.svelte
+++ b/apps/manacore/apps/web/src/routes/(app)/+page.svelte
@@ -4,12 +4,7 @@
import { PageCarousel, type CarouselPage } from '$lib/components/page-carousel';
import { getAppEntry } from '$lib/components/workbench/app-registry';
import { createAppSettingsStore } from '@manacore/shared-stores';
- import { DragPreview, dragSource } from '@manacore/shared-ui/dnd';
- import { useAllTags } from '$lib/stores/tags.svelte';
-
- // ── Tags for drag & drop ───────────────────────────────
- const tagsQuery = useAllTags();
- let allTags = $derived(tagsQuery.value ?? []);
+ import { DragPreview } from '@manacore/shared-ui/dnd';
// ── Persisted workbench state ───────────────────────────
const DEFAULT_WIDTH = 480;
@@ -140,23 +135,6 @@
- {#if allTags.length > 0}
-
- {#each allTags as tag (tag.id)}
-
- {/each}
-
- {/if}
-