├── .eslintignore ├── .prettierrc ├── next.config.js ├── .prettierignore ├── public ├── favicon.ico └── vercel.svg ├── postcss.config.js ├── next-env.d.ts ├── src ├── styles │ └── tailwind.scss └── pages │ ├── _app.tsx │ ├── _document.tsx │ └── index.tsx ├── __tests__ ├── snapshot.tsx ├── index.test.tsx └── __snapshots__ │ └── snapshot.tsx.snap ├── .vscode └── settings.json ├── jest.setup.js ├── .gitignore ├── tailwind.config.js ├── jest.config.js ├── tsconfig.json ├── package.json ├── .eslintrc.json └── README.md /.eslintignore: -------------------------------------------------------------------------------- 1 | **/node_modules/* 2 | **/out/* 3 | **/.next/* 4 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "singleQuote": false 4 | } 5 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | reactStrictMode: true, 3 | } 4 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .next 3 | yarn.lock 4 | package-lock.json 5 | public 6 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agcty/nextjs-advanced-starter/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/basic-features/typescript for more information. 6 | -------------------------------------------------------------------------------- /src/styles/tailwind.scss: -------------------------------------------------------------------------------- 1 | /* purgecss start ignore */ 2 | @tailwind base; 3 | 4 | @tailwind components; 5 | /* purgecss end ignore */ 6 | @tailwind utilities; 7 | 8 | /* purgecss start ignore */ 9 | html { 10 | @apply antialiased; 11 | } 12 | -------------------------------------------------------------------------------- /__tests__/snapshot.tsx: -------------------------------------------------------------------------------- 1 | import { render } from "@testing-library/react" 2 | 3 | import Home from "../src/pages/index" 4 | 5 | it("renders homepage unchanged", () => { 6 | const { container } = render() 7 | expect(container).toMatchSnapshot() 8 | }) 9 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.codeActionsOnSave": { 3 | "source.fixAll.eslint": true, 4 | "source.fixAll": true 5 | }, 6 | "eslint.validate": [ 7 | "javascript", 8 | "javascriptreact", 9 | "typescript", 10 | "typescriptreact" 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /src/pages/_app.tsx: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | 3 | import { AppProps } from "next/app" 4 | import "../styles/tailwind.scss" 5 | 6 | function MyApp({ Component, pageProps }: AppProps): JSX.Element { 7 | return 8 | } 9 | 10 | export default MyApp 11 | -------------------------------------------------------------------------------- /jest.setup.js: -------------------------------------------------------------------------------- 1 | // Optional: configure or set up a testing framework before each test. 2 | // If you delete this file, remove `setupFilesAfterEnv` from `jest.config.js` 3 | 4 | // Used for __tests__/testing-library.js 5 | // Learn more: https://github.com/testing-library/jest-dom 6 | import "@testing-library/jest-dom/extend-expect" 7 | -------------------------------------------------------------------------------- /__tests__/index.test.tsx: -------------------------------------------------------------------------------- 1 | import { render, screen } from "@testing-library/react" 2 | 3 | import Home from "../src/pages/index" 4 | 5 | describe("Home", () => { 6 | it("cta opens github", () => { 7 | render() 8 | 9 | expect(screen.getByText("Copy Template from GitHub")).toHaveAttribute( 10 | "href", 11 | "https://github.com/agcty/nextjs-advanced-starter" 12 | ) 13 | }) 14 | }) 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env.local 29 | .env.development.local 30 | .env.test.local 31 | .env.production.local 32 | 33 | # vercel 34 | .vercel 35 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | const defaultTheme = require("tailwindcss/defaultTheme") 2 | 3 | module.exports = { 4 | content: [ 5 | "./src/pages/**/*.{js,ts,jsx,tsx}", 6 | "./src/components/**/*.{js,ts,jsx,tsx}", 7 | ], 8 | theme: { 9 | extend: { 10 | fontFamily: { 11 | sans: ["Inter", ...defaultTheme.fontFamily.sans], 12 | }, 13 | }, 14 | }, 15 | variants: { 16 | extend: {}, 17 | }, 18 | // eslint-disable-next-line global-require 19 | plugins: [require("@tailwindcss/typography"), require("@tailwindcss/forms")], 20 | } 21 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | const nextJest = require("next/jest") 2 | 3 | const createJestConfig = nextJest({ 4 | // Provide the path to your Next.js app to load next.config.js and .env files in your test environment 5 | dir: "./", 6 | }) 7 | 8 | // Add any custom config to be passed to Jest 9 | const customJestConfig = { 10 | setupFilesAfterEnv: ["/jest.setup.js"], 11 | moduleNameMapper: { 12 | // Handle module aliases (this will be automatically configured for you soon) 13 | "^@/components/(.*)$": "/components/$1", 14 | 15 | "^@/pages/(.*)$": "/pages/$1", 16 | }, 17 | testEnvironment: "jest-environment-jsdom", 18 | } 19 | 20 | // createJestConfig is exported this way to ensure that next/jest can load the Next.js config which is async 21 | module.exports = createJestConfig(customJestConfig) 22 | -------------------------------------------------------------------------------- /src/pages/_document.tsx: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | 3 | import Document, { 4 | Html, 5 | Head, 6 | Main, 7 | NextScript, 8 | DocumentContext, 9 | } from "next/document" 10 | 11 | class MyDocument extends Document { 12 | static async getInitialProps(ctx: DocumentContext) { 13 | const initialProps = await Document.getInitialProps(ctx) 14 | return { ...initialProps } 15 | } 16 | 17 | render() { 18 | return ( 19 | 20 | 21 | 25 | 26 | 27 |
28 | 29 | 30 | 31 | ) 32 | } 33 | } 34 | 35 | export default MyDocument 36 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": [ 5 | "dom", 6 | "dom.iterable", 7 | "esnext" 8 | ], 9 | "allowJs": true, 10 | "skipLibCheck": true, 11 | "strict": false, 12 | "forceConsistentCasingInFileNames": true, 13 | "noEmit": true, 14 | "esModuleInterop": true, 15 | "module": "esnext", 16 | "moduleResolution": "node", 17 | "resolveJsonModule": true, 18 | "isolatedModules": true, 19 | "jsx": "preserve", 20 | "baseUrl": ".", 21 | "paths": { 22 | "@*": [ 23 | "./src/*" 24 | ] 25 | }, 26 | "incremental": true 27 | }, 28 | "exclude": [ 29 | "node_modules", 30 | ".next", 31 | "out" 32 | ], 33 | "include": [ 34 | "next-env.d.ts", 35 | "src/**/*.tsx", 36 | "src/**/*.ts" 37 | ] 38 | } 39 | -------------------------------------------------------------------------------- /public/vercel.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "with-typescript-eslint-jest", 3 | "author": "@agctyz", 4 | "license": "MIT", 5 | "version": "1.1.0", 6 | "scripts": { 7 | "dev": "next dev", 8 | "build": "next build", 9 | "start": "next start", 10 | "type-check": "tsc --pretty --noEmit", 11 | "format": "prettier --write .", 12 | "lint": "eslint src --fix", 13 | "test": "jest", 14 | "test-all": "yarn lint && yarn type-check && yarn test" 15 | }, 16 | "dependencies": { 17 | "next": "12.1.1", 18 | "react": "^18.0.0", 19 | "react-dom": "^18.0.0", 20 | "sass": "^1.49.9" 21 | }, 22 | "devDependencies": { 23 | "@tailwindcss/aspect-ratio": "^0.4.0", 24 | "@tailwindcss/forms": "^0.5.0", 25 | "@tailwindcss/typography": "^0.5.2", 26 | "@testing-library/jest-dom": "^5.16.2", 27 | "@testing-library/react": "^12.1.3", 28 | "@types/jest": "^27.4.1", 29 | "@types/node": "^17.0.21", 30 | "@types/react": "^17.0.39", 31 | "autoprefixer": "^10.4.2", 32 | "eslint": "^8.12.0", 33 | "eslint-config-next": "^12.1.1", 34 | "eslint-config-prettier": "^8.5.0", 35 | "eslint-plugin-prettier": "^4.0.0", 36 | "eslint-plugin-testing-library": "^5.1.0", 37 | "eslint-plugin-unused-imports": "^2.0.0", 38 | "jest": "^27.5.1", 39 | "postcss": "^8.4.12", 40 | "prettier": "^2.6.1", 41 | "prettier-plugin-tailwindcss": "^0.1.8", 42 | "tailwindcss": "^3.0.23", 43 | "typescript": "^4.6.3" 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": ["testing-library", "unused-imports", "prettier"], 3 | "extends": [ 4 | "next/core-web-vitals", 5 | "plugin:prettier/recommended" 6 | ], 7 | "rules": { 8 | "no-unused-vars": "off", 9 | "react/require-default-props": 0, 10 | "unused-imports/no-unused-imports": "error", 11 | "prettier/prettier": "error", 12 | "@typescript-eslint/explicit-module-boundary-types": 0, 13 | "react/jsx-filename-extension": [1, { "extensions": [".ts", ".tsx"] }], 14 | "react/jsx-props-no-spreading": 0, 15 | "jsx-a11y/anchor-is-valid": 0, 16 | "react/react-in-jsx-scope": 0, 17 | "react/display-name": 0, 18 | "react/prop-types": 0, 19 | "@typescript-eslint/explicit-function-return-type": 0, 20 | "@typescript-eslint/explicit-member-accessibility": 0, 21 | "@typescript-eslint/indent": 0, 22 | "@typescript-eslint/member-delimiter-style": 0, 23 | "@typescript-eslint/no-explicit-any": 0, 24 | "@typescript-eslint/no-var-requires": 0, 25 | "no-use-before-define": 0, 26 | "@typescript-eslint/no-use-before-define": 0, 27 | "import/extensions": ["error", "never", { "svg": "always" }], 28 | "react/no-unescaped-entities": 0, 29 | "jsx-a11y/label-has-associated-control": 0, 30 | "react/no-unused-prop-types": 0, 31 | "no-underscore-dangle": 0, 32 | "@typescript-eslint/no-unused-vars": [ 33 | 0, 34 | { 35 | "argsIgnorePattern": "^_" 36 | } 37 | ], 38 | "no-console": [ 39 | 2, 40 | { 41 | "allow": ["warn", "error"] 42 | } 43 | ], 44 | "import/order": [ 45 | "error", 46 | { 47 | "groups": ["builtin", "external", "internal"], 48 | "pathGroups": [ 49 | { 50 | "pattern": "react", 51 | "group": "external", 52 | "position": "before" 53 | } 54 | ], 55 | "pathGroupsExcludedImportTypes": ["react"], 56 | "newlines-between": "always", 57 | "alphabetize": { 58 | "order": "asc", 59 | "caseInsensitive": true 60 | } 61 | } 62 | ] 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/pages/index.tsx: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | 3 | import Head from "next/head" 4 | import Link from "next/link" 5 | 6 | export default function Home() { 7 | return ( 8 |
9 | 10 | Next.js advanced start template. 11 | 12 | 17 | 18 | 19 | 20 | 21 |
22 |
23 |

24 | Next.js 25 |
26 | Advanced Starter 27 |

28 | 29 |

30 | Tailwind CSS 3.0, ESLint & Prettier without a single line of config! 31 | Easily extendable zero-config template for pros and beginners. 32 |

33 | 34 |
35 |
41 |
42 | 43 | 44 | Fast design workflow with 45 | 46 | 47 | 48 | by default 49 | 50 | 51 | 52 | Customizable 53 | 54 | 55 | 56 | with Prettier 57 | 58 | 59 | 60 | Standardized 61 | 62 | 63 | 64 | Ready-to-go setup 65 | 66 | 67 |
68 | 69 |
70 |

Get it 👇

71 | 72 | 73 | 74 | 78 | Copy Template from GitHub 79 | 80 | 81 | 82 |
83 |
84 |

85 | Built by{" "} 86 | 90 | @agctyz 91 | 92 |

93 |
94 |
95 |
96 |
97 | ) 98 | } 99 | 100 | interface FeatureListProps { 101 | children: React.ReactNode 102 | } 103 | 104 | function FeatureList({ children }: FeatureListProps) { 105 | return
    {children}
106 | } 107 | 108 | function Feature({ children, main }) { 109 | return ( 110 |
  • 111 | 112 |

    {children}

    113 | 114 |

    115 | 116 |

    117 |
  • 118 | ) 119 | } 120 | 121 | function InfoText({ text }) { 122 | return ( 123 | 124 | 125 | {text} 126 | 127 | ) 128 | } 129 | 130 | function CheckIcon(props) { 131 | return ( 132 | 133 | 139 | 140 | ) 141 | } 142 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | **Notice**: While Next.js remains a great option, I'd recommend checking out [Remix](https://github.com/remix-run/remix). Since I've started using it, I've been able to build production-ready apps **10 times faster**. No kidding. I don't say this lightly, I used to love Next.js (and still do) and actually tried to convince people that Next is better than Remix for various reasons. But on a mission to become a better developer, I've started looking into other frameworks and keep an open mind. 2023 is an especially exciting year for web developers as more and more edge-native technologies pop up. If you're serious about web development, I'd highly recommend trying other frameworks. 2 | 3 | # Next.js Advanced Starter 🚀 4 | 5 | An opinionated starter skeleton with advanced features for Next.js. 6 | 7 | Use Tailwind CSS, ESLint, Prettier & absolute imports instantly. 8 | Easily extendable zero-config template for pros and beginners. 9 | 10 | Check out the [Demo website.](https://nextjs-advanced-starter.vercel.app/) 11 | 12 | ## Table of Contents 13 | 14 | - [Next.js Advanced Starter 🚀](#nextjs-advanced-starter-) 15 | - [Table of Contents](#table-of-contents) 16 | - [Why?](#why) 17 | - [Features](#features) 18 | - [Who this template is for](#who-this-template-is-for) 19 | - [How to use](#how-to-use) 20 | - [Explanation why some dependencies are in this template](#explanation-why-some-dependencies-are-in-this-template) 21 | - [@tailwindcss/forms](#tailwindcssforms) 22 | - [@tailwindcss/typography](#tailwindcsstypography) 23 | - [Extending the template](#extending-the-template) 24 | - [Config files](#config-files) 25 | - [Changing the font](#changing-the-font) 26 | - [Configuring ESLint rules](#configuring-eslint-rules) 27 | - [Adding new absolute import paths](#adding-new-absolute-import-paths) 28 | - [Recommended extensions for VSCode](#recommended-extensions-for-vscode) 29 | - [Resources](#resources) 30 | 31 | ## Why? 32 | 33 | This template aims to provide a minimal well-thought-out base for building advanced Next.js powered websites. 34 | 35 | It feels like there are so many templates and tutorials about configuring stacks out there that just don't work, no matter what you do. This is the template that **just works**. I know how frustrating it can be just wanting to build something but needing DAYS for coming up with the initial configuration. Especially getting Eslint + Prettier + absolute imports to work (well) together is super annoying and I believe using these features should be as simple as clicking a button. Also you probably want to style your webapp and there are few better ways than styling it with Tailwind CSS. 36 | 37 | The reason why I created this template in the first place is because I absolutely hate having to copy the same config over to a new project everytime and I don't really want to use existing templates because there always seems to be something wrong with them. Either the config is weird or the maintainers are not transparent with features. 38 | 39 | **Inviting you to collaborate** 40 | That being said I invite you to leave your critique about this template. If there's something wrong with ESLint, if prettier doesn't work as expected, if there's a new version of React or if the README is not transparent enough please don't hesitate to open an issue or (even better) a pull request. I've had enough with templates that don't work. 41 | 42 | ## Features 43 | 44 | - Fast design workflow with Tailwind CSS 3.0 45 | - write css like the cool kids 46 | - unused classes are purged automatically = really small css bundle size 47 | - TypeScript 48 | - typed JavaScript 49 | - drastically reduces errors 50 | - #1 must have in any web-dev project 51 | - Customizable ESLint config 52 | - Code formatting with Prettier 53 | - Code is auto-formatted on save 54 | - Inter font 55 | - Nice looking apple-like open source font. 56 | - Don't like it? It's easily [replacable](#changing-the-font) 57 | - Standardized absolute imports 58 | - Import from @components/MyComp instead of ../../components/MyComp 59 | 60 | ## Who this template is for 61 | 62 | **TLDR** This template is for beginners and pros alike. For Pros: You don't have to copy the same config over to a new project. For Beginners: Start coding like the pros without having to configure anything. 63 | 64 | If you're a newcomer to Next.js or React and you just want to start building something, this is a great place to start without worrying about configuring rules, code-formatting, css purging etc. You can figure that out later, just get developing and build things people love. I personally feel like that the features in this template are the way to go for starting a new web-dev project. Especially tailwind css has seen explosive growth and is probably going to be the standard way of styling webapps in the future. This is the minimal base-template I wish I've had when I started developing with React. 65 | 66 | If you're already a pro, this is the base-template for you. It's incredibly easy to extend or reconfigure. It's deliberately kept small so it stays performant while you build on top of it. 67 | 68 | ## How to use 69 | 70 | 1. Click **"Use this Template"** button which will create a new github repo for you automatically 71 | 2. Pull the newly created repo by following the github guide which will be shown after you finish step 1. 72 | 3. Install dependencies and run dev server: 73 | 74 | ```bash 75 | npm install 76 | # or 77 | yarn install 78 | 79 | # then 80 | npm run dev 81 | # or 82 | yarn dev 83 | ``` 84 | 85 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. 86 | 87 | ## Explanation why some dependencies are in this template 88 | 89 | ### @tailwindcss/forms 90 | 91 | First party dependency for resetting input styles so you don't have to manually reset like this: 92 | 93 | ```css 94 | textarea, 95 | input[type="text"], 96 | input[type="search"], 97 | input[type="button"], 98 | input[type="submit"] { 99 | -webkit-appearance: none; 100 | border-radius: 0; 101 | } 102 | ``` 103 | 104 | ### @tailwindcss/typography 105 | 106 | A Tailwind CSS plugin for automatically styling plain HTML content with beautiful typographic defaults. Just add the class "prose" to your html and content will be styled automatically. 107 | 108 | E.g this html: 109 | 110 | ```html 111 |
    112 |

    How to set up an enterprise Next.js stack

    113 |

    114 | Configuring Next.js with TypeScript, ESLint & prettier can become really 115 | annoying, especially if you're a beginner and don't know the intricate 116 | details of all the moving parts in a web-dev environment. The most important 117 | things you have to set up are: 118 |

    119 |
      120 |
    • A working ESLint config
    • 121 |
    • Prettier plugins that auto-format your code
    • 122 |
    • Absolute imports
    • 123 |
    124 |
    125 | ``` 126 | 127 | will be rendered like this: 128 | 129 | ![prose output](https://i.imgur.com/xJD5Ojv.png) 130 | 131 | If you don't need or want this dependency you can safely remove it. 132 | 133 | ## Extending the template 134 | 135 | ### Config files 136 | 137 | | File name | What it does | 138 | | ----------------------- | --------------------------------------------------------------------------------------------------------- | 139 | | `tsconfig.json` | TypeScript configuration. Tells IDE which absolute imports exist and works in conjunction with .babelrc | 140 | | `.eslintrc.json` | Config file for finding and fixing problems in code. E.g: No function should be used before it's defined. | 141 | | `tailwind.config.js` | TailwindCSS config. Adds new sizes, shadows, borders etc. to your tailwind classes. | 142 | | `postcss.config.js` | Tells your project to include TailwindCSS in build chain. | 143 | | `prettier.config.js` | Rules for formatting your code. E.g: indent code 6 spaces instead of 4 | 144 | | `.vscode/settings.json` | Custom settings for your VSCode workspace. Tells VSCode to auto-format code on save. | 145 | 146 | ### Changing the font 147 | 148 | 1. In `src/pages/_app.tsx` replace the link tag with your url (can be Google Fonts, Adobe Typekit, etc.) 149 | 150 | ```html 151 | 155 | ``` 156 | 157 | 2. In tailwind.config.js replace "Inter" with your custom font 158 | 159 | ```javascript 160 | extend: { 161 | fontFamily: { 162 | sans: ["Inter", ...defaultTheme.fontFamily.sans], 163 | } 164 | ``` 165 | 166 | As of Next 10.0.2 google fonts are optimized automatically: 167 | 168 | Tip: The font you choose should have at least these weights: 400, 500, 600, 700, 800. You need these weights for the tailwind font classes to have an effect. E.g if you don't include the weight 500, the class "font-medium" won't have any effect. 169 | 170 | ### Configuring ESLint rules 171 | 172 | If you need additional rules or want to turn off specific rules just edit `.eslintrc.js`. Only change the order of plugins and items in the "extends" array if you know what you're doing as this can have unexpected side effects: Items lower down the list override previous extensions. This is the intended behaviour so you can extend and configure existing rules easily. 173 | 174 | ### Adding new absolute import paths 175 | 176 | This will instruct Next.js to set up a new alias to your specific folder. If you try to import a file with @myalias now it will still throw an error however because we need to tell our IDE that this path actually exists: 177 | 178 | Add path in `.tsconfig` 179 | 180 | ```javascript 181 | "@myalias/*": ["./src/myaliasfolder/*"] 182 | ``` 183 | 184 | That's it! Nextjs 11 now automatically sets up babel and everything else and just works. In previous releases you had to manually configure babel as well. 185 | 186 | ## Recommended extensions for VSCode 187 | 188 | If you're a beginner and don't know which extensions you need, definitely install these: 189 | 190 | 1. [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint): Adds error highlighting to VSCode. 191 | 2. [Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode): Auto-fixes formatting errors everytime you hit save. 192 | 3. [TailwindCSS Intellisense](https://marketplace.visualstudio.com/items?itemName=bradlc.vscode-tailwindcss): Tailwind className suggestions as you type. 193 | 194 | ## Resources 195 | 196 | If you're not yet familiar with some of the technologies used in this project here are some resources to help you get started: 197 | 198 | [Tailwind CSS course](https://tailwindcss.com/course): Free course by the creators of tailwind. Definitely check it out. It helps you "think" in tailwind. E.g before going through this course I styled my webapps by adding classes from the beginning. However, a much better approach is to 1) semantically structure your html without any classes and 2) to then add styling by using tailwind classes. 199 | 200 | [ESLint config guide](https://eslint.org/docs/user-guide/configuring): If you need to configure ESLint read their documentation (or at least the parts you need). You'll be surprised how much just makes sense after that. 201 | -------------------------------------------------------------------------------- /__tests__/__snapshots__/snapshot.tsx.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`renders homepage unchanged 1`] = ` 4 |
    5 |
    6 |
    9 |
    10 |

    13 | Next.js 14 |
    15 | Advanced Starter 16 |

    17 |

    20 | Tailwind CSS 3.0, ESLint & Prettier without a single line of config! Easily extendable zero-config template for pros and beginners. 21 |

    22 |
    25 |
    29 |
    32 |
      35 |
    • 38 | 51 | 74 |

      77 | 80 | 86 | 92 | 93 | Tailwind CSS 94 | 95 |

      96 |
    • 97 |
    • 100 | 113 | 136 |

      139 | 142 | 148 | 154 | 155 | TypeScript 156 | 157 |

      158 |
    • 159 |
    • 162 | 175 | 198 |

      201 | 204 | 210 | 216 | 217 | ESLint config 218 | 219 |

      220 |
    • 221 |
    • 224 | 237 | 260 |

      263 | 266 | 272 | 278 | 279 | Code formatting 280 | 281 |

      282 |
    • 283 |
    • 286 | 299 | 322 |

      325 | 328 | 334 | 340 | 341 | Absolute imports 342 | 343 |

      344 |
    • 345 |
    • 348 | 361 | 385 |

      388 | 391 | 397 | 403 | 404 | Absolute imports 405 | 406 |

      407 |
    • 408 |
    409 |
    410 |
    413 |

    416 | Get it 👇 417 |

    418 | 421 | 426 | Copy Template from GitHub 427 | 428 | 429 |
    430 |
    431 |

    434 | Built by 435 | 436 | 440 | @agctyz 441 | 442 |

    443 |
    444 |
    445 |
    446 |
    447 |
    448 | `; 449 | --------------------------------------------------------------------------------