Skip to content

Commit 56fae30

Browse files
authored
[Slider] Create unstyled version and migrate to emotion & styled-components (#22435)
1 parent 688386a commit 56fae30

File tree

91 files changed

+5477
-45
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

91 files changed

+5477
-45
lines changed

.codesandbox/ci.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,17 @@
77
"packages/material-ui-styles",
88
"packages/material-ui-system",
99
"packages/material-ui-types",
10-
"packages/material-ui-utils"
10+
"packages/material-ui-utils",
11+
"packages/material-ui-styled-engine",
12+
"packages/material-ui-styled-engine-sc"
1113
],
1214
"publishDirectory": {
1315
"@material-ui/core": "packages/material-ui/build",
1416
"@material-ui/icons": "packages/material-ui-icons/build",
1517
"@material-ui/lab": "packages/material-ui-lab/build",
1618
"@material-ui/styles": "packages/material-ui-styles/build",
19+
"@material-ui/styled-engine": "packages/material-ui-styled-engine/build",
20+
"@material-ui/styled-engine-sc": "packages/material-ui-styled-engine-sc/build",
1721
"@material-ui/system": "packages/material-ui-system/build",
1822
"@material-ui/types": "packages/material-ui-types",
1923
"@material-ui/utils": "packages/material-ui-utils/build"

babel.config.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ const defaultAlias = {
2727
'@material-ui/docs': './packages/material-ui-docs/src',
2828
'@material-ui/icons': './packages/material-ui-icons/src',
2929
'@material-ui/lab': './packages/material-ui-lab/src',
30+
'@material-ui/styled-engine': './packages/material-ui-styled-engine/src',
31+
'@material-ui/styled-engine-sc': './packages/material-ui-styled-engine-sc/src',
3032
'@material-ui/styles': './packages/material-ui-styles/src',
3133
'@material-ui/system': './packages/material-ui-system/src',
3234
'@material-ui/utils': './packages/material-ui-utils/src',

docs/babel.config.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ const alias = {
1919
'@material-ui/icons': '../packages/material-ui-icons/src',
2020
'@material-ui/lab': '../packages/material-ui-lab/src',
2121
'@material-ui/styles': '../packages/material-ui-styles/src',
22+
'@material-ui/styled-engine-sc': '../packages/material-ui-styled-engine-sc/src',
23+
// Swap the comments on the next two lines for using the styled-components as style engine
24+
'@material-ui/styled-engine': '../packages/material-ui-styled-engine/src',
25+
// '@material-ui/styled-engine': '../packages/material-ui-styled-engine-sc/src',
2226
'@material-ui/system': '../packages/material-ui-system/src',
2327
'@material-ui/utils': '../packages/material-ui-utils/src',
2428
docs: './',

docs/next.config.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,9 @@ module.exports = {
115115
'@material-ui/docs': '../packages/material-ui-docs/src',
116116
'@material-ui/icons': '../packages/material-ui-icons/src',
117117
'@material-ui/lab': '../packages/material-ui-lab/src',
118+
'@material-ui/styled-engine': '../packages/material-ui-styled-engine/src',
119+
'@material-ui/styled-engine-sc':
120+
'../packages/material-ui-styled-engine-sc/src',
118121
'@material-ui/styles': '../packages/material-ui-styles/src',
119122
'@material-ui/system': '../packages/material-ui-system/src',
120123
'@material-ui/utils': '../packages/material-ui-utils/src',

docs/package.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
"@babel/plugin-transform-object-assign": "^7.10.1",
2323
"@babel/runtime-corejs2": "^7.10.2",
2424
"@date-io/core": "^1.3.9",
25+
"@emotion/cache": "^10.0.27",
2526
"@emotion/core": "^10.0.27",
2627
"@emotion/styled": "^10.0.27",
2728
"@fortawesome/fontawesome-svg-core": "^1.2.30",
@@ -32,6 +33,8 @@
3233
"@material-ui/icons": "^5.0.0-alpha.1",
3334
"@material-ui/lab": "^5.0.0-alpha.1",
3435
"@material-ui/pickers": "^4.0.0-alpha.11",
36+
"@material-ui/styled-engine": "^5.0.0-alpha.1",
37+
"@material-ui/styled-engine-sc": "^5.0.0-alpha.1",
3538
"@material-ui/styles": "^5.0.0-alpha.1",
3639
"@material-ui/system": "^5.0.0-alpha.1",
3740
"@material-ui/types": "^5.0.0",
@@ -68,6 +71,8 @@
6871
"date-fns": "^2.15.0",
6972
"docsearch.js": "^2.6.3",
7073
"doctrine": "^3.0.0",
74+
"emotion-server": "^10.0.27",
75+
"emotion-theming": "^10.0.27",
7176
"express": "^4.17.1",
7277
"fg-loadcss": "^2.0.1",
7378
"final-form": "^4.18.5",
@@ -110,6 +115,7 @@
110115
"redux-logger": "^3.0.6",
111116
"rimraf": "^3.0.0",
112117
"styled-components": "^5.0.0",
118+
"stylis-plugin-rtl": "^1.0.0",
113119
"webfontloader": "^1.6.28",
114120
"webpack": "^4.41.0",
115121
"webpack-bundle-analyzer": "^3.5.1"

docs/pages/_app.js

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,26 @@ import NextHead from 'next/head';
88
import PropTypes from 'prop-types';
99
import acceptLanguage from 'accept-language';
1010
import { create } from 'jss';
11-
import rtl from 'jss-rtl';
11+
import jssRtl from 'jss-rtl';
12+
import { StyleSheetManager } from 'styled-components';
13+
import { CacheProvider } from '@emotion/core';
14+
import createCache from '@emotion/cache';
15+
import rtlPlugin from 'stylis-plugin-rtl';
1216
import { useRouter } from 'next/router';
1317
import { StylesProvider, jssPreset } from '@material-ui/styles';
1418
import pages from 'docs/src/pages';
1519
import initRedux from 'docs/src/modules/redux/initRedux';
1620
import PageContext from 'docs/src/modules/components/PageContext';
1721
import GoogleAnalytics from 'docs/src/modules/components/GoogleAnalytics';
1822
import loadScript from 'docs/src/modules/utils/loadScript';
23+
import RtlContext from 'docs/src/modules/utils/RtlContext';
1924
import { ThemeProvider } from 'docs/src/modules/components/ThemeContext';
2025
import { pathnameToLanguage, getCookie } from 'docs/src/modules/utils/helpers';
2126
import { ACTION_TYPES, CODE_VARIANTS } from 'docs/src/modules/constants';
2227

2328
// Configure JSS
2429
const jss = create({
25-
plugins: [...jssPreset().plugins, rtl()],
30+
plugins: [...jssPreset().plugins, jssRtl()],
2631
insertionPoint: process.browser ? document.querySelector('#insertion-point-jss') : null,
2732
});
2833

@@ -275,6 +280,17 @@ function findActivePage(currentPages, pathname) {
275280
return activePage;
276281
}
277282

283+
// Cache for the ltr version of the styles
284+
const cacheLtr = createCache();
285+
cacheLtr.compat = true;
286+
287+
// Cache for the rtl version of the styles
288+
const cacheRtl = createCache({
289+
key: 'rtl',
290+
stylisPlugins: [rtlPlugin],
291+
});
292+
cacheRtl.compat = true;
293+
278294
function AppWrapper(props) {
279295
const { children, pageProps } = props;
280296

@@ -283,6 +299,9 @@ function AppWrapper(props) {
283299
initRedux({ options: { userLanguage: pageProps.userLanguage } }),
284300
);
285301

302+
const [rtl, setRtl] = React.useState(false);
303+
const rtlContextValue = { rtl, setRtl };
304+
286305
React.useEffect(() => {
287306
loadDependencies();
288307
registerServiceWorker();
@@ -313,11 +332,17 @@ function AppWrapper(props) {
313332
))}
314333
</NextHead>
315334
<ReduxProvider store={redux}>
316-
<PageContext.Provider value={{ activePage, pages, versions: pageProps.versions }}>
317-
<StylesProvider jss={jss}>
318-
<ThemeProvider>{children}</ThemeProvider>
319-
</StylesProvider>
320-
</PageContext.Provider>
335+
<RtlContext.Provider value={rtlContextValue}>
336+
<PageContext.Provider value={{ activePage, pages, versions: pageProps.versions }}>
337+
<StyleSheetManager stylisPlugins={rtl ? [rtlPlugin] : []}>
338+
<CacheProvider value={rtl ? cacheRtl : cacheLtr}>
339+
<StylesProvider jss={jss}>
340+
<ThemeProvider>{children}</ThemeProvider>
341+
</StylesProvider>
342+
</CacheProvider>
343+
</StyleSheetManager>
344+
</PageContext.Provider>
345+
</RtlContext.Provider>
321346
<LanguageNegotiation />
322347
<Analytics />
323348
</ReduxProvider>

docs/pages/_document.js

Lines changed: 59 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import React from 'react';
22
import { ServerStyleSheets } from '@material-ui/styles';
3+
import { ServerStyleSheet } from 'styled-components';
4+
import { extractCritical } from 'emotion-server';
35
import Document, { Html, Head, Main, NextScript } from 'next/document';
46
import { LANGUAGES_SSR } from 'docs/src/modules/constants';
57
import { pathnameToLanguage } from 'docs/src/modules/utils/helpers';
@@ -92,55 +94,78 @@ export default class MyDocument extends Document {
9294
}
9395
}
9496

97+
// `getInitialProps` belongs to `_document` (instead of `_app`),
98+
// it's compatible with static-site generation (SSG).
9599
MyDocument.getInitialProps = async (ctx) => {
96100
// Resolution order
97101
//
98102
// On the server:
99-
// 1. page.getInitialProps
100-
// 2. document.getInitialProps
101-
// 3. page.render
102-
// 4. document.render
103+
// 1. app.getInitialProps
104+
// 2. page.getInitialProps
105+
// 3. document.getInitialProps
106+
// 4. app.render
107+
// 5. page.render
108+
// 6. document.render
103109
//
104110
// On the server with error:
105-
// 2. document.getInitialProps
111+
// 1. document.getInitialProps
112+
// 2. app.render
106113
// 3. page.render
107114
// 4. document.render
108115
//
109116
// On the client
110-
// 1. page.getInitialProps
111-
// 3. page.render
117+
// 1. app.getInitialProps
118+
// 2. page.getInitialProps
119+
// 3. app.render
120+
// 4. page.render
112121

113122
// Render app and page and get the context of the page with collected side effects.
114-
const sheets = new ServerStyleSheets();
123+
const materialSheets = new ServerStyleSheets();
124+
const styledComponentsSheet = new ServerStyleSheet();
115125
const originalRenderPage = ctx.renderPage;
116126

117-
ctx.renderPage = () =>
118-
originalRenderPage({
119-
enhanceApp: (App) => (props) => sheets.collect(<App {...props} />),
120-
});
127+
try {
128+
ctx.renderPage = () =>
129+
originalRenderPage({
130+
enhanceApp: (App) => (props) =>
131+
styledComponentsSheet.collectStyles(materialSheets.collect(<App {...props} />)),
132+
});
121133

122-
const initialProps = await Document.getInitialProps(ctx);
134+
const initialProps = await Document.getInitialProps(ctx);
135+
const emotionStyles = extractCritical(initialProps.html);
123136

124-
let css = sheets.toString();
125-
// It might be undefined, e.g. after an error.
126-
if (css && process.env.NODE_ENV === 'production') {
127-
const result1 = await prefixer.process(css, { from: undefined });
128-
css = result1.css;
129-
css = cleanCSS.minify(css).styles;
130-
}
137+
let css = materialSheets.toString();
138+
// It might be undefined, e.g. after an error.
139+
if (css && process.env.NODE_ENV === 'production') {
140+
const result1 = await prefixer.process(css, { from: undefined });
141+
css = result1.css;
142+
css = cleanCSS.minify(css).styles;
143+
}
131144

132-
return {
133-
...initialProps,
134-
canonical: pathnameToLanguage(ctx.req.url).canonical,
135-
userLanguage: ctx.query.userLanguage || 'en',
136-
styles: [
137-
...React.Children.toArray(initialProps.styles),
138-
<style
139-
id="jss-server-side"
140-
key="jss-server-side"
141-
// eslint-disable-next-line react/no-danger
142-
dangerouslySetInnerHTML={{ __html: css }}
143-
/>,
144-
],
145-
};
145+
return {
146+
...initialProps,
147+
canonical: pathnameToLanguage(ctx.req.url).canonical,
148+
userLanguage: ctx.query.userLanguage || 'en',
149+
// Styles fragment is rendered after the app and page rendering finish.
150+
styles: [
151+
...React.Children.toArray(initialProps.styles),
152+
<style
153+
id="jss-server-side"
154+
key="jss-server-side"
155+
// eslint-disable-next-line react/no-danger
156+
dangerouslySetInnerHTML={{ __html: css }}
157+
/>,
158+
<style
159+
id="emotion-server-side"
160+
key="emotion-server-side"
161+
data-emotion-css={emotionStyles.ids.join(' ')}
162+
// eslint-disable-next-line react/no-danger
163+
dangerouslySetInnerHTML={{ __html: emotionStyles.css }}
164+
/>,
165+
styledComponentsSheet.getStyleElement(),
166+
],
167+
};
168+
} finally {
169+
styledComponentsSheet.seal();
170+
}
146171
};
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import React from 'react';
2+
import MarkdownDocs from 'docs/src/modules/components/MarkdownDocs';
3+
import { prepareMarkdown } from 'docs/src/modules/utils/parseMarkdown';
4+
5+
const pageFilename = 'api/slider-styled';
6+
const requireRaw = require.context('!raw-loader!./', false, /\/slider-styled\.md$/);
7+
8+
export default function Page({ docs }) {
9+
return <MarkdownDocs docs={docs} />;
10+
}
11+
12+
Page.getInitialProps = () => {
13+
const { demos, docs } = prepareMarkdown({ pageFilename, requireRaw });
14+
return { demos, docs };
15+
};
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
---
2+
filename: /packages/material-ui-lab/src/SliderStyled/SliderStyled.js
3+
---
4+
5+
<!--- This documentation is automatically generated, do not try to edit it. -->
6+
7+
# SliderStyled API
8+
9+
<p class="description">The API documentation of the SliderStyled React component. Learn more about the props and the CSS customization points.</p>
10+
11+
## Import
12+
13+
```js
14+
import SliderStyled from '@material-ui/lab/SliderStyled';
15+
// or
16+
import { SliderStyled } from '@material-ui/lab';
17+
```
18+
19+
You can learn more about the difference by [reading this guide](/guides/minimizing-bundle-size/).
20+
21+
22+
23+
24+
25+
## Props
26+
27+
| Name | Type | Default | Description |
28+
|:-----|:-----|:--------|:------------|
29+
30+
The `ref` is forwarded to the root element.
31+
32+
Any other props supplied will be provided to the root element (native element).
33+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import React from 'react';
2+
import MarkdownDocs from 'docs/src/modules/components/MarkdownDocs';
3+
import { prepareMarkdown } from 'docs/src/modules/utils/parseMarkdown';
4+
5+
const pageFilename = 'api/slider-unstyled';
6+
const requireRaw = require.context('!raw-loader!./', false, /\/slider-unstyled\.md$/);
7+
8+
export default function Page({ docs }) {
9+
return <MarkdownDocs docs={docs} />;
10+
}
11+
12+
Page.getInitialProps = () => {
13+
const { demos, docs } = prepareMarkdown({ pageFilename, requireRaw });
14+
return { demos, docs };
15+
};

0 commit comments

Comments
 (0)