diff --git a/docs/src/pages/demos/progress/CircularDeterminate.tsx b/docs/src/pages/demos/progress/CircularDeterminate.tsx
new file mode 100644
index 00000000000000..08598fa33a69d3
--- /dev/null
+++ b/docs/src/pages/demos/progress/CircularDeterminate.tsx
@@ -0,0 +1,40 @@
+import React from 'react';
+import { makeStyles, Theme } from '@material-ui/core/styles';
+import CircularProgress from '@material-ui/core/CircularProgress';
+
+const useStyles = makeStyles((theme: Theme) => ({
+ progress: {
+ margin: theme.spacing(2),
+ },
+}));
+
+function CircularDeterminate() {
+ const classes = useStyles();
+ const [progress, setProgress] = React.useState(0);
+
+ React.useEffect(() => {
+ function tick() {
+ // reset when reaching 100%
+ setProgress(oldProgress => (oldProgress >= 100 ? 0 : oldProgress + 1));
+ }
+
+ const timer = setInterval(tick, 20);
+ return () => {
+ clearInterval(timer);
+ };
+ }, []);
+
+ return (
+
+
+
+
+ );
+}
+
+export default CircularDeterminate;
diff --git a/docs/src/pages/demos/progress/CircularIndeterminate.tsx b/docs/src/pages/demos/progress/CircularIndeterminate.tsx
new file mode 100644
index 00000000000000..699dc32db51d22
--- /dev/null
+++ b/docs/src/pages/demos/progress/CircularIndeterminate.tsx
@@ -0,0 +1,29 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { createStyles, withStyles, WithStyles, Theme } from '@material-ui/core/styles';
+import CircularProgress from '@material-ui/core/CircularProgress';
+
+const styles = (theme: Theme) =>
+ createStyles({
+ progress: {
+ margin: theme.spacing(2),
+ },
+ });
+
+export type Props = WithStyles;
+
+function CircularIndeterminate(props: Props) {
+ const { classes } = props;
+ return (
+
+
+
+
+ );
+}
+
+CircularIndeterminate.propTypes = {
+ classes: PropTypes.object.isRequired,
+} as any;
+
+export default withStyles(styles)(CircularIndeterminate);
diff --git a/docs/src/pages/demos/progress/CircularIntegration.js b/docs/src/pages/demos/progress/CircularIntegration.js
index 4ccac71a669c98..bb8b9b8b52f18d 100644
--- a/docs/src/pages/demos/progress/CircularIntegration.js
+++ b/docs/src/pages/demos/progress/CircularIntegration.js
@@ -44,7 +44,7 @@ function CircularIntegration() {
const classes = useStyles();
const [loading, setLoading] = React.useState(false);
const [success, setSuccess] = React.useState(false);
- const timer = React.useRef(null);
+ const timer = React.useRef(undefined);
const buttonClassname = clsx({
[classes.buttonSuccess]: success,
diff --git a/docs/src/pages/demos/progress/CircularIntegration.tsx b/docs/src/pages/demos/progress/CircularIntegration.tsx
new file mode 100644
index 00000000000000..b6e3f3de3a6bc4
--- /dev/null
+++ b/docs/src/pages/demos/progress/CircularIntegration.tsx
@@ -0,0 +1,94 @@
+import React from 'react';
+import clsx from 'clsx';
+import { makeStyles, Theme } from '@material-ui/core/styles';
+import CircularProgress from '@material-ui/core/CircularProgress';
+import green from '@material-ui/core/colors/green';
+import Button from '@material-ui/core/Button';
+import Fab from '@material-ui/core/Fab';
+import CheckIcon from '@material-ui/icons/Check';
+import SaveIcon from '@material-ui/icons/Save';
+
+const useStyles = makeStyles((theme: Theme) => ({
+ root: {
+ display: 'flex',
+ alignItems: 'center',
+ },
+ wrapper: {
+ margin: theme.spacing(1),
+ position: 'relative',
+ },
+ buttonSuccess: {
+ backgroundColor: green[500],
+ '&:hover': {
+ backgroundColor: green[700],
+ },
+ },
+ fabProgress: {
+ color: green[500],
+ position: 'absolute',
+ top: -6,
+ left: -6,
+ zIndex: 1,
+ },
+ buttonProgress: {
+ color: green[500],
+ position: 'absolute',
+ top: '50%',
+ left: '50%',
+ marginTop: -12,
+ marginLeft: -12,
+ },
+}));
+
+function CircularIntegration() {
+ const classes = useStyles();
+ const [loading, setLoading] = React.useState(false);
+ const [success, setSuccess] = React.useState(false);
+ const timer = React.useRef(undefined);
+
+ const buttonClassname = clsx({
+ [classes.buttonSuccess]: success,
+ });
+
+ React.useEffect(() => {
+ return () => {
+ clearTimeout(timer.current);
+ };
+ }, []);
+
+ function handleButtonClick() {
+ if (!loading) {
+ setSuccess(false);
+ setLoading(true);
+ timer.current = setTimeout(() => {
+ setSuccess(true);
+ setLoading(false);
+ }, 2000);
+ }
+ }
+
+ return (
+
+
+
+ {success ? : }
+
+ {loading && }
+
+
+
+ {loading && }
+
+
+ );
+}
+
+export default CircularIntegration;
diff --git a/docs/src/pages/demos/progress/CircularStatic.tsx b/docs/src/pages/demos/progress/CircularStatic.tsx
new file mode 100644
index 00000000000000..fa1b56c9b45128
--- /dev/null
+++ b/docs/src/pages/demos/progress/CircularStatic.tsx
@@ -0,0 +1,38 @@
+import React from 'react';
+import { makeStyles, Theme } from '@material-ui/core/styles';
+import CircularProgress from '@material-ui/core/CircularProgress';
+
+const useStyles = makeStyles((theme: Theme) => ({
+ progress: {
+ margin: theme.spacing(2),
+ },
+}));
+
+function CircularStatic() {
+ const classes = useStyles();
+ const [completed, setCompleted] = React.useState(0);
+
+ React.useEffect(() => {
+ function progress() {
+ setCompleted(prevCompleted => (prevCompleted >= 100 ? 0 : prevCompleted + 10));
+ }
+
+ const timer = setInterval(progress, 1000);
+ return () => {
+ clearInterval(timer);
+ };
+ }, []);
+
+ return (
+
+
+
+
+
+
+
+
+ );
+}
+
+export default CircularStatic;
diff --git a/docs/src/pages/demos/progress/CircularUnderLoad.tsx b/docs/src/pages/demos/progress/CircularUnderLoad.tsx
new file mode 100644
index 00000000000000..0053e2fa6e1cde
--- /dev/null
+++ b/docs/src/pages/demos/progress/CircularUnderLoad.tsx
@@ -0,0 +1,8 @@
+import React from 'react';
+import CircularProgress from '@material-ui/core/CircularProgress';
+
+function CircularUnderLoad() {
+ return ;
+}
+
+export default CircularUnderLoad;
diff --git a/docs/src/pages/demos/progress/CustomizedProgress.tsx b/docs/src/pages/demos/progress/CustomizedProgress.tsx
new file mode 100644
index 00000000000000..b60ef8afd0eda6
--- /dev/null
+++ b/docs/src/pages/demos/progress/CustomizedProgress.tsx
@@ -0,0 +1,96 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { createStyles, withStyles, WithStyles, Theme } from '@material-ui/core/styles';
+import { lighten } from '@material-ui/core/styles/colorManipulator';
+import CircularProgress from '@material-ui/core/CircularProgress';
+import Paper from '@material-ui/core/Paper';
+import LinearProgress from '@material-ui/core/LinearProgress';
+
+const styles = (theme: Theme) =>
+ createStyles({
+ root: {
+ flexGrow: 1,
+ },
+ progress: {
+ margin: theme.spacing(2),
+ color: '#00695c',
+ },
+ linearColorPrimary: {
+ backgroundColor: '#b2dfdb',
+ },
+ linearBarColorPrimary: {
+ backgroundColor: '#00695c',
+ },
+ linearProgressDeterminate: {
+ margin: `${theme.spacing(1)}px auto 0`,
+ height: 10,
+ backgroundColor: lighten('#ff6c5c', 0.5),
+ },
+ linearProgressDeterminateBar: {
+ borderRadius: 20,
+ backgroundColor: '#ff6c5c',
+ },
+ // Reproduce the Facebook spinners.
+ facebook: {
+ margin: theme.spacing(2),
+ position: 'relative',
+ },
+ facebook1: {
+ color: '#eef3fd',
+ },
+ facebook2: {
+ color: '#6798e5',
+ animationDuration: '550ms',
+ position: 'absolute',
+ left: 0,
+ },
+ });
+
+export type Props = WithStyles;
+
+function CustomizedProgress(props: Props) {
+ const { classes } = props;
+
+ return (
+
+
+
+
+
+
+
+
+
+ );
+}
+
+CustomizedProgress.propTypes = {
+ classes: PropTypes.object.isRequired,
+} as any;
+
+export default withStyles(styles)(CustomizedProgress);
diff --git a/docs/src/pages/demos/progress/LinearBuffer.js b/docs/src/pages/demos/progress/LinearBuffer.js
index 25ffd61a8bb6dd..d513224c15691a 100644
--- a/docs/src/pages/demos/progress/LinearBuffer.js
+++ b/docs/src/pages/demos/progress/LinearBuffer.js
@@ -13,7 +13,7 @@ function LinearBuffer() {
const [completed, setCompleted] = React.useState(0);
const [buffer, setBuffer] = React.useState(10);
- const progress = React.useRef();
+ const progress = React.useRef(() => {});
React.useEffect(() => {
progress.current = () => {
if (completed > 100) {
diff --git a/docs/src/pages/demos/progress/LinearBuffer.tsx b/docs/src/pages/demos/progress/LinearBuffer.tsx
new file mode 100644
index 00000000000000..d513224c15691a
--- /dev/null
+++ b/docs/src/pages/demos/progress/LinearBuffer.tsx
@@ -0,0 +1,51 @@
+import React from 'react';
+import { makeStyles } from '@material-ui/core/styles';
+import LinearProgress from '@material-ui/core/LinearProgress';
+
+const useStyles = makeStyles({
+ root: {
+ flexGrow: 1,
+ },
+});
+
+function LinearBuffer() {
+ const classes = useStyles();
+ const [completed, setCompleted] = React.useState(0);
+ const [buffer, setBuffer] = React.useState(10);
+
+ const progress = React.useRef(() => {});
+ React.useEffect(() => {
+ progress.current = () => {
+ if (completed > 100) {
+ setCompleted(0);
+ setBuffer(10);
+ } else {
+ const diff = Math.random() * 10;
+ const diff2 = Math.random() * 10;
+ setCompleted(completed + diff);
+ setBuffer(completed + diff + diff2);
+ }
+ };
+ });
+
+ React.useEffect(() => {
+ function tick() {
+ progress.current();
+ }
+ const timer = setInterval(tick, 500);
+
+ return () => {
+ clearInterval(timer);
+ };
+ }, []);
+
+ return (
+
+
+
+
+
+ );
+}
+
+export default LinearBuffer;
diff --git a/docs/src/pages/demos/progress/LinearDeterminate.tsx b/docs/src/pages/demos/progress/LinearDeterminate.tsx
new file mode 100644
index 00000000000000..dd6731511e60b5
--- /dev/null
+++ b/docs/src/pages/demos/progress/LinearDeterminate.tsx
@@ -0,0 +1,41 @@
+import React from 'react';
+import { makeStyles } from '@material-ui/core/styles';
+import LinearProgress from '@material-ui/core/LinearProgress';
+
+const useStyles = makeStyles({
+ root: {
+ flexGrow: 1,
+ },
+});
+
+function LinearDeterminate() {
+ const classes = useStyles();
+ const [completed, setCompleted] = React.useState(0);
+
+ React.useEffect(() => {
+ function progress() {
+ setCompleted(oldCompleted => {
+ if (oldCompleted === 100) {
+ return 0;
+ }
+ const diff = Math.random() * 10;
+ return Math.min(oldCompleted + diff, 100);
+ });
+ }
+
+ const timer = setInterval(progress, 500);
+ return () => {
+ clearInterval(timer);
+ };
+ }, []);
+
+ return (
+
+
+
+
+
+ );
+}
+
+export default LinearDeterminate;
diff --git a/docs/src/pages/demos/progress/LinearIndeterminate.tsx b/docs/src/pages/demos/progress/LinearIndeterminate.tsx
new file mode 100644
index 00000000000000..23884d1b2ee435
--- /dev/null
+++ b/docs/src/pages/demos/progress/LinearIndeterminate.tsx
@@ -0,0 +1,29 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { createStyles, withStyles, WithStyles } from '@material-ui/core/styles';
+import LinearProgress from '@material-ui/core/LinearProgress';
+
+const styles = createStyles({
+ root: {
+ flexGrow: 1,
+ },
+});
+
+export type Props = WithStyles;
+
+function LinearIndeterminate(props: Props) {
+ const { classes } = props;
+ return (
+
+
+
+
+
+ );
+}
+
+LinearIndeterminate.propTypes = {
+ classes: PropTypes.object.isRequired,
+} as any;
+
+export default withStyles(styles)(LinearIndeterminate);
diff --git a/docs/src/pages/demos/progress/LinearQuery.tsx b/docs/src/pages/demos/progress/LinearQuery.tsx
new file mode 100644
index 00000000000000..8bfe15a19d4e07
--- /dev/null
+++ b/docs/src/pages/demos/progress/LinearQuery.tsx
@@ -0,0 +1,29 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { createStyles, withStyles, WithStyles } from '@material-ui/core/styles';
+import LinearProgress from '@material-ui/core/LinearProgress';
+
+const styles = createStyles({
+ root: {
+ flexGrow: 1,
+ },
+});
+
+export type Props = WithStyles;
+
+function LinearQuery(props: Props) {
+ const { classes } = props;
+ return (
+
+
+
+
+
+ );
+}
+
+LinearQuery.propTypes = {
+ classes: PropTypes.object.isRequired,
+} as any;
+
+export default withStyles(styles)(LinearQuery);