From 91b3492231974d3b67b694a313c1f91dcf5b545d Mon Sep 17 00:00:00 2001 From: Ku6epXBOCTuK Date: Mon, 24 Aug 2026 06:35:01 +0500 Subject: [PATCH] feat: restore old toolchain button --- web/src/lib/components/Preview.svelte | 1 - web/src/lib/components/ToolPage.svelte | 13 +- .../components/workspace/StepEditor.svelte | 41 --- .../lib/components/workspace/StepList.svelte | 128 -------- .../components/workspace/StepPicker.svelte | 50 ---- web/src/routes/+page.svelte | 51 +++- web/src/routes/workspace/+page.svelte | 281 ------------------ 7 files changed, 58 insertions(+), 507 deletions(-) delete mode 100644 web/src/lib/components/workspace/StepEditor.svelte delete mode 100644 web/src/lib/components/workspace/StepList.svelte delete mode 100644 web/src/lib/components/workspace/StepPicker.svelte delete mode 100644 web/src/routes/workspace/+page.svelte diff --git a/web/src/lib/components/Preview.svelte b/web/src/lib/components/Preview.svelte index c1d6b15..c7196a2 100644 --- a/web/src/lib/components/Preview.svelte +++ b/web/src/lib/components/Preview.svelte @@ -94,7 +94,6 @@ repeating-conic-gradient(var(--check-a) 0% 25%, var(--check-b) 0% 50%); background-size: 16px 16px; border: 1px solid var(--border); - border-radius: var(--radius-m); } canvas.pipette { diff --git a/web/src/lib/components/ToolPage.svelte b/web/src/lib/components/ToolPage.svelte index 8a96d73..7e5cc4d 100644 --- a/web/src/lib/components/ToolPage.svelte +++ b/web/src/lib/components/ToolPage.svelte @@ -3,7 +3,7 @@ import { decodeFile, isSupportedImage, unsupportedImageMessage } from '$lib/core/io'; import type { PixelImage } from '$lib/core/types'; import { defaultParams, getTool, outputOf, sanitizeParams, type ToolEntry } from '$lib/registry'; - import { newStepId, type PipelineStep } from '$lib/tools/pipeline'; + import { loadStoredSteps, newStepId, saveSteps, type PipelineStep } from '$lib/tools/pipeline'; import DownloadButton from './DownloadButton.svelte'; import ParamForm from './ParamForm.svelte'; import Preview from './Preview.svelte'; @@ -15,7 +15,7 @@ import SourceCard from './tool/SourceCard.svelte'; import TextInputCard from './tool/TextInputCard.svelte'; - let { tool }: { tool: ToolEntry } = $props(); + let { tool, restoreChain = false }: { tool: ToolEntry; restoreChain?: boolean } = $props(); type Status = 'idle' | 'loaded' | 'processing' | 'error'; @@ -28,7 +28,8 @@ let info = $state(null); let errorText = $state(''); let values = $state>({}); - let chain = $state([]); + // svelte-ignore state_referenced_locally + let chain = $state(restoreChain ? loadStoredSteps() : []); let chainResults = $state<(PixelImage | null)[]>([]); let lastRunChainJson = ''; @@ -204,6 +205,12 @@ return runner.schedule(() => void runTool()); }); + $effect(() => { + const filled = chain.filter((step) => step.toolId !== ''); + if (filled.length === 0 && !hasLastRun) return; + saveSteps(filled); + }); + function showError(e: unknown) { status = source ? 'loaded' : 'idle'; errorText = e instanceof Error ? e.message : String(e); diff --git a/web/src/lib/components/workspace/StepEditor.svelte b/web/src/lib/components/workspace/StepEditor.svelte deleted file mode 100644 index 8d439b2..0000000 --- a/web/src/lib/components/workspace/StepEditor.svelte +++ /dev/null @@ -1,41 +0,0 @@ - - -{#if tool} -
-

{tool.title}

-

{tool.description}

- {#if tool.params.length > 0} - - {:else} -

У этого шага нет параметров.

- {/if} -
-{/if} - - diff --git a/web/src/lib/components/workspace/StepList.svelte b/web/src/lib/components/workspace/StepList.svelte deleted file mode 100644 index 529e7af..0000000 --- a/web/src/lib/components/workspace/StepList.svelte +++ /dev/null @@ -1,128 +0,0 @@ - - -{#if steps.length === 0} -

Цепочка пуста — добавьте первый инструмент.

-{:else} -
    - {#each steps as step, index (step.id)} -
  1. - - - - - - -
  2. - {/each} -
-{/if} - - diff --git a/web/src/lib/components/workspace/StepPicker.svelte b/web/src/lib/components/workspace/StepPicker.svelte deleted file mode 100644 index 4a38ccf..0000000 --- a/web/src/lib/components/workspace/StepPicker.svelte +++ /dev/null @@ -1,50 +0,0 @@ - - -
- - -
- - diff --git a/web/src/routes/+page.svelte b/web/src/routes/+page.svelte index a807a4d..47a114f 100644 --- a/web/src/routes/+page.svelte +++ b/web/src/routes/+page.svelte @@ -2,8 +2,40 @@ import { getTool } from '$lib/registry'; import ToolPage from '$lib/components/ToolPage.svelte'; import ToolSearch from '$lib/components/search/ToolSearch.svelte'; + import Button from '$lib/components/ui/Button.svelte'; + + const LAST_TOOL_KEY = 'last-tool-id'; + + function loadLastToolId(): string | null { + if (typeof localStorage === 'undefined') return null; + try { + const id = localStorage.getItem(LAST_TOOL_KEY); + return id !== null && getTool(id) ? id : null; + } catch { + return null; + } + } let selectedId = $state(null); + let restoreOnOpen = $state(false); + let lastToolId = $state(loadLastToolId()); + + function openTool(id: string, restore = false) { + if (!getTool(id)) return; + selectedId = id; + restoreOnOpen = restore; + lastToolId = id; + if (typeof localStorage === 'undefined') return; + try { + localStorage.setItem(LAST_TOOL_KEY, id); + } catch { + // приватный режим — просто не запоминаем + } + } + + function closeTool() { + selectedId = null; + } let selected = $derived(selectedId !== null ? (getTool(selectedId) ?? null) : null); @@ -18,15 +50,23 @@

Что делаем с изображением?

Найдите инструмент — все операции выполняются локально в браузере.

- (selectedId = id)} /> + openTool(id)} /> + {#if lastToolId !== null && getTool(lastToolId)} + {@const restoreId = lastToolId} +
+ +
+ {/if}
{:else}
- {#key selectedId} - + {/key}
{/if} @@ -46,6 +86,11 @@ margin: 0 auto var(--space-4); } + .restore-row { + max-width: 36rem; + margin: var(--space-2) auto 0; + } + .back { display: inline-block; margin-bottom: var(--space-3); diff --git a/web/src/routes/workspace/+page.svelte b/web/src/routes/workspace/+page.svelte deleted file mode 100644 index 8970d94..0000000 --- a/web/src/routes/workspace/+page.svelte +++ /dev/null @@ -1,281 +0,0 @@ - - - - -
-

Рабочая область

-

- Цепочка инструментов: результат каждого шага становится входом следующего. -

- - {#if errorText} - - {/if} - -
-
- -
- -
-

Шаги

- - (selectedId = steps[index]?.id ?? null)} - onMoveUp={moveUp} - onMoveDown={moveDown} - onRemove={removeStep} - /> - {#if selectedIndex >= 0 && steps[selectedIndex]} - - {/if} -
- -
-

Итог

- {#if !source} -
- -
- {:else if status === 'processing' && !shownResult} -
- -
- {:else} -
- - {#if status === 'processing'} - Пересчёт… - {/if} -
- showError(e instanceof Error ? e.message : String(e))} - /> - {/if} -
-
-
- -