Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/data/docs-infra/pages.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { MuiPage } from 'docs/src/MuiPage';
import type { MuiPage } from '@mui/docs/MuiPage';

const pages: readonly MuiPage[] = [
{
Expand Down
2 changes: 1 addition & 1 deletion docs/data/docs/pages.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { MuiPage } from 'docs/src/MuiPage';
import type { MuiPage } from '@mui/docs/MuiPage';
import standardNavIcons from 'docs/src/modules/components/AppNavIcons';

const pages: readonly MuiPage[] = [
Expand Down
2 changes: 1 addition & 1 deletion docs/data/joy/pages.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { MuiPage } from 'docs/src/MuiPage';
import type { MuiPage } from '@mui/docs/MuiPage';
import pagesApi from 'docs/data/joy/pagesApi';

const pages: readonly MuiPage[] = [
Expand Down
2 changes: 1 addition & 1 deletion docs/data/material/customization/color/ColorTool.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import Button from '@mui/material/Button';
import CheckIcon from '@mui/icons-material/Check';
import Slider from '@mui/material/Slider';
import { capitalize } from '@mui/material/utils';
import { resetDocsColor, setDocsColors } from 'docs/src/BrandingCssVarsProvider';
import { resetDocsColor, setDocsColors } from '@mui/docs/branding';
import ColorDemo from './ColorDemo';

const defaults = {
Expand Down
2 changes: 1 addition & 1 deletion docs/data/material/customization/density/DensityTool.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import IncreaseIcon from '@mui/icons-material/AddCircleOutline';
import DecreaseIcon from '@mui/icons-material/RemoveCircleOutline';
import { DispatchContext, ThemeOptionsContext } from '@mui/docs/ThemeContext';
import { useTranslate } from '@mui/docs/i18n';
import { setDocsSpacing, resetDocsSpacing } from 'docs/src/BrandingCssVarsProvider';
import { setDocsSpacing, resetDocsSpacing } from '@mui/docs/branding';

const minSpacing = 0;
const maxSpacing = 20;
Expand Down
2 changes: 1 addition & 1 deletion docs/data/material/pages.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import standardNavIcons from 'docs/src/modules/components/AppNavIcons';
import pagesApi from 'docs/data/material/pagesApi';
import { MuiPage } from 'docs/src/MuiPage';
import { MuiPage } from '@mui/docs/MuiPage';

const pages: MuiPage[] = [
{
Expand Down
2 changes: 1 addition & 1 deletion docs/data/system/pages.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { MuiPage } from 'docs/src/MuiPage';
import type { MuiPage } from '@mui/docs/MuiPage';
import pagesApi from 'docs/data/system/pagesApi';

const pages: readonly MuiPage[] = [
Expand Down
18 changes: 9 additions & 9 deletions docs/next.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -259,15 +259,6 @@ export default withDocsInfra({

return map;
},
redirects: async () => {
return [
{
source: '/base-ui/',
destination: 'https://base-ui.com',
permanent: true,
},
];
},
// Used to signal we run pnpm build
...(process.env.NODE_ENV === 'production'
? {
Expand All @@ -283,5 +274,14 @@ export default withDocsInfra({
{ source: `/static/x/:rest*`, destination: 'http://0.0.0.0:3001/static/x/:rest*' },
];
},
redirects: async () => {
return [
{
source: '/base-ui/',
destination: 'https://base-ui.com',
permanent: true,
},
];
},
}),
} satisfies NextConfig);
10 changes: 5 additions & 5 deletions docs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@
"@babel/runtime": "^7.28.6",
"@base-ui/react": "^1.2.0",
"@docsearch/react": "^3.9.0",
"@emotion/cache": "^11.14.0",
"@emotion/react": "^11.14.0",
"@emotion/server": "^11.11.0",
"@emotion/styled": "^11.14.1",
"@emotion/cache": "catalog:docs",
"@emotion/react": "catalog:docs",
"@emotion/server": "catalog:docs",
"@emotion/styled": "catalog:docs",
"@fortawesome/fontawesome-svg-core": "^6.7.2",
"@fortawesome/free-solid-svg-icons": "^6.7.2",
"@fortawesome/react-fontawesome": "^0.2.6",
Expand Down Expand Up @@ -99,7 +99,7 @@
"react-window": "^2.2.7",
"rimraf": "^6.1.3",
"styled-components": "^6.3.11",
"stylis": "4.2.0",
"stylis": "catalog:docs",
"use-count-up": "^3.0.1",
"webpack-bundle-analyzer": "^5.2.0"
},
Expand Down
2 changes: 1 addition & 1 deletion docs/pages/404.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Divider from '@mui/material/Divider';
import Head from 'docs/src/modules/components/Head';
import BrandingCssVarsProvider from 'docs/src/BrandingCssVarsProvider';
import { BrandingCssVarsProvider } from '@mui/docs/branding';
import AppHeader from 'docs/src/layouts/AppHeader';
import AppFooter from 'docs/src/layouts/AppFooter';
import AppHeaderBanner from 'docs/src/components/banner/AppHeaderBanner';
Expand Down
54 changes: 26 additions & 28 deletions docs/pages/_app.js
Original file line number Diff line number Diff line change
@@ -1,43 +1,41 @@
import 'docs/src/modules/components/bootstrap';
// --- Post bootstrap -----
import * as React from 'react';
import { loadCSS } from 'fg-loadcss';
import NextHead from 'next/head';
import PropTypes from 'prop-types';
import { useRouter } from 'next/router';
import { LicenseInfo } from '@mui/x-license';
import materialPkgJson from '@mui/material/package.json';
import { AnalyticsProvider } from '@mui/docs/AnalyticsProvider';
import { CodeCopyProvider } from '@mui/docs/CodeCopy';
import DemoContext from '@mui/docs/DemoContext';
import { DocsProvider } from '@mui/docs/DocsProvider';
import GoogleAnalytics from '@mui/docs/GoogleAnalytics';
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The thing is that modules like GoogleAnalytics are not really used outside of _app.js. And there are several others. But _app.js in X and core are almost the same code. Shouldn't we rather extract a DocsApp component we can use in the _app.js of both X and core and which abstracts all the shared logic?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Even with this DocsApp, we'd anyways need to move the files to the package from docs. So now that the first step is done, it'd be easier to create a DocsApp since most of its import already live in @mui/docs

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we'd anyways need to move the files to the package from docs.

Yes, but we wouldn't need to export them from @mui/docs. Which would reduce the API surface that needs to be maintained from this package.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can refactor that during app migration. I can update it to have static export paths instead of current glob.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok

import PageContext from '@mui/docs/PageContext';
import DocsStyledEngineProvider from '@mui/docs/StyledEngineProvider';
import { ThemeProvider } from '@mui/docs/ThemeContext';
import { CodeVariantProvider } from '@mui/docs/codeVariant';
import createEmotionCache from '@mui/docs/createEmotionCache';
import findActivePage from '@mui/docs/findActivePage';
import getProductInfoFromUrl from '@mui/docs/getProductInfoFromUrl';
import { mapTranslations } from '@mui/docs/i18n';
import joyPkgJson from '@mui/joy/package.json';
import { extendTheme, useColorScheme as useJoyColorScheme } from '@mui/joy/styles';
import GlobalStyles from '@mui/material/GlobalStyles';
import materialPkgJson from '@mui/material/package.json';
import systemPkgJson from '@mui/system/package.json';
import generalDocsPages from 'docs/data/docs/pages';
import { LicenseInfo } from '@mui/x-license';
import docsInfraPages from 'docs/data/docs-infra/pages';
import materialPages from 'docs/data/material/pages';
import generalDocsPages from 'docs/data/docs/pages';
import joyPages from 'docs/data/joy/pages';
import materialPages from 'docs/data/material/pages';
import systemPages from 'docs/data/system/pages';
import PageContext from 'docs/src/modules/components/PageContext';
import DemoContext from 'docs/src/modules/components/DemoContext';
import GoogleAnalytics from 'docs/src/modules/components/GoogleAnalytics';
import { CodeCopyProvider } from '@mui/docs/CodeCopy';
import { ThemeProvider } from '@mui/docs/ThemeContext';
import { CodeVariantProvider } from 'docs/src/modules/utils/codeVariant';
import GlobalStyles from '@mui/material/GlobalStyles';
import { extendTheme, useColorScheme as useJoyColorScheme } from '@mui/joy/styles';
import DocsStyledEngineProvider from 'docs/src/modules/utils/StyledEngineProvider';
import createEmotionCache from 'docs/src/createEmotionCache';
import findActivePage from 'docs/src/modules/utils/findActivePage';
import getProductInfoFromUrl from 'docs/src/modules/utils/getProductInfoFromUrl';
import { AnalyticsProvider } from 'docs/src/modules/components/AnalyticsProvider';
import { DocsProvider } from '@mui/docs/DocsProvider';
import { mapTranslations } from '@mui/docs/i18n';
import SvgMuiLogomark, {
muiSvgLogoString,
muiSvgWordmarkString,
} from 'docs/src/icons/SvgMuiLogomark';
import './global.css';
import '../public/static/components-gallery/base-theme.css';
import { loadCSS } from 'fg-loadcss';
import NextHead from 'next/head';
import { useRouter } from 'next/router';
import PropTypes from 'prop-types';
import * as React from 'react';
import * as config from '../config';

export { fontClasses } from '@mui/docs/nextFonts';
import '../public/static/components-gallery/base-theme.css';
import './global.css';

// Remove the license warning from demonstration purposes
LicenseInfo.setLicenseKey(process.env.NEXT_PUBLIC_MUI_LICENSE);
Expand Down
207 changes: 7 additions & 200 deletions docs/pages/_document.js
Original file line number Diff line number Diff line change
@@ -1,208 +1,15 @@
import * as React from 'react';
import Script from 'next/script';
import { documentGetInitialProps } from '@mui/material-nextjs/v13-pagesRouter';
import { ServerStyleSheet } from 'styled-components';
import Document, { Html, Head, Main, NextScript } from 'next/document';
import GlobalStyles from '@mui/material/GlobalStyles';
import MuiInitColorSchemeScript from '@mui/material/InitColorSchemeScript';
import NextDocument from 'next/document';
import { Document as MuiDocsDocument, createGetInitialProps } from '@mui/docs/Document';
import JoyInitColorSchemeScript from '@mui/joy/InitColorSchemeScript';
import { pathnameToLanguage } from 'docs/src/modules/utils/helpers';
import createEmotionCache from 'docs/src/createEmotionCache';
import { getMetaThemeColor } from '@mui/docs/branding';
import { fontClasses } from './_app';

const PRODUCTION_GA =
process.env.DEPLOY_ENV === 'production' || process.env.DEPLOY_ENV === 'staging';
export default class MuiDocument extends NextDocument {
static getInitialProps = createGetInitialProps({ setupStyledComponents: true });

const GOOGLE_ANALYTICS_ID_V4 = PRODUCTION_GA ? 'G-5NXDQLC2ZK' : 'G-XJ83JQEK7J';
const APOLLO_TRACKING_ID = PRODUCTION_GA ? '691c2e920c5e20000d7801b6' : 'dev-id';

export default class MyDocument extends Document {
render() {
const { canonicalAsServer, userLanguage } = this.props;

return (
<Html lang={userLanguage} data-mui-color-scheme="light" data-joy-color-scheme="light">
<Head>
{/*
manifest.json provides metadata used when your web app is added to the
homescreen on Android. See https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/
*/}
<link rel="manifest" href="/static/manifest.json" />
{/* PWA primary color */}
<meta
name="theme-color"
content={getMetaThemeColor('light')}
media="(prefers-color-scheme: light)"
/>
<meta
name="theme-color"
content={getMetaThemeColor('dark')}
media="(prefers-color-scheme: dark)"
/>
<link rel="icon" href="/static/favicon.ico" />
{/* iOS Icon */}
<link rel="apple-touch-icon" sizes="180x180" href="/static/icons/180x180.png" />
{/* SEO */}
<link
rel="canonical"
href={`https://mui.com${
userLanguage === 'en' ? '' : `/${userLanguage}`
}${canonicalAsServer}`}
/>
<link rel="alternate" href={`https://mui.com${canonicalAsServer}`} hrefLang="x-default" />
<GlobalStyles
styles={{
// First SSR paint
'.only-light-mode': {
display: 'block',
},
'.only-dark-mode': {
display: 'none',
},
// Post SSR Hydration
'.mode-dark .only-light-mode': {
display: 'none',
},
'.mode-dark .only-dark-mode': {
display: 'block',
},
// TODO migrate to .only-dark-mode to .only-dark-mode-v2
'[data-mui-color-scheme="light"] .only-dark-mode-v2': {
display: 'none',
},
'[data-mui-color-scheme="dark"] .only-light-mode-v2': {
display: 'none',
},
'.plan-pro, .plan-premium': {
display: 'inline-block',
height: '0.9em',
width: '1em',
verticalAlign: 'middle',
marginLeft: '0.3em',
marginBottom: '0.08em',
backgroundSize: 'contain',
backgroundRepeat: 'no-repeat',
flexShrink: 0,
},
'.plan-pro': {
backgroundImage: 'url(/static/x/pro.svg)',
},
'.plan-premium': {
backgroundImage: 'url(/static/x/premium.svg)',
},
}}
/>
</Head>
<body className={fontClasses}>
<MuiInitColorSchemeScript defaultMode="system" />
<JoyInitColorSchemeScript defaultMode="system" />
<Main />
<script
// eslint-disable-next-line react/no-danger
dangerouslySetInnerHTML={{
__html: `
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
window.gtag = gtag;

${/* Set default consent to denied (Google Consent Mode v2) */ ''}
gtag('consent', 'default', {
'ad_storage': 'denied',
'ad_user_data': 'denied',
'ad_personalization': 'denied',
'analytics_storage': 'denied',
'wait_for_update': 500
});
gtag('set', 'ads_data_redaction', true);
gtag('set', 'url_passthrough', true);

gtag('js', new Date());
gtag('config', '${GOOGLE_ANALYTICS_ID_V4}', {
send_page_view: false,
});

${/* Apollo initialization - called by AnalyticsProvider when consent is granted */ ''}
window.initApollo = function() {
if (window.apolloInitialized) return;
window.apolloInitialized = true;
var n = Math.random().toString(36).substring(7),
o = document.createElement('script');
o.src = 'https://assets.apollo.io/micro/website-tracker/tracker.iife.js?nocache=' + n;
o.async = true;
o.defer = true;
o.onload = function () {
window.trackingFunctions.onLoad({ appId: '${APOLLO_TRACKING_ID}' });
};
document.head.appendChild(o);
};

${/* Check localStorage for existing consent and initialize if already granted */ ''}
(function() {
try {
var consent = localStorage.getItem('docs-cookie-consent');
if (consent === 'analytics') {
window.initApollo();
}
} catch (e) {}
})();
`,
}}
/>
{/**
* A better alternative to <script async>, to delay its execution
* https://developer.chrome.com/blog/script-component/
*/}
<Script
strategy="afterInteractive"
src={`https://www.googletagmanager.com/gtag/js?id=${GOOGLE_ANALYTICS_ID_V4}`}
/>
<NextScript />
</body>
</Html>
<MuiDocsDocument {...this.props}>
<JoyInitColorSchemeScript defaultMode="system" />
</MuiDocsDocument>
);
}
}

MyDocument.getInitialProps = async (ctx) => {
const styledComponentsSheet = new ServerStyleSheet();

try {
const finalProps = await documentGetInitialProps(ctx, {
emotionCache: createEmotionCache(),
plugins: [
{
// styled-components
enhanceApp: (App) => (props) => styledComponentsSheet.collectStyles(<App {...props} />),
resolveProps: async (initialProps) => ({
...initialProps,
styles: [styledComponentsSheet.getStyleElement(), ...initialProps.styles],
}),
},
],
});

// All the URLs should have a leading /.
// This is missing in the Next.js static export.
let url = ctx.req.url;
if (url[url.length - 1] !== '/') {
url += '/';
}

return {
...finalProps,
canonicalAsServer: pathnameToLanguage(url).canonicalAsServer,
userLanguage: ctx.query.userLanguage || 'en',
styles: [
<style id="material-icon-font" key="material-icon-font" />,
<style id="font-awesome-css" key="font-awesome-css" />,
...finalProps.emotionStyleTags,
<style id="app-search" key="app-search" />,
<style id="prismjs" key="prismjs" />,
...React.Children.toArray(finalProps.styles),
],
};
} finally {
styledComponentsSheet.seal();
}
};
Loading
Loading