diff --git a/web/src/lib/components/ToolPage.svelte b/web/src/lib/components/ToolPage.svelte index 8b600fb..3b41797 100644 --- a/web/src/lib/components/ToolPage.svelte +++ b/web/src/lib/components/ToolPage.svelte @@ -14,14 +14,12 @@ import { executeStep } from '$lib/tools/executor'; import { t } from '$lib/i18n/t'; import { toolDescription, toolTitle } from '$lib/i18n/tool-strings'; - import ParamsCard from './tool/ParamsCard.svelte'; - import ResultCard from './tool/ResultCard.svelte'; - import SourceCard from './tool/SourceCard.svelte'; - import TextInputCard from './tool/TextInputCard.svelte'; + import type { StageStatus } from './stage/stage-props'; + import ToolStageClassic from './stage/ToolStageClassic.svelte'; let { tool, restoreChain = false }: { tool: ToolEntry; restoreChain?: boolean } = $props(); - type Status = 'idle' | 'loaded' | 'processing' | 'error'; + type Status = StageStatus; let status = $state('idle'); let source = $state(null); @@ -267,61 +265,34 @@ {/if} -
-
- {#if !isSourceless} - -
- {#if isTextSource && !source} - - {:else} - (errorText = errorMessage(e))} - onReset={reset} - pipetteActive={!!pipetteTargetId} - onPickColor={handlePickColor} - /> - {/if} -
- {/if} - -
- 0} - onDownloadError={showError} - /> -
-
- - {#if (source || isSourceless) && !isInfo && (tool.params.length > 0 || hasMask)} -
- -
- - {/if} -
+ 0} + hasMask={hasMask} + bind:showMask + bind:values + pipetteTargetId={pipetteTargetId} + handleFile={handleFile} + onTextSubmit={handleTextSubmit} + onSourceError={(e) => (errorText = errorMessage(e))} + reset={reset} + toggleChain={toggleChain} + handlePipetteToggle={handlePipetteToggle} + handlePickColor={handlePickColor} + showError={showError} + errorMessage={errorMessage} + />
{#each chain as step, index (step.id)} @@ -374,27 +345,6 @@ margin-bottom: var(--space-3); } - .tool-stage { - position: relative; - } - - .source-legend { - left: 25%; - transform: translateX(-50%); - } - - .result-legend { - left: 75%; - transform: translateX(-50%); - } - - @media (max-width: 48rem) { - .source-legend, - .result-legend { - display: none; - } - } - .empty-slot { padding: var(--space-3); } diff --git a/web/src/lib/components/stage/ToolStageClassic.svelte b/web/src/lib/components/stage/ToolStageClassic.svelte new file mode 100644 index 0000000..3673a63 --- /dev/null +++ b/web/src/lib/components/stage/ToolStageClassic.svelte @@ -0,0 +1,116 @@ + + +
+
+ {#if !isSourceless} + +
+ {#if isTextSource && !source} + + {:else} + + {/if} +
+ {/if} + +
+ +
+
+ + {#if (source || isSourceless) && !isInfo && (tool.params.length > 0 || hasMask)} +
+ +
+ + {/if} +
+ + diff --git a/web/src/lib/components/stage/stage-props.ts b/web/src/lib/components/stage/stage-props.ts new file mode 100644 index 0000000..f76cf55 --- /dev/null +++ b/web/src/lib/components/stage/stage-props.ts @@ -0,0 +1,34 @@ +import type { ImageInfo } from '$lib/core/analyze'; +import type { PixelImage } from '$lib/core/types'; +import type { ToolEntry } from '$lib/registry'; + +export type StageStatus = 'idle' | 'loaded' | 'processing' | 'error'; + +export interface StageProps { + tool: ToolEntry; + source: PixelImage | null; + result: PixelImage | null; + displayImage: PixelImage | null; + info: ImageInfo | null; + status: StageStatus; + isInfo: boolean; + isSourceless: boolean; + isTextSource: boolean; + textResult: string | null; + sanitized: Record; + canChainBase: boolean; + hasChain: boolean; + hasMask: boolean; + showMask: boolean; + values: Record; + pipetteTargetId: string | null; + handleFile: (file: File) => Promise | void; + onTextSubmit: (text: string) => Promise | void; + onSourceError: (e: unknown) => void; + reset: () => void; + toggleChain: () => void; + handlePipetteToggle: (id: string) => void; + handlePickColor: (hex: string) => void; + showError: (e: unknown) => void; + errorMessage: (e: unknown) => string; +}