diff --git a/.eslintrc.js b/.eslintrc.js
index 260b678ef9a..eb023dbdfae 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -56,6 +56,15 @@ module.exports = {
// Turning react/jsx-key back on.
// https://github.com/airbnb/javascript/blob/5155aa5fc1ea9bb2c6493a06ddbd5c7a05414c86/packages/eslint-config-airbnb/rules/react.js#L94
'react/jsx-key': ['error', { checkKeyMustBeforeSpread: true, warnOnDuplicates: true }],
+ // This got turned of in the mono-repo:
+ // See https://github.com/mui/mui-toolpad/pull/866#discussion_r957222171
+ 'react/no-unused-prop-types': [
+ 'error',
+ {
+ customValidators: [],
+ skipShapeProps: true,
+ },
+ ],
},
overrides: [
{
diff --git a/README.md b/README.md
index 58397017d62..af4cd9ba155 100644
--- a/README.md
+++ b/README.md
@@ -20,7 +20,7 @@ Quickly build internal tools. MUI Toolpad is a self-hosted low-code internal too
-
+
## Notice
diff --git a/docs/data/toolpad/getting-started/tutorial.md b/docs/data/toolpad/getting-started/tutorial.md
index 7bf1107cbb5..3cc5b59355b 100644
--- a/docs/data/toolpad/getting-started/tutorial.md
+++ b/docs/data/toolpad/getting-started/tutorial.md
@@ -12,19 +12,19 @@ Make sure you have a running Toolpad instance. If you don't know how to do that,
1. Open Toolpad by navigating to [http://localhost:3000/](http://localhost:3000/) if you went through the docker setup, or otherwise, the URL Toolpad is hosted under. You'll be presented with an overview screen with all the applications available. If you've started from a fresh instance, there should be none present.
- 
+ 
1. Click "create new" and choose a name for your application in the popup, then click "create". This will create a new Toolpad application and the page will navigate to the application editor.
- 
+ 
1. In the left navigation bar, you will see all the objects that are present in this application. You'll see "connections", which represent credentials needed to connect to a data source. "APIs" allow you to query your data and make it available to pages. Next to the "pages" entry click + the icon to add a new page, give it a name, and click "create". The page designer will open.
- 
+ 
1. You are now in the page designer. You can access the components catalog by hovering over the bar on the left side containing the word "components". When the catalog folds out, grab a "TextField" and drag it into the canvas over the green box that says "insert here". When the box highlights, drop the TextField. An MUI TextField will now appear on the page canvas and the component properties editor opens. This input will be used to enter the name of the person we want to greet. In the component editor, change the name to "nameInput". We will use this name, later on, to refer to this TextField, so that we can bind properties to their value.
- 
+ 
1. Open the component catalog again and drag a "Typography" component on the page. This will contain our greeting. In the component editor on the right-hand side, locate the text field for the "value" property. Try typing in this field. You'll notice the text on the screen changes. We can also make this value dynamic. To do this, click the link icon to the right of the text field to open the binding editor.
@@ -32,11 +32,11 @@ Make sure you have a running Toolpad instance. If you don't know how to do that,
Now, change the JavaScript expression to `` `Hello ${nameInput.value}!` ``. Notice how we refer to our textField by the name "nameInput" that we set before. Now click "update binding" and close the binding editor.
- 
+ 
1. Select the TextField and try typing your name. See how the Text follows?
- 
+ 
## Deploying your first application
@@ -44,7 +44,7 @@ Now that we have our first simple application, let's make sure we can use it out
1. The first thing we need to do is to create a release for our application. When you create a release, the current state of the application is captured as a snapshot and stored. This snapshot will never change, we will always be able to access this snapshot and see the state of the application at the time that we took the snapshot. To create a release, click the launch icon in the top right corner of the menu bar. In the dialog that opens, write "Initial release" in the description field and click "create". You will be directed to the release's page. Here you'll get a list of all the pages present in this release. Go ahead and click the "open page" icon to see what your released page looks like.
- 
+ 
1. You just created a versioned release of your application. Click the "deploy" button to host this version under the production URL of your page. Navigate to Toolpad home to get an overview of your application and click the "open" button on the application you just deployed. You'll be presented with an overview of the pages available in this application. Click on a page to see the production version of the application.
@@ -56,18 +56,18 @@ A Toolpad aplication wouldn't be useful if you couldn't import your data into it
1. the first step is to make a connection to your data source. The connection holds the necessary credentials. In the case of a database, this may be the connection string, or in the case of a REST API this may contain an API token. For demo purposes, we will just create a dummy connection that we can use to make public HTTP requests. To get started, click on the plus button next to "Connections" in the left menu. In the popup that opens, select the "Fetch" type and click "create". In the window that opens, give your connection a name "ourData".
- 
+ 
1. Now that we can connect to our data source, we can make an API endpoint for it on the Toolpad application. Click the plus button next to "Apis" in the left menu and select the "ourData" connection that we will make an API for. In the editor that opens, give it a name "ourDataApi" and in the url fill in `https://gist.githubusercontent.com/Janpot/c9d1f00be8472f2a510680b7e716a43b/raw/f001e0c3c501f5a0da35474ba4854cfc69acfd78/sample-data.json`. This contains a sample dataset for us to use. If everything went well, you will see a preview in the bottom half of the page. Click "update" to accept the parameters for this API.
- 
+ 
1. Now we need to bring this data to our page. To do this, make a new page and click the "create query state" button in the page properties. In the popup that opens, give the state a name "ourDataState" and select the API we created before. We now have the data from this API available on the page in a variable `ourDataState` and we can bind it to components on the page.
- 
+ 
1. Now add a DataGrid on the page and in its properties click the link button next to "DataQuery". This will open our trusty binding editor in which you can type `ourDataState` and click "update binding". Close the binding editor to see the result.
- 
+ 
Read our deep dive into data fetching in the [data fetching documentation](/toolpad/data-fetching/).
diff --git a/docs/next.config.js b/docs/next.config.js
index f282da0d0b7..89a71893a7a 100644
--- a/docs/next.config.js
+++ b/docs/next.config.js
@@ -10,6 +10,24 @@ const pkg = require('../package.json');
const { findPages } = require('./src/modules/utils/find');
const { LANGUAGES, LANGUAGES_SSR } = require('./src/modules/constants');
+let DEPLOY_ENV = 'development';
+
+// Same as process.env.PULL_REQUEST === 'true'
+if (process.env.CONTEXT === 'deploy-preview') {
+ DEPLOY_ENV = 'pull-request';
+}
+
+if (process.env.CONTEXT === 'production' || process.env.CONTEXT === 'branch-deploy') {
+ DEPLOY_ENV = 'production';
+}
+
+if (
+ process.env.CONTEXT === 'branch-deploy' &&
+ (process.env.HEAD === 'master' || process.env.HEAD === 'next')
+) {
+ DEPLOY_ENV = 'staging';
+}
+
const MONORPO_PATH = path.resolve(__dirname, './node_modules/@mui/monorepo');
const MONOREPO_PACKAGES = {
'@mui/base': path.resolve(MONORPO_PATH, './packages/mui-base/src'),
@@ -46,14 +64,12 @@ if (reactStrictMode) {
console.log(`Using React.StrictMode.`);
}
-const isDeployment = process.env.NETLIFY === 'true';
-
module.exports = withTM({
eslint: {
ignoreDuringBuilds: true,
},
// Avoid conflicts with the other Next.js apps hosted under https://mui.com/
- assetPrefix: isDeployment ? '/toolpad' : '',
+ assetPrefix: DEPLOY_ENV === 'development' ? '' : '/toolpad',
typescript: {
// Motivated by https://github.com/zeit/next.js/issues/7687
ignoreDevErrors: true,
@@ -65,14 +81,12 @@ module.exports = withTM({
ENABLE_AD: process.env.ENABLE_AD,
GITHUB_AUTH: process.env.GITHUB_AUTH,
LIB_VERSION: pkg.version,
- PULL_REQUEST: process.env.PULL_REQUEST === 'true',
REACT_STRICT_MODE: reactStrictMode,
FEEDBACK_URL: process.env.FEEDBACK_URL,
- // Set by Netlify
- GRID_EXPERIMENTAL_ENABLED: process.env.PULL_REQUEST === 'false' ? 'false' : 'true',
// #default-branch-switch
SOURCE_CODE_ROOT_URL: 'https://github.com/mui/mui-toolpad/blob/master',
SOURCE_CODE_REPO: 'https://github.com/mui/mui-toolpad',
+ DEPLOY_ENV,
},
webpack5: true,
webpack: (config) => {
diff --git a/docs/pages/toolpad/index.js b/docs/pages/toolpad/index.js
index 01ae5b747be..deea653a523 100644
--- a/docs/pages/toolpad/index.js
+++ b/docs/pages/toolpad/index.js
@@ -1,25 +1,58 @@
import * as React from 'react';
+import NoSsr from '@mui/material/NoSsr';
import Head from 'docs/src/modules/components/Head';
import CssBaseline from '@mui/material/CssBaseline';
import BrandingProvider from 'docs/src/BrandingProvider';
import AppHeader from 'docs/src/layouts/AppHeader';
import AppFooter from 'docs/src/layouts/AppFooter';
import AppHeaderBanner from 'docs/src/components/banner/AppHeaderBanner';
-import ToolpadHero from '../../src/components/landing/ToolpadHero';
+import ToolpadHero from '../../src/components/landing/Hero';
+import SignUpToast from '../../src/components/landing/SignUpToast';
+import CardGrid from '../../src/components/landing/CardGrid';
+import Banner from '../../src/components/landing/Banner';
+import Pricing from '../../src/components/landing/PricingTable';
+import Marquee from '../../src/components/landing/Marquee';
+import features from '../../src/content/features';
+import upvote from '../../src/content/upvote';
+import useCases from '../../src/content/useCases';
+import marquee from '../../src/content/marquee';
+import {
+ Headline,
+ plans,
+ planInfo,
+ rowHeaders,
+ communityData,
+ commercialData,
+} from '../../src/content/pricing';
export default function Home() {
return (
+
+
+
-
+
+
+
+
+
+
diff --git a/docs/public/static/branding/pricing/block-blue.svg b/docs/public/static/branding/pricing/block-blue.svg
new file mode 100644
index 00000000000..dbde67ddbf2
--- /dev/null
+++ b/docs/public/static/branding/pricing/block-blue.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/docs/public/static/branding/pricing/block-gold.svg b/docs/public/static/branding/pricing/block-gold.svg
new file mode 100644
index 00000000000..f5945b77b2c
--- /dev/null
+++ b/docs/public/static/branding/pricing/block-gold.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/docs/public/static/branding/pricing/block-green.svg b/docs/public/static/branding/pricing/block-green.svg
new file mode 100644
index 00000000000..c6f705ea6f9
--- /dev/null
+++ b/docs/public/static/branding/pricing/block-green.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/docs/public/static/branding/pricing/no-dark.svg b/docs/public/static/branding/pricing/no-dark.svg
new file mode 100644
index 00000000000..ac3044c903e
--- /dev/null
+++ b/docs/public/static/branding/pricing/no-dark.svg
@@ -0,0 +1,4 @@
+
diff --git a/docs/public/static/branding/pricing/no-light.svg b/docs/public/static/branding/pricing/no-light.svg
new file mode 100644
index 00000000000..e5b49bb34da
--- /dev/null
+++ b/docs/public/static/branding/pricing/no-light.svg
@@ -0,0 +1,4 @@
+
diff --git a/docs/public/static/branding/pricing/time-dark.svg b/docs/public/static/branding/pricing/time-dark.svg
new file mode 100644
index 00000000000..109c1ab9d71
--- /dev/null
+++ b/docs/public/static/branding/pricing/time-dark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/docs/public/static/branding/pricing/time-light.svg b/docs/public/static/branding/pricing/time-light.svg
new file mode 100644
index 00000000000..c06b69498f8
--- /dev/null
+++ b/docs/public/static/branding/pricing/time-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/docs/public/static/branding/pricing/yes-dark.svg b/docs/public/static/branding/pricing/yes-dark.svg
new file mode 100644
index 00000000000..ae619a9d910
--- /dev/null
+++ b/docs/public/static/branding/pricing/yes-dark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/docs/public/static/branding/pricing/yes-light.svg b/docs/public/static/branding/pricing/yes-light.svg
new file mode 100644
index 00000000000..368c5d5e2c4
--- /dev/null
+++ b/docs/public/static/branding/pricing/yes-light.svg
@@ -0,0 +1 @@
+
diff --git a/docs/public/static/branding/product-toolpad-dark.svg b/docs/public/static/branding/product-toolpad-dark.svg
new file mode 100644
index 00000000000..4fbac23e38c
--- /dev/null
+++ b/docs/public/static/branding/product-toolpad-dark.svg
@@ -0,0 +1,27 @@
+
diff --git a/docs/public/static/branding/product-toolpad-light.svg b/docs/public/static/branding/product-toolpad-light.svg
new file mode 100644
index 00000000000..7df3d98cfdb
--- /dev/null
+++ b/docs/public/static/branding/product-toolpad-light.svg
@@ -0,0 +1,27 @@
+
diff --git a/docs/public/static/toolpad/add-textfield.png b/docs/public/static/toolpad/docs/add-textfield.png
similarity index 100%
rename from docs/public/static/toolpad/add-textfield.png
rename to docs/public/static/toolpad/docs/add-textfield.png
diff --git a/docs/public/static/toolpad/apps-overview.png b/docs/public/static/toolpad/docs/apps-overview.png
similarity index 100%
rename from docs/public/static/toolpad/apps-overview.png
rename to docs/public/static/toolpad/docs/apps-overview.png
diff --git a/docs/public/static/toolpad/bind-query-state.png b/docs/public/static/toolpad/docs/bind-query-state.png
similarity index 100%
rename from docs/public/static/toolpad/bind-query-state.png
rename to docs/public/static/toolpad/docs/bind-query-state.png
diff --git a/docs/public/static/toolpad/create-api.png b/docs/public/static/toolpad/docs/create-api.png
similarity index 100%
rename from docs/public/static/toolpad/create-api.png
rename to docs/public/static/toolpad/docs/create-api.png
diff --git a/docs/public/static/toolpad/create-connection.png b/docs/public/static/toolpad/docs/create-connection.png
similarity index 100%
rename from docs/public/static/toolpad/create-connection.png
rename to docs/public/static/toolpad/docs/create-connection.png
diff --git a/docs/public/static/toolpad/create-state.png b/docs/public/static/toolpad/docs/create-state.png
similarity index 100%
rename from docs/public/static/toolpad/create-state.png
rename to docs/public/static/toolpad/docs/create-state.png
diff --git a/docs/public/static/toolpad/editor-overview.png b/docs/public/static/toolpad/docs/editor-overview.png
similarity index 100%
rename from docs/public/static/toolpad/editor-overview.png
rename to docs/public/static/toolpad/docs/editor-overview.png
diff --git a/docs/public/static/toolpad/page-editor.png b/docs/public/static/toolpad/docs/page-editor.png
similarity index 100%
rename from docs/public/static/toolpad/page-editor.png
rename to docs/public/static/toolpad/docs/page-editor.png
diff --git a/docs/public/static/toolpad/release.png b/docs/public/static/toolpad/docs/release.png
similarity index 100%
rename from docs/public/static/toolpad/release.png
rename to docs/public/static/toolpad/docs/release.png
diff --git a/docs/public/static/toolpad/result.png b/docs/public/static/toolpad/docs/result.png
similarity index 100%
rename from docs/public/static/toolpad/result.png
rename to docs/public/static/toolpad/docs/result.png
diff --git a/docs/public/static/toolpad/updated-binding.png b/docs/public/static/toolpad/docs/updated-binding.png
similarity index 100%
rename from docs/public/static/toolpad/updated-binding.png
rename to docs/public/static/toolpad/docs/updated-binding.png
diff --git a/docs/public/static/toolpad/hero-screenshot.png b/docs/public/static/toolpad/marketing/hero-screenshot.png
similarity index 100%
rename from docs/public/static/toolpad/hero-screenshot.png
rename to docs/public/static/toolpad/marketing/hero-screenshot.png
diff --git a/docs/public/static/toolpad/marketing/hero-video.mp4 b/docs/public/static/toolpad/marketing/hero-video.mp4
new file mode 100644
index 00000000000..7ea28985c9d
Binary files /dev/null and b/docs/public/static/toolpad/marketing/hero-video.mp4 differ
diff --git a/docs/public/static/toolpad/marketing/toolpad-admin-panel.svg b/docs/public/static/toolpad/marketing/toolpad-admin-panel.svg
new file mode 100644
index 00000000000..bb61d9329f9
--- /dev/null
+++ b/docs/public/static/toolpad/marketing/toolpad-admin-panel.svg
@@ -0,0 +1,80 @@
+
diff --git a/docs/public/static/toolpad/marketing/toolpad-custom-cms.svg b/docs/public/static/toolpad/marketing/toolpad-custom-cms.svg
new file mode 100644
index 00000000000..96903f0bfd4
--- /dev/null
+++ b/docs/public/static/toolpad/marketing/toolpad-custom-cms.svg
@@ -0,0 +1,84 @@
+
diff --git a/docs/public/static/toolpad/marketing/toolpad-monitoring-dashboard.svg b/docs/public/static/toolpad/marketing/toolpad-monitoring-dashboard.svg
new file mode 100644
index 00000000000..006bd442eb2
--- /dev/null
+++ b/docs/public/static/toolpad/marketing/toolpad-monitoring-dashboard.svg
@@ -0,0 +1,100 @@
+
diff --git a/docs/src/components/landing/Banner.js b/docs/src/components/landing/Banner.js
new file mode 100644
index 00000000000..0e08e55af55
--- /dev/null
+++ b/docs/src/components/landing/Banner.js
@@ -0,0 +1,74 @@
+import * as React from 'react';
+import PropTypes from 'prop-types';
+import Container from '@mui/material/Container';
+import Typography from '@mui/material/Typography';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Link from 'docs/src/modules/components/Link';
+import KeyboardArrowRightRounded from '@mui/icons-material/KeyboardArrowRightRounded';
+
+export default function Banner(props) {
+ const { content } = props;
+ return (
+
+ (theme.palette.mode === 'dark' ? 'primaryDark.900' : 'primary.50'),
+ border: '1px solid',
+ borderColor: (theme) =>
+ theme.palette.mode === 'dark' ? 'primaryDark.500' : 'primary.100',
+ display: 'flex',
+ flexDirection: {
+ xs: 'column',
+ sm: 'row',
+ },
+ justifyContent: 'space-between',
+ alignItems: { xs: 'flex-start', sm: 'center' },
+ }}
+ >
+