diff --git a/docs/data/joy/getting-started/templates/email/components/Header.tsx b/docs/data/joy/getting-started/templates/email/components/Header.tsx index 1f280e487d0f11..c076216cdc0cfa 100644 --- a/docs/data/joy/getting-started/templates/email/components/Header.tsx +++ b/docs/data/joy/getting-started/templates/email/components/Header.tsx @@ -42,7 +42,7 @@ function ColorSchemeToggle() { return ( Custom theme - Material Design 2 + + Material Design 2 + ); @@ -203,7 +205,11 @@ export default function Checkout() { height: 150, }} > - + Custom theme - Material Design 2 + + Material Design 2 + ); @@ -203,7 +205,11 @@ export default function Checkout() { height: 150, }} > - + {mode === 'dark' ? ( diff --git a/docs/data/material/getting-started/templates/checkout/ToggleColorMode.tsx b/docs/data/material/getting-started/templates/checkout/ToggleColorMode.tsx index 1fd99c941fe0ab..faf35370cc8841 100644 --- a/docs/data/material/getting-started/templates/checkout/ToggleColorMode.tsx +++ b/docs/data/material/getting-started/templates/checkout/ToggleColorMode.tsx @@ -1,12 +1,12 @@ import * as React from 'react'; import { PaletteMode } from '@mui/material'; -import IconButton from '@mui/material/IconButton'; +import IconButton, { IconButtonProps } from '@mui/material/IconButton'; import ModeNightRoundedIcon from '@mui/icons-material/ModeNightRounded'; import WbSunnyRoundedIcon from '@mui/icons-material/WbSunnyRounded'; -interface ToggleColorModeProps { +interface ToggleColorModeProps extends IconButtonProps { mode: PaletteMode; toggleColorMode: () => void; } @@ -14,12 +14,14 @@ interface ToggleColorModeProps { export default function ToggleColorMode({ mode, toggleColorMode, + ...props }: ToggleColorModeProps) { return ( {mode === 'dark' ? ( diff --git a/docs/data/material/getting-started/templates/dashboard/components/MenuButton.tsx b/docs/data/material/getting-started/templates/dashboard/components/MenuButton.tsx index 2c184af4d10dce..ab6199b2e459aa 100644 --- a/docs/data/material/getting-started/templates/dashboard/components/MenuButton.tsx +++ b/docs/data/material/getting-started/templates/dashboard/components/MenuButton.tsx @@ -2,14 +2,14 @@ import * as React from 'react'; import Badge from '@mui/material/Badge'; import IconButton, { IconButtonProps } from '@mui/material/IconButton'; -interface StyledMenuButtonProps extends IconButtonProps { +export interface MenuButtonProps extends IconButtonProps { showBadge?: boolean; } export default function MenuButton({ showBadge = false, ...props -}: StyledMenuButtonProps) { +}: MenuButtonProps) { return ( - + - + {mode === 'dark' ? ( diff --git a/docs/data/material/getting-started/templates/dashboard/components/ToggleColorMode.tsx b/docs/data/material/getting-started/templates/dashboard/components/ToggleColorMode.tsx index 9642c2d2f21fcb..67010c166ca6e9 100644 --- a/docs/data/material/getting-started/templates/dashboard/components/ToggleColorMode.tsx +++ b/docs/data/material/getting-started/templates/dashboard/components/ToggleColorMode.tsx @@ -2,9 +2,9 @@ import * as React from 'react'; import { PaletteMode } from '@mui/material'; import WbSunnyRoundedIcon from '@mui/icons-material/WbSunnyRounded'; import ModeNightRoundedIcon from '@mui/icons-material/ModeNightRounded'; -import MenuButton from './MenuButton'; +import MenuButton, { MenuButtonProps } from './MenuButton'; -interface ToggleColorModeProps { +interface ToggleColorModeProps extends MenuButtonProps { mode: PaletteMode; toggleColorMode: () => void; } @@ -12,12 +12,14 @@ interface ToggleColorModeProps { export default function ToggleColorMode({ mode, toggleColorMode, + ...props }: ToggleColorModeProps) { return ( {mode === 'dark' ? ( diff --git a/docs/data/material/getting-started/templates/dashboard/internals/components/ToggleCustomTheme.js b/docs/data/material/getting-started/templates/dashboard/internals/components/ToggleCustomTheme.js index 21a8f10f6e75b1..bb68fd96580df4 100644 --- a/docs/data/material/getting-started/templates/dashboard/internals/components/ToggleCustomTheme.js +++ b/docs/data/material/getting-started/templates/dashboard/internals/components/ToggleCustomTheme.js @@ -34,7 +34,9 @@ function ToggleCustomTheme({ showCustomTheme, toggleCustomTheme }) { Custom theme - Material Design 2 + + Material Design 2 + ); diff --git a/docs/data/material/getting-started/templates/dashboard/internals/components/ToggleCustomTheme.tsx b/docs/data/material/getting-started/templates/dashboard/internals/components/ToggleCustomTheme.tsx index 58df9e79a64226..f4b1b7c218b4a8 100644 --- a/docs/data/material/getting-started/templates/dashboard/internals/components/ToggleCustomTheme.tsx +++ b/docs/data/material/getting-started/templates/dashboard/internals/components/ToggleCustomTheme.tsx @@ -41,7 +41,9 @@ export default function ToggleCustomTheme({ Custom theme - Material Design 2 + + Material Design 2 + ); diff --git a/docs/data/material/getting-started/templates/landing-page/LandingPage.js b/docs/data/material/getting-started/templates/landing-page/LandingPage.js index 93382f406f9515..7452a774a757fc 100644 --- a/docs/data/material/getting-started/templates/landing-page/LandingPage.js +++ b/docs/data/material/getting-started/templates/landing-page/LandingPage.js @@ -48,7 +48,9 @@ function ToggleCustomTheme({ showCustomTheme, toggleCustomTheme }) { Custom theme - Material Design 2 + + Material Design 2 + ); diff --git a/docs/data/material/getting-started/templates/landing-page/LandingPage.tsx b/docs/data/material/getting-started/templates/landing-page/LandingPage.tsx index cd4441df77760f..22518445b61a31 100644 --- a/docs/data/material/getting-started/templates/landing-page/LandingPage.tsx +++ b/docs/data/material/getting-started/templates/landing-page/LandingPage.tsx @@ -55,7 +55,9 @@ function ToggleCustomTheme({ Custom theme - Material Design 2 + + Material Design 2 + ); diff --git a/docs/data/material/getting-started/templates/landing-page/components/AppAppBar.js b/docs/data/material/getting-started/templates/landing-page/components/AppAppBar.js index 4f99929a231e3e..e32edf9b9e7905 100644 --- a/docs/data/material/getting-started/templates/landing-page/components/AppAppBar.js +++ b/docs/data/material/getting-started/templates/landing-page/components/AppAppBar.js @@ -118,7 +118,11 @@ function AppAppBar({ mode, toggleColorMode }) { alignItems: 'center', }} > - + diff --git a/docs/data/material/getting-started/templates/landing-page/components/AppAppBar.tsx b/docs/data/material/getting-started/templates/landing-page/components/AppAppBar.tsx index d20f27a5d97b55..762b760ccd456e 100644 --- a/docs/data/material/getting-started/templates/landing-page/components/AppAppBar.tsx +++ b/docs/data/material/getting-started/templates/landing-page/components/AppAppBar.tsx @@ -122,7 +122,11 @@ export default function AppAppBar({ mode, toggleColorMode }: AppAppBarProps) { alignItems: 'center', }} > - + diff --git a/docs/data/material/getting-started/templates/landing-page/components/ToggleColorMode.js b/docs/data/material/getting-started/templates/landing-page/components/ToggleColorMode.js index bcb83d384743d2..27779e7809b43d 100644 --- a/docs/data/material/getting-started/templates/landing-page/components/ToggleColorMode.js +++ b/docs/data/material/getting-started/templates/landing-page/components/ToggleColorMode.js @@ -6,13 +6,14 @@ import IconButton from '@mui/material/IconButton'; import WbSunnyRoundedIcon from '@mui/icons-material/WbSunnyRounded'; import ModeNightRoundedIcon from '@mui/icons-material/ModeNightRounded'; -function ToggleColorMode({ mode, toggleColorMode }) { +function ToggleColorMode({ mode, toggleColorMode, ...props }) { return ( {mode === 'dark' ? ( diff --git a/docs/data/material/getting-started/templates/landing-page/components/ToggleColorMode.tsx b/docs/data/material/getting-started/templates/landing-page/components/ToggleColorMode.tsx index 9ccb9982009d24..0997dbf26c79f5 100644 --- a/docs/data/material/getting-started/templates/landing-page/components/ToggleColorMode.tsx +++ b/docs/data/material/getting-started/templates/landing-page/components/ToggleColorMode.tsx @@ -1,11 +1,11 @@ import * as React from 'react'; import { PaletteMode } from '@mui/material'; -import IconButton from '@mui/material/IconButton'; +import IconButton, { IconButtonProps } from '@mui/material/IconButton'; import WbSunnyRoundedIcon from '@mui/icons-material/WbSunnyRounded'; import ModeNightRoundedIcon from '@mui/icons-material/ModeNightRounded'; -interface ToggleColorModeProps { +interface ToggleColorModeProps extends IconButtonProps { mode: PaletteMode; toggleColorMode: () => void; } @@ -13,6 +13,7 @@ interface ToggleColorModeProps { export default function ToggleColorMode({ mode, toggleColorMode, + ...props }: ToggleColorModeProps) { return ( {mode === 'dark' ? ( diff --git a/docs/data/material/getting-started/templates/sign-in-side/Content.js b/docs/data/material/getting-started/templates/sign-in-side/Content.js index f00cf55020cf4d..1df78fe8ea5220 100644 --- a/docs/data/material/getting-started/templates/sign-in-side/Content.js +++ b/docs/data/material/getting-started/templates/sign-in-side/Content.js @@ -45,8 +45,8 @@ export default function Content() { - {items.map((item) => ( - + {items.map((item, index) => ( + {item.icon}
diff --git a/docs/data/material/getting-started/templates/sign-in-side/Content.tsx b/docs/data/material/getting-started/templates/sign-in-side/Content.tsx index f00cf55020cf4d..1df78fe8ea5220 100644 --- a/docs/data/material/getting-started/templates/sign-in-side/Content.tsx +++ b/docs/data/material/getting-started/templates/sign-in-side/Content.tsx @@ -45,8 +45,8 @@ export default function Content() { - {items.map((item) => ( - + {items.map((item, index) => ( + {item.icon}
diff --git a/docs/data/material/getting-started/templates/sign-in-side/SignInSide.js b/docs/data/material/getting-started/templates/sign-in-side/SignInSide.js index 9d799332986b63..1672577cc1e9de 100644 --- a/docs/data/material/getting-started/templates/sign-in-side/SignInSide.js +++ b/docs/data/material/getting-started/templates/sign-in-side/SignInSide.js @@ -45,7 +45,9 @@ function ToggleCustomTheme({ showCustomTheme, toggleCustomTheme }) { Custom theme - Material Design 2 + + Material Design 2 + ); @@ -111,7 +113,11 @@ export default function SignInSide() { > Back - + Custom theme - Material Design 2 + + Material Design 2 + ); @@ -112,7 +114,11 @@ export default function SignInSide() { > Back - + {mode === 'dark' ? ( diff --git a/docs/data/material/getting-started/templates/sign-in-side/ToggleColorMode.tsx b/docs/data/material/getting-started/templates/sign-in-side/ToggleColorMode.tsx index 1fd99c941fe0ab..faf35370cc8841 100644 --- a/docs/data/material/getting-started/templates/sign-in-side/ToggleColorMode.tsx +++ b/docs/data/material/getting-started/templates/sign-in-side/ToggleColorMode.tsx @@ -1,12 +1,12 @@ import * as React from 'react'; import { PaletteMode } from '@mui/material'; -import IconButton from '@mui/material/IconButton'; +import IconButton, { IconButtonProps } from '@mui/material/IconButton'; import ModeNightRoundedIcon from '@mui/icons-material/ModeNightRounded'; import WbSunnyRoundedIcon from '@mui/icons-material/WbSunnyRounded'; -interface ToggleColorModeProps { +interface ToggleColorModeProps extends IconButtonProps { mode: PaletteMode; toggleColorMode: () => void; } @@ -14,12 +14,14 @@ interface ToggleColorModeProps { export default function ToggleColorMode({ mode, toggleColorMode, + ...props }: ToggleColorModeProps) { return ( {mode === 'dark' ? ( diff --git a/docs/data/material/getting-started/templates/sign-in/SignIn.js b/docs/data/material/getting-started/templates/sign-in/SignIn.js index efb745d7f356d3..ea032553d972a2 100644 --- a/docs/data/material/getting-started/templates/sign-in/SignIn.js +++ b/docs/data/material/getting-started/templates/sign-in/SignIn.js @@ -54,7 +54,9 @@ function ToggleCustomTheme({ showCustomTheme, toggleCustomTheme }) { Custom theme - Material Design 2 + + Material Design 2 + ); @@ -185,7 +187,11 @@ export default function SignIn() { > Back - + Custom theme - Material Design 2 + + Material Design 2 + ); @@ -185,7 +187,11 @@ export default function SignIn() { > Back - + {mode === 'dark' ? ( diff --git a/docs/data/material/getting-started/templates/sign-in/ToggleColorMode.tsx b/docs/data/material/getting-started/templates/sign-in/ToggleColorMode.tsx index 1fd99c941fe0ab..faf35370cc8841 100644 --- a/docs/data/material/getting-started/templates/sign-in/ToggleColorMode.tsx +++ b/docs/data/material/getting-started/templates/sign-in/ToggleColorMode.tsx @@ -1,12 +1,12 @@ import * as React from 'react'; import { PaletteMode } from '@mui/material'; -import IconButton from '@mui/material/IconButton'; +import IconButton, { IconButtonProps } from '@mui/material/IconButton'; import ModeNightRoundedIcon from '@mui/icons-material/ModeNightRounded'; import WbSunnyRoundedIcon from '@mui/icons-material/WbSunnyRounded'; -interface ToggleColorModeProps { +interface ToggleColorModeProps extends IconButtonProps { mode: PaletteMode; toggleColorMode: () => void; } @@ -14,12 +14,14 @@ interface ToggleColorModeProps { export default function ToggleColorMode({ mode, toggleColorMode, + ...props }: ToggleColorModeProps) { return ( {mode === 'dark' ? ( diff --git a/docs/data/material/getting-started/templates/sign-up/SignUp.js b/docs/data/material/getting-started/templates/sign-up/SignUp.js index cfb26f9cf621f7..8a97fac45b5395 100644 --- a/docs/data/material/getting-started/templates/sign-up/SignUp.js +++ b/docs/data/material/getting-started/templates/sign-up/SignUp.js @@ -53,7 +53,9 @@ function ToggleCustomTheme({ showCustomTheme, toggleCustomTheme }) { Custom theme - Material Design 2 + + Material Design 2 + ); @@ -189,7 +191,11 @@ export default function SignUp() { > Back - + Custom theme - Material Design 2 + + Material Design 2 + ); @@ -189,7 +191,11 @@ export default function SignUp() { > Back - + {mode === 'dark' ? ( diff --git a/docs/data/material/getting-started/templates/sign-up/ToggleColorMode.tsx b/docs/data/material/getting-started/templates/sign-up/ToggleColorMode.tsx index 1fd99c941fe0ab..faf35370cc8841 100644 --- a/docs/data/material/getting-started/templates/sign-up/ToggleColorMode.tsx +++ b/docs/data/material/getting-started/templates/sign-up/ToggleColorMode.tsx @@ -1,12 +1,12 @@ import * as React from 'react'; import { PaletteMode } from '@mui/material'; -import IconButton from '@mui/material/IconButton'; +import IconButton, { IconButtonProps } from '@mui/material/IconButton'; import ModeNightRoundedIcon from '@mui/icons-material/ModeNightRounded'; import WbSunnyRoundedIcon from '@mui/icons-material/WbSunnyRounded'; -interface ToggleColorModeProps { +interface ToggleColorModeProps extends IconButtonProps { mode: PaletteMode; toggleColorMode: () => void; } @@ -14,12 +14,14 @@ interface ToggleColorModeProps { export default function ToggleColorMode({ mode, toggleColorMode, + ...props }: ToggleColorModeProps) { return ( {mode === 'dark' ? ( diff --git a/docs/pages/experiments/joy/toggle-button.tsx b/docs/pages/experiments/joy/toggle-button.tsx index bc09c1dddcf4ed..d2a251dfc07e00 100644 --- a/docs/pages/experiments/joy/toggle-button.tsx +++ b/docs/pages/experiments/joy/toggle-button.tsx @@ -21,7 +21,7 @@ function ColorSchemeToggle({ onClick, sx, ...props }: IconButtonProps) { } return ( Toggle Mode + * + * - The screenshot with `-default` suffix is generated if the page has a button with id `toggle-default-theme` + * + * + * - The screenshot with `-default-dark` suffix is generated if the page has both buttons + * + * Debug: + * - Set `chromium.launch({ headless: false })` in line:50 to see the browser */ const host = process.env.DEPLOY_PREVIEW || 'http://localhost:3000'; -const directory = 'docs/public/static/screenshots'; + +/** + * project key should be `mui.com//*` + */ +const projects = { + 'material-ui': { + input: path.join(process.cwd(), 'docs/pages/material-ui/getting-started/templates'), + output: 'docs/public/static/screenshots', + viewport: { width: 1680, height: 1092 }, + }, + 'joy-ui': { + input: path.join(process.cwd(), 'docs/pages/joy-ui/getting-started/templates'), + output: 'docs/public/static/screenshots', + viewport: { width: 1600, height: 800 }, + }, +}; const names = new Set(process.argv.slice(2)); (async () => { // eslint-disable-next-line no-console console.info('Host:', host); - const browser = await chromium.launch(); - const page = await browser.newPage({ - viewport: { width: 1600, height: 800 }, - reducedMotion: 'reduce', - }); + const browser = await chromium.launch({ headless: true }); - const files = await fs.readdir( - path.join(process.cwd(), 'docs/pages/joy-ui/getting-started/templates'), - ); - const urls = files - .filter( - (file) => - !file.startsWith('index') && - (names.size === 0 || names.has(file.replace(/\.(js|tsx)$/, ''))), - ) - .map((file) => `/joy-ui/getting-started/templates/${file.replace(/\.(js|tsx)$/, '/')}`); - - try { - await Promise.resolve().then(() => - urls.reduce(async (sequence, aUrl) => { - await sequence; - await page.goto(`${host}${aUrl}`, { waitUntil: 'networkidle' }); - - const filePath = `${directory}${aUrl.replace(/\/$/, '')}.jpg`; - // eslint-disable-next-line no-console - console.info('Saving screenshot to:', filePath); - await page.screenshot({ path: filePath, animations: 'disabled' }); - - // capture dark mode - const toggle = await page.$('#toggle-mode'); - if (toggle) { - await page.click('#toggle-mode'); - await page.reload({ waitUntil: 'networkidle' }); - await page.screenshot({ - path: filePath.replace('.jpg', '-dark.jpg'), - animations: 'disabled', - }); - - await page.click('#toggle-mode'); // switch back to light + await Promise.all( + Object.entries(projects) + .filter(([project]) => names.size === 0 || names.has(project)) + .map(async ([project, { input, output, viewport }]) => { + const page = await browser.newPage({ + viewport, + reducedMotion: 'reduce', + }); + + names.delete(project); + + const files = await fs.readdir(input); + const urls = files + .filter( + (file) => + !file.startsWith('index') && + (names.size === 0 || names.has(file.replace(/\.(js|tsx)$/, ''))), + ) + .map( + (file) => `/${project}/getting-started/templates/${file.replace(/\.(js|tsx)$/, '/')}`, + ); + + async function captureDarkMode(outputPath: string) { + const btn = await page.$('[data-screenshot="toggle-mode"]'); + if (btn) { + await page.click('[data-screenshot="toggle-mode"]'); + await page.waitForLoadState('networkidle'); // changing to dark mode might trigger image loading + await page.screenshot({ + path: outputPath, + animations: 'disabled', + }); + + await page.click('[data-screenshot="toggle-mode"]'); // switch back to light + } } - return Promise.resolve(); - }, Promise.resolve()), - ); - } catch (error) { - // eslint-disable-next-line no-console - console.log(error); - } + try { + await Promise.resolve().then(() => + urls.reduce(async (sequence, aUrl) => { + await sequence; + await page.goto(`${host}${aUrl}`, { waitUntil: 'networkidle' }); + + const filePath = `${output}${aUrl.replace(/\/$/, '')}.jpg`; + // eslint-disable-next-line no-console + console.info('Saving screenshot to:', filePath); + await page.screenshot({ path: filePath, animations: 'disabled' }); + + await captureDarkMode(filePath.replace('.jpg', '-dark.jpg')); + + // capture custom theme + const toggleTheme = await page.$('[data-screenshot="toggle-default-theme"]'); + if (toggleTheme) { + await page.click('[data-screenshot="toggle-default-theme"]'); + await page.screenshot({ + path: filePath.replace('.jpg', '-default.jpg'), + animations: 'disabled', + }); + + await captureDarkMode(filePath.replace('.jpg', '-default-dark.jpg')); + } + + return Promise.resolve(); + }, Promise.resolve()), + ); + } catch (error) { + console.error(error); + } + }), + ); await browser.close(); })(); diff --git a/docs/src/modules/components/MaterialFreeTemplatesCollection.js b/docs/src/modules/components/MaterialFreeTemplatesCollection.js index 7c47261a7de654..a8e09df4015baa 100644 --- a/docs/src/modules/components/MaterialFreeTemplatesCollection.js +++ b/docs/src/modules/components/MaterialFreeTemplatesCollection.js @@ -9,66 +9,62 @@ import Typography from '@mui/material/Typography'; import Visibility from '@mui/icons-material/Visibility'; import CodeRoundedIcon from '@mui/icons-material/CodeRounded'; import { useTranslate } from '@mui/docs/i18n'; -import { useTheme } from '@mui/material/styles'; const sourcePrefix = `${process.env.SOURCE_CODE_REPO}/tree/v${process.env.LIB_VERSION}`; -function layouts(translatation, theme) { - const imageSuffix = theme.palette.mode === 'dark' ? '-dark' : '-light'; +function layouts(translatation) { return [ { title: translatation('dashboardTitle'), description: translatation('dashboardDescr'), - src: `/static/images/templates/dashboard${imageSuffix}.png`, href: '/material-ui/getting-started/templates/dashboard/', source: `${sourcePrefix}/docs/data/material/getting-started/templates/dashboard`, + hasDarkMode: true, }, { title: translatation('landingPageTitle'), description: translatation('landingPageDescr'), - src: `/static/images/templates/landing-page${imageSuffix}.png`, href: '/material-ui/getting-started/templates/landing-page/', source: `${sourcePrefix}/docs/data/material/getting-started/templates/landing-page`, + hasDarkMode: true, }, { title: translatation('checkoutTitle'), description: translatation('checkoutDescr'), - src: `/static/images/templates/checkout${imageSuffix}.png`, href: '/material-ui/getting-started/templates/checkout/', source: `${sourcePrefix}/docs/data/material/getting-started/templates/checkout`, + hasDarkMode: true, }, { title: translatation('signInTitle'), description: translatation('signInDescr'), - src: `/static/images/templates/sign-in${imageSuffix}.png`, href: '/material-ui/getting-started/templates/sign-in/', source: `${sourcePrefix}/docs/data/material/getting-started/templates/sign-in`, + hasDarkMode: true, }, { title: translatation('signInSideTitle'), description: translatation('signInSideDescr'), - src: `/static/images/templates/sign-in-side${imageSuffix}.png`, href: '/material-ui/getting-started/templates/sign-in-side/', source: `${sourcePrefix}/docs/data/material/getting-started/templates/sign-in-side`, + hasDarkMode: true, }, { title: translatation('signUpTitle'), description: translatation('signUpDescr'), - src: `/static/images/templates/sign-up${imageSuffix}.png`, href: '/material-ui/getting-started/templates/sign-up/', source: `${sourcePrefix}/docs/data/material/getting-started/templates/sign-up`, + hasDarkMode: true, }, { title: translatation('blogTitle'), description: translatation('blogDescr'), - src: `/static/images/templates/blog${imageSuffix}.png`, href: '/material-ui/getting-started/templates/blog/', source: `${sourcePrefix}/docs/data/material/getting-started/templates/blog`, }, { title: translatation('stickyFooterTitle'), description: translatation('stickyFooterDescr'), - src: `/static/images/templates/sticky-footer${imageSuffix}.png`, href: '/material-ui/getting-started/templates/sticky-footer/', source: `${sourcePrefix}/docs/data/material/getting-started/templates/sticky-footer`, }, @@ -77,11 +73,10 @@ function layouts(translatation, theme) { export default function Templates() { const translatation = useTranslate(); - const theme = useTheme(); return ( - {layouts(translatation, theme).map((layout) => ( + {layouts(translatation).map((layout) => ( ({ aspectRatio: '16 / 9', objectPosition: 'top', borderBottom: '1px solid', borderColor: 'divider', + ...theme.applyStyles('dark', { + content: 'var(--src)', + }), + })} + style={{ + '--src': layout.hasDarkMode + ? `url(/static/screenshots${layout.href.replace(/\/$/, '')}-dark.jpg)` + : `url(/static/screenshots${layout.href.replace(/\/$/, '')}.jpg)`, }} />