From c93a8e493ef8464d1b1ee96869b6f99ddc0a583a Mon Sep 17 00:00:00 2001 From: Ku6epXBOCTuK Date: Sun, 23 Aug 2026 21:55:05 +0500 Subject: [PATCH] feat: add tool search component, add chainable flag --- .../lib/components/search/ToolSearch.svelte | 205 ++++++++++++++++++ web/src/lib/registry.ts | 4 + web/src/routes/+layout.svelte | 9 +- web/src/routes/+page.svelte | 117 ++++------ web/src/routes/list-tools/+page.svelte | 96 ++++++++ 5 files changed, 348 insertions(+), 83 deletions(-) create mode 100644 web/src/lib/components/search/ToolSearch.svelte create mode 100644 web/src/routes/list-tools/+page.svelte diff --git a/web/src/lib/components/search/ToolSearch.svelte b/web/src/lib/components/search/ToolSearch.svelte new file mode 100644 index 0000000..070d5f2 --- /dev/null +++ b/web/src/lib/components/search/ToolSearch.svelte @@ -0,0 +1,205 @@ + + + + + diff --git a/web/src/lib/registry.ts b/web/src/lib/registry.ts index 17e3640..5bb6d62 100644 --- a/web/src/lib/registry.ts +++ b/web/src/lib/registry.ts @@ -92,6 +92,10 @@ export type ToolEntry = { export const PNG_OUTPUT: OutputFormat = { mime: 'image/png', ext: 'png' }; +export function isChainable(tool: ToolEntry): boolean { + return (tool.resultType ?? 'image') === 'image' && (!tool.sourceMode || tool.sourceMode === 'file'); +} + function num(params: Record, id: string): number { const v = params[id]; if (typeof v !== 'number' || !Number.isFinite(v)) { diff --git a/web/src/routes/+layout.svelte b/web/src/routes/+layout.svelte index a49710e..c12efac 100644 --- a/web/src/routes/+layout.svelte +++ b/web/src/routes/+layout.svelte @@ -1,7 +1,6 @@ @@ -13,11 +12,9 @@
easy-png-tools -
diff --git a/web/src/routes/+page.svelte b/web/src/routes/+page.svelte index 186ac8f..048b051 100644 --- a/web/src/routes/+page.svelte +++ b/web/src/routes/+page.svelte @@ -1,97 +1,60 @@ - easy-png-tools — PNG-утилиты прямо в браузере - + + {selected ? `${selected.title} — easy-png-tools` : 'easy-png-tools — PNG-утилиты прямо в браузере'} + -

easy-png-tools

-

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

- -{#each CATEGORIES as category (category.id)} - {@const categoryTools = TOOLS.filter((tool) => tool.category === category.id)} - {#if categoryTools.length > 0} -
-

{category.label}

-
- {#each categoryTools as tool (tool.id)} - - {tool.title} - {tool.description} - - {/each} -
-
- {/if} -{/each} +{#if !selected} +
+

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

+

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

+ (selectedId = id)} /> +
+{:else} +
+ + {#key selectedId} + + {/key} +
+{/if} diff --git a/web/src/routes/list-tools/+page.svelte b/web/src/routes/list-tools/+page.svelte new file mode 100644 index 0000000..8b29caf --- /dev/null +++ b/web/src/routes/list-tools/+page.svelte @@ -0,0 +1,96 @@ + + + + Все инструменты — easy-png-tools + + + +

Каталог инструментов

+

+ {TOOLS.length} утилит для работы с PNG. Все операции выполняются локально в браузере. +

+ +{#each CATEGORIES as category (category.id)} + {@const categoryTools = TOOLS.filter((tool) => tool.category === category.id)} + {#if categoryTools.length > 0} +
+

{category.label}

+
+ {#each categoryTools as tool (tool.id)} + + {tool.title} + {tool.description} + + {/each} +
+
+ {/if} +{/each} + +