From ea8284b48263a24d713ea784bbcfafce33aa152a Mon Sep 17 00:00:00 2001 From: DemonGatanjieu <1027066412@qq.com> Date: Wed, 9 Sep 2026 21:58:46 +0800 Subject: [PATCH] fix(ui): replace ugly pink toolbox emoji with elegant vector asset cube SVG across sidebar and materials --- web/modules/locales.js | 4 ++-- web/modules/ui_materials.js | 14 ++++++++++++-- web/modules/ui_recipe_detail.js | 3 ++- web/modules/ui_sidebar.js | 4 ++-- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/web/modules/locales.js b/web/modules/locales.js index 6173780..c032b83 100644 --- a/web/modules/locales.js +++ b/web/modules/locales.js @@ -182,7 +182,7 @@ export const i18n = {

1. 🔄 前置准备 (扫描向导)
具体位置:界面左侧底部的 扫描向导 (🔄)。
这是最重要的前置操作!请先打开扫描向导执行扫描。切记保持网络畅通。部分 C站限制级模型信息需要在设置中填入 API-KEY。扫描完成后,插件的各项功能基本激活。

2. 🩺 拯救爆红 (模型医生)
具体位置:左侧底部第二个 听诊器 (🩺) 按钮。
当导入别人使用该插件输出的工作流或者图片时,若模型路径爆红,点击模型医生就能智能识别当前所有节点实现正确路径的替换。

3. 🤖 选中交互与参数预设 (节点助手)
具体位置:左侧第三个 机器人 (🤖) 按钮。
在画布上选中节点后,“动作”页可以可视化替换模型,或在兼容的 MODEL + CLIP 链前后插入 LoRA。“参数方案”页会按配方分组读取工作流配方保存的同类型节点参数;点击一条记录即可把参数应用到当前选中节点。例如选中 KSampler 后,可一键载入配方中的采样器、调度器、步数、CFG 与降噪等值;种子等每次运行变化的参数会被忽略。

-

4. 🧰 工作流配方、参数方案与素材库
具体位置:打开 创作工作台。
配方会保存工作流、封面、标签、备注、模型引用及常用参数。未闭合的局部配方默认追加到当前画布,可独立运行的整体配方会在新画布打开;两者都支持导入/导出配方包。详情页包含概览、参数方案、图库和版本:可匹配本地模型、查看与复制完整参数、比较历史出图参数、比较或恢复配方版本。主图库或配方图库的图片悬浮后可进入参数详情,把原图、完整工作流和节点参数保存为一个素材快照;素材库可打开完整工作流,节点助手则按当前节点类型筛选并应用其中的参数。参数方案可从当前画布读取同一骨架的新参数,也可编辑安全控件并保存;“应用到当前工作流”只会在骨架匹配后写入参数。

+

4. 📦 工作流配方、参数方案与素材库
具体位置:打开 创作工作台。
配方会保存工作流、封面、标签、备注、模型引用及常用参数。未闭合的局部配方默认追加到当前画布,可独立运行的整体配方会在新画布打开;两者都支持导入/导出配方包。详情页包含概览、参数方案、图库和版本:可匹配本地模型、查看与复制完整参数、比较历史出图参数、比较或恢复配方版本。主图库或配方图库的图片悬浮后可进入参数详情,把原图、完整工作流和节点参数保存为一个素材快照;素材库可打开完整工作流,节点助手则按当前节点类型筛选并应用其中的参数。参数方案可从当前画布读取同一骨架的新参数,也可编辑安全控件并保存;“应用到当前工作流”只会在骨架匹配后写入参数。

5. ⚙️ 个性化配置 (设置面板)
具体位置:左侧底部的 齿轮 (⚙️) 按钮。
可以调节语言、主页面字体大小;进入“模型设置”可选择视频封面始终播放或悬停播放,以及卡片使用流畅缩略图或原始封面。详情页始终保留原图画质。

6. 📑 顶部导航与提示词笔记
具体位置:右侧顶部的按钮分别为 模型 (📦)、图库 (🖼️)、创作工作台 (📑)、停靠侧边栏 (◧)。
进入创作工作台的“提示词笔记”,点击新建 ➕。选择基础模型、主模型和 LoRA 后,可通过 📝纯文本/粘贴 填入提示词并进行双语对照、分块、查找替换和标签编辑,最后点击 🚀 发送到画布 一键组装节点。

7. 📁 文件夹管理 (Folder Manager)
具体位置:设置 (⚙️) 面板内的 📁 文件夹管理。
可以用来隐藏不需要的内置文件夹。隐藏后的文件夹不仅从侧边栏消失,后端的静默扫描和本地读取也会完全跳过,实现真正的“零性能损耗”。并且可以在这里拖拽调整文件夹在侧边栏显示的顺序。

@@ -1204,7 +1204,7 @@ export const i18n = {

1. 🔄 Prerequisites (Scan Wizard)
Location: The Scan (🔄) icon at the bottom left.
This is the most crucial step! Open the Scan Wizard and execute a scan. Keep your network connected. (API-KEY may be needed in Settings for NSFW Civitai models). Scanning activates all core features.

2. 🩺 Fix Broken Nodes (Model Doctor)
Location: The 2nd icon (Stethoscope 🩺) from the bottom left.
When importing a workflow/image exported by this plugin and nodes turn red, open the Model Doctor to intelligently identify and replace them with correct local paths.

3. 🤖 Node actions and parameter presets (Node Assistant)
Location: The 3rd icon (Robot 🤖) from the bottom left.
After selecting a canvas node, Actions can visually replace its model or insert a LoRA before/after a compatible MODEL + CLIP chain. Parameter Presets reads same-type node values saved by Workflow Recipes and groups them by recipe. Click one record to apply it to the selected node. For example, selecting a KSampler can load its sampler, scheduler, steps, CFG, and denoise values in one click; volatile values such as seeds are ignored.

-

4. 🧰 Workflow Recipes and Parameter Sets
Location: Open the Creative Workspace and switch to Workflow Recipes.
A recipe saves the workflow, cover, tags, notes, model references, and common parameters. Open partial recipes append to the current canvas, while independently runnable complete recipes open in a new canvas; both can be shared as import/export packages. Details include Overview, Parameter Set, Gallery, and Versions for local model matching, full parameter viewing/copying, output comparison, and version comparison/restoration. Parameter notes can capture fresh values from a matching live canvas or edit safe controls; Apply to Current Workflow writes only after the recipe skeleton matches. Third-party prompt nodes that cannot be classified reliably can be labelled manually.

+

4. 📦 Workflow Recipes and Parameter Sets
Location: Open the Creative Workspace and switch to Workflow Recipes.
A recipe saves the workflow, cover, tags, notes, model references, and common parameters. Open partial recipes append to the current canvas, while independently runnable complete recipes open in a new canvas; both can be shared as import/export packages. Details include Overview, Parameter Set, Gallery, and Versions for local model matching, full parameter viewing/copying, output comparison, and version comparison/restoration. Parameter notes can capture fresh values from a matching live canvas or edit safe controls; Apply to Current Workflow writes only after the recipe skeleton matches. Third-party prompt nodes that cannot be classified reliably can be labelled manually.

5. ⚙️ Settings Panel
Location: The Gear (⚙️) icon at the bottom left.
Adjust language and UI scale. Open “Model Settings” to choose always-play or hover-play video covers and optimized thumbnails or original covers. Detail pages always retain original image quality.

6. 📑 Top Navigation & Prompt Notes
Location: Top-right tabs Models (📦), Gallery (🖼️), Creative Workspace (📑), and Dock (◧).
Open Prompt Notes in the Creative Workspace and click ➕. Select a Base Model, Main Model, and LoRAs; use 📝 Edit Raw/Paste for bilingual prompts, chunking, find/replace, and tag editing; then click 🚀 Send to Canvas to assemble the nodes.

7. 📁 Folder Manager
Location: Inside the Settings (⚙️) panel, click 📁 Manage Folders.
Use this to hide unneeded built-in folders. Hidden folders will be completely skipped by background scans and I/O reads, achieving true "zero performance cost". You can also drag and drop to reorder how folders appear in the sidebar.

diff --git a/web/modules/ui_materials.js b/web/modules/ui_materials.js index dacf016..0a6fb90 100644 --- a/web/modules/ui_materials.js +++ b/web/modules/ui_materials.js @@ -14,6 +14,16 @@ const t = (key, params) => translate(key, params); const isPromptMaterial = material => ['prompt_note_bundle', 'prompt_text'].includes(material.kind); const promptKindLabel = material => t(material.kind === 'prompt_text' ? 'materialPromptTextKind' : 'materialPromptNoteBundle'); +function getMaterialPlaceholderSvg(material, size = 36) { + if (isPromptMaterial(material) || material?.kind === 'prompt_plan') { + return ``; + } + if (material?.kind === 'recipe_parameter_selection') { + return ``; + } + return ``; +} + function materialAssetUrl(filename, asset) { if (!filename || !asset) return ''; return `/anomalous/material_asset?filename=${encodeURIComponent(filename)}&asset=${encodeURIComponent(asset)}`; @@ -296,7 +306,7 @@ function buildMaterialMediaStage(owner, material, sourceNameElement) { imageStage.appendChild(image); imageStage.onclick = () => owner.showGalleryViewer?.(sourceUrl); } else { - imageStage.textContent = (isPromptMaterial(material) || material.kind === 'prompt_plan') ? '💬' : material.kind === 'recipe_parameter_selection' ? '🧰' : '🖼️'; + imageStage.innerHTML = getMaterialPlaceholderSvg(material, 56); imageStage.disabled = true; } media.appendChild(imageStage); @@ -510,7 +520,7 @@ function renderMaterialCard(owner, material) { image.draggable = false; preview.appendChild(image); } else { - preview.textContent = (isPromptMaterial(material) || material.kind === 'prompt_plan') ? '💬' : material.kind === 'recipe_parameter_selection' ? '🧰' : '🖼️'; + preview.innerHTML = getMaterialPlaceholderSvg(material, 36); } card.appendChild(preview); diff --git a/web/modules/ui_recipe_detail.js b/web/modules/ui_recipe_detail.js index f4523f4..f1965f0 100644 --- a/web/modules/ui_recipe_detail.js +++ b/web/modules/ui_recipe_detail.js @@ -2390,7 +2390,8 @@ function renderRecipeParameters(content, owner, recipe, gallery, refreshGallery, actions.className = 'anomalous-preset-item-actions anomalous-secondary-actions'; appendText(actions, 'summary', t('notebookMore')); - const saveMaterial = button(actions, '🧰', 'anomalous-preset-item-btn'); + const saveMaterial = button(actions, '', 'anomalous-preset-item-btn'); + saveMaterial.innerHTML = ``; saveMaterial.title = t('materialSaveNotebookHint'); saveMaterial.onclick = async (e) => { e.stopPropagation(); diff --git a/web/modules/ui_sidebar.js b/web/modules/ui_sidebar.js index fb00086..bcab6d1 100644 --- a/web/modules/ui_sidebar.js +++ b/web/modules/ui_sidebar.js @@ -1630,7 +1630,7 @@ export function createDOM() { importBtn.id = 'anomalous-materials-btn'; importBtn.title = t('materialLibrary'); importBtn.setAttribute('aria-label', t('materialLibrary')); - importBtn.innerHTML = `🧰`; + importBtn.innerHTML = ``; importBtn.style.background = 'transparent'; importBtn.style.color = '#ccc'; importBtn.style.border = 'none'; @@ -1639,7 +1639,7 @@ export function createDOM() { importBtn.style.fontSize = '1.1em'; importBtn.style.cursor = 'pointer'; importBtn.style.transition = 'all 0.2s ease'; - importBtn.onmouseover = () => { importBtn.style.background = 'rgba(255,255,255,0.1)'; importBtn.style.color = '#fff'; }; + importBtn.onmouseover = () => { importBtn.style.background = 'rgba(255,255,255,0.1)'; importBtn.style.color = '#2dd4bf'; }; importBtn.onmouseout = () => { importBtn.style.background = 'transparent'; importBtn.style.color = '#ccc'; }; importBtn.onclick = () => this.openMaterialLibrary();