requestClose("skip")}
aria-label="Skip tour"
>
@@ -343,7 +343,7 @@ export function GuidedTour({
requestClose("skip")}
>
Skip
diff --git a/studio/frontend/src/index.css b/studio/frontend/src/index.css
index 07bef147d7..76721eaa63 100644
--- a/studio/frontend/src/index.css
+++ b/studio/frontend/src/index.css
@@ -113,7 +113,8 @@
--ease-out-quart: cubic-bezier(0.165, 0.84, 0.44, 1);
--ease-out-cubic: cubic-bezier(0.215, 0.61, 0.355, 1);
- --background: oklch(1 0 0);
+ /* Slightly warm off white; every page (and the chat surface) shares it. */
+ --background: #fefefd;
--foreground: oklch(0.2686 0 0);
--card: oklch(1 0 0);
--card-foreground: oklch(0.1281 0.0179 169.2764);
@@ -137,9 +138,9 @@
--chart-4: oklch(0.6926 0.1112 346.5775);
--chart-5: oklch(0.7497 0.1003 85.0057);
--radius: 1.1rem;
- /* Match the page background so the sidebar reads as one surface with the
- content; the faint --sidebar-border on its right edge is the separator. */
- --sidebar: oklch(1 0 0);
+ /* White sidebar against the warm off-white page; the tone difference is
+ the separator now that the right-edge divider is gone. */
+ --sidebar: #ffffff;
--sidebar-foreground: oklch(0.1281 0.0179 169.2764);
--sidebar-primary: #17b88b;
--sidebar-primary-foreground: oklch(1 0 0);
@@ -233,7 +234,8 @@
/* Exact palette from apps/studio/index_chat.html mockup. Using hex so the
rendered surface matches the mockup pixel-for-pixel — OKLCH conversion
drifted ~3% darker and shifted the neutral hue. */
- --background: #1f2023;
+ /* Slightly darker than --sidebar so the sidebar reads as its own surface. */
+ --background: #1a1b1e;
--foreground: #ececee;
--card: #2d2e32;
--card-foreground: #ececee;
@@ -245,7 +247,8 @@
--secondary-foreground: #ececee;
--muted: #2e3035;
--muted-foreground: #999999;
- --accent: #2e3035;
+ /* One step lighter than --popover so menu item hover reads clearly. */
+ --accent: #3a3d43;
--accent-foreground: #ececee;
--destructive: oklch(0.6368 0.2078 25.3313);
/* --border / --input one step lighter than --muted so outlines and form
@@ -259,14 +262,14 @@
--chart-3: oklch(0.7554 0.1285 197.339);
--chart-4: oklch(0.7503 0.1199 346.7805);
--chart-5: oklch(0.799 0.1196 84.6633);
- /* Match the page background (dark); --sidebar-border is the right-edge separator. */
+ /* A step lighter than --background; the tone difference is the separator. */
--sidebar: #1f2023;
--sidebar-foreground: #ececee;
--sidebar-primary: #17b88b;
--sidebar-primary-foreground: oklch(1 0 0);
- --sidebar-accent: #2f2f31;
+ --sidebar-accent: #2e3035;
--sidebar-accent-foreground: #ececee;
- --sidebar-border: #2d2d2f;
+ --sidebar-border: #2d2e32;
--sidebar-ring: #17b88b;
--destructive-foreground: oklch(1 0 0);
/* Match light's radius so every rounded-* element is the same in both themes. */
@@ -293,7 +296,7 @@
--nav-fg: #c7c7c4;
--nav-fg-muted: #96979b;
- --nav-surface-hover: #2e2e30;
+ --nav-surface-hover: #2e3035;
--nav-icon-idle: #5c5c5c;
--nav-beta-border: #3a3c3f;
--panel-surface-hover: #3a3c42;
@@ -305,7 +308,7 @@
--panel-surface: var(--background);
--panel-surface-fg: var(--foreground);
--panel-input-surface: #2a2b2e;
- --panel-input-surface-hover: #2e3033;
+ --panel-input-surface-hover: #34373c;
/* Soft neutral gray for muted text and sliders. Pure-ish #ababab
reads as quiet on the dark panel without going colored. */
--panel-surface-fg-muted: #ababab;
@@ -618,7 +621,7 @@
prompt button, and the chat-template textarea so all three read
as one quiet gray family, matching the focused-edit-number tint. */
.panel-input-group {
- @apply !h-9 min-h-9 min-w-0 items-stretch gap-0 rounded-[10px] pr-0 transition-colors focus-within:ring-0 focus-within:shadow-none;
+ @apply !h-9 min-h-9 min-w-0 items-stretch gap-0 rounded-[14px] pr-0 transition-colors focus-within:ring-0 focus-within:shadow-none;
border: 0 !important;
background-color: var(--panel-input-surface);
}
@@ -714,13 +717,12 @@
/* Inline numeric input — used for slider values and Context Length.
Designed to read as *editable text* rather than a pill button so
it doesn't mirror the Select/dropdown components on the panel.
- Default: transparent box, no border, no ring, sized by the
- `size` HTML attribute (each consumer picks 6 / 8 / etc. chars).
- Hover/focus: very light bg fade-in to signal editability — just
- enough to read as interactive, not enough to compete with the
- slider row's quiet aesthetic. */
+ Default: transparent box, no border, no ring; the component sets
+ an inline width that hugs the value. Hover/focus: very light bg
+ fade-in, just enough to read as interactive without competing
+ with the slider row's quiet aesthetic. */
.panel-number-input {
- @apply h-7 rounded-md border-0 bg-transparent px-1.5 text-right text-[13px]! font-medium tabular-nums text-nav-fg shadow-none transition-colors hover:bg-black/[0.04] focus:bg-black/[0.05] focus-visible:ring-0! focus-visible:outline-none md:text-[13px]!;
+ @apply h-7 min-w-8 shrink-0 rounded-full border-0 bg-transparent px-2 text-right text-[13px]! font-medium tabular-nums text-nav-fg shadow-none transition-colors hover:bg-black/[0.04] focus:bg-black/[0.05] focus-visible:ring-0! focus-visible:outline-none md:text-[13px]!;
}
.dark .panel-number-input {
@apply hover:bg-white/[0.04] focus:bg-white/[0.06];
@@ -779,7 +781,7 @@
height: 36px;
padding: 0 0.75rem !important;
gap: 9.5px !important;
- border-radius: 12px;
+ border-radius: 9999px;
font-weight: 500;
font-size: 15px;
line-height: 20px;
@@ -805,6 +807,9 @@
.dark .app-user-menu [data-slot="dropdown-menu-item"]:focus,
.dark .app-user-menu [data-slot="dropdown-menu-sub-trigger"]:focus,
.dark .app-user-menu [data-slot="dropdown-menu-sub-trigger"][data-state="open"] {
+ /* --nav-surface-hover is tuned for the page bg; on the lighter menu
+ surface it is invisible, so use the menu hover token instead. */
+ background-color: var(--accent);
color: #fff;
}
.app-user-menu [data-slot="dropdown-menu-item"]:focus *,
@@ -837,14 +842,15 @@
/* Elevated surface shadow (use ring-* for borders) */
.shadow-border {
- --tw-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);
- --tw-shadow-colored: 0 4px 16px var(--tw-shadow-color);
+ /* Chatbox shadow; dark mode drops it. */
+ --tw-shadow: 0 2px 8px -2px rgba(0, 0, 0, 0.16);
+ --tw-shadow-colored: 0 2px 8px -2px var(--tw-shadow-color);
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000),
var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.dark .shadow-border {
- --tw-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
+ box-shadow: none;
}
/* Settings dialog: no shadow in dark mode. */
@@ -852,6 +858,12 @@
box-shadow: none;
}
+ /* Lift the dialog off the page bg; halfway to --card keeps the inner
+ bg-muted / bg-background fills readable. */
+ .dark .settings-surface {
+ background-color: color-mix(in srgb, var(--background) 50%, var(--card));
+ }
+
/* App-wide: every clickable control shows the hand cursor. Disabled ones
(native :disabled, aria-disabled, Radix data-disabled) keep the default. */
button:not(:disabled):not([aria-disabled="true"]),
@@ -893,7 +905,7 @@
both themes; rounded-4xl here and on the inner Command follow this. */
--radius: 0.625rem;
/* Match the chat box: soft elevation in light, none in dark. */
- box-shadow: 0 2px 8px -2px rgba(27, 27, 31, 0.16);
+ box-shadow: 0 2px 8px -2px rgba(0, 0, 0, 0.16);
}
.dark .chat-search-surface {
@@ -902,25 +914,29 @@
.menu-soft-surface,
.menu-soft-surface-up {
+ /* Light: chatbox shadow geometry. */
--menu-soft-edge: rgba(0, 0, 0, 0.14);
- --menu-soft-shadow: rgba(0, 0, 0, 0.18);
- --menu-soft-offset-y: 8px;
- --menu-soft-blur: 28px;
- --menu-soft-spread: -6px;
+ --menu-soft-shadow: rgba(0, 0, 0, 0.16);
+ --menu-soft-offset-y: 2px;
+ --menu-soft-blur: 8px;
+ --menu-soft-spread: -2px;
@apply bg-popover text-popover-foreground;
box-shadow:
inset 0 0 0 1px var(--menu-soft-edge),
0 var(--menu-soft-offset-y) var(--menu-soft-blur)
var(--menu-soft-spread) var(--menu-soft-shadow);
}
- .menu-soft-surface-up {
- --menu-soft-offset-y: -6px;
- --menu-soft-spread: -8px;
- }
.dark .menu-soft-surface,
.dark .menu-soft-surface-up {
--menu-soft-edge: rgba(255, 255, 255, 0.07);
--menu-soft-shadow: rgba(0, 0, 0, 0.28);
+ --menu-soft-offset-y: 8px;
+ --menu-soft-blur: 28px;
+ --menu-soft-spread: -6px;
+ }
+ .dark .menu-soft-surface-up {
+ --menu-soft-offset-y: -6px;
+ --menu-soft-spread: -8px;
}
/* Model selector: drop the inset edge ring, keep the soft drop shadow.
@@ -935,6 +951,15 @@
box-shadow: none;
}
+ /* List menus: one radius in both themes, slightly tighter than --radius-lg
+ and matching the sidebar buttons. !important beats per-menu rounded-*. */
+ [data-slot="dropdown-menu-content"],
+ [data-slot="dropdown-menu-sub-content"],
+ [data-slot="select-content"],
+ [data-slot="combobox-content"] {
+ border-radius: 14px !important;
+ }
+
/* Every dropdown/menu/select/popover: borderless, chatbox shadow in light,
none in dark. !important so it also overrides the bespoke menu shadows. */
[data-slot="dropdown-menu-content"],
@@ -942,7 +967,7 @@
[data-slot="select-content"],
[data-slot="combobox-content"],
[data-slot="popover-content"] {
- box-shadow: 0 2px 8px -2px rgba(27, 27, 31, 0.16) !important;
+ box-shadow: 0 2px 8px -2px rgba(0, 0, 0, 0.16) !important;
}
/* Dark: keep the chat-box dropdown shadow so menus don't merge into a
same-color surface (e.g. a menu overlapping the composer). */
@@ -954,6 +979,15 @@
box-shadow: 0 4px 14px var(--background) !important;
}
+ /* Model selector: shadow in the page-bg color so it lifts off the
+ composer it overlaps (chatbox geometry). Account menu stays flat. */
+ .dark .unsloth-model-selector-menu {
+ box-shadow: 0 2px 8px -2px var(--background) !important;
+ }
+ .dark .app-user-menu.menu-soft-surface-up {
+ box-shadow: none !important;
+ }
+
/* Context menus (chat, run, project): drop the inset edge ring, keep the soft shadow. */
.app-user-menu.menu-soft-surface {
box-shadow: 0 var(--menu-soft-offset-y) var(--menu-soft-blur)
@@ -962,7 +996,7 @@
/* Account menu: drop the inset edge ring and use the composer's soft shadow. */
.app-user-menu.menu-soft-surface-up {
- box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.09);
+ box-shadow: 0 2px 8px -2px rgba(0, 0, 0, 0.16);
}
.dark .app-user-menu.menu-soft-surface-up {
box-shadow: 0 8px 28px -6px rgba(0, 0, 0, 0.28);
@@ -972,16 +1006,19 @@
@apply relative flex w-full flex-col rounded-[32px] bg-background dark:bg-card px-1 pt-2 outline-none transition-shadow;
font-family: var(--font-sans);
background-clip: padding-box;
- box-shadow: 0 2px 8px -2px rgba(27, 27, 31, 0.16);
+ background-color: #ffffff;
+ /* Gemini-style composer shadow. */
+ box-shadow: 0 2px 8px -2px rgba(0, 0, 0, 0.16);
+ transition: box-shadow 0.1s;
}
.dark .chat-composer-surface {
- background-color: #2a2a2c;
+ background-color: var(--card);
box-shadow: none;
}
.composer-pill-btn {
- @apply flex cursor-pointer items-center gap-1.5 rounded-full py-1.5 pl-2 pr-2.5 text-[14px] font-medium text-muted-foreground/70 transition-colors hover:bg-primary/10 dark:hover:bg-white/[0.08] disabled:cursor-not-allowed disabled:opacity-40;
+ @apply flex cursor-pointer items-center gap-1.5 rounded-full py-1.5 pl-2 pr-2.5 text-[14px] font-medium text-muted-foreground/70 transition-colors hover:bg-primary/10 dark:hover:bg-white/[0.1] disabled:cursor-not-allowed disabled:opacity-40;
}
/* Icon-only (compact) pills drop their label, so make the button a square
@@ -1058,16 +1095,18 @@
@apply relative flex w-full flex-col rounded-[32px] bg-background dark:bg-card px-3 py-3 outline-none transition-shadow;
font-family: var(--font-sans);
background-clip: padding-box;
- /* Gemini search pill: soft, centered shadow, no downward offset. */
- box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.09);
+ background-color: #ffffff;
+ /* Gemini-style composer shadow. */
+ box-shadow: 0 2px 8px -2px rgba(0, 0, 0, 0.16);
+ transition: box-shadow 0.1s;
}
.unsloth-composer-surface:focus-within {
- box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.09);
+ box-shadow: 0 2px 8px -2px rgba(0, 0, 0, 0.16);
}
.dark .unsloth-composer-surface {
- background-color: #2a2a2c;
+ background-color: var(--card);
box-shadow: none;
}
@@ -1177,7 +1216,7 @@
/* Right-side Thinking pill (toggle or dropdown). pl-2 matches the left
pills so the hover X is not pushed in too far. */
.unsloth-thinking-pill {
- @apply inline-flex shrink-0 cursor-pointer items-center gap-1 rounded-full py-1.5 pl-2 pr-2.5 text-[14px] font-medium text-muted-foreground transition-colors hover:bg-primary/10 dark:hover:bg-white/[0.08] disabled:cursor-not-allowed disabled:opacity-40;
+ @apply inline-flex shrink-0 cursor-pointer items-center gap-1 rounded-full py-1.5 pl-2 pr-2.5 text-[14px] font-medium text-muted-foreground transition-colors hover:bg-primary/10 dark:hover:bg-white/[0.1] disabled:cursor-not-allowed disabled:opacity-40;
/* Reserve a text line so the icon-only (inactive) pill matches the
text pills' height instead of collapsing to the icon. */
min-height: calc(1lh + 0.75rem);
@@ -1206,9 +1245,7 @@
border-radius: 18px;
padding-top: 0.5rem;
padding-bottom: 0.5rem;
- box-shadow:
- 0 1px 2px oklch(0 0 0 / 0.04),
- 0 6px 18px oklch(0 0 0 / 0.08);
+ box-shadow: 0 2px 8px -2px rgba(0, 0, 0, 0.16);
}
/* MCP menu is wider (232px), so nudge the radius up so it reads as round as
@@ -1218,7 +1255,7 @@
}
.dark .unsloth-plus-menu[data-slot] {
- background-color: #2a2a2c;
+ background-color: var(--card);
/* Shadow tinted to the page bg so it blends, not a dark halo. */
box-shadow: 0 4px 14px var(--background);
}
@@ -1257,7 +1294,7 @@
[data-slot="dropdown-menu-item"],
[data-slot="dropdown-menu-sub-trigger"]
):is(:hover, :focus, :focus-visible, [data-highlighted], [data-state="open"]) {
- background-color: rgba(255, 255, 255, 0.08) !important;
+ background-color: rgba(255, 255, 255, 0.1) !important;
}
/* Hover tints only the background; the item and every descendant (text, icons,
@@ -1302,7 +1339,7 @@
white-space: nowrap;
}
.artifact-panel-shell {
- box-shadow: 0 2px 8px -2px rgba(27, 27, 31, 0.16);
+ box-shadow: 0 2px 8px -2px rgba(0, 0, 0, 0.16);
}
.dark .artifact-panel-shell {
@@ -1634,7 +1671,7 @@
!important because Sonner injects its base rules at runtime. */
[data-sonner-toast][data-styled='true'] {
padding: 12px 18px !important;
- box-shadow: 0 2px 6px rgba(0, 0, 0, 0.08) !important;
+ box-shadow: 0 2px 8px -2px rgba(0, 0, 0, 0.16) !important;
}
[data-sonner-toast][data-styled='true']:has([data-close-button]):not(:has([data-cancel])) {
@@ -1671,7 +1708,7 @@
/* Boost shadow on dark surfaces; mirrors .shadow-border / .menu-soft-surface pattern. */
.dark [data-sonner-toast][data-styled='true'] {
- background-color: #2a2a2c !important;
+ background-color: var(--card) !important;
box-shadow: none !important;
}
@@ -1923,7 +1960,7 @@
/* Keep the (borderless) close button blended with the dark toast surface. */
.dark [data-sonner-toast][data-styled="true"] [data-close-button] {
- background: #2a2a2c !important;
+ background: var(--card) !important;
}
[data-sonner-toast][data-styled="true"] [data-close-button] svg {