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 @@
Uploaded preview
- +
{: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 @@
- +
@@ -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 @@

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

{#if $panelStore} - + {/if}
@@ -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 @@ @@ -250,9 +254,7 @@ class="text-input" maxlength="100" /> - + {#if errorMessage}
@@ -266,13 +268,13 @@ {#each currentPanel.texts as textItem (textItem.id)}
{textItem.text} - +
{/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 @@ + + + + + diff --git a/src/lib/components/ui/IconButton.svelte b/src/lib/components/ui/IconButton.svelte new file mode 100644 index 0000000..4d6ce10 --- /dev/null +++ b/src/lib/components/ui/IconButton.svelte @@ -0,0 +1,100 @@ + + + + + diff --git a/src/lib/components/ui/index.ts b/src/lib/components/ui/index.ts new file mode 100644 index 0000000..f45aa98 --- /dev/null +++ b/src/lib/components/ui/index.ts @@ -0,0 +1,2 @@ +export { default as Button } from "./Button.svelte"; +export { default as IconButton } from "./IconButton.svelte";