marionette / src /theme.ts
Thibaud Frère
feat: initial marionette v2 release
44aec57
/**
* MUI theme - mirrors the mobile app + emotions / telepresence
* convention so Marionette feels like a natural extension of the
* Reachy Mini shell when embedded.
*
* Two prebuilt instances (light + dark) selected at runtime by
* `embed.tsx` from the URL `?theme` query param or the host's
* `host:theme-changed` message. Pre-building both avoids a flash
* when the user toggles their system appearance.
*/
import { createTheme, type Theme } from "@mui/material/styles";
const ACCENT = "#FF9500";
const RADIUS = 12;
const FONT_FAMILY =
'Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", sans-serif';
function buildTheme(mode: "light" | "dark"): Theme {
const isDark = mode === "dark";
return createTheme({
palette: {
mode,
primary: { main: ACCENT },
background: {
default: isDark ? "#101013" : "#fafafa",
paper: isDark ? "#1a1a1a" : "#ffffff",
},
text: {
primary: isDark ? "#f5f5f5" : "#111111",
secondary: isDark ? "rgba(255,255,255,0.72)" : "rgba(0,0,0,0.65)",
},
divider: isDark ? "rgba(255,255,255,0.08)" : "rgba(0,0,0,0.08)",
},
typography: {
fontFamily: FONT_FAMILY,
button: { textTransform: "none", fontWeight: 600 },
},
shape: { borderRadius: RADIUS },
components: {
MuiCssBaseline: {
styleOverrides: {
html: {
backgroundColor: isDark ? "#101013" : "#fafafa",
minHeight: ["100vh", "100dvh"],
},
body: {
backgroundColor: isDark ? "#101013" : "#fafafa",
minHeight: ["100vh", "100dvh"],
margin: 0,
// Wizard recording UX benefits from no rubber-band scroll
// (the user is holding the head, not the page).
overscrollBehavior: "none",
WebkitTapHighlightColor: "transparent",
},
"#root": {
minHeight: ["100vh", "100dvh"],
display: "flex",
flexDirection: "column",
},
},
},
MuiButton: {
defaultProps: { disableElevation: true, variant: "outlined" },
styleOverrides: {
root: { borderRadius: RADIUS, paddingInline: 20, paddingBlock: 10 },
outlined: { borderWidth: 1.5 },
outlinedPrimary: ({ theme }) => ({
borderColor: theme.palette.primary.main,
"&:hover": {
borderWidth: 1.5,
backgroundColor: `rgba(255, 149, 0, ${
theme.palette.mode === "dark" ? 0.1 : 0.08
})`,
},
}),
},
},
MuiPaper: {
styleOverrides: { root: { backgroundImage: "none" } },
},
MuiCard: {
styleOverrides: { root: { borderRadius: RADIUS } },
},
MuiTooltip: {
styleOverrides: {
tooltip: { fontSize: 12, paddingBlock: 6, paddingInline: 10 },
},
},
},
});
}
export const lightTheme = buildTheme("light");
export const darkTheme = buildTheme("dark");