diff --git a/src/components/ImageCropper.svelte b/src/components/ImageCropper.svelte
index f05bfb9..c537558 100644
--- a/src/components/ImageCropper.svelte
+++ b/src/components/ImageCropper.svelte
@@ -4,6 +4,7 @@
import type { ImageCropResult } from "../lib/types/panel";
import { ImageService } from "../lib/services/imageService";
import { uiStore, setLoading } from "../stores/uiStore";
+ import { Button } from "../lib/components/ui";
let {
imageSrc,
@@ -107,10 +108,10 @@
{/if}
@@ -167,39 +168,6 @@
border: 1px solid #ffcdd2;
}
- .btn {
- padding: 0.75rem 1.5rem;
- border: none;
- border-radius: 4px;
- font-size: 1rem;
- cursor: pointer;
- transition: all 0.3s ease;
- font-weight: 500;
- }
-
- .btn:disabled {
- opacity: 0.5;
- cursor: not-allowed;
- }
-
- .btn-primary {
- background: #007bff;
- color: white;
- }
-
- .btn-primary:hover:not(:disabled) {
- background: #0056b3;
- }
-
- .btn-secondary {
- background: #6c757d;
- color: white;
- }
-
- .btn-secondary:hover:not(:disabled) {
- background: #545b62;
- }
-
:global(.cropper-view-box),
:global(.cropper-face) {
border-radius: 0;
diff --git a/src/components/ImageUpload.svelte b/src/components/ImageUpload.svelte
index 62c3f0a..16fe18f 100644
--- a/src/components/ImageUpload.svelte
+++ b/src/components/ImageUpload.svelte
@@ -5,6 +5,7 @@
import { ImageService } from "../lib/services/imageService";
import { handleError } from "../lib/utils/errorHandler";
import type { ImageUploadResult } from "../lib/types/panel";
+ import { Button } from "../lib/components/ui";
let imageService = new ImageService();
@@ -155,7 +156,7 @@
-
+
{:else}
@@ -183,11 +184,11 @@
Перетащите файл сюда, нажмите для выбора, или вставьте через Ctrl+V
-
+
-
{#if showUrlInput}
@@ -199,7 +200,7 @@
required
class="url-input"
/>
-
Загрузить
+
Загрузить
{/if}
@@ -389,36 +390,4 @@
transform: rotate(360deg);
}
}
-
- .btn {
- padding: 0.5rem 1rem;
- border: none;
- border-radius: 4px;
- cursor: pointer;
- font-size: 0.9rem;
- transition: all 0.3s ease;
- }
-
- .btn-primary {
- background: #007bff;
- color: white;
- }
-
- .btn-primary:hover:not(:disabled) {
- background: #0056b3;
- }
-
- .btn-secondary {
- background: #6c757d;
- color: white;
- }
-
- .btn-secondary:hover:not(:disabled) {
- background: #545b62;
- }
-
- .btn:disabled {
- opacity: 0.6;
- cursor: not-allowed;
- }
diff --git a/src/components/PanelList.svelte b/src/components/PanelList.svelte
index dbf03c8..c6819d4 100644
--- a/src/components/PanelList.svelte
+++ b/src/components/PanelList.svelte
@@ -4,6 +4,7 @@
import { panelStore } from "../stores/panelStore";
import { panelStorage } from "../lib/utils/panelStorage";
import type { Panel } from "../lib/types/panel";
+ import { IconButton } from "../lib/components/ui";
let { onPanelSelect, onPanelDelete }: {
onPanelSelect: (panel: Panel) => void;
@@ -75,9 +76,9 @@
{#if errorMessage}
@@ -118,13 +119,13 @@
- { e.stopPropagation(); handlePanelDelete(panel.id); }}
- aria-label="Удалить панель"
+ ariaLabel="Удалить панель"
>
🗑️
-
+
@@ -158,21 +159,6 @@
font-size: 1.5rem;
}
- .btn-refresh {
- background: none;
- border: none;
- font-size: 1.5rem;
- cursor: pointer;
- padding: 0.5rem;
- color: #666;
- transition: all 0.2s ease;
- }
-
- .btn-refresh:hover {
- color: #007bff;
- transform: rotate(180deg);
- }
-
.error-message {
background: #ffebee;
color: #c62828;
@@ -271,17 +257,4 @@
justify-content: flex-end;
gap: 0.5rem;
}
-
- .btn-icon {
- background: none;
- border: none;
- cursor: pointer;
- padding: 0.25rem 0.5rem;
- font-size: 1.2rem;
- transition: all 0.2s ease;
- }
-
- .btn-delete:hover {
- transform: scale(1.1);
- }
diff --git a/src/components/PanelPreview.svelte b/src/components/PanelPreview.svelte
index e8ab30d..4b8ce34 100644
--- a/src/components/PanelPreview.svelte
+++ b/src/components/PanelPreview.svelte
@@ -2,6 +2,7 @@
import { panelStore } from "../stores/panelStore";
import type { TextItem } from "../lib/types/panel";
import { Stage, Layer, Image, Text } from "svelte-konva";
+ import { Button } from "../lib/components/ui";
let {
onDownload,
@@ -56,7 +57,7 @@
@@ -171,23 +172,4 @@
margin: 0;
font-size: 0.95rem;
}
-
- .btn {
- padding: 0.6rem 1.25rem;
- border: none;
- border-radius: 6px;
- font-size: 0.95rem;
- cursor: pointer;
- transition: all 0.2s ease;
- font-weight: 500;
- }
-
- .btn-primary {
- background: #007bff;
- color: white;
- }
-
- .btn-primary:hover {
- background: #0056b3;
- }
diff --git a/src/components/TextManager.svelte b/src/components/TextManager.svelte
index d9cd848..71f9ab6 100644
--- a/src/components/TextManager.svelte
+++ b/src/components/TextManager.svelte
@@ -3,6 +3,7 @@
import { panelStore, addTextToPanel, updateTextInPanel, removeTextFromPanel } from "../stores/panelStore";
import type { TextItem } from "../lib/types/panel";
import { v4 as uuidv4 } from "uuid";
+ import { Button, IconButton } from "../lib/components/ui";
let { onTextUpdate }: {
onTextUpdate: (texts: TextItem[]) => void;
@@ -172,33 +173,36 @@
@@ -266,13 +268,13 @@
{#each currentPanel.texts as textItem (textItem.id)}
{textItem.text}
- handleRemoveText(textItem.id)}
- aria-label="Удалить текст"
+ ariaLabel="Удалить текст"
>
×
-
+
{/each}
@@ -323,28 +325,6 @@
gap: 0.5rem;
}
- .btn-align {
- flex: 1;
- padding: 0.5rem;
- border: 2px solid #ddd;
- border-radius: 4px;
- background: white;
- cursor: pointer;
- font-size: 1.2rem;
- transition: all 0.2s ease;
- }
-
- .btn-align:hover {
- border-color: #007bff;
- background: #f0f8ff;
- }
-
- .btn-align.active {
- background: #007bff;
- color: white;
- border-color: #007bff;
- }
-
.add-text-section {
display: flex;
flex-direction: column;
@@ -369,25 +349,6 @@
border-color: #007bff;
}
- .btn {
- padding: 0.6rem 1.25rem;
- border: none;
- border-radius: 6px;
- font-size: 0.95rem;
- cursor: pointer;
- transition: all 0.2s ease;
- font-weight: 500;
- }
-
- .btn-primary {
- background: #007bff;
- color: white;
- }
-
- .btn-primary:hover {
- background: #0056b3;
- }
-
.error-message {
background: #ffebee;
color: #c62828;
@@ -425,21 +386,6 @@
flex: 1;
}
- .btn-icon {
- background: none;
- border: none;
- cursor: pointer;
- padding: 0.25rem 0.5rem;
- font-size: 1.25rem;
- color: #dc3545;
- transition: all 0.2s ease;
- line-height: 1;
- }
-
- .btn-icon:hover {
- color: #a71d2a;
- }
-
.text-controls {
padding: 1rem;
display: flex;
diff --git a/src/lib/components/ui/Button.svelte b/src/lib/components/ui/Button.svelte
new file mode 100644
index 0000000..d998c83
--- /dev/null
+++ b/src/lib/components/ui/Button.svelte
@@ -0,0 +1,139 @@
+
+
+