diff --git a/studio/frontend/src/features/images/images-page.tsx b/studio/frontend/src/features/images/images-page.tsx index 1b5fb5f528..49eb023a78 100644 --- a/studio/frontend/src/features/images/images-page.tsx +++ b/studio/frontend/src/features/images/images-page.tsx @@ -4,16 +4,22 @@ import { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from "react"; import { ArrowDown01Icon, + ArrowExpand01Icon, ArrowLeftRightIcon, ArrowReloadHorizontalIcon, CheckmarkCircle02Icon, Delete02Icon, Download01Icon, + Edit03Icon, ImageAdd02Icon, + ImageUpload01Icon, InformationCircleIcon, + MagicWand01Icon, LayoutAlignRightIcon, + PaintBrush02Icon, PencilEdit02Icon, Settings02Icon, + ZoomInAreaIcon, } from "@hugeicons/core-free-icons"; import { HugeiconsIcon } from "@hugeicons/react"; import { TestTubeOutlineIcon } from "@/lib/hugeicons-derived"; @@ -98,42 +104,55 @@ const WORKFLOW_TABS: Array<{ id: WorkflowId; label: string; requires: string | null; + icon: typeof PencilEdit02Icon; hint?: string; }> = [ - { id: "create", label: "Create", requires: null, hint: "Generate a new image from a prompt" }, + { + id: "create", + label: "Create", + requires: null, + icon: PencilEdit02Icon, + hint: "Generate a new image from a prompt", + }, { id: "transform", label: "Transform", + icon: MagicWand01Icon, requires: "img2img", hint: "Redraw an uploaded image guided by your prompt (img2img)", }, { id: "inpaint", label: "Inpaint", + icon: PaintBrush02Icon, requires: "inpaint", hint: "Paint over a region to regenerate just that area, keeping the rest", }, { id: "extend", label: "Extend", + icon: ArrowExpand01Icon, requires: "outpaint", hint: "Outpaint: grow the canvas and fill the new edges from your prompt", }, { id: "upscale", label: "Upscale", + icon: ZoomInAreaIcon, requires: "upscale", hint: "Hires fix: enlarge an uploaded image and re-detail it at higher resolution", }, { id: "reference", label: "Reference", + icon: ImageUpload01Icon, requires: "reference", hint: "Generate a new image guided by a reference image + your prompt (FLUX.2)", }, { id: "edit", label: "Edit", + icon: Edit03Icon, requires: "edit", hint: "Instruction editing: change an image with a prompt (Qwen-Image-Edit)", }, @@ -2313,7 +2332,7 @@ export function ImagesPage({ active = true }: { active?: boolean }) { /* ── Controls rail + preview canvas. Padding mirrors the other tabs (Export, Data Recipes): px-5 / sm:px-9, with a roomy bottom. pt-3 keeps the cards off the model selector row. ── */ -
+
{/* The controls rail. Plain card (the gray surface) with no header — the prompt + Generate button make the panel self-explanatory. */}
@@ -2322,59 +2341,69 @@ export function ImagesPage({ active = true }: { active?: boolean }) { its hint, and each row explains itself. A row is disabled until the loaded model supports it (status.workflows), with the reason in place of the hint. New workflows slot in without shrinking anything. */} - - - - - {/* DropdownMenuContent already tracks the trigger width, so the rows get - the full rail width for their hints. */} - - {WORKFLOW_TABS.map((t) => { - const enabled = workflowEnabled(t); - return ( - setWorkflow(t.id)} - className="items-start gap-2" - > - - - {t.label} - - {enabled - ? t.hint - : `Needs a loaded model that supports ${t.label.toLowerCase()}`} + + + + {/* DropdownMenuContent already tracks the trigger width, so the rows get + the full rail width for their hints. */} + + {WORKFLOW_TABS.map((t) => { + const enabled = workflowEnabled(t); + return ( + setWorkflow(t.id)} + className="items-start gap-2" + > + + + {t.label} + + {enabled + ? t.hint + : `Needs a loaded model that supports ${t.label.toLowerCase()}`} + - - - ); - })} - - + + + ); + })} + + + {/* Description sits under the closed trigger, matching the Field hints + below it, so the button itself stays one line. */} +

+ {activeWorkflowTab.hint} +

+
{workflow === "transform" && ( <> diff --git a/studio/frontend/src/features/images/train/diffusion-train-panel.tsx b/studio/frontend/src/features/images/train/diffusion-train-panel.tsx index e9c284b6cc..a89076f141 100644 --- a/studio/frontend/src/features/images/train/diffusion-train-panel.tsx +++ b/studio/frontend/src/features/images/train/diffusion-train-panel.tsx @@ -990,7 +990,7 @@ export function DiffusionTrainPanel({ ); return ( -
+
{/* Left: configure */}
@@ -1218,7 +1218,9 @@ export function DiffusionTrainPanel({ front) plus the previous-runs history; during/after a run the live view takes over (progress with Stop, then the saved-adapter card ABOVE the charts). Selecting a previous run re-plots its persisted logs read-only. */} -
+ {/* p-px so the cards' ring-1 (drawn outside the box) isn't clipped by this + scroll container. */} +
{viewRun && !hasRun ? ( <>