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 (
-