fix: resolve preview image not visible
This commit is contained in:
@@ -3,8 +3,6 @@
|
|||||||
import { onMount } from "svelte";
|
import { onMount } from "svelte";
|
||||||
import { browser } from "$app/environment";
|
import { browser } from "$app/environment";
|
||||||
import { panelStore } from "../stores/panelStore";
|
import { panelStore } from "../stores/panelStore";
|
||||||
import type { Panel } from "../lib/types/panel";
|
|
||||||
import type { PageProps } from "./$types";
|
|
||||||
|
|
||||||
let { onDownload }: {
|
let { onDownload }: {
|
||||||
onDownload?: () => void;
|
onDownload?: () => void;
|
||||||
@@ -12,16 +10,16 @@
|
|||||||
|
|
||||||
let Stage: any;
|
let Stage: any;
|
||||||
let Layer: any;
|
let Layer: any;
|
||||||
let Image: any;
|
let KonvaImage: any;
|
||||||
let Text: any;
|
let Text: any;
|
||||||
|
|
||||||
let currentPanel = $state<Panel | null>(null);
|
|
||||||
let backgroundImage: HTMLImageElement | undefined = $state(undefined);
|
let backgroundImage: HTMLImageElement | undefined = $state(undefined);
|
||||||
|
|
||||||
$effect(() => {
|
$effect(() => {
|
||||||
currentPanel = $panelStore;
|
if (!browser) return;
|
||||||
if (currentPanel?.backgroundImage) {
|
const panel = $panelStore;
|
||||||
loadImage(currentPanel.backgroundImage);
|
if (panel?.backgroundImage && panel.backgroundImage !== backgroundImage?.src) {
|
||||||
|
loadImage(panel.backgroundImage);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -30,7 +28,7 @@
|
|||||||
const svelteKonva = await import("svelte-konva");
|
const svelteKonva = await import("svelte-konva");
|
||||||
Stage = svelteKonva.Stage;
|
Stage = svelteKonva.Stage;
|
||||||
Layer = svelteKonva.Layer;
|
Layer = svelteKonva.Layer;
|
||||||
Image = svelteKonva.Image;
|
KonvaImage = svelteKonva.Image;
|
||||||
Text = svelteKonva.Text;
|
Text = svelteKonva.Text;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -50,10 +48,12 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getTextPosition(textItem: any) {
|
function getTextPosition(textItem: any) {
|
||||||
|
const panel = $panelStore;
|
||||||
|
if (!panel) return { x: 0, y: 0 };
|
||||||
const panelWidth = 320;
|
const panelWidth = 320;
|
||||||
const paddingX = textItem.paddingX || 0;
|
const paddingX = textItem.paddingX || 0;
|
||||||
const verticalOffset = textItem.verticalOffset || 0;
|
const verticalOffset = textItem.verticalOffset || 0;
|
||||||
const centerY = currentPanel!.height / 2 + verticalOffset;
|
const centerY = panel.height / 2 + verticalOffset;
|
||||||
|
|
||||||
switch (textItem.textAlign) {
|
switch (textItem.textAlign) {
|
||||||
case "left":
|
case "left":
|
||||||
@@ -70,26 +70,26 @@
|
|||||||
<div class="panel-preview">
|
<div class="panel-preview">
|
||||||
<div class="preview-header">
|
<div class="preview-header">
|
||||||
<h2>Предпросмотр панели</h2>
|
<h2>Предпросмотр панели</h2>
|
||||||
{#if currentPanel}
|
{#if $panelStore}
|
||||||
<button class="btn btn-primary" onclick={handleDownload}>
|
<button class="btn btn-primary" onclick={handleDownload}>
|
||||||
Скачать
|
Скачать
|
||||||
</button>
|
</button>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{#if currentPanel && Stage}
|
{#if $panelStore && Stage}
|
||||||
<div class="preview-sections">
|
<div class="preview-sections">
|
||||||
<!-- Превью чистой картинки -->
|
<!-- Превью чистой картинки -->
|
||||||
<div class="preview-section">
|
<div class="preview-section">
|
||||||
<h3>Чистая картинка</h3>
|
<h3>Чистая картинка</h3>
|
||||||
<div class="canvas-container">
|
<div class="canvas-container">
|
||||||
<Stage width={320} height={currentPanel.height}>
|
<Stage width={320} height={$panelStore.height}>
|
||||||
<Layer>
|
<Layer>
|
||||||
{#if backgroundImage}
|
{#if backgroundImage}
|
||||||
<Image
|
<KonvaImage
|
||||||
image={backgroundImage}
|
image={backgroundImage}
|
||||||
width={320}
|
width={320}
|
||||||
height={currentPanel.height}
|
height={$panelStore.height}
|
||||||
/>
|
/>
|
||||||
{/if}
|
{/if}
|
||||||
</Layer>
|
</Layer>
|
||||||
@@ -101,16 +101,16 @@
|
|||||||
<div class="preview-section">
|
<div class="preview-section">
|
||||||
<h3>С текстом</h3>
|
<h3>С текстом</h3>
|
||||||
<div class="canvas-container">
|
<div class="canvas-container">
|
||||||
<Stage width={320} height={currentPanel.height}>
|
<Stage width={320} height={$panelStore.height}>
|
||||||
<Layer>
|
<Layer>
|
||||||
{#if backgroundImage}
|
{#if backgroundImage}
|
||||||
<Image
|
<KonvaImage
|
||||||
image={backgroundImage}
|
image={backgroundImage}
|
||||||
width={320}
|
width={320}
|
||||||
height={currentPanel.height}
|
height={$panelStore.height}
|
||||||
/>
|
/>
|
||||||
{/if}
|
{/if}
|
||||||
{#each currentPanel.texts as textItem (textItem.id)}
|
{#each $panelStore.texts || [] as textItem (textItem.id)}
|
||||||
{@const textPosition = getTextPosition(textItem)}
|
{@const textPosition = getTextPosition(textItem)}
|
||||||
<Text
|
<Text
|
||||||
text={textItem.text}
|
text={textItem.text}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
let Stage: any;
|
let Stage: any;
|
||||||
let Layer: any;
|
let Layer: any;
|
||||||
let Image: any;
|
let KonvaImage: any;
|
||||||
let Text: any;
|
let Text: any;
|
||||||
let bgImage: HTMLImageElement | undefined = $state(undefined);
|
let bgImage: HTMLImageElement | undefined = $state(undefined);
|
||||||
let currentPanel = $state($panelStore);
|
let currentPanel = $state($panelStore);
|
||||||
@@ -24,13 +24,14 @@
|
|||||||
const svelteKonva = await import("svelte-konva");
|
const svelteKonva = await import("svelte-konva");
|
||||||
Stage = svelteKonva.Stage;
|
Stage = svelteKonva.Stage;
|
||||||
Layer = svelteKonva.Layer;
|
Layer = svelteKonva.Layer;
|
||||||
Image = svelteKonva.Image;
|
KonvaImage = svelteKonva.Image;
|
||||||
Text = svelteKonva.Text;
|
Text = svelteKonva.Text;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
$effect(() => {
|
$effect(() => {
|
||||||
if (currentPanel?.backgroundImage) {
|
if (!browser) return;
|
||||||
|
if (currentPanel?.backgroundImage && currentPanel.backgroundImage !== bgImage?.src) {
|
||||||
loadImage(currentPanel.backgroundImage);
|
loadImage(currentPanel.backgroundImage);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -69,7 +70,7 @@
|
|||||||
<div class="canvas-container">
|
<div class="canvas-container">
|
||||||
<Stage width={320} {height}>
|
<Stage width={320} {height}>
|
||||||
<Layer>
|
<Layer>
|
||||||
<Image image={bgImage} width={320} {height} />
|
<KonvaImage image={bgImage} width={320} {height} />
|
||||||
<Text
|
<Text
|
||||||
text={textItem.text}
|
text={textItem.text}
|
||||||
fontSize={textItem.fontSize}
|
fontSize={textItem.fontSize}
|
||||||
|
|||||||
+12
-5
@@ -33,10 +33,6 @@
|
|||||||
currentPanel = $panelStore;
|
currentPanel = $panelStore;
|
||||||
});
|
});
|
||||||
|
|
||||||
onMount(() => {
|
|
||||||
// Инициализация
|
|
||||||
});
|
|
||||||
|
|
||||||
function handleImageUpload(image: string) {
|
function handleImageUpload(image: string) {
|
||||||
uploadedImage = image;
|
uploadedImage = image;
|
||||||
errorMessage = null;
|
errorMessage = null;
|
||||||
@@ -127,9 +123,11 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="sidebar">
|
<div class="sidebar">
|
||||||
{#if $uiStore.currentStep === "text" && PanelPreview}
|
{#if $uiStore.currentStep === "text" && PanelPreview?.default}
|
||||||
{@const Preview = PanelPreview.default}
|
{@const Preview = PanelPreview.default}
|
||||||
<Preview onDownload={handleDownload} />
|
<Preview onDownload={handleDownload} />
|
||||||
|
{:else if $uiStore.currentStep === "text"}
|
||||||
|
<div class="loading">Загрузка предпросмотра...</div>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -189,6 +187,15 @@
|
|||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.loading {
|
||||||
|
text-align: center;
|
||||||
|
padding: 2rem;
|
||||||
|
color: #666;
|
||||||
|
background: #f9f9f9;
|
||||||
|
border-radius: 8px;
|
||||||
|
border: 2px solid #e9ecef;
|
||||||
|
}
|
||||||
|
|
||||||
.btn {
|
.btn {
|
||||||
padding: 0.75rem 1.5rem;
|
padding: 0.75rem 1.5rem;
|
||||||
border: none;
|
border: none;
|
||||||
|
|||||||
Reference in New Issue
Block a user