From 56fae30033ffffdee027916b87ec0c5852b9004b Mon Sep 17 00:00:00 2001 From: Marija Najdova Date: Wed, 23 Sep 2020 20:09:55 +0200 Subject: [PATCH] [Slider] Create unstyled version and migrate to emotion & styled-components (#22435) --- .codesandbox/ci.json | 6 +- babel.config.js | 2 + docs/babel.config.js | 4 + docs/next.config.js | 3 + docs/package.json | 6 + docs/pages/_app.js | 39 +- docs/pages/_document.js | 93 +- docs/pages/api-docs/slider-styled.js | 15 + docs/pages/api-docs/slider-styled.md | 33 + docs/pages/api-docs/slider-unstyled.js | 15 + docs/pages/api-docs/slider-unstyled.md | 58 ++ docs/pages/api-docs/slider.md | 1 + docs/pages/components/slider-styled.js | 28 + docs/pages/components/slider.js | 4 + docs/pages/performance/slider-emotion.js | 25 + docs/pages/performance/slider-jss.js | 25 + docs/src/modules/components/AppFrame.js | 4 + docs/src/modules/utils/RtlContext.js | 8 + docs/src/modules/utils/helpers.js | 2 + docs/src/pages.js | 1 + .../slider-styled/ContinuousSlider.js | 49 + .../slider-styled/ContinuousSlider.tsx | 52 + .../slider-styled/CustomizedSlider.js | 210 ++++ .../slider-styled/CustomizedSlider.tsx | 222 +++++ .../slider-styled/DiscreteSlider.js | 50 + .../slider-styled/DiscreteSlider.tsx | 50 + .../slider-styled/DiscreteSliderLabel.js | 56 ++ .../slider-styled/DiscreteSliderLabel.tsx | 58 ++ .../slider-styled/DiscreteSliderMarks.js | 56 ++ .../slider-styled/DiscreteSliderMarks.tsx | 58 ++ .../slider-styled/DiscreteSliderSteps.js | 36 + .../slider-styled/DiscreteSliderSteps.tsx | 36 + .../slider-styled/DiscreteSliderValues.js | 58 ++ .../slider-styled/DiscreteSliderValues.tsx | 58 ++ .../components/slider-styled/InputSlider.js | 73 ++ .../components/slider-styled/InputSlider.tsx | 78 ++ .../slider-styled/NonLinearSlider.js | 39 + .../slider-styled/NonLinearSlider.tsx | 42 + .../components/slider-styled/RangeSlider.js | 38 + .../components/slider-styled/RangeSlider.tsx | 41 + .../slider-styled/TrackFalseSlider.js | 66 ++ .../slider-styled/TrackFalseSlider.tsx | 68 ++ .../slider-styled/TrackInvertedSlider.js | 66 ++ .../slider-styled/TrackInvertedSlider.tsx | 68 ++ .../slider-styled/UnstyledSlider.js | 63 ++ .../slider-styled/UnstyledSlider.tsx | 63 ++ .../slider-styled/VerticalSlider.js | 67 ++ .../slider-styled/VerticalSlider.tsx | 67 ++ .../components/slider-styled/slider-styled.md | 117 +++ .../guides/right-to-left/RtlOptOutStylis.js | 32 + .../guides/right-to-left/RtlOptOutStylis.tsx | 32 + .../guides/right-to-left/RtlOptOutStylist.js | 32 + .../guides/right-to-left/right-to-left.md | 66 +- framer/scripts/templates/slider.txt | 2 +- .../src/SliderStyled/SliderStyled.d.ts | 36 + .../src/SliderStyled/SliderStyled.js | 316 ++++++ .../src/SliderStyled/SliderStyled.spec.tsx | 16 + .../src/SliderStyled/SliderStyled.test.js | 793 +++++++++++++++ .../src/SliderStyled/ValueLabelStyled.js | 75 ++ .../src/SliderStyled/index.d.ts | 2 + .../material-ui-lab/src/SliderStyled/index.js | 1 + .../src/SliderUnstyled/SliderUnstyled.d.ts | 207 ++++ .../src/SliderUnstyled/SliderUnstyled.js | 936 ++++++++++++++++++ .../src/SliderUnstyled/SliderUnstyled.test.js | 19 + .../src/SliderUnstyled/ValueLabelUnstyled.js | 49 + .../src/SliderUnstyled/index.d.ts | 2 + .../src/SliderUnstyled/index.js | 1 + .../material-ui-styled-engine-sc/README.md | 22 + .../material-ui-styled-engine-sc/package.json | 57 ++ .../src/index.d.ts | 2 + .../material-ui-styled-engine-sc/src/index.js | 12 + .../tsconfig.json | 4 + packages/material-ui-styled-engine/README.md | 3 + .../material-ui-styled-engine/package.json | 52 + .../material-ui-styled-engine/src/index.d.ts | 2 + .../material-ui-styled-engine/src/index.js | 1 + .../material-ui-styled-engine/tsconfig.json | 4 + packages/material-ui-styles/src/index.d.ts | 3 + packages/material-ui-styles/src/index.js | 3 + packages/material-ui/package.json | 3 + packages/material-ui/src/Slider/Slider.d.ts | 1 + packages/material-ui/src/styles/index.d.ts | 2 + packages/material-ui/src/styles/index.js | 2 + .../material-ui/src/styles/muiStyled.d.ts | 208 ++++ packages/material-ui/src/styles/muiStyled.js | 80 ++ .../material-ui/src/styles/useThemeProps.d.ts | 15 + .../material-ui/src/styles/useThemeProps.js | 20 + scripts/sizeSnapshot/webpack.config.js | 8 + tsconfig.json | 4 + webpackBaseConfig.js | 8 + yarn.lock | 12 + 91 files changed, 5477 insertions(+), 45 deletions(-) create mode 100644 docs/pages/api-docs/slider-styled.js create mode 100644 docs/pages/api-docs/slider-styled.md create mode 100644 docs/pages/api-docs/slider-unstyled.js create mode 100644 docs/pages/api-docs/slider-unstyled.md create mode 100644 docs/pages/components/slider-styled.js create mode 100644 docs/pages/performance/slider-emotion.js create mode 100644 docs/pages/performance/slider-jss.js create mode 100644 docs/src/modules/utils/RtlContext.js create mode 100644 docs/src/pages/components/slider-styled/ContinuousSlider.js create mode 100644 docs/src/pages/components/slider-styled/ContinuousSlider.tsx create mode 100644 docs/src/pages/components/slider-styled/CustomizedSlider.js create mode 100644 docs/src/pages/components/slider-styled/CustomizedSlider.tsx create mode 100644 docs/src/pages/components/slider-styled/DiscreteSlider.js create mode 100644 docs/src/pages/components/slider-styled/DiscreteSlider.tsx create mode 100644 docs/src/pages/components/slider-styled/DiscreteSliderLabel.js create mode 100644 docs/src/pages/components/slider-styled/DiscreteSliderLabel.tsx create mode 100644 docs/src/pages/components/slider-styled/DiscreteSliderMarks.js create mode 100644 docs/src/pages/components/slider-styled/DiscreteSliderMarks.tsx create mode 100644 docs/src/pages/components/slider-styled/DiscreteSliderSteps.js create mode 100644 docs/src/pages/components/slider-styled/DiscreteSliderSteps.tsx create mode 100644 docs/src/pages/components/slider-styled/DiscreteSliderValues.js create mode 100644 docs/src/pages/components/slider-styled/DiscreteSliderValues.tsx create mode 100644 docs/src/pages/components/slider-styled/InputSlider.js create mode 100644 docs/src/pages/components/slider-styled/InputSlider.tsx create mode 100644 docs/src/pages/components/slider-styled/NonLinearSlider.js create mode 100644 docs/src/pages/components/slider-styled/NonLinearSlider.tsx create mode 100644 docs/src/pages/components/slider-styled/RangeSlider.js create mode 100644 docs/src/pages/components/slider-styled/RangeSlider.tsx create mode 100644 docs/src/pages/components/slider-styled/TrackFalseSlider.js create mode 100644 docs/src/pages/components/slider-styled/TrackFalseSlider.tsx create mode 100644 docs/src/pages/components/slider-styled/TrackInvertedSlider.js create mode 100644 docs/src/pages/components/slider-styled/TrackInvertedSlider.tsx create mode 100644 docs/src/pages/components/slider-styled/UnstyledSlider.js create mode 100644 docs/src/pages/components/slider-styled/UnstyledSlider.tsx create mode 100644 docs/src/pages/components/slider-styled/VerticalSlider.js create mode 100644 docs/src/pages/components/slider-styled/VerticalSlider.tsx create mode 100644 docs/src/pages/components/slider-styled/slider-styled.md create mode 100644 docs/src/pages/guides/right-to-left/RtlOptOutStylis.js create mode 100644 docs/src/pages/guides/right-to-left/RtlOptOutStylis.tsx create mode 100644 docs/src/pages/guides/right-to-left/RtlOptOutStylist.js create mode 100644 packages/material-ui-lab/src/SliderStyled/SliderStyled.d.ts create mode 100644 packages/material-ui-lab/src/SliderStyled/SliderStyled.js create mode 100644 packages/material-ui-lab/src/SliderStyled/SliderStyled.spec.tsx create mode 100644 packages/material-ui-lab/src/SliderStyled/SliderStyled.test.js create mode 100644 packages/material-ui-lab/src/SliderStyled/ValueLabelStyled.js create mode 100644 packages/material-ui-lab/src/SliderStyled/index.d.ts create mode 100644 packages/material-ui-lab/src/SliderStyled/index.js create mode 100644 packages/material-ui-lab/src/SliderUnstyled/SliderUnstyled.d.ts create mode 100644 packages/material-ui-lab/src/SliderUnstyled/SliderUnstyled.js create mode 100644 packages/material-ui-lab/src/SliderUnstyled/SliderUnstyled.test.js create mode 100644 packages/material-ui-lab/src/SliderUnstyled/ValueLabelUnstyled.js create mode 100644 packages/material-ui-lab/src/SliderUnstyled/index.d.ts create mode 100644 packages/material-ui-lab/src/SliderUnstyled/index.js create mode 100644 packages/material-ui-styled-engine-sc/README.md create mode 100644 packages/material-ui-styled-engine-sc/package.json create mode 100644 packages/material-ui-styled-engine-sc/src/index.d.ts create mode 100644 packages/material-ui-styled-engine-sc/src/index.js create mode 100644 packages/material-ui-styled-engine-sc/tsconfig.json create mode 100644 packages/material-ui-styled-engine/README.md create mode 100644 packages/material-ui-styled-engine/package.json create mode 100644 packages/material-ui-styled-engine/src/index.d.ts create mode 100644 packages/material-ui-styled-engine/src/index.js create mode 100644 packages/material-ui-styled-engine/tsconfig.json create mode 100644 packages/material-ui/src/styles/muiStyled.d.ts create mode 100644 packages/material-ui/src/styles/muiStyled.js create mode 100644 packages/material-ui/src/styles/useThemeProps.d.ts create mode 100644 packages/material-ui/src/styles/useThemeProps.js diff --git a/.codesandbox/ci.json b/.codesandbox/ci.json index f1f80be03d4c90..fa2d24b4522891 100644 --- a/.codesandbox/ci.json +++ b/.codesandbox/ci.json @@ -7,13 +7,17 @@ "packages/material-ui-styles", "packages/material-ui-system", "packages/material-ui-types", - "packages/material-ui-utils" + "packages/material-ui-utils", + "packages/material-ui-styled-engine", + "packages/material-ui-styled-engine-sc" ], "publishDirectory": { "@material-ui/core": "packages/material-ui/build", "@material-ui/icons": "packages/material-ui-icons/build", "@material-ui/lab": "packages/material-ui-lab/build", "@material-ui/styles": "packages/material-ui-styles/build", + "@material-ui/styled-engine": "packages/material-ui-styled-engine/build", + "@material-ui/styled-engine-sc": "packages/material-ui-styled-engine-sc/build", "@material-ui/system": "packages/material-ui-system/build", "@material-ui/types": "packages/material-ui-types", "@material-ui/utils": "packages/material-ui-utils/build" diff --git a/babel.config.js b/babel.config.js index 162d469804993a..30bfea34532466 100644 --- a/babel.config.js +++ b/babel.config.js @@ -27,6 +27,8 @@ const defaultAlias = { '@material-ui/docs': './packages/material-ui-docs/src', '@material-ui/icons': './packages/material-ui-icons/src', '@material-ui/lab': './packages/material-ui-lab/src', + '@material-ui/styled-engine': './packages/material-ui-styled-engine/src', + '@material-ui/styled-engine-sc': './packages/material-ui-styled-engine-sc/src', '@material-ui/styles': './packages/material-ui-styles/src', '@material-ui/system': './packages/material-ui-system/src', '@material-ui/utils': './packages/material-ui-utils/src', diff --git a/docs/babel.config.js b/docs/babel.config.js index 5b3c1a4a066b8c..1c3513f83bc45a 100644 --- a/docs/babel.config.js +++ b/docs/babel.config.js @@ -19,6 +19,10 @@ const alias = { '@material-ui/icons': '../packages/material-ui-icons/src', '@material-ui/lab': '../packages/material-ui-lab/src', '@material-ui/styles': '../packages/material-ui-styles/src', + '@material-ui/styled-engine-sc': '../packages/material-ui-styled-engine-sc/src', + // Swap the comments on the next two lines for using the styled-components as style engine + '@material-ui/styled-engine': '../packages/material-ui-styled-engine/src', + // '@material-ui/styled-engine': '../packages/material-ui-styled-engine-sc/src', '@material-ui/system': '../packages/material-ui-system/src', '@material-ui/utils': '../packages/material-ui-utils/src', docs: './', diff --git a/docs/next.config.js b/docs/next.config.js index 2bad5c996578c6..009b0985ae31f1 100644 --- a/docs/next.config.js +++ b/docs/next.config.js @@ -115,6 +115,9 @@ module.exports = { '@material-ui/docs': '../packages/material-ui-docs/src', '@material-ui/icons': '../packages/material-ui-icons/src', '@material-ui/lab': '../packages/material-ui-lab/src', + '@material-ui/styled-engine': '../packages/material-ui-styled-engine/src', + '@material-ui/styled-engine-sc': + '../packages/material-ui-styled-engine-sc/src', '@material-ui/styles': '../packages/material-ui-styles/src', '@material-ui/system': '../packages/material-ui-system/src', '@material-ui/utils': '../packages/material-ui-utils/src', diff --git a/docs/package.json b/docs/package.json index 22a48d634d00a1..7e5da2a1b36390 100644 --- a/docs/package.json +++ b/docs/package.json @@ -22,6 +22,7 @@ "@babel/plugin-transform-object-assign": "^7.10.1", "@babel/runtime-corejs2": "^7.10.2", "@date-io/core": "^1.3.9", + "@emotion/cache": "^10.0.27", "@emotion/core": "^10.0.27", "@emotion/styled": "^10.0.27", "@fortawesome/fontawesome-svg-core": "^1.2.30", @@ -32,6 +33,8 @@ "@material-ui/icons": "^5.0.0-alpha.1", "@material-ui/lab": "^5.0.0-alpha.1", "@material-ui/pickers": "^4.0.0-alpha.11", + "@material-ui/styled-engine": "^5.0.0-alpha.1", + "@material-ui/styled-engine-sc": "^5.0.0-alpha.1", "@material-ui/styles": "^5.0.0-alpha.1", "@material-ui/system": "^5.0.0-alpha.1", "@material-ui/types": "^5.0.0", @@ -68,6 +71,8 @@ "date-fns": "^2.15.0", "docsearch.js": "^2.6.3", "doctrine": "^3.0.0", + "emotion-server": "^10.0.27", + "emotion-theming": "^10.0.27", "express": "^4.17.1", "fg-loadcss": "^2.0.1", "final-form": "^4.18.5", @@ -110,6 +115,7 @@ "redux-logger": "^3.0.6", "rimraf": "^3.0.0", "styled-components": "^5.0.0", + "stylis-plugin-rtl": "^1.0.0", "webfontloader": "^1.6.28", "webpack": "^4.41.0", "webpack-bundle-analyzer": "^3.5.1" diff --git a/docs/pages/_app.js b/docs/pages/_app.js index 68494174449b7a..5f630b1c1ce66b 100644 --- a/docs/pages/_app.js +++ b/docs/pages/_app.js @@ -8,7 +8,11 @@ import NextHead from 'next/head'; import PropTypes from 'prop-types'; import acceptLanguage from 'accept-language'; import { create } from 'jss'; -import rtl from 'jss-rtl'; +import jssRtl from 'jss-rtl'; +import { StyleSheetManager } from 'styled-components'; +import { CacheProvider } from '@emotion/core'; +import createCache from '@emotion/cache'; +import rtlPlugin from 'stylis-plugin-rtl'; import { useRouter } from 'next/router'; import { StylesProvider, jssPreset } from '@material-ui/styles'; import pages from 'docs/src/pages'; @@ -16,13 +20,14 @@ import initRedux from 'docs/src/modules/redux/initRedux'; import PageContext from 'docs/src/modules/components/PageContext'; import GoogleAnalytics from 'docs/src/modules/components/GoogleAnalytics'; import loadScript from 'docs/src/modules/utils/loadScript'; +import RtlContext from 'docs/src/modules/utils/RtlContext'; import { ThemeProvider } from 'docs/src/modules/components/ThemeContext'; import { pathnameToLanguage, getCookie } from 'docs/src/modules/utils/helpers'; import { ACTION_TYPES, CODE_VARIANTS } from 'docs/src/modules/constants'; // Configure JSS const jss = create({ - plugins: [...jssPreset().plugins, rtl()], + plugins: [...jssPreset().plugins, jssRtl()], insertionPoint: process.browser ? document.querySelector('#insertion-point-jss') : null, }); @@ -275,6 +280,17 @@ function findActivePage(currentPages, pathname) { return activePage; } +// Cache for the ltr version of the styles +const cacheLtr = createCache(); +cacheLtr.compat = true; + +// Cache for the rtl version of the styles +const cacheRtl = createCache({ + key: 'rtl', + stylisPlugins: [rtlPlugin], +}); +cacheRtl.compat = true; + function AppWrapper(props) { const { children, pageProps } = props; @@ -283,6 +299,9 @@ function AppWrapper(props) { initRedux({ options: { userLanguage: pageProps.userLanguage } }), ); + const [rtl, setRtl] = React.useState(false); + const rtlContextValue = { rtl, setRtl }; + React.useEffect(() => { loadDependencies(); registerServiceWorker(); @@ -313,11 +332,17 @@ function AppWrapper(props) { ))} - - - {children} - - + + + + + + {children} + + + + + diff --git a/docs/pages/_document.js b/docs/pages/_document.js index 84aa2b00839faa..0229e37934d88f 100644 --- a/docs/pages/_document.js +++ b/docs/pages/_document.js @@ -1,5 +1,7 @@ import React from 'react'; import { ServerStyleSheets } from '@material-ui/styles'; +import { ServerStyleSheet } from 'styled-components'; +import { extractCritical } from 'emotion-server'; import Document, { Html, Head, Main, NextScript } from 'next/document'; import { LANGUAGES_SSR } from 'docs/src/modules/constants'; import { pathnameToLanguage } from 'docs/src/modules/utils/helpers'; @@ -92,55 +94,78 @@ export default class MyDocument extends Document { } } +// `getInitialProps` belongs to `_document` (instead of `_app`), +// it's compatible with static-site generation (SSG). MyDocument.getInitialProps = async (ctx) => { // Resolution order // // On the server: - // 1. page.getInitialProps - // 2. document.getInitialProps - // 3. page.render - // 4. document.render + // 1. app.getInitialProps + // 2. page.getInitialProps + // 3. document.getInitialProps + // 4. app.render + // 5. page.render + // 6. document.render // // On the server with error: - // 2. document.getInitialProps + // 1. document.getInitialProps + // 2. app.render // 3. page.render // 4. document.render // // On the client - // 1. page.getInitialProps - // 3. page.render + // 1. app.getInitialProps + // 2. page.getInitialProps + // 3. app.render + // 4. page.render // Render app and page and get the context of the page with collected side effects. - const sheets = new ServerStyleSheets(); + const materialSheets = new ServerStyleSheets(); + const styledComponentsSheet = new ServerStyleSheet(); const originalRenderPage = ctx.renderPage; - ctx.renderPage = () => - originalRenderPage({ - enhanceApp: (App) => (props) => sheets.collect(), - }); + try { + ctx.renderPage = () => + originalRenderPage({ + enhanceApp: (App) => (props) => + styledComponentsSheet.collectStyles(materialSheets.collect()), + }); - const initialProps = await Document.getInitialProps(ctx); + const initialProps = await Document.getInitialProps(ctx); + const emotionStyles = extractCritical(initialProps.html); - let css = sheets.toString(); - // It might be undefined, e.g. after an error. - if (css && process.env.NODE_ENV === 'production') { - const result1 = await prefixer.process(css, { from: undefined }); - css = result1.css; - css = cleanCSS.minify(css).styles; - } + let css = materialSheets.toString(); + // It might be undefined, e.g. after an error. + if (css && process.env.NODE_ENV === 'production') { + const result1 = await prefixer.process(css, { from: undefined }); + css = result1.css; + css = cleanCSS.minify(css).styles; + } - return { - ...initialProps, - canonical: pathnameToLanguage(ctx.req.url).canonical, - userLanguage: ctx.query.userLanguage || 'en', - styles: [ - ...React.Children.toArray(initialProps.styles), -