Setup
Step 1: Create new app vite.js
npm create vite@latest
# Project name: …
› vite-app-ts
# Select a framework:
› React
# Select a variant:
› TypeScript + SWC
Step 2: Install dependencies
npm i @emotion/cache @emotion/react @emotion/styled @fontsource/barlow @fontsource/public-sans @mui/lab @mui/material @mui/material-nextjs @mui/x-data-grid @mui/x-date-pickers @mui/x-tree-view
npm i --save-dev @types/node
Step 3: Modifying files
- Copy and override
tsconfig.json
/jsconfig.json
. - Copy and override
tsconfig.node.json
. - Copy
src/theme
. - Remove
src/theme/with-settings/**
. - Update
vite.config.ts
.
import path from 'path';
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react-swc';
export default defineConfig({
plugins: [react()],
resolve: {
alias: [
{
find: /^~(.+)/,
replacement: path.join(process.cwd(), 'node_modules/$1'),
},
{
find: /^src(.+)/,
replacement: path.join(process.cwd(), 'src/$1'),
},
],
},
});
Step 4: Create files
export const CONFIG = {
site: {
basePath: import.meta.env.VITE_BASE_PATH ?? '',
},
};
@import '@fontsource/public-sans/400.css';
@import '@fontsource/public-sans/500.css';
@import '@fontsource/public-sans/600.css';
@import '@fontsource/public-sans/700.css';
@import '@fontsource/public-sans/800.css';
@import '@fontsource/barlow/400.css';
@import '@fontsource/barlow/500.css';
@import '@fontsource/barlow/600.css';
@import '@fontsource/barlow/700.css';
@import '@fontsource/barlow/800.css';
Step 5: Update theme
export function createTheme(): Theme {
const initialTheme = {
colorSchemes,
shadows: shadows('light'),
customShadows: customShadows('light'),
shape: { borderRadius: 8 },
components,
typography,
cssVarPrefix: '',
shouldSkipGeneratingVar,
};
const theme = extendTheme(initialTheme);
return theme;
}
export const schemeConfig = {
modeStorageKey: 'theme-mode',
defaultMode: 'light',
} as const;
export function ThemeProvider({ children }: Props) {
const theme = createTheme();
return (
<CssVarsProvider
theme={theme}
defaultMode={schemeConfig.defaultMode}
modeStorageKey={schemeConfig.modeStorageKey}
>
<CssBaseline />
{children}
</CssVarsProvider>
);
}
Step 6: Testing
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import './index.css';
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<App />
</React.StrictMode>
);
import './App.css';
import 'src/global.css';
import { ThemeProvider } from 'src/theme/theme-provider';
import Stack from '@mui/material/Stack';
import Button from '@mui/material/Button';
export default function App() {
return (
<ThemeProvider>
<Stack spacing={1} alignItems="center">
<Button variant="contained">Button</Button>
<Button variant="contained" color="primary">
Button
</Button>
<Button variant="contained" color="secondary">
Button
</Button>
<Button variant="contained" color="info">
Button
</Button>
<Button variant="contained" color="success">
Button
</Button>
<Button variant="contained" color="warning">
Button
</Button>
<Button variant="contained" color="error">
Button
</Button>
<Button disabled variant="contained">
Button
</Button>
</Stack>
</ThemeProvider>
);
}