From ae151cec253ac71839149ae6323bdb7942e3a0b2 Mon Sep 17 00:00:00 2001
From: Linus Rath <139418639+rathlinus@users.noreply.github.com>
Date: Mon, 12 Oct 2026 00:37:59 +0200
Subject: [PATCH] feat: set Mountain View's content on a rounded card over a
tinted canvas
---
app/globals.css | 25 +++++++++++++++++++++++--
components/calendar/calendar-app.tsx | 4 ++--
components/contacts/contacts-app.tsx | 4 ++--
components/files/files-app.tsx | 4 ++--
components/layout/mv-top-bar.tsx | 7 ++++---
components/layout/sidebar.tsx | 4 +++-
components/mail/mail-app.tsx | 15 ++++++++++-----
components/search/search-box.tsx | 6 ++++--
components/settings/settings-app.tsx | 4 ++--
9 files changed, 52 insertions(+), 21 deletions(-)
diff --git a/app/globals.css b/app/globals.css
index 5df163f6d..0f61c3da8 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -971,6 +971,26 @@ optgroup {
--mv-search-radius: 8px;
--mv-popover-w: 352px;
--mv-popover-radius: 28px;
+ --mv-card-radius: 16px;
+ /* Surfaces, tinted from the theme's primary so any theme keeps the same
+ relationships: a faintly tinted canvas behind the chrome, a plain card
+ for the content, a slightly deeper search field, a selected-row pill and
+ a soft Compose button. */
+ --mv-canvas: color-mix(in oklab, var(--color-primary) 4%, var(--color-background));
+ --mv-search-bg: color-mix(in oklab, var(--color-primary) 9%, var(--color-background));
+ --mv-nav-hover: color-mix(in oklab, var(--color-foreground) 7%, var(--mv-canvas));
+ --mv-nav-selected: color-mix(in oklab, var(--color-primary) 18%, var(--color-background));
+ --mv-compose-bg: color-mix(in oklab, var(--color-primary) 24%, var(--color-background));
+ --mv-compose-fg: color-mix(in oklab, var(--color-primary) 30%, var(--color-foreground));
+ --mv-row-read: color-mix(in oklab, var(--color-primary) 3%, var(--color-background));
+}
+
+/* The content card: everything that is not chrome sits on one rounded sheet
+ inset from the canvas. */
+[data-interface-layout="mountain-view"] [data-mv-card] {
+ border-radius: var(--mv-card-radius);
+ background-color: var(--color-background);
+ overflow: hidden;
}
/* Search: a filled 48px field that lifts onto a card while focused, rather
@@ -979,14 +999,15 @@ optgroup {
height: var(--mv-search-h);
border-radius: var(--mv-search-radius);
border-color: transparent;
- background-color: var(--color-muted);
+ background-color: var(--mv-search-bg);
padding-inline-start: 3rem;
font-size: 1rem;
}
[data-interface-layout="mountain-view"] .mv-topbar input[data-search-input]:hover {
border-color: transparent;
- background-color: var(--color-accent);
+ background-color: var(--mv-search-bg);
+ box-shadow: 0 1px 1px 0 rgb(0 0 0 / 0.08), 0 1px 3px 1px rgb(0 0 0 / 0.04);
}
[data-interface-layout="mountain-view"] .mv-topbar input[data-search-input]:focus-visible {
diff --git a/components/calendar/calendar-app.tsx b/components/calendar/calendar-app.tsx
index 8edb59548..9d5b6e4e6 100644
--- a/components/calendar/calendar-app.tsx
+++ b/components/calendar/calendar-app.tsx
@@ -1729,7 +1729,7 @@ export function CalendarApp({ linkSegments: routeSegments }: CalendarAppProps =
);
return (
-
+
{refreshIndicator}
{mvShell && (
@@ -1741,7 +1741,7 @@ export function CalendarApp({ linkSegments: routeSegments }: CalendarAppProps =
activeAppId={inlineApp?.id ?? null}
/>
)}
-
+
{/* Left Navigation Rail (hidden when embedded in Pro shell) */}
{!isMobile && !isEmbedded && !mvShell && (
diff --git a/components/contacts/contacts-app.tsx b/components/contacts/contacts-app.tsx
index 1367484b7..b72efc7c1 100644
--- a/components/contacts/contacts-app.tsx
+++ b/components/contacts/contacts-app.tsx
@@ -901,7 +901,7 @@ function ContactsAppContent({ linkSegments: routeSegments }: ContactsAppProps =
};
return (
-
+
{refreshIndicator}
{mvShell && (
@@ -913,7 +913,7 @@ function ContactsAppContent({ linkSegments: routeSegments }: ContactsAppProps =
activeAppId={inlineApp?.id ?? null}
/>
)}
-
+
{/* Navigation Rail - desktop only (hidden when embedded in Pro shell) */}
{!isMobile && !isEmbedded && !mvShell && (
diff --git a/components/files/files-app.tsx b/components/files/files-app.tsx
index 2cc09a327..f1d7ca70f 100644
--- a/components/files/files-app.tsx
+++ b/components/files/files-app.tsx
@@ -593,7 +593,7 @@ export function FilesApp({ linkSegments: routeSegments }: FilesAppProps = {}) {
if (!isAuthenticated) return null;
return (
-
+
{refreshIndicator}
{mvShell && (
@@ -605,7 +605,7 @@ export function FilesApp({ linkSegments: routeSegments }: FilesAppProps = {}) {
activeAppId={inlineApp?.id ?? null}
/>
)}
-
+
{!isMobile && !isEmbedded && !mvShell && (
{/* Brand block: occupies the sidebar's own column width */}
@@ -192,6 +192,7 @@ export function MvTopBar({
onClear={search.onClear}
onSelectContact={search.onSelectContact}
disabled={search.disabled}
+ placeholder={t("search_placeholder")}
/>