Skip to content

Commit 98ff11a

Browse files
authored
Merge pull request #113 from akd-io/feature/add-material-ui
Add Material UI
2 parents 062207a + 48ed1a8 commit 98ff11a

File tree

16 files changed

+160
-19
lines changed

16 files changed

+160
-19
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ The table below provides an overview of the technologies currently supported by
5555
| [CSS Modules](https://github.com/css-modules/css-modules) | [Docs](https://github.com/css-modules/css-modules) - [Next.js-specific docs](https://nextjs.org/docs/basic-features/built-in-css-support#adding-component-level-css) |
5656
| [Sass](https://sass-lang.com/) | [Docs](https://sass-lang.com/documentation) - [Next.js-specific docs](https://nextjs.org/docs/basic-features/built-in-css-support#sass-support) |
5757
| [Chakra UI](https://chakra-ui.com/) | [Docs](https://chakra-ui.com/docs/getting-started) - [GitHub repo](https://github.com/chakra-ui/chakra-ui) |
58+
| [Material UI](https://material-ui.com/) | [Docs](https://material-ui.com/getting-started/installation/) - [GitHub repo](https://github.com/mui-org/material-ui) |
5859
| [React Hook Form](https://react-hook-form.com/) | [Docs](https://react-hook-form.com/get-started) - [GitHub repo](https://github.com/react-hook-form/react-hook-form) |
5960
| [Formik](https://formik.org/) | [Docs](https://formik.org/docs/overview) - [GitHub repo](https://github.com/formium/formik) |
6061
| [Framer Motion](https://www.framer.com/motion/) | [Docs](https://www.framer.com/docs/) - [GitHub repo](https://github.com/framer/motion) |

src/main/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ class CreateNextStack extends Command {
6565
"Adds Chakra UI. (Component library) (Requires Emotion and Framer Motion)",
6666
}),
6767

68+
"material-ui": flags.boolean({
69+
description: "Adds Material UI. (Component library)",
70+
}),
71+
6872
// Form libraries:
6973
"react-hook-form": flags.boolean({
7074
description: "Adds React Hook Form. (Form library)",

src/main/questionnaire/flags-questionnaire.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ export const performFlagsQuestionnaire =
8989
"formattingPreCommitHook"
9090
),
9191
chakra: technologies.has("chakra"),
92+
"material-ui": technologies.has("material-ui"),
9293
}
9394

9495
return result

src/main/questionnaire/questions/categories/component-libraries.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import inquirer from "inquirer"
22
import { arrayToKeyToKeyMap } from "../../../helpers/array-to-key-to-key-map"
33
import { Technology } from "../../flags-questionnaire"
44

5-
const componentLibraryOptions = ["chakra"] as const
5+
const componentLibraryOptions = ["chakra", "material-ui"] as const
66
export type ComponentLibraryValue = typeof componentLibraryOptions[number]
77
const componentLibraryValues = arrayToKeyToKeyMap(componentLibraryOptions)
88

@@ -25,6 +25,11 @@ export const promptComponentLibraries = async (
2525
checked: technologies.has("emotion"),
2626
disabled: !technologies.has("emotion"),
2727
},
28+
{
29+
value: componentLibraryValues["material-ui"],
30+
name: "Material UI",
31+
checked: false,
32+
},
2833
],
2934
})
3035

src/main/setup/packages.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,4 +125,12 @@ export const packages = {
125125
name: "@chakra-ui/react",
126126
version: "^1.0.0",
127127
},
128+
"@material-ui/core": {
129+
name: "@material-ui/core",
130+
version: "^4.0.0",
131+
},
132+
"@material-ui/icons": {
133+
name: "@material-ui/icons",
134+
version: "^4.0.0",
135+
},
128136
} as const

src/main/setup/setup.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { installFramerMotionStep } from "./steps/install-framer-motion"
1818
import { installReactHookFormStep } from "./steps/install-react-hook-form"
1919
import { removeOfficialCNAContentStep } from "./steps/remove-official-cna-content"
2020
import { setUpChakraUIStep } from "./steps/set-up-chakra-ui"
21+
import { setUpMaterialUIStep } from "./steps/set-up-material-ui"
2122
import { setUpCssModulesWithSassStep } from "./steps/set-up-css-modules-with-sass"
2223
import { setUpEmotionStep } from "./steps/set-up-emotion"
2324
import { setUpEslintStep } from "./steps/set-up-eslint"
@@ -50,6 +51,7 @@ export const performSetupSteps = async (
5051

5152
// Component libraries
5253
setUpChakraUIStep,
54+
setUpMaterialUIStep,
5355

5456
// Formatting
5557
setUpPrettierStep,

src/main/setup/steps/add-content/add-content.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,11 @@ export const addContentStep: Step = {
4444
)
4545
}
4646

47-
if (styling === "emotion" && inputs.flags.chakra) {
48-
promises.push(fs.writeFile("theme.ts", generateTheme()))
47+
if (
48+
(styling === "emotion" && inputs.flags.chakra) ||
49+
inputs.flags["material-ui"]
50+
) {
51+
promises.push(...generateTheme(inputs))
4952
}
5053

5154
await Promise.all(promises)

src/main/setup/steps/add-content/generate-app.ts

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ type WrapperComponent = {
1010
const wrapperComponents: WrapperComponent[] = [
1111
{
1212
//Chakra Provider
13-
openingTag: endent/* tsx */ `<ChakraProvider resetCSS theme={theme}>`,
13+
openingTag: endent/* tsx */ `<ChakraProvider resetCSS theme={chakraTheme}>`,
1414
closingTag: endent/* tsx */ `</ChakraProvider>`,
1515
filter: ({ flags }) => Boolean(flags.chakra),
1616
},
@@ -19,14 +19,21 @@ const wrapperComponents: WrapperComponent[] = [
1919
openingTag: endent/* tsx */ `
2020
<ColorModeProvider
2121
options={{
22-
initialColorMode: theme.config.initialColorMode,
23-
useSystemColorMode: theme.config.useSystemColorMode,
22+
initialColorMode: chakraTheme.config.initialColorMode,
23+
useSystemColorMode: chakraTheme.config.useSystemColorMode,
2424
}}
2525
>
2626
`,
2727
closingTag: endent/* tsx */ `</ColorModeProvider>`,
2828
filter: ({ flags }) => Boolean(flags.chakra),
2929
},
30+
{
31+
//Material UI Theme Provider
32+
openingTag: endent/* tsx */ `<ThemeProvider theme={materialTheme}>
33+
<CssBaseline />`,
34+
closingTag: endent/* tsx */ `</ThemeProvider>`,
35+
filter: ({ flags }) => Boolean(flags["material-ui"]),
36+
},
3037
]
3138

3239
export const generateApp = (inputs: ValidCNSInputs): string => {
@@ -40,6 +47,7 @@ export const generateApp = (inputs: ValidCNSInputs): string => {
4047
return endent/* tsx */ `
4148
import { AppProps } from "next/app";
4249
${getChakraUIImports(inputs)}
50+
${getMaterialUIImports(inputs)}
4351
${getGlobalStylesImport(inputs)}
4452
4553
const CustomApp = ({ Component, pageProps }: AppProps) => {
@@ -71,7 +79,17 @@ const getChakraUIImports = ({ flags }: ValidCNSInputs) => {
7179
ChakraProvider,
7280
ColorModeProvider,
7381
} from "@chakra-ui/react";
74-
import { theme } from "../theme";
82+
import { chakraTheme } from "../chakra-theme";
7583
`
7684
: ""
7785
}
86+
87+
const getMaterialUIImports = ({ flags }: ValidCNSInputs) => {
88+
return flags["material-ui"]
89+
? endent/* tsx */ `
90+
import { ThemeProvider } from "@material-ui/core/styles";
91+
import CssBaseline from '@material-ui/core/CssBaseline';
92+
import { materialTheme } from "../material-theme";
93+
`
94+
: ""
95+
}

src/main/setup/steps/add-content/generate-document.ts

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,61 @@
11
import endent from "endent"
2-
import { ValidCNSInputs } from "../../../create-next-stack-types"
2+
import type {
3+
ValidCNSInputs,
4+
ValidCreateNextStackFlags,
5+
} from "../../../create-next-stack-types"
6+
7+
const getChakraImports = (flags: ValidCreateNextStackFlags) => {
8+
if (flags.chakra) {
9+
return endent/* tsx */ `
10+
import { ColorModeScript } from "@chakra-ui/react";
11+
import { chakraTheme } from "../chakra-theme";
12+
`
13+
} else {
14+
return ""
15+
}
16+
}
17+
18+
const getMaterialImports = (flags: ValidCreateNextStackFlags) => {
19+
if (flags["material-ui"]) {
20+
return endent/* tsx */ `
21+
import { materialTheme } from "../material-theme";
22+
`
23+
} else {
24+
return ""
25+
}
26+
}
27+
28+
const getHeadElements = (flags: ValidCreateNextStackFlags) => {
29+
if (flags["material-ui"]) {
30+
return endent/* tsx */ `
31+
<meta name="theme-color" content={materialTheme.palette.primary.main} />
32+
<link
33+
rel="stylesheet"
34+
href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap"
35+
/>
36+
`
37+
} else {
38+
return ""
39+
}
40+
}
341

442
export const generateDocument = ({ flags }: ValidCNSInputs): string => {
543
return endent/* tsx */ `
6-
${
7-
flags.chakra
8-
? /* tsx */ `import { ColorModeScript } from "@chakra-ui/react";`
9-
: ""
10-
}
44+
${getChakraImports(flags)}
45+
${getMaterialImports(flags)}
1146
import NextDocument, { Html, Head, Main, NextScript } from "next/document";
12-
${flags.chakra ? /* tsx */ `import { theme } from "../theme";` : ""}
1347
1448
export default class Document extends NextDocument {
1549
render() {
1650
return (
1751
<Html lang="en">
18-
<Head />
52+
<Head>
53+
${getHeadElements(flags)}
54+
</Head>
1955
<body>
2056
${
2157
flags.chakra
22-
? /* tsx */ `<ColorModeScript initialColorMode={theme.config.initialColorMode} />`
58+
? /* tsx */ `<ColorModeScript initialColorMode={chakraTheme.config.initialColorMode} />`
2359
: ""
2460
}
2561
<Main />

src/main/setup/steps/add-content/generate-theme.ts

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import endent from "endent"
2+
import { promises as fs } from "fs"
3+
import type { ValidCNSInputs } from "../../../create-next-stack-types"
24

3-
export const generateTheme = (): string => {
4-
return endent/* tsx */ `
5+
const chakraUITheme = endent/* tsx */ `
56
import { extendTheme, ThemeConfig } from "@chakra-ui/react";
67
78
const colors = {
@@ -17,6 +18,41 @@ export const generateTheme = (): string => {
1718
useSystemColorMode: false,
1819
};
1920
20-
export const theme = extendTheme({ colors, config });
21+
export const chakraTheme = extendTheme({ colors, config });
2122
`
23+
24+
const materialUITheme = endent/* tsx */ `
25+
import { createTheme } from '@material-ui/core/styles';
26+
import { red } from '@material-ui/core/colors';
27+
28+
export const materialTheme = createTheme({
29+
palette: {
30+
primary: {
31+
main: '#556cd6',
32+
},
33+
secondary: {
34+
main: '#19857b',
35+
},
36+
error: {
37+
main: red.A400,
38+
},
39+
background: {
40+
default: '#fff',
41+
},
42+
},
43+
});
44+
`
45+
46+
export const generateTheme = ({ flags }: ValidCNSInputs): Promise<void>[] => {
47+
const promises: Promise<void>[] = []
48+
49+
if (flags.chakra) {
50+
promises.push(fs.writeFile("chakra-theme.ts", chakraUITheme))
51+
}
52+
53+
if (flags["material-ui"]) {
54+
promises.push(fs.writeFile("material-theme.ts", materialUITheme))
55+
}
56+
57+
return promises
2258
}

0 commit comments

Comments
 (0)