├── .env.example
├── src
├── app
│ ├── favicon.ico
│ ├── layout.tsx
│ ├── globals.css
│ └── page.tsx
└── lib
│ └── utils.ts
├── .husky
├── commit-msg
└── pre-commit
├── .vscode
├── settings.json
└── extensions.json
├── postcss.config.js
├── lint-staged.config.js
├── next-sitemap.config.js
├── commitlint.config.js
├── env.mjs
├── .github
├── workflows
│ ├── commitlint.yml
│ └── typos.yml
├── dependabot.yml
├── ISSUE_TEMPLATE
│ ├── feature_request.md
│ └── bug_report.md
├── PULL_REQUEST_TEMPLATE.md
├── CONTRIBUTING.md
└── CODE_OF_CONDUCT.md
├── .eslintignore
├── .editorconfig
├── .gitattributes
├── public
├── vercel.svg
└── next.svg
├── next.config.js
├── tsconfig.json
├── LICENSE
├── tailwind.config.js
├── package.json
├── .gitignore
└── README.md
/.env.example:
--------------------------------------------------------------------------------
1 | NEXT_PUBLIC_SITE_URL=http://localhost:3000/
--------------------------------------------------------------------------------
/src/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/natainditama/nevel/HEAD/src/app/favicon.ico
--------------------------------------------------------------------------------
/.husky/commit-msg:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 | . "$(dirname -- "$0")/_/husky.sh"
3 |
4 | npx --no -- commitlint --edit ${1}
5 |
--------------------------------------------------------------------------------
/.husky/pre-commit:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 | . "$(dirname -- "$0")/_/husky.sh"
3 |
4 | npx lint-staged --concurrent false
5 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "editor.formatOnPaste": true,
3 | "editor.defaultFormatter": "esbenp.prettier-vscode"
4 | }
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/lint-staged.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | "*.{js,jsx,ts,tsx}": ["eslint"],
3 | "*.{json,yaml}": ["prettier --write"],
4 | };
5 |
--------------------------------------------------------------------------------
/next-sitemap.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('next-sitemap').IConfig} */
2 | module.exports = {
3 | siteUrl: process.env.NEXT_PUBLIC_SITE_URL,
4 | generateRobotsTxt: true,
5 | }
--------------------------------------------------------------------------------
/commitlint.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | extends: ["@commitlint/config-conventional"],
3 | rules: {
4 | "subject-case": [1, "always", "sentence-case"],
5 | },
6 | };
7 |
--------------------------------------------------------------------------------
/src/lib/utils.ts:
--------------------------------------------------------------------------------
1 | import { ClassValue, clsx } from "clsx";
2 | import { twMerge } from "tailwind-merge";
3 |
4 | export function cn(...inputs: ClassValue[]) {
5 | return twMerge(clsx(inputs));
6 | }
7 |
--------------------------------------------------------------------------------
/env.mjs:
--------------------------------------------------------------------------------
1 | import { createEnv } from "@t3-oss/env-nextjs";
2 | import { z } from "zod";
3 |
4 | export const env = createEnv({
5 | client: {
6 | NEXT_PUBLIC_SITE_URL: z.string().min(1),
7 | },
8 | });
9 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": [
3 | "bradlc.vscode-tailwindcss",
4 | "esbenp.prettier-vscode",
5 | "dbaeumer.vscode-eslint",
6 | "stylelint.vscode-stylelint",
7 | "christian-kohler.path-intellisense"
8 | ]
9 | }
--------------------------------------------------------------------------------
/.github/workflows/commitlint.yml:
--------------------------------------------------------------------------------
1 | name: Lint Commit Messages
2 | on: [pull_request]
3 |
4 | jobs:
5 | commitlint:
6 | runs-on: ubuntu-latest
7 | steps:
8 | - uses: actions/checkout@v4
9 | with:
10 | fetch-depth: 0
11 | - uses: wagoid/commitlint-github-action@v5
--------------------------------------------------------------------------------
/.github/workflows/typos.yml:
--------------------------------------------------------------------------------
1 | name: Spell Check
2 | on:
3 | pull_request:
4 | push:
5 | branches:
6 | - "main"
7 | jobs:
8 | typos:
9 | name: Spell Check with Typos
10 | runs-on: ubuntu-latest
11 | steps:
12 | - name: Checkout Actions Repository
13 | uses: actions/checkout@v4
14 | - name: Check spelling
15 | uses: crate-ci/typos@master
16 |
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # For more information about the properties used in
2 | # this file, please see the EditorConfig documentation:
3 | # https://editorconfig.org/
4 |
5 | root = true
6 |
7 | [*]
8 | charset = utf-8
9 | end_of_line = lf
10 | indent_size = 2
11 | indent_style = space
12 | insert_final_newline = true
13 | trim_trailing_whitespace = true
14 |
15 | [*.md]
16 | trim_trailing_whitespace = false
17 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | version: 2
2 | updates:
3 | - package-ecosystem: npm
4 | directory: "/"
5 | schedule:
6 | interval: monthly
7 | versioning-strategy: increase
8 | - package-ecosystem: npm
9 | directory: "/src/"
10 | schedule:
11 | interval: monthly
12 | versioning-strategy: increase
13 | - package-ecosystem: github-actions
14 | directory: "/"
15 | schedule:
16 | interval: monthly
17 |
--------------------------------------------------------------------------------
/src/app/layout.tsx:
--------------------------------------------------------------------------------
1 | import "./globals.css";
2 |
3 | import { Inter } from "next/font/google";
4 |
5 | const inter = Inter({ subsets: ["latin"] });
6 |
7 | export const metadata = {
8 | title: "Create Next App",
9 | description: "Generated by create next app",
10 | };
11 |
12 | export default function RootLayout({
13 | children,
14 | }: {
15 | children: React.ReactNode;
16 | }) {
17 | return (
18 |
19 |
{children}
20 |
21 | );
22 | }
23 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Set default behavior for text files
2 | * text=auto
3 |
4 | # Ignore line endings for specific file types
5 | .* text eol=lf
6 | *.css text eol=lf
7 | *.html text eol=lf
8 | *.js text eol=lf
9 | *.json text eol=lf
10 | *.md text eol=lf
11 | *.sh text eol=lf
12 | *.txt text eol=lf
13 | *.xml text eol=lf
14 |
15 | # Ignore file mode changes
16 | * -text
17 |
18 | # Ignore binary files
19 | *.png binary
20 | *.jpg binary
21 | *.gif binary
22 |
23 | # Specify Git merge strategy for specific files
24 | *.csv merge=union
25 | *.json merge=union
26 |
--------------------------------------------------------------------------------
/public/vercel.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/next.config.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable @typescript-eslint/no-var-requires */
2 | const withBundleAnalyzer = require("@next/bundle-analyzer");
3 | const withTM = require("next-transpile-modules");
4 |
5 | /** @type {import('next').NextConfig} */
6 | const nextConfig = {
7 | reactStrictMode: false,
8 | swcMinify: true,
9 | images: {
10 | formats: ["image/avif", "image/webp"],
11 | },
12 | experimental: {},
13 | };
14 |
15 | const nextPlugins = [
16 | withBundleAnalyzer({ enabled: process.env.ANALYZE === "true" }),
17 | withTM([]),
18 | ];
19 |
20 | module.exports = (_phase, { defaultConfig: _ }) => {
21 | return nextPlugins.reduce((acc, plugin) => plugin(acc), { ...nextConfig });
22 | };
23 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: Suggest an idea for this project
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Is your feature request related to a problem? Please describe.**
11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12 |
13 | **Describe the solution you'd like**
14 | A clear and concise description of what you want to happen.
15 |
16 | **Describe alternatives you've considered**
17 | A clear and concise description of any alternative solutions or features you've considered.
18 |
19 | **Additional context**
20 | Add any other context or screenshots about the feature request here.
21 |
--------------------------------------------------------------------------------
/src/app/globals.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 | :root {
6 | --foreground-rgb: 0, 0, 0;
7 | --background-start-rgb: 214, 219, 220;
8 | --background-end-rgb: 255, 255, 255;
9 | --color-primary: 186, 230, 253;
10 | }
11 |
12 | @media (prefers-color-scheme: dark) {
13 | :root {
14 | --foreground-rgb: 255, 255, 255;
15 | --background-start-rgb: 0, 0, 0;
16 | --background-end-rgb: 0, 0, 0;
17 | --color-primary: 1, 65, 255;
18 | }
19 | }
20 |
21 | body {
22 | color: rgb(var(--foreground-rgb));
23 | background: linear-gradient(
24 | to bottom,
25 | transparent,
26 | rgb(var(--background-end-rgb))
27 | )
28 | rgb(var(--background-start-rgb));
29 | }
30 |
--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
1 | ## 🔗 Related Issue(s)
2 | If this pull request is related to any existing issues, please reference them here using the syntax `Fixes #issue_number`.
3 |
4 | ## 🔄 Type of Changes
5 | Please indicate the type of changes made in this pull request by putting an 'x' in the relevant checkboxes:
6 |
7 | - [ ] Bug fix
8 | - [ ] New feature
9 | - [ ] Documentation update
10 | - [ ] Code refactoring
11 | - [ ] Performance improvement
12 |
13 | ## ✅ Checklist
14 | Please review and check the following items before submitting the pull request:
15 |
16 | - [ ] Code follows project's style and conventions.
17 | - [ ] Existing tests pass successfully.
18 | - [ ] New tests added (if applicable).
19 | - [ ] Documentation updated (if necessary).
20 | - [ ] Pull request title is clear and descriptive.
21 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es5",
4 | "lib": ["dom", "dom.iterable", "esnext"],
5 | "allowJs": true,
6 | "skipLibCheck": true,
7 | "strict": true,
8 | "noEmit": true,
9 | "esModuleInterop": true,
10 | "module": "esnext",
11 | "moduleResolution": "bundler",
12 | "resolveJsonModule": true,
13 | "isolatedModules": true,
14 | "jsx": "preserve",
15 | "incremental": true,
16 | /* Linting */
17 | "noImplicitAny": true,
18 | "noImplicitReturns": true,
19 | "noImplicitThis": true,
20 | "noUnusedLocals": true,
21 | "noUnusedParameters": true,
22 | "allowUnreachableCode": false,
23 | "noFallthroughCasesInSwitch": true,
24 | "plugins": [
25 | {
26 | "name": "next"
27 | }
28 | ],
29 | "paths": {
30 | "@/*": ["./*"]
31 | }
32 | },
33 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
34 | "exclude": ["node_modules"]
35 | }
36 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help us improve
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Describe the bug**
11 | A clear and concise description of what the bug is.
12 |
13 | **To Reproduce**
14 | Steps to reproduce the behavior:
15 | 1. Go to '...'
16 | 2. Click on '....'
17 | 3. Scroll down to '....'
18 | 4. See error
19 |
20 | **Expected behavior**
21 | A clear and concise description of what you expected to happen.
22 |
23 | **Screenshots**
24 | If applicable, add screenshots to help explain your problem.
25 |
26 | **Desktop (please complete the following information):**
27 | - OS: [e.g. iOS]
28 | - Browser [e.g. chrome, safari]
29 | - Version [e.g. 22]
30 |
31 | **Smartphone (please complete the following information):**
32 | - Device: [e.g. iPhone6]
33 | - OS: [e.g. iOS8.1]
34 | - Browser [e.g. stock browser, safari]
35 | - Version [e.g. 22]
36 |
37 | **Additional context**
38 | Add any other context about the problem here.
39 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 Nata Inditama
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable @typescript-eslint/no-var-requires */
2 | const defaultTheme = require("tailwindcss/defaultTheme");
3 | const colors = require("tailwindcss/colors");
4 |
5 | /** @type {import('tailwindcss').Config} */
6 | module.exports = {
7 | content: [
8 | './src/pages/**/*.{js,ts,jsx,tsx,mdx}',
9 | './src/components/**/*.{js,ts,jsx,tsx,mdx}',
10 | './src/app/**/*.{js,ts,jsx,tsx,mdx}',
11 | ],
12 | theme: {
13 | fontFamily: {
14 | sans: ["var(--font-body)", ...defaultTheme.fontFamily.sans],
15 | },
16 | colors: {
17 | primary: colors.blue,
18 | dark: colors.neutral[900],
19 | light: colors.neutral[50],
20 | ...colors,
21 | },
22 | container: {
23 | center: true,
24 | padding: {
25 | DEFAULT: "1rem",
26 | sm: "2rem",
27 | lg: "4rem",
28 | xl: "5rem",
29 | "2xl": "6rem",
30 | },
31 | },
32 | extend: {
33 | backgroundImage: {
34 | 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))',
35 | 'gradient-conic':
36 | 'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))',
37 | },
38 | },
39 | },
40 | plugins: [],
41 | };
42 |
--------------------------------------------------------------------------------
/public/next.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.github/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contribution Guidelines
2 |
3 | Thank you for your interest in contributing to the projects! We appreciate your support and collaboration. To ensure a smooth and effective contribution process, please follow these guidelines:
4 |
5 | ## 📚 Questions and Discussions
6 |
7 | If you have any questions or want to engage in project-related discussions, please use the designated channels, such as forums or community platforms.
8 |
9 | ## 🐛 Bug Reports
10 |
11 | If you come across any bugs or issues, we encourage you to submit a detailed bug report using the issue tracker. Include relevant information like version details, steps to reproduce, and error messages or logs, if applicable.
12 |
13 | ## 💡 Feature Requests
14 |
15 | We welcome and value your ideas for new features. To propose a feature, create an issue with clear specifications and use cases. It's helpful to discuss the potential impact and benefits of the feature as well.
16 |
17 | ## 💻 Code Contributions
18 |
19 | Contributing code is a great way to improve the project. Follow these steps to contribute:
20 |
21 | 1. Fork the repository to your own GitHub account.
22 | 2. Create a new branch with a descriptive name for your changes.
23 | 3. Implement your changes, following the project's coding conventions and best practices.
24 | 4. Thoroughly test your changes to ensure they work as intended.
25 | 5. Commit your changes and push them to your branch in the forked repository.
26 | 6. Open a pull request from your branch to the original repository's main branch.
27 | 7. Provide a clear and concise description of your changes in the pull request, including any relevant context or motivation.
28 |
29 | ## 🎨 Style and Best Practices
30 |
31 | Maintain consistency by adhering to the project's coding style and conventions. If there are any provided style guides or documentation, make sure to consult them for specific guidelines.
32 |
33 | ## 📝 Documentation
34 |
35 | Improvements to the project's documentation are highly appreciated. Feel free to update the README file, add usage examples, or enhance any other relevant documentation.
36 |
37 | ## ⚠️ Licensing
38 |
39 | By contributing to the project, you agree to license your contributions under the project's specified license.
40 |
41 | ## 🙏 Acknowledgements
42 |
43 | We would like to express our gratitude to all contributors for their valuable contributions to this project. Your efforts are greatly appreciated!
44 |
45 | ## 🤝 Contact
46 |
47 | If you have any inquiries, suggestions, or additional contributions, you can reach out to us via the following channels:
48 |
49 | - [Email](mailto:natainditama.dev@gmail.com)
50 | - [LinkedIn](https://www.linkedin.com/in/natainditama)
51 | - [GitHub](https://github.com/natainditama)
52 |
53 | Thank you for your support, interest, feedback, and contributions! Together, we can make this project even better. Happy coding! 😊
54 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nevel",
3 | "version": "0.1.0",
4 | "private": true,
5 | "description": "Minimalist boilerplate for Next with Tailwind CSS",
6 | "homepage": "https://nevel.pages.dev/",
7 | "bugs": {
8 | "url": "https://github.com/natainditama/nevel/issues",
9 | "email": "natainditama.dev@gmail.com"
10 | },
11 | "repository": {
12 | "type": "git",
13 | "url": "https://github.com/natainditama/nevel"
14 | },
15 | "license": "MIT",
16 | "author": {
17 | "name": "natainditama",
18 | "email": "natainditama.dev@gmail.com",
19 | "url": "https://github.com/natainditama/"
20 | },
21 | "scripts": {
22 | "analyze": "cross-env ANALYZE=true next build",
23 | "build": "next build",
24 | "postbuild": "next-sitemap",
25 | "dev": "next dev",
26 | "format": "prettier -w \"src/*/*.{tsx,ts,js,jsx,css}\"",
27 | "lint": "next lint",
28 | "prepare": "husky install",
29 | "start": "next start",
30 | "tsc": "tsc --pretty --noEmit"
31 | },
32 | "dependencies": {
33 | "@t3-oss/env-nextjs": "^0.7.1",
34 | "clsx": "^2.0.0",
35 | "next": "^14.0.1",
36 | "react": "^18.2.0",
37 | "react-dom": "^18.2.0",
38 | "tailwind-merge": "^2.0.0",
39 | "zod": "^3.22.4"
40 | },
41 | "devDependencies": {
42 | "@commitlint/cli": "^18.2.0",
43 | "@commitlint/config-conventional": "^18.1.0",
44 | "@next/bundle-analyzer": "^14.0.1",
45 | "@types/node": "^20.8.10",
46 | "@types/react": "18.2.14",
47 | "@types/react-dom": "18.2.6",
48 | "@typescript-eslint/eslint-plugin": "^6.9.1",
49 | "@typescript-eslint/parser": "^6.9.1",
50 | "autoprefixer": "10.4.14",
51 | "cross-env": "^7.0.3",
52 | "eslint": "^8.52.0",
53 | "eslint-config-next": "^14.0.1",
54 | "eslint-config-prettier": "^9.0.0",
55 | "eslint-plugin-import": "^2.29.0",
56 | "eslint-plugin-jsx-a11y": "^6.7.1",
57 | "eslint-plugin-prettier": "^5.0.1",
58 | "eslint-plugin-react": "^7.33.2",
59 | "eslint-plugin-react-hooks": "^4.6.0",
60 | "eslint-plugin-simple-import-sort": "^10.0.0",
61 | "eslint-plugin-tailwindcss": "^3.13.0",
62 | "husky": "^8.0.3",
63 | "lint-staged": "^15.0.2",
64 | "next-sitemap": "^4.1.8",
65 | "next-transpile-modules": "^9.0.0",
66 | "postcss": "^8.4.31",
67 | "prettier": "^3.0.3",
68 | "prettier-plugin-tailwindcss": "^0.3.0",
69 | "tailwindcss": "^3.3.5",
70 | "typescript": "5.1.6"
71 | },
72 | "engines": {
73 | "node": ">18",
74 | "yarn": "1.x"
75 | },
76 | "prettier": {
77 | "semi": true,
78 | "singleQuote": false,
79 | "arrowParens": "always",
80 | "tabWidth": 2,
81 | "printWidth": 80,
82 | "trailingComma": "all",
83 | "endOfLine": "auto"
84 | },
85 | "eslintConfig": {
86 | "env": {
87 | "es6": true,
88 | "browser": true,
89 | "node": true
90 | },
91 | "extends": [
92 | "eslint:recommended",
93 | "plugin:import/recommended",
94 | "plugin:import/typescript",
95 | "plugin:react/recommended",
96 | "plugin:@typescript-eslint/recommended",
97 | "plugin:@typescript-eslint/eslint-recommended",
98 | "prettier",
99 | "plugin:prettier/recommended",
100 | "plugin:@next/next/recommended",
101 | "next/core-web-vitals"
102 | ],
103 | "parser": "@typescript-eslint/parser",
104 | "parserOptions": {
105 | "ecmaVersion": "latest",
106 | "sourceType": "module"
107 | },
108 | "plugins": [
109 | "react",
110 | "react-hooks",
111 | "tailwindcss",
112 | "simple-import-sort",
113 | "@typescript-eslint"
114 | ],
115 | "settings": {
116 | "react": {
117 | "version": "detect"
118 | }
119 | },
120 | "rules": {
121 | "react/prop-types": "off",
122 | "react/react-in-jsx-scope": "off",
123 | "@typescript-eslint/no-unused-vars": "warn",
124 | "@typescript-eslint/explicit-function-return-type": "off",
125 | "@typescript-eslint/ban-ts-comment": "off",
126 | "@typescript-eslint/no-explicit-any": "off",
127 | "import/no-unresolved": "off",
128 | "simple-import-sort/imports": "warn",
129 | "simple-import-sort/exports": "warn",
130 | "no-console": [
131 | "warn",
132 | {
133 | "allow": [
134 | "warn",
135 | "error"
136 | ]
137 | }
138 | ],
139 | "prettier/prettier": [
140 | "off",
141 | {
142 | "endOfLine": "auto"
143 | }
144 | ]
145 | }
146 | }
147 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Created by https://www.toptal.com/developers/gitignore/api/yarn,nextjs,node,visualstudiocode,git
2 | # Edit at https://www.toptal.com/developers/gitignore?templates=yarn,nextjs,node,visualstudiocode,git
3 |
4 | ### Git ###
5 | # Created by git for backups. To disable backups in Git:
6 | # $ git config --global mergetool.keepBackup false
7 | *.orig
8 |
9 | # Created by git when using merge tools for conflicts
10 | *.BACKUP.*
11 | *.BASE.*
12 | *.LOCAL.*
13 | *.REMOTE.*
14 | *_BACKUP_*.txt
15 | *_BASE_*.txt
16 | *_LOCAL_*.txt
17 | *_REMOTE_*.txt
18 |
19 | ### NextJS ###
20 | # dependencies
21 | /node_modules
22 | /.pnp
23 | .pnp.js
24 |
25 | # testing
26 | /coverage
27 |
28 | # next.js
29 | /.next/
30 | /out/
31 |
32 | # production
33 | /build
34 |
35 | # misc
36 | .DS_Store
37 | *.pem
38 |
39 | # debug
40 | npm-debug.log*
41 | yarn-debug.log*
42 | yarn-error.log*
43 | .pnpm-debug.log*
44 |
45 | # local env files
46 | .env*.local
47 |
48 | # vercel
49 | .vercel
50 |
51 | # typescript
52 | *.tsbuildinfo
53 | next-env.d.ts
54 |
55 | ### Node ###
56 | # Logs
57 | logs
58 | *.log
59 | lerna-debug.log*
60 |
61 | # Diagnostic reports (https://nodejs.org/api/report.html)
62 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
63 |
64 | # Runtime data
65 | pids
66 | *.pid
67 | *.seed
68 | *.pid.lock
69 |
70 | # Directory for instrumented libs generated by jscoverage/JSCover
71 | lib-cov
72 |
73 | # Coverage directory used by tools like istanbul
74 | coverage
75 | *.lcov
76 |
77 | # nyc test coverage
78 | .nyc_output
79 |
80 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
81 | .grunt
82 |
83 | # Bower dependency directory (https://bower.io/)
84 | bower_components
85 |
86 | # node-waf configuration
87 | .lock-wscript
88 |
89 | # Compiled binary addons (https://nodejs.org/api/addons.html)
90 | build/Release
91 |
92 | # Dependency directories
93 | node_modules/
94 | jspm_packages/
95 |
96 | # Snowpack dependency directory (https://snowpack.dev/)
97 | web_modules/
98 |
99 | # TypeScript cache
100 |
101 | # Optional npm cache directory
102 | .npm
103 |
104 | # Optional eslint cache
105 | .eslintcache
106 |
107 | # Optional stylelint cache
108 | .stylelintcache
109 |
110 | # Microbundle cache
111 | .rpt2_cache/
112 | .rts2_cache_cjs/
113 | .rts2_cache_es/
114 | .rts2_cache_umd/
115 |
116 | # Optional REPL history
117 | .node_repl_history
118 |
119 | # Output of 'npm pack'
120 | *.tgz
121 |
122 | # Yarn Integrity file
123 | .yarn-integrity
124 |
125 | # dotenv environment variable files
126 | .env
127 | .env.development.local
128 | .env.test.local
129 | .env.production.local
130 | .env.local
131 |
132 | # parcel-bundler cache (https://parceljs.org/)
133 | .cache
134 | .parcel-cache
135 |
136 | # Next.js build output
137 | .next
138 | out
139 |
140 | # Nuxt.js build / generate output
141 | .nuxt
142 | dist
143 |
144 | # Gatsby files
145 | .cache/
146 | # Comment in the public line in if your project uses Gatsby and not Next.js
147 | # https://nextjs.org/blog/next-9-1#public-directory-support
148 | # public
149 |
150 | # vuepress build output
151 | .vuepress/dist
152 |
153 | # vuepress v2.x temp and cache directory
154 | .temp
155 |
156 | # Docusaurus cache and generated files
157 | .docusaurus
158 |
159 | # Serverless directories
160 | .serverless/
161 |
162 | # FuseBox cache
163 | .fusebox/
164 |
165 | # DynamoDB Local files
166 | .dynamodb/
167 |
168 | # TernJS port file
169 | .tern-port
170 |
171 | # Stores VSCode versions used for testing VSCode extensions
172 | .vscode-test
173 |
174 | # yarn v2
175 | .yarn/cache
176 | .yarn/unplugged
177 | .yarn/build-state.yml
178 | .yarn/install-state.gz
179 | .pnp.*
180 |
181 | ### Node Patch ###
182 | # Serverless Webpack directories
183 | .webpack/
184 |
185 | # Optional stylelint cache
186 |
187 | # SvelteKit build / generate output
188 | .svelte-kit
189 |
190 | ### VisualStudioCode ###
191 | .vscode/*
192 | !.vscode/settings.json
193 | !.vscode/tasks.json
194 | !.vscode/launch.json
195 | !.vscode/extensions.json
196 | !.vscode/*.code-snippets
197 |
198 | # Local History for Visual Studio Code
199 | .history/
200 |
201 | # Built Visual Studio Code Extensions
202 | *.vsix
203 |
204 | ### VisualStudioCode Patch ###
205 | # Ignore all local history of files
206 | .history
207 | .ionide
208 |
209 | ### yarn ###
210 | # https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored
211 |
212 | .yarn/*
213 | !.yarn/releases
214 | !.yarn/patches
215 | !.yarn/plugins
216 | !.yarn/sdks
217 | !.yarn/versions
218 |
219 | # if you are NOT using Zero-installs, then:
220 | # comment the following lines
221 | !.yarn/cache
222 |
223 | # and uncomment the following lines
224 | # .pnp.*
225 |
226 | # End of https://www.toptal.com/developers/gitignore/api/yarn,nextjs,node,visualstudiocode,git
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 | ## 📝 About the Project
51 |
52 |
53 | ### 🌟 Features
54 |
55 | This project includes the following features:
56 |
57 | - Linter with [ESLint](https://eslint.org)
58 | - Code Formatter with [Prettier](https://prettier.io/)
59 | - Integrate with [TailwindCSS](https://tailwindcss.com/)
60 | - [Next.js](https://nextjs.org) for Static Site Generator
61 | - Type checking [TypeScript](https://www.typescriptlang.org/)
62 | - Sitemap.xml and robots.txt with [next-sitemap](https://www.npmjs.com/package/next-sitemap)
63 |
64 |
65 | ### 🎨 Color Reference
66 |
67 | | Color | Hex |
68 | | ----------------- | ------------------------------------------------------------------ |
69 | | Primary Color |  #000000 |
70 | | Secondary Color |  #e4e4e7 |
71 | | Background Color |  #ffffff |
72 | | Text Color |  #000000 |
73 |
74 |
75 | ### 🔑 Environment Variables
76 |
77 | This project requires the following configuration:
78 |
79 | - `NEXT_PUBLIC_SITE_URL` : The public URL of the project's
80 |
81 |
82 | ## 🚀 Getting Started
83 |
84 |
85 | ### 🔧 Prerequisites
86 |
87 | Prerequisites for this project:
88 |
89 | - [Nodejs](https://nodejs.org)
90 | - [Yarn](https://yarnpkg.com/)
91 |
92 |
93 | ### 🏃 Run Locally
94 |
95 | Clone the project
96 |
97 | ```bash
98 | git clone https://github.com/natainditama/nevel.git
99 | ```
100 |
101 | Go to the project directory
102 |
103 | ```bash
104 | cd nevel
105 | ```
106 |
107 | Install dependencies
108 |
109 | ```bash
110 | yarn install
111 | ```
112 |
113 | Start the local server
114 |
115 | ```bash
116 | yarn run dev
117 | ```
118 |
119 |
120 | ## 👋 Contributing
121 |
122 |
123 |
124 |
125 |
126 | Contributions are always welcome!
127 |
128 | See [contributing.md](https://github.com/natainditama/nevel/blob/main/.github/CONTRIBUTING.md) for ways to get started.
129 |
130 |
131 | ### 📜 Code of Conduct
132 |
133 | Please read the [Code of Conduct](https://github.com/natainditama/nevel/blob/main/.github/CODE_OF_CONDUCT.md)
134 |
135 |
136 | ## ⚠️ License
137 |
138 | This project is licensed under the MIT License. See the [LICENSE](https://github.com/natainditama/nevel/blob/main/LICENSE) file for details
139 |
140 |
141 | ## 🤝 Contact
142 |
143 | Contact me for inquiries, suggestions, or contributions via the following channels:
144 |
145 | - [Email](mailto:natainditama.dev@gmail.com)
146 | - [LinkedIn](https://www.linkedin.com/in/natainditama)
147 | - [GitHub](https://github.com/natainditama)
148 |
149 | Thank you for your support, interest, feedback, and contributions!
150 |
--------------------------------------------------------------------------------
/.github/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | # Contributor Covenant Code of Conduct
2 |
3 | ## Our Pledge
4 |
5 | We as members, contributors, and leaders pledge to make participation in our
6 | community a harassment-free experience for everyone, regardless of age, body
7 | size, visible or invisible disability, ethnicity, sex characteristics, gender
8 | identity and expression, level of experience, education, socio-economic status,
9 | nationality, personal appearance, race, religion, or sexual identity
10 | and orientation.
11 |
12 | We pledge to act and interact in ways that contribute to an open, welcoming,
13 | diverse, inclusive, and healthy community.
14 |
15 | ## Our Standards
16 |
17 | Examples of behavior that contributes to a positive environment for our
18 | community include:
19 |
20 | * Demonstrating empathy and kindness toward other people
21 | * Being respectful of differing opinions, viewpoints, and experiences
22 | * Giving and gracefully accepting constructive feedback
23 | * Accepting responsibility and apologizing to those affected by our mistakes,
24 | and learning from the experience
25 | * Focusing on what is best not just for us as individuals, but for the
26 | overall community
27 |
28 | Examples of unacceptable behavior include:
29 |
30 | * The use of sexualized language or imagery, and sexual attention or
31 | advances of any kind
32 | * Trolling, insulting or derogatory comments, and personal or political attacks
33 | * Public or private harassment
34 | * Publishing others' private information, such as a physical or email
35 | address, without their explicit permission
36 | * Other conduct which could reasonably be considered inappropriate in a
37 | professional setting
38 |
39 | ## Enforcement Responsibilities
40 |
41 | Community leaders are responsible for clarifying and enforcing our standards of
42 | acceptable behavior and will take appropriate and fair corrective action in
43 | response to any behavior that they deem inappropriate, threatening, offensive,
44 | or harmful.
45 |
46 | Community leaders have the right and responsibility to remove, edit, or reject
47 | comments, commits, code, wiki edits, issues, and other contributions that are
48 | not aligned to this Code of Conduct, and will communicate reasons for moderation
49 | decisions when appropriate.
50 |
51 | ## Scope
52 |
53 | This Code of Conduct applies within all community spaces, and also applies when
54 | an individual is officially representing the community in public spaces.
55 | Examples of representing our community include using an official e-mail address,
56 | posting via an official social media account, or acting as an appointed
57 | representative at an online or offline event.
58 |
59 | ## Enforcement
60 |
61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be
62 | reported to the community leaders responsible for enforcement at
63 | natainditama.dev@gmail.com.
64 | All complaints will be reviewed and investigated promptly and fairly.
65 |
66 | All community leaders are obligated to respect the privacy and security of the
67 | reporter of any incident.
68 |
69 | ## Enforcement Guidelines
70 |
71 | Community leaders will follow these Community Impact Guidelines in determining
72 | the consequences for any action they deem in violation of this Code of Conduct:
73 |
74 | ### 1. Correction
75 |
76 | **Community Impact**: Use of inappropriate language or other behavior deemed
77 | unprofessional or unwelcome in the community.
78 |
79 | **Consequence**: A private, written warning from community leaders, providing
80 | clarity around the nature of the violation and an explanation of why the
81 | behavior was inappropriate. A public apology may be requested.
82 |
83 | ### 2. Warning
84 |
85 | **Community Impact**: A violation through a single incident or series
86 | of actions.
87 |
88 | **Consequence**: A warning with consequences for continued behavior. No
89 | interaction with the people involved, including unsolicited interaction with
90 | those enforcing the Code of Conduct, for a specified period of time. This
91 | includes avoiding interactions in community spaces as well as external channels
92 | like social media. Violating these terms may lead to a temporary or
93 | permanent ban.
94 |
95 | ### 3. Temporary Ban
96 |
97 | **Community Impact**: A serious violation of community standards, including
98 | sustained inappropriate behavior.
99 |
100 | **Consequence**: A temporary ban from any sort of interaction or public
101 | communication with the community for a specified period of time. No public or
102 | private interaction with the people involved, including unsolicited interaction
103 | with those enforcing the Code of Conduct, is allowed during this period.
104 | Violating these terms may lead to a permanent ban.
105 |
106 | ### 4. Permanent Ban
107 |
108 | **Community Impact**: Demonstrating a pattern of violation of community
109 | standards, including sustained inappropriate behavior, harassment of an
110 | individual, or aggression toward or disparagement of classes of individuals.
111 |
112 | **Consequence**: A permanent ban from any sort of public interaction within
113 | the community.
114 |
115 | ## Attribution
116 |
117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118 | version 2.0, available at
119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
120 |
121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct
122 | enforcement ladder](https://github.com/mozilla/diversity).
123 |
124 | [homepage]: https://www.contributor-covenant.org
125 |
126 | For answers to common questions about this code of conduct, see the FAQ at
127 | https://www.contributor-covenant.org/faq. Translations are available at
128 | https://www.contributor-covenant.org/translations.
129 |
--------------------------------------------------------------------------------
/src/app/page.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import Image from "next/image";
3 | import { useEffect, useRef } from "react";
4 |
5 | export default function Home() {
6 | const mainRef = useRef(null);
7 |
8 | useEffect(() => {
9 | const updateMousePosition = (ev: MouseEvent) => {
10 | if (!mainRef.current) return;
11 | const { clientX, clientY } = ev;
12 | mainRef.current.style.setProperty("--x", `${clientX}px`);
13 | mainRef.current.style.setProperty("--y", `${clientY}px`);
14 | };
15 |
16 | window.addEventListener("mousemove", updateMousePosition);
17 |
18 | return () => {
19 | window.removeEventListener("mousemove", updateMousePosition);
20 | };
21 | }, []);
22 |
23 | return (
24 |
28 |
29 |
30 | Get started by editing
31 | src/app/page.tsx
32 |
33 |
51 |
52 |
53 |
54 |
62 |
63 |
64 |
133 |
134 | );
135 | }
136 |
--------------------------------------------------------------------------------