diff --git a/packages/studio/src/components/nle/TimelinePane.tsx b/packages/studio/src/components/nle/TimelinePane.tsx
index 727fef32fb..39131066e6 100644
--- a/packages/studio/src/components/nle/TimelinePane.tsx
+++ b/packages/studio/src/components/nle/TimelinePane.tsx
@@ -262,7 +262,7 @@ export function TimelinePane({
aria-disabled={timelineDisabled || undefined}
>
{
if ((e.target as HTMLElement).closest("[data-clip]")) return;
if (timelineDisabled) return;
diff --git a/packages/studio/src/components/ui/Menu.tsx b/packages/studio/src/components/ui/Menu.tsx
index a0b36d54b9..b4e22b6007 100644
--- a/packages/studio/src/components/ui/Menu.tsx
+++ b/packages/studio/src/components/ui/Menu.tsx
@@ -220,6 +220,22 @@ export function MenuRadioItem({ className, children, ...props }: MenuRadioItemPr
);
}
+/** An on/off row; the tick renders only while `checked`. */
+export function MenuCheckboxItem({
+ className,
+ children,
+ ...props
+}: StyledProps) {
+ return (
+
+ {children}
+
+ ✓
+
+
+ );
+}
+
/** A hairline between two groups of items. */
export function MenuSeparator({ className, ...props }: StyledProps) {
return ;
diff --git a/packages/studio/src/components/ui/index.ts b/packages/studio/src/components/ui/index.ts
index e9f4936e8e..aac1aa360f 100644
--- a/packages/studio/src/components/ui/index.ts
+++ b/packages/studio/src/components/ui/index.ts
@@ -11,6 +11,7 @@ export { Tooltip } from "./Tooltip";
export {
ContextMenu,
Menu,
+ MenuCheckboxItem,
MenuItem,
MenuRadioGroup,
MenuRadioItem,
diff --git a/packages/studio/src/styles/theme.css b/packages/studio/src/styles/theme.css
index 3b44430f6f..a4af83a5f9 100644
--- a/packages/studio/src/styles/theme.css
+++ b/packages/studio/src/styles/theme.css
@@ -270,18 +270,13 @@
--color-panel-media: var(--color-media);
--color-panel-container: var(--color-container);
- /* panel tabs. Dark values. A paper host overrides these same names:
- strip #f5f5f4, border #18181b14, active rgba(0, 0, 0, 0.06),
- muted rgba(0, 0, 0, 0.03), hover rgba(0, 0, 0, 0.035), text #18181b / #71717a. */
- --panel-strip-bg: var(--color-panel-surface);
- --panel-strip-border: var(--color-panel-border);
- --panel-tab-bg-active: rgba(255, 255, 255, 0.08);
- --panel-tab-bg-active-muted: rgba(255, 255, 255, 0.04);
- --panel-tab-bg-hover: rgba(255, 255, 255, 0.04);
- --panel-tab-text-active: var(--color-text-1);
- --panel-tab-text: var(--color-text-3);
- --panel-tab-indicator: var(--color-accent);
- --panel-tab-ring: var(--color-accent);
+ /* Dock panels are cards on the shell. The card owns the only border; its tab
+ * strip sits below the card body and the shown tab is a fill in the body colour. */
+ --panel-shell-bg: var(--color-bg-1);
+ --panel-card-bg: var(--color-surface);
+ --panel-card-border: #303034;
+ --panel-strip-bg: var(--color-bg-0);
+ --panel-tab-bg-hover: #202023;
/* Names Studio's markup invented that no config ever defined, so the classes
* compiled to nothing. Aliased to the token that was meant, rather than
diff --git a/scripts/contrast-pairs.json b/scripts/contrast-pairs.json
index c695cb7015..5f393dccb5 100644
--- a/scripts/contrast-pairs.json
+++ b/scripts/contrast-pairs.json
@@ -270,6 +270,39 @@
],
"opacity": 0.64,
"format": "rgb-channels"
+ },
+ {
+ "id": "dock-tab-label",
+ "foreground": "--color-text-2",
+ "background": ["--panel-strip-bg"],
+ "role": "text",
+ "minimum": 4.5,
+ "sources": [
+ "packages/studio/src/components/dock/dock.css:13",
+ "packages/studio/src/components/dock/dock.css:15"
+ ]
+ },
+ {
+ "id": "dock-shown-tab-label",
+ "foreground": "--color-text-1",
+ "background": ["--panel-card-bg"],
+ "role": "text",
+ "minimum": 4.5,
+ "sources": [
+ "packages/studio/src/components/dock/dock.css:12",
+ "packages/studio/src/components/dock/dock.css:14"
+ ]
+ },
+ {
+ "id": "dock-hovered-tab-label",
+ "foreground": "--color-text-1",
+ "background": ["--panel-strip-bg", "--panel-tab-bg-hover"],
+ "role": "text",
+ "minimum": 4.5,
+ "sources": [
+ "packages/studio/src/components/dock/dock.css:97",
+ "packages/studio/src/components/dock/dock.css:99"
+ ]
}
]
},