diff --git a/studio/frontend/src/features/images/images-page.tsx b/studio/frontend/src/features/images/images-page.tsx index a86e1b2161..d557d89e44 100644 --- a/studio/frontend/src/features/images/images-page.tsx +++ b/studio/frontend/src/features/images/images-page.tsx @@ -39,11 +39,11 @@ import { import { Slider } from "@/components/ui/slider"; import { Spinner } from "@/components/ui/spinner"; import { Switch } from "@/components/ui/switch"; -import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Textarea } from "@/components/ui/textarea"; import { InfoHint } from "@/components/ui/info-hint"; import { ModelSelector } from "@/features/model-picker/components/model-selector"; import { IMAGE_GEN_TASKS } from "@/features/model-picker/components/model-selector/pickers"; +import { PillTabs } from "@/features/model-picker/components/model-selector/pill-tabs"; import { IMAGE_CATALOG, catalogToModelOptions, @@ -2226,30 +2226,36 @@ export function ImagesPage({ active = true }: { active?: boolean }) { open={active && selectorOpen} onOpenChange={(o) => setSelectorOpen(active && o)} /> - {/* Create | Train page-mode switch, on the left next to the model selector - (the selector itself stays leftmost: its position is shared with Chat's). - Create is the generation workspace; Train is the LoRA training workspace. */} - setPageMode(v as "create" | "train")}> - - {/* Same icons as the sidebar's New Chat / Train entries, so the - two workspaces read as the same actions everywhere. */} - {/* TabsTrigger renders children inside a plain inline span (and preflight - makes svg display:block), so the icon and label need their own flex - row to stay on one line. */} - - + {/* Create | Train page-mode switch, next to the model selector (which stays + leftmost: its position is shared with Chat's). PillTabs is the app's + segmented control, so this matches the picker and Hub toggles. Icons match + the sidebar's New chat / Train rows. Height pinned to the row's 34px. */} + setPageMode(v as "create" | "train")} + fit={true} + className="h-[34px] [&>button]:h-[34px]" + tabs={[ + { + value: "create", + label: "Create", + icon: ( - Create - - - - - - Train - - - - + ), + }, + { + value: "train", + label: "Train", + icon: ( + + ), + }, + ]} + />
{/* Single fixed toggle for the right-docked Advanced panel (mirrors Chat's settings @@ -2290,8 +2296,9 @@ 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. ── */ -
+ (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. */}
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 46753cdaaf..e9c284b6cc 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 */}