From fe4fa55c7f4896b00ae723d95013d9b7e7efd643 Mon Sep 17 00:00:00 2001 From: Prasanth A R <73158535+ptech12@users.noreply.github.com> Date: Sat, 6 Jan 2024 18:56:18 +0530 Subject: [PATCH] Adding Support for Javascript --- index.js | 18 +- scripts/create-next-app-no-typescript.js | 32 +++ {template => template-js}/LICENSE | 0 {template => template-js}/README.md | 0 template-js/components/MUIThemeProvider.js | 28 +++ template-js/components/RadixThemeProvider.js | 8 + template-js/components/chakraUIProvider.js | 15 ++ {template => template-js}/config/gitignore | 0 {template => template-js}/config/globals.d.ts | 0 .../config/jest.config.mjs | 0 .../config/next-pwa-with-markdown.config.js | 0 .../config/next-pwa.config.js | 0 .../config/prettierignore | 0 .../config/prettierrc.json | 0 .../config/stylelintrc.json | 0 {template => template-js}/css/globals-mui.css | 0 .../css/globals-no-chakraui.css | 0 .../css/globals-radix.css | 0 {template => template-js}/css/globals.css | 0 .../image/android-chrome-192x192.png | Bin .../image/android-chrome-512x512.png | Bin .../image/apple-touch-icon.png | Bin .../image/favicon-16x16.png | Bin .../image/favicon-32x32.png | Bin {template => template-js}/image/favicon.ico | Bin template-js/layout/rootLayout-mui.js | 83 ++++++ template-js/layout/rootLayout-no-chakraui.js | 77 ++++++ template-js/layout/rootLayout-radix.js | 81 ++++++ template-js/layout/rootLayout.js | 80 ++++++ .../next-auth/[...nextauth].js | 0 .../page/rootPage-mui.js | 0 .../page/rootPage-no-chakraui.js | 0 .../page/rootPage-radix.js | 0 .../page/rootPage.js | 0 {template => template-js}/pwa/manifest.json | 0 template-ts/LICENSE | 21 ++ template-ts/README.md | 122 +++++++++ .../components/MUIThemeProvider.tsx | 0 .../components/RadixThemeProvider.tsx | 0 .../components/chakraUIProvider.tsx | 0 template-ts/config/gitignore | 42 ++++ template-ts/config/globals.d.ts | 1 + template-ts/config/jest.config.mjs | 18 ++ .../config/next-pwa-with-markdown.config.js | 37 +++ template-ts/config/next-pwa.config.js | 30 +++ template-ts/config/prettierignore | 25 ++ template-ts/config/prettierrc.json | 9 + template-ts/config/stylelintrc.json | 17 ++ template-ts/css/globals-mui.css | 38 +++ template-ts/css/globals-no-chakraui.css | 35 +++ template-ts/css/globals-radix.css | 11 + template-ts/css/globals.css | 27 ++ template-ts/image/android-chrome-192x192.png | Bin 0 -> 11902 bytes template-ts/image/android-chrome-512x512.png | Bin 0 -> 39285 bytes template-ts/image/apple-touch-icon.png | Bin 0 -> 10551 bytes template-ts/image/favicon-16x16.png | Bin 0 -> 657 bytes template-ts/image/favicon-32x32.png | Bin 0 -> 1302 bytes template-ts/image/favicon.ico | Bin 0 -> 15406 bytes .../layout/rootLayout-mui.tsx | 0 .../layout/rootLayout-no-chakraui.tsx | 0 .../layout/rootLayout-radix.tsx | 0 .../layout/rootLayout.tsx | 0 template-ts/next-auth/[...nextauth].js | 10 + template-ts/page/rootPage-mui.tsx | 237 ++++++++++++++++++ template-ts/page/rootPage-no-chakraui.tsx | 143 +++++++++++ template-ts/page/rootPage-radix.tsx | 157 ++++++++++++ template-ts/page/rootPage.tsx | 181 +++++++++++++ template-ts/pwa/manifest.json | 33 +++ 68 files changed, 1615 insertions(+), 1 deletion(-) create mode 100644 scripts/create-next-app-no-typescript.js rename {template => template-js}/LICENSE (100%) rename {template => template-js}/README.md (100%) create mode 100644 template-js/components/MUIThemeProvider.js create mode 100644 template-js/components/RadixThemeProvider.js create mode 100644 template-js/components/chakraUIProvider.js rename {template => template-js}/config/gitignore (100%) rename {template => template-js}/config/globals.d.ts (100%) rename {template => template-js}/config/jest.config.mjs (100%) rename {template => template-js}/config/next-pwa-with-markdown.config.js (100%) rename {template => template-js}/config/next-pwa.config.js (100%) rename {template => template-js}/config/prettierignore (100%) rename {template => template-js}/config/prettierrc.json (100%) rename {template => template-js}/config/stylelintrc.json (100%) rename {template => template-js}/css/globals-mui.css (100%) rename {template => template-js}/css/globals-no-chakraui.css (100%) rename {template => template-js}/css/globals-radix.css (100%) rename {template => template-js}/css/globals.css (100%) rename {template => template-js}/image/android-chrome-192x192.png (100%) rename {template => template-js}/image/android-chrome-512x512.png (100%) rename {template => template-js}/image/apple-touch-icon.png (100%) rename {template => template-js}/image/favicon-16x16.png (100%) rename {template => template-js}/image/favicon-32x32.png (100%) rename {template => template-js}/image/favicon.ico (100%) create mode 100644 template-js/layout/rootLayout-mui.js create mode 100644 template-js/layout/rootLayout-no-chakraui.js create mode 100644 template-js/layout/rootLayout-radix.js create mode 100644 template-js/layout/rootLayout.js rename {template => template-js}/next-auth/[...nextauth].js (100%) rename template/page/rootPage-mui.tsx => template-js/page/rootPage-mui.js (100%) rename template/page/rootPage-no-chakraui.tsx => template-js/page/rootPage-no-chakraui.js (100%) rename template/page/rootPage-radix.tsx => template-js/page/rootPage-radix.js (100%) rename template/page/rootPage.tsx => template-js/page/rootPage.js (100%) rename {template => template-js}/pwa/manifest.json (100%) create mode 100644 template-ts/LICENSE create mode 100644 template-ts/README.md rename {template => template-ts}/components/MUIThemeProvider.tsx (100%) rename {template => template-ts}/components/RadixThemeProvider.tsx (100%) rename {template => template-ts}/components/chakraUIProvider.tsx (100%) create mode 100644 template-ts/config/gitignore create mode 100644 template-ts/config/globals.d.ts create mode 100644 template-ts/config/jest.config.mjs create mode 100644 template-ts/config/next-pwa-with-markdown.config.js create mode 100644 template-ts/config/next-pwa.config.js create mode 100644 template-ts/config/prettierignore create mode 100644 template-ts/config/prettierrc.json create mode 100644 template-ts/config/stylelintrc.json create mode 100644 template-ts/css/globals-mui.css create mode 100644 template-ts/css/globals-no-chakraui.css create mode 100644 template-ts/css/globals-radix.css create mode 100644 template-ts/css/globals.css create mode 100644 template-ts/image/android-chrome-192x192.png create mode 100644 template-ts/image/android-chrome-512x512.png create mode 100644 template-ts/image/apple-touch-icon.png create mode 100644 template-ts/image/favicon-16x16.png create mode 100644 template-ts/image/favicon-32x32.png create mode 100644 template-ts/image/favicon.ico rename {template => template-ts}/layout/rootLayout-mui.tsx (100%) rename {template => template-ts}/layout/rootLayout-no-chakraui.tsx (100%) rename {template => template-ts}/layout/rootLayout-radix.tsx (100%) rename {template => template-ts}/layout/rootLayout.tsx (100%) create mode 100644 template-ts/next-auth/[...nextauth].js create mode 100644 template-ts/page/rootPage-mui.tsx create mode 100644 template-ts/page/rootPage-no-chakraui.tsx create mode 100644 template-ts/page/rootPage-radix.tsx create mode 100644 template-ts/page/rootPage.tsx create mode 100644 template-ts/pwa/manifest.json diff --git a/index.js b/index.js index ac826c9..58f8ffc 100644 --- a/index.js +++ b/index.js @@ -5,6 +5,7 @@ import inquirer from "inquirer"; import chalk from "chalk"; import K from "./constants.js"; import createNextApp from "./scripts/create-next-app.js"; +import createNextAppJs from "./scripts/create-next-app-no-typescript.js"; import ora from "ora"; import { fileURLToPath } from "url"; import { dirname } from "path"; @@ -88,6 +89,15 @@ try { }, ]); + const { projectType } = await prompt( [ + { + name: "projectType", + message: "What would you like to use?", + type: "list", + choices: [K.ts, K.js], + + } + ]); const { uiLibrary } = await prompt([ { name: "uiLibrary", @@ -158,7 +168,13 @@ try { } const projectDir = path.resolve(currentDir, projectName); const templateDir = path.resolve(__dirname, "template"); - createNextApp(projectName, templateDir); + + if (projectType.includes(K.ts)){ + createNextApp(projectName, templateDir); + }else{ + createNextAppJs(projectName, templateDir) + + } if (uiLibrary.includes(K.chakraui)) { spinner.start( diff --git a/scripts/create-next-app-no-typescript.js b/scripts/create-next-app-no-typescript.js new file mode 100644 index 0000000..e911cd2 --- /dev/null +++ b/scripts/create-next-app-no-typescript.js @@ -0,0 +1,32 @@ +import fs from "fs"; +import path from "path"; +import spawn from "cross-spawn"; + +const createNextAppJs = (name, templateDir) => { + const rootDir = process.cwd(); + const projectDir = path.resolve(rootDir, name); + const options = [ + "create-next-app@latest", + name, + "--app", + "--tailwind", + "--eslint", + ]; + spawn.sync("npx", options, { + stdio: "inherit", + }); + fs.cpSync( + path.join(templateDir, "config", "next-pwa.config.js"), + path.join(projectDir, "next.config.js") + ); + fs.cpSync( + path.join(templateDir, "config", "gitignore"), + path.join(projectDir, ".gitignore") + ); + fs.cpSync( + path.join(templateDir, "README.md"), + path.join(projectDir, "README.md") + ); +}; + +export default createNextAppJs; diff --git a/template/LICENSE b/template-js/LICENSE similarity index 100% rename from template/LICENSE rename to template-js/LICENSE diff --git a/template/README.md b/template-js/README.md similarity index 100% rename from template/README.md rename to template-js/README.md diff --git a/template-js/components/MUIThemeProvider.js b/template-js/components/MUIThemeProvider.js new file mode 100644 index 0000000..2de6c0f --- /dev/null +++ b/template-js/components/MUIThemeProvider.js @@ -0,0 +1,28 @@ +"use client"; + +import { createTheme } from "@mui/material/styles"; +import { ThemeProvider, CssBaseline } from "@mui/material"; + +export const lightTheme = createTheme({ + palette: { + mode: "light", + primary: { + main: "#5361fc", + }, + secondary: { + main: "#32c13b", + }, + info: { + main: "#fcb42f", + }, + }, +}); + +export function MUIThemeProvider({ children }) { + return ( + + + {children} + + ); +} diff --git a/template-js/components/RadixThemeProvider.js b/template-js/components/RadixThemeProvider.js new file mode 100644 index 0000000..a2a20e9 --- /dev/null +++ b/template-js/components/RadixThemeProvider.js @@ -0,0 +1,8 @@ +"use client"; + +import "@radix-ui/themes/styles.css"; +import { Theme } from "@radix-ui/themes"; + +export function RadixThemeProvider({ children }) { + return {children}; +} diff --git a/template-js/components/chakraUIProvider.js b/template-js/components/chakraUIProvider.js new file mode 100644 index 0000000..e478bb4 --- /dev/null +++ b/template-js/components/chakraUIProvider.js @@ -0,0 +1,15 @@ +// app/providers.tsx +'use client'; + +// import { CacheProvider } from '@chakra-ui/next-js'; +import { CacheProvider } from '@chakra-ui-next-js'; +import { ChakraProvider } from '@chakra-ui/react'; + +export function ChakraUIProvider({ children }) { + return ( + + {children} + + + ); +} diff --git a/template/config/gitignore b/template-js/config/gitignore similarity index 100% rename from template/config/gitignore rename to template-js/config/gitignore diff --git a/template/config/globals.d.ts b/template-js/config/globals.d.ts similarity index 100% rename from template/config/globals.d.ts rename to template-js/config/globals.d.ts diff --git a/template/config/jest.config.mjs b/template-js/config/jest.config.mjs similarity index 100% rename from template/config/jest.config.mjs rename to template-js/config/jest.config.mjs diff --git a/template/config/next-pwa-with-markdown.config.js b/template-js/config/next-pwa-with-markdown.config.js similarity index 100% rename from template/config/next-pwa-with-markdown.config.js rename to template-js/config/next-pwa-with-markdown.config.js diff --git a/template/config/next-pwa.config.js b/template-js/config/next-pwa.config.js similarity index 100% rename from template/config/next-pwa.config.js rename to template-js/config/next-pwa.config.js diff --git a/template/config/prettierignore b/template-js/config/prettierignore similarity index 100% rename from template/config/prettierignore rename to template-js/config/prettierignore diff --git a/template/config/prettierrc.json b/template-js/config/prettierrc.json similarity index 100% rename from template/config/prettierrc.json rename to template-js/config/prettierrc.json diff --git a/template/config/stylelintrc.json b/template-js/config/stylelintrc.json similarity index 100% rename from template/config/stylelintrc.json rename to template-js/config/stylelintrc.json diff --git a/template/css/globals-mui.css b/template-js/css/globals-mui.css similarity index 100% rename from template/css/globals-mui.css rename to template-js/css/globals-mui.css diff --git a/template/css/globals-no-chakraui.css b/template-js/css/globals-no-chakraui.css similarity index 100% rename from template/css/globals-no-chakraui.css rename to template-js/css/globals-no-chakraui.css diff --git a/template/css/globals-radix.css b/template-js/css/globals-radix.css similarity index 100% rename from template/css/globals-radix.css rename to template-js/css/globals-radix.css diff --git a/template/css/globals.css b/template-js/css/globals.css similarity index 100% rename from template/css/globals.css rename to template-js/css/globals.css diff --git a/template/image/android-chrome-192x192.png b/template-js/image/android-chrome-192x192.png similarity index 100% rename from template/image/android-chrome-192x192.png rename to template-js/image/android-chrome-192x192.png diff --git a/template/image/android-chrome-512x512.png b/template-js/image/android-chrome-512x512.png similarity index 100% rename from template/image/android-chrome-512x512.png rename to template-js/image/android-chrome-512x512.png diff --git a/template/image/apple-touch-icon.png b/template-js/image/apple-touch-icon.png similarity index 100% rename from template/image/apple-touch-icon.png rename to template-js/image/apple-touch-icon.png diff --git a/template/image/favicon-16x16.png b/template-js/image/favicon-16x16.png similarity index 100% rename from template/image/favicon-16x16.png rename to template-js/image/favicon-16x16.png diff --git a/template/image/favicon-32x32.png b/template-js/image/favicon-32x32.png similarity index 100% rename from template/image/favicon-32x32.png rename to template-js/image/favicon-32x32.png diff --git a/template/image/favicon.ico b/template-js/image/favicon.ico similarity index 100% rename from template/image/favicon.ico rename to template-js/image/favicon.ico diff --git a/template-js/layout/rootLayout-mui.js b/template-js/layout/rootLayout-mui.js new file mode 100644 index 0000000..20bbb12 --- /dev/null +++ b/template-js/layout/rootLayout-mui.js @@ -0,0 +1,83 @@ + +// import { Metadata } from "next" COMMENT: Does it require? +import "./globals.css"; +import { MUIThemeProvider } from "./MUIThemeProvider"; + +// Metadata for SEO +export const metadata = { + title: "NextJS Easy Template", + description: "NextJS | TailwindCSS | Material UI easy template by Li Yuxuan", + manifest: "/manifest.json", + appleWebApp: { + title: "NextJS Easy Template", + statusBarStyle: "black-translucent", + }, + icons: { + icon: "/favicon.ico", + apple: [ + { + url: "/android-chrome-192x192.png", + sizes: "192x192", + type: "image/png", + }, + { + url: "/android-chrome512x512.png", + sizes: "512x512", + type: "image/png", + }, + ], + other: { + rel: "apple-touch-icon", + url: "/apple-touch-icon.png", + }, + }, + applicationName: "NextJS Easy Template", + keywords: ["template"], + authors: [{ name: "Li Yuxuan", url: "https://xmliszt.github.io/" }], + creator: "Li Yuxuan", + alternates: { + canonical: "http://localhost:3000", + }, + category: "technology", + openGraph: { + title: "NextJS Easy Template", + description: + "NextJS | TailwindCSS | Material UI easy template by Li Yuxuan", + url: "http://localhost:3000", + siteName: "Taboo AI", + images: [ + { + url: "https://i.imgur.com/IIP6UzK.jpeg", + width: 800, + height: 600, + alt: "NextJS Easy Template", + }, + ], + locale: "en_US", + type: "website", + }, + twitter: { + card: "summary_large_image", + title: "NextJS Easy Template", + description: + "NextJS | TailwindCSS | Material UI easy template by Li Yuxuan", + siteId: "1704579643", + creator: "@xmliszt", + creatorId: "1704579643", + images: ["https://i.imgur.com/IIP6UzK.jpeg"], + }, + viewport: { + width: "device-width", + initialScale: 1, + }, +}; + +export default function RootLayout({ children }) { + return ( + + + {children} + + + ); +} diff --git a/template-js/layout/rootLayout-no-chakraui.js b/template-js/layout/rootLayout-no-chakraui.js new file mode 100644 index 0000000..5d33825 --- /dev/null +++ b/template-js/layout/rootLayout-no-chakraui.js @@ -0,0 +1,77 @@ +import { Metadata } from "next"; +import "./globals.css"; + +// Metadata for SEO +export const metadata = { + title: "NextJS Easy Template", + description: "NextJS | TailwindCSS | ChakraUI easy template by Li Yuxuan", + manifest: "/manifest.json", + appleWebApp: { + title: "NextJS Easy Template", + statusBarStyle: "black-translucent", + }, + icons: { + icon: "/favicon.ico", + apple: [ + { + url: "/android-chrome-192x192.png", + sizes: "192x192", + type: "image/png", + }, + { + url: "/android-chrome512x512.png", + sizes: "512x512", + type: "image/png", + }, + ], + other: { + rel: "apple-touch-icon", + url: "/apple-touch-icon.png", + }, + }, + applicationName: "NextJS Easy Template", + keywords: ["template"], + authors: [{ name: "Li Yuxuan", url: "https://xmliszt.github.io/" }], + creator: "Li Yuxuan", + alternates: { + canonical: "http://localhost:3000", + }, + category: "technology", + openGraph: { + title: "NextJS Easy Template", + description: "NextJS | TailwindCSS | ChakraUI easy template by Li Yuxuan", + url: "http://localhost:3000", + siteName: "Taboo AI", + images: [ + { + url: "https://i.imgur.com/IIP6UzK.jpeg", + width: 800, + height: 600, + alt: "NextJS Easy Template", + }, + ], + locale: "en_US", + type: "website", + }, + twitter: { + card: "summary_large_image", + title: "NextJS Easy Template", + description: "NextJS | TailwindCSS | ChakraUI easy template by Li Yuxuan", + siteId: "1704579643", + creator: "@xmliszt", + creatorId: "1704579643", + images: ["https://i.imgur.com/IIP6UzK.jpeg"], + }, + viewport: { + width: "device-width", + initialScale: 1, + }, +}; + +export default function RootLayout({ children }) { + return ( + + {children} + + ); +} diff --git a/template-js/layout/rootLayout-radix.js b/template-js/layout/rootLayout-radix.js new file mode 100644 index 0000000..e862fb5 --- /dev/null +++ b/template-js/layout/rootLayout-radix.js @@ -0,0 +1,81 @@ +// import { Metadata } from "next"; +// import React from "react"; +import "./globals.css"; +import { RadixThemeProvider } from "./RadixThemeProvider"; + +// Metadata for SEO +export const metadata = { + title: "NextJS Easy Template", + description: "NextJS | TailwindCSS | RadixUI easy template by Li Yuxuan", + manifest: "/manifest.json", + appleWebApp: { + title: "NextJS Easy Template", + statusBarStyle: "black-translucent", + }, + icons: { + icon: "/favicon.ico", + apple: [ + { + url: "/android-chrome-192x192.png", + sizes: "192x192", + type: "image/png", + }, + { + url: "/android-chrome512x512.png", + sizes: "512x512", + type: "image/png", + }, + ], + other: { + rel: "apple-touch-icon", + url: "/apple-touch-icon.png", + }, + }, + applicationName: "NextJS Easy Template", + keywords: ["template"], + authors: [{ name: "Li Yuxuan", url: "https://xmliszt.github.io/" }], + creator: "Li Yuxuan", + alternates: { + canonical: "http://localhost:3000", + }, + category: "technology", + openGraph: { + title: "NextJS Easy Template", + description: "NextJS | TailwindCSS | RadixUI easy template by Li Yuxuan", + url: "http://localhost:3000", + siteName: "Taboo AI", + images: [ + { + url: "https://i.imgur.com/IIP6UzK.jpeg", + width: 800, + height: 600, + alt: "NextJS Easy Template", + }, + ], + locale: "en_US", + type: "website", + }, + twitter: { + card: "summary_large_image", + title: "NextJS Easy Template", + description: "NextJS | TailwindCSS | RadixUI easy template by Li Yuxuan", + siteId: "1704579643", + creator: "@xmliszt", + creatorId: "1704579643", + images: ["https://i.imgur.com/IIP6UzK.jpeg"], + }, + viewport: { + width: "device-width", + initialScale: 1, + }, +}; + +export default function RootLayout({ children }) { + return ( + + + {children} + + + ); +} diff --git a/template-js/layout/rootLayout.js b/template-js/layout/rootLayout.js new file mode 100644 index 0000000..101a91b --- /dev/null +++ b/template-js/layout/rootLayout.js @@ -0,0 +1,80 @@ +import { Metadata } from "next"; +import { ChakraUIProvider } from "./chakraUIProvider"; +import "./globals.css"; + +// Metdata for SEO +export const metadata = { + title: "NextJS Easy Template", + description: "NextJS | TailwindCSS | ChakraUI easy template by Li Yuxuan", + manifest: "/manifest.json", + appleWebApp: { + title: "NextJS Easy Template", + statusBarStyle: "black-translucent", + }, + icons: { + icon: "/favicon.ico", + apple: [ + { + url: "/android-chrome-192x192.png", + sizes: "192x192", + type: "image/png", + }, + { + url: "/android-chrome512x512.png", + sizes: "512x512", + type: "image/png", + }, + ], + other: { + rel: "apple-touch-icon", + url: "/apple-touch-icon.png", + }, + }, + applicationName: "NextJS Easy Template", + keywords: ["template"], + authors: [{ name: "Li Yuxuan", url: "https://xmliszt.github.io/" }], + creator: "Li Yuxuan", + alternates: { + canonical: "http://localhost:3000", + }, + category: "technology", + openGraph: { + title: "NextJS Easy Template", + description: "NextJS | TailwindCSS | ChakraUI easy template by Li Yuxuan", + url: "http://localhost:3000", + siteName: "Taboo AI", + images: [ + { + url: "https://i.imgur.com/IIP6UzK.jpeg", + width: 800, + height: 600, + alt: "NextJS Easy Template", + }, + ], + locale: "en_US", + type: "website", + }, + twitter: { + card: "summary_large_image", + title: "NextJS Easy Template", + description: "NextJS | TailwindCSS | ChakraUI easy template by Li Yuxuan", + siteId: "1704579643", + creator: "@xmliszt", + creatorId: "1704579643", + images: ["https://i.imgur.com/IIP6UzK.jpeg"], + }, + viewport: { + width: "device-width", + initialScale: 1, + }, +}; + +export default function RootLayout({ children }) { + return ( + + + {children} + + + ); +} diff --git a/template/next-auth/[...nextauth].js b/template-js/next-auth/[...nextauth].js similarity index 100% rename from template/next-auth/[...nextauth].js rename to template-js/next-auth/[...nextauth].js diff --git a/template/page/rootPage-mui.tsx b/template-js/page/rootPage-mui.js similarity index 100% rename from template/page/rootPage-mui.tsx rename to template-js/page/rootPage-mui.js diff --git a/template/page/rootPage-no-chakraui.tsx b/template-js/page/rootPage-no-chakraui.js similarity index 100% rename from template/page/rootPage-no-chakraui.tsx rename to template-js/page/rootPage-no-chakraui.js diff --git a/template/page/rootPage-radix.tsx b/template-js/page/rootPage-radix.js similarity index 100% rename from template/page/rootPage-radix.tsx rename to template-js/page/rootPage-radix.js diff --git a/template/page/rootPage.tsx b/template-js/page/rootPage.js similarity index 100% rename from template/page/rootPage.tsx rename to template-js/page/rootPage.js diff --git a/template/pwa/manifest.json b/template-js/pwa/manifest.json similarity index 100% rename from template/pwa/manifest.json rename to template-js/pwa/manifest.json diff --git a/template-ts/LICENSE b/template-ts/LICENSE new file mode 100644 index 0000000..2945eb5 --- /dev/null +++ b/template-ts/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Li Yuxuan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/template-ts/README.md b/template-ts/README.md new file mode 100644 index 0000000..48f16bd --- /dev/null +++ b/template-ts/README.md @@ -0,0 +1,122 @@ +# Hello 👋 I'm A Next13 TypeScript Template! + +boostrapped with `TailwindCSS` and `ESLint`, configured with `PWA` and `SEO`, created by [Li Yuxuan](https://xmliszt.github.io) + +**NPM Package: https://www.npmjs.com/package/create-easy-next13-template-ts** + +## Run the Sample App + +```bash +npm run dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +## Create a build + +```bash +npm run build +``` + +## Linting + +```bash +npm run lint +``` + +## (If you install Jest) + +To test + +```bash +npm run test +``` + +## (If you install Cypress) + +To test + +```bash +npm run cypress +``` + +## (If you install Playwright) + +To test + +```bash +npm run test:e2e +``` + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. + +## Template Introduction + +A few things to take notes before you start: + +- This is a TypeScript template. JavaScript is currently not supported. +- The template will install the latest **NextJS** version (Next13), with the "App Router" mode enabled. If you are more familiar with the traditional "Pages Router", feel free to change the example application. (For more details about "App Router" vs "Pages Router", visit [NextJS Documentation](https://nextjs.org/docs) to find out more!) +- The template will also by default include the followings. Feel free to modify or remove any of them if you don't want to include them in your project. **Instructions on how to remove them are documented at the end of this README.** + - Install TailwindCSS + - Install ESLint + - Set up PWA + - Set up SEO + +## How to use + +- simply run `npx create-easy-next13-template-ts@latest` and follow on screen instructions! + +```bash +npx create-easy-next13-template-ts@latest +``` + +## Features + +- A TypeScript Next 13 (App Router) template with + [TailwindCSS](https://tailwindcss.com) and [ESLint](https://eslint.org) supported by default. +- Optional UI library [Chakra UI](https://chakra-ui.com), [Material UI](https://mui.com) to be installed. +- [Progressive Web App (PWA)](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps) enabled (with next-pwa) +- [Search Engine Optimization (SEO)](https://support.google.com/webmasters/answer/7451184?hl=en/) is included (with [NextJS Metadata](https://nextjs.org/docs/app/building-your-application/optimizing/metadata)) +- Optional third-party libraries such as: [React Icons](https://react-icons.github.io/react-icons/), [NextAuth.js](https://next-auth.js.org), [Lodash](https://lodash.com), [Moment.js](https://momentjs.com) to be installed. +- Optional Testing frameworks to be installed: [Jest](https://jestjs.io), [Cypress](https://www.cypress.io), [Playwright](https://playwright.dev) +- Optional markdown files support, with [React-Markdown](https://github.com/remarkjs/react-markdown) +- Optional linter(s) and formatter(s) to be installed: [Stylelint](https://github.com/remarkjs/react-markdown), [Prettier](https://prettier.io) +- [Husky](https://typicode.github.io/husky/) can be installed for adding git hooks to your project +- MIT License + +## Remove Search Engine Optimization (SEO) + +The project is automatically configured with sample SEO approach. You can find the details in `app/layout.tsx`, where you see the `export const metadata: Metadata = {...}` is being defined. If you wish to remove SEO, simply remove the entire metdata block. For more information about metdata in Next13, check out: https://nextjs.org/docs/app/building-your-application/optimizing/metadata + +## Remove Progressive Web App (PWA) + +The project is by default boostrapped with PWA using `next-pwa`. If you wish to remove PWA, you can follow the below steps: + +1. Go to `next.config.js` in root directory, remove anything related to PWA, namely `withPWA` and change `module.exports = withPWA(nextConfig);` into `module.exports = nextConfig;` +2. Go to `public/` and remove `manifest.json` +3. Go to `app/layout.tsx`, (assuming you have SEO enabled), in the `metadata` block, remove `manifest`, `appleWebApp` fields. + +## Remove ESLint + +The project is by default installed with ESLint. If you wish to remove it, simply remove the `.eslintrc.json` in root directory. You can also remove the `lint` field in the `scripts` field in `package.json`. + +## Remove TailwindCSS + +The project is by default installed with TailwindCSS integration with Next13. If you wish to remove it, follow the below steps: + +1. At root directory, remove `postcss.config.js` and `tailwind.config.js` +2. In `app/globals.css`, remove the `@tailwind` lines at the top, and any lines that start with `@apply` + +> Note: once you remove tailwindCSS, all the tailwindCSS syntax in `className` will not work anymore! You have to remove them or create your own CSS classes. + +--- + +Feel free to remove / modify any pre-installed packages to suit your own needs! + +😈 Happy Hacking! diff --git a/template/components/MUIThemeProvider.tsx b/template-ts/components/MUIThemeProvider.tsx similarity index 100% rename from template/components/MUIThemeProvider.tsx rename to template-ts/components/MUIThemeProvider.tsx diff --git a/template/components/RadixThemeProvider.tsx b/template-ts/components/RadixThemeProvider.tsx similarity index 100% rename from template/components/RadixThemeProvider.tsx rename to template-ts/components/RadixThemeProvider.tsx diff --git a/template/components/chakraUIProvider.tsx b/template-ts/components/chakraUIProvider.tsx similarity index 100% rename from template/components/chakraUIProvider.tsx rename to template-ts/components/chakraUIProvider.tsx diff --git a/template-ts/config/gitignore b/template-ts/config/gitignore new file mode 100644 index 0000000..81d8100 --- /dev/null +++ b/template-ts/config/gitignore @@ -0,0 +1,42 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. +# Auto Generated PWA files +**/public/sw.js +**/public/workbox-*.js +**/public/worker-*.js +**/public/sw.js.map +**/public/workbox-*.js.map +**/public/worker-*.js.map + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/template-ts/config/globals.d.ts b/template-ts/config/globals.d.ts new file mode 100644 index 0000000..5c1c18f --- /dev/null +++ b/template-ts/config/globals.d.ts @@ -0,0 +1 @@ +declare module '*.md'; diff --git a/template-ts/config/jest.config.mjs b/template-ts/config/jest.config.mjs new file mode 100644 index 0000000..ffee258 --- /dev/null +++ b/template-ts/config/jest.config.mjs @@ -0,0 +1,18 @@ +import nextJest from 'next/jest.js'; + +const createJestConfig = nextJest({ + // Provide the path to your Next.js app to load next.config.js and .env files in your test environment + dir: './', +}); + +// Add any custom config to be passed to Jest +/** @type {import('jest').Config} */ +const config = { + // Add more setup options before each test is run + // setupFilesAfterEnv: ['/jest.setup.js'], + + testEnvironment: 'jest-environment-jsdom', +}; + +// createJestConfig is exported this way to ensure that next/jest can load the Next.js config which is async +export default createJestConfig(config); diff --git a/template-ts/config/next-pwa-with-markdown.config.js b/template-ts/config/next-pwa-with-markdown.config.js new file mode 100644 index 0000000..2f445f7 --- /dev/null +++ b/template-ts/config/next-pwa-with-markdown.config.js @@ -0,0 +1,37 @@ +/** @type {import('next').NextConfig} */ + +const appSecurityHeaders = [ + { key: 'X-XSS-Protection', value: '1; mode=block' }, + { + key: 'X-Frame-Options', + value: 'SAMEORIGIN', + }, +]; + +const withPWA = require('next-pwa')({ + dest: 'public', + register: true, + skipWaiting: true, +}); + +const nextConfig = { + reactStrictMode: true, + webpack: (config) => { + config.module.rules.push({ + test: /\.md$/, + use: 'raw-loader', + }); + return config; + }, + async headers() { + return [ + { + // Apply these headers to all routes in your application. + source: '/:path*', + headers: appSecurityHeaders, + }, + ]; + }, +}; + +module.exports = withPWA(nextConfig); diff --git a/template-ts/config/next-pwa.config.js b/template-ts/config/next-pwa.config.js new file mode 100644 index 0000000..fd9e3d5 --- /dev/null +++ b/template-ts/config/next-pwa.config.js @@ -0,0 +1,30 @@ +/** @type {import('next').NextConfig} */ + +const appSecurityHeaders = [ + { key: 'X-XSS-Protection', value: '1; mode=block' }, + { + key: 'X-Frame-Options', + value: 'SAMEORIGIN', + }, +]; + +const withPWA = require('next-pwa')({ + dest: 'public', + register: true, + skipWaiting: true, +}); + +const nextConfig = { + reactStrictMode: true, + async headers() { + return [ + { + // Apply these headers to all routes in your application. + source: '/:path*', + headers: appSecurityHeaders, + }, + ]; + }, +}; + +module.exports = withPWA(nextConfig); diff --git a/template-ts/config/prettierignore b/template-ts/config/prettierignore new file mode 100644 index 0000000..4a7a0b5 --- /dev/null +++ b/template-ts/config/prettierignore @@ -0,0 +1,25 @@ +**/build +**/coverage + +*.html +**/.git +**/node_modules + +**/package-lock.json + +**/.husky/** +**/.prettierignore + +**/playwright-report/** +**/public/** +**/test-results/** + +**/.gitignore +**/.github/** +**/.vscode/** +**/.swc/** +**/.next/** +**/.vercel/** + +**/LICENSE +**/*.png diff --git a/template-ts/config/prettierrc.json b/template-ts/config/prettierrc.json new file mode 100644 index 0000000..81c7f73 --- /dev/null +++ b/template-ts/config/prettierrc.json @@ -0,0 +1,9 @@ +{ + "tabWidth": 2, + "semi": true, + "singleQuote": true, + "jsxSingleQuote": true, + "trailingComma": "es5", + "bracketSpacing": true, + "arrowParens": "always" +} diff --git a/template-ts/config/stylelintrc.json b/template-ts/config/stylelintrc.json new file mode 100644 index 0000000..b546a10 --- /dev/null +++ b/template-ts/config/stylelintrc.json @@ -0,0 +1,17 @@ +{ + "extends": ["stylelint-config-standard"], + "rules": { + "at-rule-no-unknown": [ + true, + { + "ignoreAtRules": [ + "tailwind", + "apply", + "variants", + "responsive", + "screen" + ] + } + ] + } +} diff --git a/template-ts/css/globals-mui.css b/template-ts/css/globals-mui.css new file mode 100644 index 0000000..377771a --- /dev/null +++ b/template-ts/css/globals-mui.css @@ -0,0 +1,38 @@ +@import url("https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap"); +@import url("https://fonts.googleapis.com/icon?family=Material+Icons"); + +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --foreground-rgb: 0, 0, 0; + --background-start-rgb: 200, 200, 255; + --background-end-rgb: 255, 255, 255; +} + +@media (prefers-color-scheme: dark) { + :root { + --foreground-rgb: 255, 255, 255; + --background-start-rgb: 0, 0, 0; + --background-end-rgb: 0, 0, 0; + } +} + +body { + color: rgb(var(--foreground-rgb)); + background: linear-gradient( + to bottom, + transparent, + rgb(var(--background-end-rgb)) + ) + rgb(var(--background-start-rgb)); +} + +a { + @apply underline text-purple-400; +} + +li { + @apply list-disc; +} diff --git a/template-ts/css/globals-no-chakraui.css b/template-ts/css/globals-no-chakraui.css new file mode 100644 index 0000000..28583ba --- /dev/null +++ b/template-ts/css/globals-no-chakraui.css @@ -0,0 +1,35 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --foreground-rgb: 0, 0, 0; + --background-start-rgb: 200, 200, 255; + --background-end-rgb: 255, 255, 255; +} + +@media (prefers-color-scheme: dark) { + :root { + --foreground-rgb: 255, 255, 255; + --background-start-rgb: 0, 0, 0; + --background-end-rgb: 0, 0, 0; + } +} + +body { + color: rgb(var(--foreground-rgb)); + background: linear-gradient( + to bottom, + transparent, + rgb(var(--background-end-rgb)) + ) + rgb(var(--background-start-rgb)); +} + +a { + @apply underline text-purple-400; +} + +li { + @apply list-disc; +} diff --git a/template-ts/css/globals-radix.css b/template-ts/css/globals-radix.css new file mode 100644 index 0000000..796b61a --- /dev/null +++ b/template-ts/css/globals-radix.css @@ -0,0 +1,11 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +body { + background: linear-gradient( + to bottom, + rgb(33, 33, 33) 0%, + rgb(116, 84, 168) 80% + ); +} diff --git a/template-ts/css/globals.css b/template-ts/css/globals.css new file mode 100644 index 0000000..81521ee --- /dev/null +++ b/template-ts/css/globals.css @@ -0,0 +1,27 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --foreground-rgb: 0, 0, 0; + --background-start-rgb: 200, 200, 255; + --background-end-rgb: 255, 255, 255; +} + +@media (prefers-color-scheme: dark) { + :root { + --foreground-rgb: 255, 255, 255; + --background-start-rgb: 0, 0, 0; + --background-end-rgb: 0, 0, 0; + } +} + +body { + color: rgb(var(--foreground-rgb)); + background: linear-gradient( + to bottom, + transparent, + rgb(var(--background-end-rgb)) + ) + rgb(var(--background-start-rgb)); +} diff --git a/template-ts/image/android-chrome-192x192.png b/template-ts/image/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..16fdb0ebb0271fde488c85c298e5d7e8c9947a82 GIT binary patch literal 11902 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 SzQljE-wHCS(shz1q5lV#yu<(i literal 0 HcmV?d00001 diff --git a/template-ts/image/android-chrome-512x512.png b/template-ts/image/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..909e33bc835a3b3fbbb333ab6f04cf9138b06d0e GIT binary patch literal 39285 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 literal 0 HcmV?d00001 diff --git a/template-ts/image/apple-touch-icon.png b/template-ts/image/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9c56dbfcaeea9b80193ddcc557e51616b9974c16 GIT binary patch literal 10551 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 literal 0 HcmV?d00001 diff --git a/template-ts/image/favicon-16x16.png b/template-ts/image/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..c1f418e5a4313e860143d1797a103d9ce6ba13ac GIT binary patch literal 657 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uuz(rC1}QWNE&K#j_S@6NF~mZ! zck=%H%MLO}@6TQ9(Kz7|-xL#0McD-+j_JPe%K#Z-Rf3#d%v(=}e9V3sDP z;vy~(lIs-8C>ZDzF=3*om(=qg`;_~dCW!8vbiVw3ZCsIE{n~5qL(Qi;{dF*^e0=Hc zq3_3^uAP)UM|E+*MFv+7%?Fc>DlP^;eD(F|<^1{Uuk0yX{`rK&lPgs_g)~+)A2MyJ zVQoHLZ`AWI*lkAop*iB}$q98?ORvmkG}ApMI`g#rv1w8Ul0s*)zFdvcu{$?m%{%Ld z*DUnTrH5HB+$YN3b9v@fo7|?mdE&ip!j1w*p1qi;csl9Y)76hw2L8E~wJ>O{63_1$ z_SI~`!R|UYvT6_S{yw`vhWGsE34ZcUN)so1b_tAjY75b7J$i|$@9F0cwesuD%`Uud z{q|^%l&w+9;!8P`G7kR!S9e}-^G%(Y>l?+NFP;~B;=r2Ie3R2H1v`z6UAI{0o|z}( zb=Y$6#iX#!wysl-Gk*J4xA11pqdQ42*XI_UzVc$C^b zyE@^tZ?ckYV&wn!{;Iu=k6W3ZJxg1wrn|GO^yigHr>6$4w7zt$L{H$up2I&jY;L}L zw_j}DoG$@UGu+jRudGY0$TT+EXuaUqlYi5f7#(E3dGc)F+UP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91AfN*P1ONa40RR91AOHXW0IY^$^8f$@fJsC_R9FeUS50giMHK#K*Z+3o z{4`2Y5*p%^CQT27Lj@c;0OEp>NEIYb?FBAKBtU!WxrMq&J#hd|NVH9)9*__e1c(D5 z4unhUv~hylB%)D5V#jvuWNi=ctuwZFz1XP~`AMspee>S?-p;(AS#k5~{M!)nVj3#t7m3i>x^FGf-hW^nuZ zLd4iB%}61KAn}2?8I7d{L}*`ly(HvY6O$u%l=6*e>}eh10vUgkcz(riGUmw1uZoaY zCZZEX#S!~=M}UL0v_!_lrzgu`LG zSi|>JDus=IH<8}n#_sMe1_q9!r>DoF!`QBJSF`Z(=+PP;F0WXap->1zkwFX&J_TLZ zEo2JgrmypS16x$qqK3}~9)KRGy+$&HbS}aln!p=?(`Fsw^WD3hGD_CFO zFb%OI&p&qt?d@hKu7D(yN&NQv9~I#4?xX1M>m#`^d_F${0Y9iQRpiSPQ8d%g#x(_l z!2r6tx)7nS)^%4!gum>kpMNnOR7`f3d9`27I;_h!*j7DwSzF`Fgfiqb777J$Ow>{v z#f8gNb&BWAt0mT9-A2UN)D4knB*f>+M^Z~8!zbbKRIdm;XI?F_4(m1|#^!D~+epac z@gm^2)~GO@tDWpT)?wX7#Mm0&;Tj2X+?+l=S`pz)2nGU`cQs)iuPI`kx|maoYUKOl zK}#{`_1>NVj_yXp*}_M1fVyFpVlywMqw}BBcAT>t&gF6_m82QP_O*k&XR|xdGy%Wu z2w9hazZjnyK5wQW-(HDl*o|h=8Ql5)2gG9YO(VKim!qF`SeI=$kg<N)%iTew2^KrY~l=nyA^OkS(`Q1FWx6?3;>L&gl zI91&_Uodk?d1a}MGaoIUDCx$pv{)Bu+#hCV|3W64Rl1I2C>X@p*fThG%-VSNg*UXK z`-L|?jL@$@nJf-4>&7Pw&uXROcQmbYf&+4Obrmc0Y;JB*ugIHLxY2ZWcA&4f7rpdw z;5pDnNz-4Rc<+SeH^5P{yc2u3?Z;s^stRP&e5Y;Kik{bNzg*dJY(^~T4`t7Au#jN& zV3pSX$iPj&`PVGUww%D(jN=Z};vDABX{}u~Z|Z;&JgnbyWlxR&0VBoKYTNb`EC2ui M07*qoM6N<$g6L^dp#T5? literal 0 HcmV?d00001 diff --git a/template-ts/image/favicon.ico b/template-ts/image/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..40a236cde173fee876e8c75132a44250a43fcd1c GIT binary patch literal 15406 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 +

+ + Hello 👋 I'm a NextJS 13 TypeScript Template + + + + +
+
+ + + + + + A + + Next 13 (App Router) + + template with + + TailwindCSS + + , + + ChakraUI + + , and + + ESLint + + + + + + + Progressive Web App (PWA) enabled (with + + next-pwa + + ) + + + + + + Search Engine Optimization (SEO) in-built (with + + NextJS Metadata + + ) + + + + + + MIT License template included + + + + + + Optional convenient third-party libraries such as: + + React Icons + + , + + NextAuth.js + + , + + Lodash + + , + + Moment.js + + pre-installed + + + + + + You can choose to install testing frameworks like:{" "} + + Jest + + and + + Playwright + + + + + + + You can choose to support markdown files with + + React-Markdown + + + + + + + Optional linters and formatters: + + Stylelint + + , + + Prettier + + + + + + + + Husky + + can be installed for adding git hooks to your project + + + + + + The template is yours! Feel free to remove / modify any + pre-installed packages to suit your own needs! + + +
+ + + ); +} diff --git a/template-ts/page/rootPage-no-chakraui.tsx b/template-ts/page/rootPage-no-chakraui.tsx new file mode 100644 index 0000000..40228d9 --- /dev/null +++ b/template-ts/page/rootPage-no-chakraui.tsx @@ -0,0 +1,143 @@ +export default function Home() { + return ( +
+
+

+ Hello 👋 I'm a NextJS 13 TypeScript Template +

+ +
+
+ +
+
+ Happy Hacking! +
+
+ ); +} diff --git a/template-ts/page/rootPage-radix.tsx b/template-ts/page/rootPage-radix.tsx new file mode 100644 index 0000000..dbd2b5b --- /dev/null +++ b/template-ts/page/rootPage-radix.tsx @@ -0,0 +1,157 @@ +import { + CheckCircledIcon, + QuestionMarkCircledIcon, + InfoCircledIcon, +} from "@radix-ui/react-icons"; +import { Button, Code, Flex, Heading, Link } from "@radix-ui/themes"; + +export default function Home() { + return ( +
+
+ Hello 👋 I'm a NextJS 13 TypeScript Template + +
+ + + +
+ A{" "} + + Next 13 (App Router) + {" "} + template with{" "} + + TailwindCSS + + , and{" "} + + ESLint + +
+
+ + +
+ Progressive Web App (PWA) enabled (with{" "} + + next-pwa + + ) +
+
+ + +
+ Search Engine Optimization (SEO) in-built (with{" "} + + NextJS Metadata + + ) +
+
+ + +
MIT License template included
+
+ + +
+ Optional convenient third-party libraries such as:{" "} + + React Icons + + ,{" "} + + NextAuth.js + + ,{" "} + + Lodash + + ,{" "} + + Moment.js + {" "} + pre-installed +
+
+ + +
+ You can choose to install testing frameworks like:{" "} + + Jest + {" "} + and{" "} + + Playwright + +
+
+ + +
+ You can choose to support markdown files with{" "} + + React-Markdown + +
+
+ + +
+ Optional linters and formatters:{" "} + + Stylelint + + ,{" "} + + Prettier + +
+
+ + +
+ + Husky + {" "} + can be installed for adding git hooks to your project +
+
+ + +
+ The template is yours! Feel free to remove / modify any + pre-installed packages to suit your own needs! +
+
+
+ Happy Hacking! +
+ ); +} diff --git a/template-ts/page/rootPage.tsx b/template-ts/page/rootPage.tsx new file mode 100644 index 0000000..d4dfdb9 --- /dev/null +++ b/template-ts/page/rootPage.tsx @@ -0,0 +1,181 @@ +"use client"; + +import { CheckCircleIcon, InfoIcon, QuestionIcon } from "@chakra-ui/icons"; +import { + Kbd, + Link, + List, + ListIcon, + ListItem, + Tag, + Text, +} from "@chakra-ui/react"; + +export default function Home() { + return ( +
+
+ + Hello 👋 I'm a NextJS 13 TypeScript Template + + + + by Li Yuxuan + + +
+
+ + + A{" "} + + Next 13 (App Router) + {" "} + template with{" "} + + TailwindCSS + + ,{" "} + + ChakraUI + + , and{" "} + + ESLint + + + + + Progressive Web App (PWA) enabled (with{" "} + + next-pwa + + ) + + + + Search Engine Optimization (SEO) in-built (with{" "} + + NextJS Metadata + + ) + + + + MIT License template included + + + + Optional convenient third-party libraries such as:{" "} + + React Icons + + ,{" "} + + NextAuth.js + + ,{" "} + + Lodash + + ,{" "} + + Moment.js + {" "} + pre-installed + + + + You can choose to install testing frameworks like:{" "} + + Jest + {" "} + and{" "} + + Playwright + + + + + You can choose to support markdown files with{" "} + + React-Markdown + + + + + Optional linters and formatters:{" "} + + Stylelint + + ,{" "} + + Prettier + + + + + + Husky + {" "} + can be installed for adding git hooks to your project + + + + The template is yours! Feel free to remove / modify any + pre-installed packages to suit your own needs! + + +
+ Happy Hacking! +
+ ); +} diff --git a/template-ts/pwa/manifest.json b/template-ts/pwa/manifest.json new file mode 100644 index 0000000..afa5c6f --- /dev/null +++ b/template-ts/pwa/manifest.json @@ -0,0 +1,33 @@ +{ + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone", + "scope": "/", + "start_url": "/", + "name": "NextJS Template", + "short_name": "NextJS Template", + "description": "This is an example PWA web app for NextJS template", + "categories": ["Example"], + "icons": [ + { + "src": "/favicon-16x16.png", + "sizes": "16x16", + "type": "image/png" + }, + { + "src": "/favicon-32x32.png", + "sizes": "32x32", + "type": "image/png" + }, + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ] +} \ No newline at end of file