diff --git a/src/components/PanelPreview.svelte b/src/components/PanelPreview.svelte index 8038752..b1503d6 100644 --- a/src/components/PanelPreview.svelte +++ b/src/components/PanelPreview.svelte @@ -3,8 +3,6 @@ import { onMount } from "svelte"; import { browser } from "$app/environment"; import { panelStore } from "../stores/panelStore"; - import type { Panel } from "../lib/types/panel"; - import type { PageProps } from "./$types"; let { onDownload }: { onDownload?: () => void; @@ -12,16 +10,16 @@ let Stage: any; let Layer: any; - let Image: any; + let KonvaImage: any; let Text: any; - let currentPanel = $state(null); let backgroundImage: HTMLImageElement | undefined = $state(undefined); $effect(() => { - currentPanel = $panelStore; - if (currentPanel?.backgroundImage) { - loadImage(currentPanel.backgroundImage); + if (!browser) return; + const panel = $panelStore; + if (panel?.backgroundImage && panel.backgroundImage !== backgroundImage?.src) { + loadImage(panel.backgroundImage); } }); @@ -30,7 +28,7 @@ const svelteKonva = await import("svelte-konva"); Stage = svelteKonva.Stage; Layer = svelteKonva.Layer; - Image = svelteKonva.Image; + KonvaImage = svelteKonva.Image; Text = svelteKonva.Text; } }); @@ -50,10 +48,12 @@ } function getTextPosition(textItem: any) { + const panel = $panelStore; + if (!panel) return { x: 0, y: 0 }; const panelWidth = 320; const paddingX = textItem.paddingX || 0; const verticalOffset = textItem.verticalOffset || 0; - const centerY = currentPanel!.height / 2 + verticalOffset; + const centerY = panel.height / 2 + verticalOffset; switch (textItem.textAlign) { case "left": @@ -70,26 +70,26 @@

Предпросмотр панели

- {#if currentPanel} + {#if $panelStore} {/if}
- {#if currentPanel && Stage} + {#if $panelStore && Stage}

Чистая картинка

- + {#if backgroundImage} - {/if} @@ -101,16 +101,16 @@

С текстом

- + {#if backgroundImage} - {/if} - {#each currentPanel.texts as textItem (textItem.id)} + {#each $panelStore.texts || [] as textItem (textItem.id)} {@const textPosition = getTextPosition(textItem)} { - if (currentPanel?.backgroundImage) { + if (!browser) return; + if (currentPanel?.backgroundImage && currentPanel.backgroundImage !== bgImage?.src) { loadImage(currentPanel.backgroundImage); } }); @@ -69,7 +70,7 @@
- + { - // Инициализация - }); - function handleImageUpload(image: string) { uploadedImage = image; errorMessage = null; @@ -127,9 +123,11 @@
@@ -189,6 +187,15 @@ font-weight: 500; } + .loading { + text-align: center; + padding: 2rem; + color: #666; + background: #f9f9f9; + border-radius: 8px; + border: 2px solid #e9ecef; + } + .btn { padding: 0.75rem 1.5rem; border: none;