diff --git a/apps/picture/apps/web/src/lib/components/board/BoardCanvas.svelte b/apps/picture/apps/web/src/lib/components/board/BoardCanvas.svelte index 62ec2f24f..186ba5c14 100644 --- a/apps/picture/apps/web/src/lib/components/board/BoardCanvas.svelte +++ b/apps/picture/apps/web/src/lib/components/board/BoardCanvas.svelte @@ -146,7 +146,8 @@ // Stage click to deselect stage.on('click', (e) => { console.log('[Canvas] Stage clicked, target:', e.target.getType()); - if (e.target === stage || e.target === backgroundLayer) { + const targetType = e.target.getType(); + if (targetType === 'Stage' || e.target.name() === 'background') { console.log('[Canvas] Deselecting all'); deselectAll(); transformer.nodes([]); @@ -437,7 +438,7 @@ textarea.style.width = `${textNode.width() * textNode.scaleX()}px`; textarea.style.fontSize = `${textNode.fontSize()}px`; textarea.style.fontFamily = textNode.fontFamily(); - textarea.style.color = textNode.fill(); + textarea.style.color = String(textNode.fill()); textarea.style.border = '2px solid #4A90E2'; textarea.style.padding = '4px'; textarea.style.margin = '0px'; diff --git a/apps/picture/apps/web/src/lib/components/board/CanvasToolbar.svelte b/apps/picture/apps/web/src/lib/components/board/CanvasToolbar.svelte index c9e1fb7f5..c099f086d 100644 --- a/apps/picture/apps/web/src/lib/components/board/CanvasToolbar.svelte +++ b/apps/picture/apps/web/src/lib/components/board/CanvasToolbar.svelte @@ -46,15 +46,12 @@ const hasSelection = $derived($selectedItemIds.length > 0); async function handleExport() { - // Get the stage element - const stage = document.querySelector('.konvajs-content canvas') as HTMLCanvasElement; - if (!stage) return; + // Get the canvas element + const canvas = document.querySelector('.konvajs-content canvas') as HTMLCanvasElement; + if (!canvas) return; - // Create download link - const dataURL = stage.toDataURL({ - pixelRatio: 2, // Retina quality - mimeType: 'image/png', - }); + // Create download link using standard canvas API + const dataURL = canvas.toDataURL('image/png'); const link = document.createElement('a'); link.download = `${boardName}.png`; diff --git a/apps/picture/apps/web/src/lib/components/gallery/QuickGenerateBar.svelte b/apps/picture/apps/web/src/lib/components/gallery/QuickGenerateBar.svelte index 420f5c1fe..decec73a7 100644 --- a/apps/picture/apps/web/src/lib/components/gallery/QuickGenerateBar.svelte +++ b/apps/picture/apps/web/src/lib/components/gallery/QuickGenerateBar.svelte @@ -103,8 +103,6 @@ generationProgress.set(`Warte auf Verarbeitung... (${i + 1}/${totalImages})`); } else if (progress.status === 'processing') { generationProgress.set(`Verarbeite Bild ${i + 1}/${totalImages}...`); - } else if (progress.status === 'downloading') { - generationProgress.set(`Speichere Bild ${i + 1}/${totalImages}...`); } else if (progress.status === 'completed') { unsubscribe(); resolve(); diff --git a/apps/picture/apps/web/src/lib/components/generate/GenerateForm.svelte b/apps/picture/apps/web/src/lib/components/generate/GenerateForm.svelte index 932f0bdf6..26764b7ee 100644 --- a/apps/picture/apps/web/src/lib/components/generate/GenerateForm.svelte +++ b/apps/picture/apps/web/src/lib/components/generate/GenerateForm.svelte @@ -68,8 +68,6 @@ generationProgress.set('Queued for processing...'); } else if (progress.status === 'processing') { generationProgress.set('Processing...'); - } else if (progress.status === 'downloading') { - generationProgress.set('Saving image...'); } else if (progress.status === 'completed') { unsubscribe(); resolve(); diff --git a/apps/picture/apps/web/src/lib/components/ui/ContextMenu.svelte b/apps/picture/apps/web/src/lib/components/ui/ContextMenu.svelte index 23adf9383..5064c92c9 100644 --- a/apps/picture/apps/web/src/lib/components/ui/ContextMenu.svelte +++ b/apps/picture/apps/web/src/lib/components/ui/ContextMenu.svelte @@ -13,7 +13,7 @@ import { images } from '$lib/stores/images'; import { archivedImages } from '$lib/stores/archive'; import { showToast } from '$lib/stores/toast'; - import type { Database } from '@picture/shared/types'; + import type { Tag } from '$lib/api/tags'; import { DownloadSimple, Link, @@ -26,21 +26,19 @@ Check, } from '@manacore/shared-icons'; - type TagType = Database['public']['Tables']['tags']['Row']; - let tagSubmenuElement = $state(null); - let imageTags = $state([]); + let imageTags = $state([]); // Check if current image is archived const isArchived = $derived( - $contextMenu.image?.archived_at !== null && $contextMenu.image?.archived_at !== undefined + $contextMenu.image?.archivedAt !== null && $contextMenu.image?.archivedAt !== undefined ); // Check if current image is favorite - const isFavorite = $derived($contextMenu.image?.is_favorite === true); + const isFavorite = $derived($contextMenu.image?.isFavorite === true); // Check if current image belongs to current user - const isOwnImage = $derived($contextMenu.image?.user_id === authStore.user?.id); + const isOwnImage = $derived($contextMenu.image?.userId === authStore.user?.id); type IconName = 'download' | 'link' | 'heart' | 'tag' | 'archive' | 'restore' | 'trash'; @@ -72,7 +70,7 @@ showTagSubmenu(rect.right, rect.top); } - async function handleAddTag(tag: TagType) { + async function handleAddTag(tag: Tag) { if (!$contextMenu.image) return; try { @@ -85,7 +83,7 @@ } } - async function handleRemoveTag(tag: TagType) { + async function handleRemoveTag(tag: Tag) { if (!$contextMenu.image) return; try { @@ -99,10 +97,10 @@ } function handleDownload() { - if (!$contextMenu.image?.public_url) return; + if (!$contextMenu.image?.publicUrl) return; const link = document.createElement('a'); - link.href = $contextMenu.image.public_url; + link.href = $contextMenu.image.publicUrl; link.download = $contextMenu.image.filename || 'image.png'; link.click(); hideContextMenu(); @@ -110,9 +108,9 @@ } function handleCopyLink() { - if (!$contextMenu.image?.public_url) return; + if (!$contextMenu.image?.publicUrl) return; - navigator.clipboard.writeText($contextMenu.image.public_url); + navigator.clipboard.writeText($contextMenu.image.publicUrl); hideContextMenu(); showToast('Link kopiert', 'success'); } @@ -171,12 +169,12 @@ // Update in all stores images.update((current) => current.map((img) => - img.id === $contextMenu.image?.id ? { ...img, is_favorite: newFavoriteStatus } : img + img.id === $contextMenu.image?.id ? { ...img, isFavorite: newFavoriteStatus } : img ) ); archivedImages.update((current) => current.map((img) => - img.id === $contextMenu.image?.id ? { ...img, is_favorite: newFavoriteStatus } : img + img.id === $contextMenu.image?.id ? { ...img, isFavorite: newFavoriteStatus } : img ) ); diff --git a/apps/picture/apps/web/src/lib/components/ui/Input.svelte b/apps/picture/apps/web/src/lib/components/ui/Input.svelte index 7fac183f9..34bf4ed1f 100644 --- a/apps/picture/apps/web/src/lib/components/ui/Input.svelte +++ b/apps/picture/apps/web/src/lib/components/ui/Input.svelte @@ -10,7 +10,7 @@ class?: string; id?: string; name?: string; - autocomplete?: string; + autocomplete?: AutoFill; onchange?: (e: Event) => void; oninput?: (e: Event) => void; } @@ -26,7 +26,7 @@ class: className = '', id = '', name = '', - autocomplete = '', + autocomplete, onchange, oninput, }: Props = $props(); diff --git a/apps/picture/apps/web/src/lib/components/ui/ViewModeSwitcher.svelte b/apps/picture/apps/web/src/lib/components/ui/ViewModeSwitcher.svelte index 3ea1099f3..3b789482d 100644 --- a/apps/picture/apps/web/src/lib/components/ui/ViewModeSwitcher.svelte +++ b/apps/picture/apps/web/src/lib/components/ui/ViewModeSwitcher.svelte @@ -1,6 +1,6 @@