diff --git a/.dockerignore b/.dockerignore
index 833c23a..ce9b5e5 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -1,13 +1,13 @@
-.dockerignore
-
-.git
-
-.next
-
-Dockerfile
-
-node_modules
-
-npm-debug.log
-
-README.md
+.dockerignore
+
+.git
+
+.next
+
+Dockerfile
+
+node_modules
+
+npm-debug.log
+
+README.md
\ No newline at end of file
diff --git a/.editorconfig b/.editorconfig
index 88bf97c..2d4b6f5 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -1,12 +1,12 @@
-# EditorConfig is awesome: https://EditorConfig.org
-
-# top-most EditorConfig file
-root = true
-
-[*]
-indent_style = space
-indent_size = 2
-end_of_line = crlf
-charset = utf-8
-trim_trailing_whitespace = false
+# EditorConfig is awesome: https://EditorConfig.org
+
+# top-most EditorConfig file
+root = true
+
+[*]
+indent_style = space
+indent_size = 2
+end_of_line = crlf
+charset = utf-8
+trim_trailing_whitespace = false
insert_final_newline = false
\ No newline at end of file
diff --git a/.eslintignore b/.eslintignore
index 719c5af..f82b9c5 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -1,3 +1,371 @@
-node_modules
-.next
-coverage
\ No newline at end of file
+# Created by https://www.toptal.com/developers/gitignore/api/nextjs,vercel,react,sublimetext,visualstudiocode,node,yarn,bower,macos,powershell,windows,linux,vim,dotenv,typings
+# Edit at https://www.toptal.com/developers/gitignore?templates=nextjs,vercel,react,sublimetext,visualstudiocode,node,yarn,bower,macos,powershell,windows,linux,vim,dotenv,typings
+
+### Bower ###
+bower_components
+.bower-cache
+.bower-registry
+.bower-tmp
+
+### dotenv ###
+.env
+
+### Linux ###
+*~
+
+# temporary files which can be created if a process still has a handle open of a deleted file
+.fuse_hidden*
+
+# KDE directory preferences
+.directory
+
+# Linux trash folder which might appear on any partition or disk
+.Trash-*
+
+# .nfs files are created when an open file is removed but is still being accessed
+.nfs*
+
+### macOS ###
+# General
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+
+### macOS Patch ###
+# iCloud generated files
+*.icloud
+
+### NextJS ###
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+# misc
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+.pnpm-debug.log*
+
+# local env files
+.env*.local
+
+# vercel
+.vercel
+
+# typescript
+*.tsbuildinfo
+next-env.d.ts
+
+### Node ###
+# Logs
+logs
+*.log
+lerna-debug.log*
+
+# Diagnostic reports (https://nodejs.org/api/report.html)
+report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+*.lcov
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# Snowpack dependency directory (https://snowpack.dev/)
+web_modules/
+
+# TypeScript cache
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional stylelint cache
+.stylelintcache
+
+# Microbundle cache
+.rpt2_cache/
+.rts2_cache_cjs/
+.rts2_cache_es/
+.rts2_cache_umd/
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+.yarn
+
+# dotenv environment variable files
+.env.development.local
+.env.test.local
+.env.production.local
+.env.local
+
+# parcel-bundler cache (https://parceljs.org/)
+.cache
+.parcel-cache
+
+# Next.js build output
+.next
+out
+
+# Nuxt.js build / generate output
+.nuxt
+dist
+
+# Gatsby files
+.cache/
+# Comment in the public line in if your project uses Gatsby and not Next.js
+# https://nextjs.org/blog/next-9-1#public-directory-support
+# public
+
+# vuepress build output
+.vuepress/dist
+
+# vuepress v2.x temp and cache directory
+.temp
+
+# Docusaurus cache and generated files
+.docusaurus
+
+# Serverless directories
+.serverless/
+
+# FuseBox cache
+.fusebox/
+
+# DynamoDB Local files
+.dynamodb/
+
+# TernJS port file
+.tern-port
+
+# Stores VSCode versions used for testing VSCode extensions
+.vscode-test
+
+# yarn v2
+.yarn/cache
+.yarn/unplugged
+.yarn/build-state.yml
+.yarn/install-state.gz
+.pnp.*
+
+### Node Patch ###
+# Serverless Webpack directories
+.webpack/
+
+# Optional stylelint cache
+
+# SvelteKit build / generate output
+.svelte-kit
+
+### PowerShell ###
+# Exclude packaged modules
+*.zip
+
+# Exclude .NET assemblies from source
+*.dll
+
+### react ###
+.DS_*
+**/*.backup.*
+**/*.back.*
+
+node_modules
+
+*.sublime*
+
+psd
+thumb
+sketch
+
+### SublimeText ###
+# Cache files for Sublime Text
+*.tmlanguage.cache
+*.tmPreferences.cache
+*.stTheme.cache
+
+# Workspace files are user-specific
+*.sublime-workspace
+
+# Project files should be checked into the repository, unless a significant
+# proportion of contributors will probably not be using Sublime Text
+# *.sublime-project
+
+# SFTP configuration file
+sftp-config.json
+sftp-config-alt*.json
+
+# Package control specific files
+Package Control.last-run
+Package Control.ca-list
+Package Control.ca-bundle
+Package Control.system-ca-bundle
+Package Control.cache/
+Package Control.ca-certs/
+Package Control.merged-ca-bundle
+Package Control.user-ca-bundle
+oscrypto-ca-bundle.crt
+bh_unicode_properties.cache
+
+# Sublime-github package stores a github token in this file
+# https://packagecontrol.io/packages/sublime-github
+GitHub.sublime-settings
+
+### Typings ###
+## Ignore downloaded typings
+typings
+
+### Vercel ###
+
+### Vim ###
+# Swap
+[._]*.s[a-v][a-z]
+!*.svg # comment out if you don't need vector files
+[._]*.sw[a-p]
+[._]s[a-rt-v][a-z]
+[._]ss[a-gi-z]
+[._]sw[a-p]
+
+# Session
+Session.vim
+Sessionx.vim
+
+# Temporary
+.netrwhist
+# Auto-generated tag files
+tags
+# Persistent undo
+[._]*.un~
+
+### VisualStudioCode ###
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+!.vscode/*.code-snippets
+
+# Local History for Visual Studio Code
+.history/
+
+# Built Visual Studio Code Extensions
+*.vsix
+
+### VisualStudioCode Patch ###
+# Ignore all local history of files
+.history
+.ionide
+
+### Windows ###
+# Windows thumbnail cache files
+Thumbs.db
+Thumbs.db:encryptable
+ehthumbs.db
+ehthumbs_vista.db
+
+# Dump file
+*.stackdump
+
+# Folder config file
+[Dd]esktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Windows Installer files
+*.cab
+*.msi
+*.msix
+*.msm
+*.msp
+
+# Windows shortcuts
+*.lnk
+
+### yarn ###
+# https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored
+
+.yarn/*
+!.yarn/releases
+!.yarn/patches
+!.yarn/plugins
+!.yarn/sdks
+!.yarn/versions
+
+# if you are NOT using Zero-installs, then:
+# comment the following lines
+!.yarn/cache
+
+# and uncomment the following lines
+# .pnp.*
+
+# End of https://www.toptal.com/developers/gitignore/api/nextjs,vercel,react,sublimetext,visualstudiocode,node,yarn,bower,macos,powershell,windows,linux,vim,dotenv,typings
\ No newline at end of file
diff --git a/.eslintrc.json b/.eslintrc.json
index 3a8b206..1b5102c 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -1,103 +1,103 @@
-{
- "$schema": "https://json.schemastore.org/eslintrc",
- "env": {
- "browser": true,
- "es2021": true,
- "node": true
- },
- "extends": [
- "next/core-web-vitals",
- "plugin:react/recommended",
- "prettier",
- "airbnb",
- "next",
- "plugin:prettier/recommended",
- "plugin:tailwindcss/recommended"
- ],
- "settings": {
- "react": {
- "version": "detect"
- }
- },
- "parser": "@typescript-eslint/parser",
- "parserOptions": {
- "ecmaVersion": 2021,
- "sourceType": "module",
- "ecmaFeatures": {
- "jsx": true
- }
- },
- "plugins": [
- "@typescript-eslint",
- "import",
- "jsx-a11y",
- "prettier",
- "promise",
- "react",
- "tailwindcss",
- "jsdoc"
- ],
- "rules": {
- "quotes": [2, "double"],
- "semi": [2, "always"],
- "@typescript-eslint/quotes": [2, "double"],
- "@typescript-eslint/semi": [2, "always"],
- "@typescript-eslint/strict-boolean-expressions": 0,
- "@typescript-eslint/explicit-function-return-type": 0,
- "react/jsx-no-bind": 0,
- "react/react-in-jsx-scope": 0,
- "import/no-extraneous-dependencies": 0,
- "import/prefer-default-export": 0,
- "import/extensions": 0,
- "import/no-anonymous-default-export": 0,
- "@next/next/no-html-link-for-pages": [2, "src/app"],
- "react/jsx-filename-extension": [
- 1,
- { "extensions": [".js", ".jsx", ".ts", ".tsx"] }
- ],
- "react/require-default-props": 0,
- "react/jsx-props-no-spreading": 0,
- "tailwindcss/no-custom-classname": 0,
- "tailwindcss/classnames-order": [
- 2,
- {
- "callees": ["classnames", "clsx", "ctl", "cva", "tv", "cn"],
- "removeDuplicates": true,
- "skipClassAttribute": true
- }
- ],
- "prettier/prettier": [
- 2,
- {
- "semi": true,
- "tabWidth": 2,
- "printWidth": 80,
- "singleQuote": false,
- "jsxSingleQuote": false,
- "singleAttributePerLine": true,
- "endOfLine": "auto",
- "trailingComma": "all"
- }
- ],
- "react/function-component-definition": [
- 2,
- {
- "namedComponents": [
- "function-declaration",
- "function-expression",
- "arrow-function"
- ],
- "unnamedComponents": ["function-expression", "arrow-function"]
- }
- ],
- "jsx-a11y/label-has-associated-control": [
- 2,
- {
- "labelComponents": ["CustomInputLabel"],
- "labelAttributes": ["label"],
- "controlComponents": ["CustomInput"],
- "depth": 3
- }
- ]
- }
-}
+{
+ "$schema": "https://json.schemastore.org/eslintrc",
+ "env": {
+ "browser": true,
+ "es2021": true,
+ "node": true
+ },
+ "extends": [
+ "next/core-web-vitals",
+ "plugin:react/recommended",
+ "prettier",
+ "airbnb",
+ "next",
+ "plugin:prettier/recommended",
+ "plugin:tailwindcss/recommended"
+ ],
+ "settings": {
+ "react": {
+ "version": "detect"
+ }
+ },
+ "parser": "@typescript-eslint/parser",
+ "parserOptions": {
+ "ecmaVersion": "latest",
+ "sourceType": "module",
+ "ecmaFeatures": {
+ "jsx": true
+ }
+ },
+ "plugins": [
+ "@typescript-eslint",
+ "import",
+ "jsx-a11y",
+ "prettier",
+ "promise",
+ "react",
+ "tailwindcss",
+ "jsdoc"
+ ],
+ "rules": {
+ "quotes": [2, "double"],
+ "semi": [2, "always"],
+ "@typescript-eslint/quotes": [2, "double"],
+ "@typescript-eslint/semi": [2, "always"],
+ "@typescript-eslint/strict-boolean-expressions": 0,
+ "@typescript-eslint/explicit-function-return-type": 0,
+ "react/jsx-no-bind": 0,
+ "react/react-in-jsx-scope": 0,
+ "import/no-extraneous-dependencies": 0,
+ "import/prefer-default-export": 0,
+ "import/extensions": 0,
+ "import/no-anonymous-default-export": 0,
+ "@next/next/no-html-link-for-pages": [2, "src/app"],
+ "react/jsx-filename-extension": [
+ 1,
+ { "extensions": [".js", ".jsx", ".ts", ".tsx"] }
+ ],
+ "react/require-default-props": 0,
+ "react/jsx-props-no-spreading": 0,
+ "tailwindcss/no-custom-classname": 0,
+ "tailwindcss/classnames-order": [
+ 2,
+ {
+ "callees": ["className", "clsx", "ctl", "cva", "tv", "cn"],
+ "removeDuplicates": true,
+ "skipClassAttribute": true
+ }
+ ],
+ "prettier/prettier": [
+ 2,
+ {
+ "semi": true,
+ "tabWidth": 2,
+ "printWidth": 80,
+ "singleQuote": false,
+ "jsxSingleQuote": false,
+ "singleAttributePerLine": true,
+ "endOfLine": "auto",
+ "trailingComma": "all"
+ }
+ ],
+ "react/function-component-definition": [
+ 2,
+ {
+ "namedComponents": [
+ "function-declaration",
+ "function-expression",
+ "arrow-function"
+ ],
+ "unnamedComponents": ["function-expression", "arrow-function"]
+ }
+ ],
+ "jsx-a11y/label-has-associated-control": [
+ 2,
+ {
+ "labelComponents": ["CustomInputLabel"],
+ "labelAttributes": ["label"],
+ "controlComponents": ["CustomInput"],
+ "depth": 3
+ }
+ ]
+ }
+}
diff --git a/.github/CODE_OF_CONDUCT b/.github/CODE_OF_CONDUCT
index afaa98f..ac19e2d 100644
--- a/.github/CODE_OF_CONDUCT
+++ b/.github/CODE_OF_CONDUCT
@@ -1,128 +1,128 @@
-# Contributor Covenant Code of Conduct
-
-## Our Pledge
-
-We as members, contributors, and leaders pledge to make participation in our
-community a harassment-free experience for everyone, regardless of age, body
-size, visible or invisible disability, ethnicity, sex characteristics, gender
-identity and expression, level of experience, education, socio-economic status,
-nationality, personal appearance, race, religion, or sexual identity
-and orientation.
-
-We pledge to act and interact in ways that contribute to an open, welcoming,
-diverse, inclusive, and healthy community.
-
-## Our Standards
-
-Examples of behavior that contributes to a positive environment for our
-community include:
-
-- Demonstrating empathy and kindness toward other people
-- Being respectful of differing opinions, viewpoints, and experiences
-- Giving and gracefully accepting constructive feedback
-- Accepting responsibility and apologizing to those affected by our mistakes,
- and learning from the experience
-- Focusing on what is best not just for us as individuals, but for the
- overall community
-
-Examples of unacceptable behavior include:
-
-- The use of sexualized language or imagery, and sexual attention or
- advances of any kind
-- Trolling, insulting or derogatory comments, and personal or political attacks
-- Public or private harassment
-- Publishing others' private information, such as a physical or email
- address, without their explicit permission
-- Other conduct which could reasonably be considered inappropriate in a
- professional setting
-
-## Enforcement Responsibilities
-
-Community leaders are responsible for clarifying and enforcing our standards of
-acceptable behavior and will take appropriate and fair corrective action in
-response to any behavior that they deem inappropriate, threatening, offensive,
-or harmful.
-
-Community leaders have the right and responsibility to remove, edit, or reject
-comments, commits, code, wiki edits, issues, and other contributions that are
-not aligned to this Code of Conduct, and will communicate reasons for moderation
-decisions when appropriate.
-
-## Scope
-
-This Code of Conduct applies within all community spaces, and also applies when
-an individual is officially representing the community in public spaces.
-Examples of representing our community include using an official e-mail address,
-posting via an official social media account, or acting as an appointed
-representative at an online or offline event.
-
-## Enforcement
-
-Instances of abusive, harassing, or otherwise unacceptable behavior may be
-reported to the community leaders responsible for enforcement at
-.
-All complaints will be reviewed and investigated promptly and fairly.
-
-All community leaders are obligated to respect the privacy and security of the
-reporter of any incident.
-
-## Enforcement Guidelines
-
-Community leaders will follow these Community Impact Guidelines in determining
-the consequences for any action they deem in violation of this Code of Conduct:
-
-### 1. Correction
-
-**Community Impact**: Use of inappropriate language or other behavior deemed
-unprofessional or unwelcome in the community.
-
-**Consequence**: A private, written warning from community leaders, providing
-clarity around the nature of the violation and an explanation of why the
-behavior was inappropriate. A public apology may be requested.
-
-### 2. Warning
-
-**Community Impact**: A violation through a single incident or series
-of actions.
-
-**Consequence**: A warning with consequences for continued behavior. No
-interaction with the people involved, including unsolicited interaction with
-those enforcing the Code of Conduct, for a specified period of time. This
-includes avoiding interactions in community spaces as well as external channels
-like social media. Violating these terms may lead to a temporary or
-permanent ban.
-
-### 3. Temporary Ban
-
-**Community Impact**: A serious violation of community standards, including
-sustained inappropriate behavior.
-
-**Consequence**: A temporary ban from any sort of interaction or public
-communication with the community for a specified period of time. No public or
-private interaction with the people involved, including unsolicited interaction
-with those enforcing the Code of Conduct, is allowed during this period.
-Violating these terms may lead to a permanent ban.
-
-### 4. Permanent Ban
-
-**Community Impact**: Demonstrating a pattern of violation of community
-standards, including sustained inappropriate behavior, harassment of an
-individual, or aggression toward or disparagement of classes of individuals.
-
-**Consequence**: A permanent ban from any sort of public interaction within
-the community.
-
-## Attribution
-
-This Code of Conduct is adapted from the [Contributor Covenant][homepage],
-version 2.0, available at
-https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
-
-Community Impact Guidelines were inspired by [Mozilla's code of conduct
-enforcement ladder](https://github.com/mozilla/diversity).
-
-[homepage]: https://www.contributor-covenant.org
-
-For answers to common questions about this code of conduct, see the FAQ at
-https://www.contributor-covenant.org/faq. Translations are available at
-https://www.contributor-covenant.org/translations.
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+We as members, contributors, and leaders pledge to make participation in our
+community a harassment-free experience for everyone, regardless of age, body
+size, visible or invisible disability, ethnicity, sex characteristics, gender
+identity and expression, level of experience, education, socio-economic status,
+nationality, personal appearance, race, religion, or sexual identity
+and orientation.
+
+We pledge to act and interact in ways that contribute to an open, welcoming,
+diverse, inclusive, and healthy community.
+
+## Our Standards
+
+Examples of behavior that contributes to a positive environment for our
+community include:
+
+- Demonstrating empathy and kindness toward other people
+- Being respectful of differing opinions, viewpoints, and experiences
+- Giving and gracefully accepting constructive feedback
+- Accepting responsibility and apologizing to those affected by our mistakes,
+ and learning from the experience
+- Focusing on what is best not just for us as individuals, but for the
+ overall community
+
+Examples of unacceptable behavior include:
+
+- The use of sexualized language or imagery, and sexual attention or
+ advances of any kind
+- Trolling, insulting or derogatory comments, and personal or political attacks
+- Public or private harassment
+- Publishing others' private information, such as a physical or email
+ address, without their explicit permission
+- Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Enforcement Responsibilities
+
+Community leaders are responsible for clarifying and enforcing our standards of
+acceptable behavior and will take appropriate and fair corrective action in
+response to any behavior that they deem inappropriate, threatening, offensive,
+or harmful.
+
+Community leaders have the right and responsibility to remove, edit, or reject
+comments, commits, code, wiki edits, issues, and other contributions that are
+not aligned to this Code of Conduct, and will communicate reasons for moderation
+decisions when appropriate.
+
+## Scope
+
+This Code of Conduct applies within all community spaces, and also applies when
+an individual is officially representing the community in public spaces.
+Examples of representing our community include using an official e-mail address,
+posting via an official social media account, or acting as an appointed
+representative at an online or offline event.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported to the community leaders responsible for enforcement at
+.
+All complaints will be reviewed and investigated promptly and fairly.
+
+All community leaders are obligated to respect the privacy and security of the
+reporter of any incident.
+
+## Enforcement Guidelines
+
+Community leaders will follow these Community Impact Guidelines in determining
+the consequences for any action they deem in violation of this Code of Conduct:
+
+### 1. Correction
+
+**Community Impact**: Use of inappropriate language or other behavior deemed
+unprofessional or unwelcome in the community.
+
+**Consequence**: A private, written warning from community leaders, providing
+clarity around the nature of the violation and an explanation of why the
+behavior was inappropriate. A public apology may be requested.
+
+### 2. Warning
+
+**Community Impact**: A violation through a single incident or series
+of actions.
+
+**Consequence**: A warning with consequences for continued behavior. No
+interaction with the people involved, including unsolicited interaction with
+those enforcing the Code of Conduct, for a specified period of time. This
+includes avoiding interactions in community spaces as well as external channels
+like social media. Violating these terms may lead to a temporary or
+permanent ban.
+
+### 3. Temporary Ban
+
+**Community Impact**: A serious violation of community standards, including
+sustained inappropriate behavior.
+
+**Consequence**: A temporary ban from any sort of interaction or public
+communication with the community for a specified period of time. No public or
+private interaction with the people involved, including unsolicited interaction
+with those enforcing the Code of Conduct, is allowed during this period.
+Violating these terms may lead to a permanent ban.
+
+### 4. Permanent Ban
+
+**Community Impact**: Demonstrating a pattern of violation of community
+standards, including sustained inappropriate behavior, harassment of an
+individual, or aggression toward or disparagement of classes of individuals.
+
+**Consequence**: A permanent ban from any sort of public interaction within
+the community.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage],
+version 2.0, available at
+https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
+
+Community Impact Guidelines were inspired by [Mozilla's code of conduct
+enforcement ladder](https://github.com/mozilla/diversity).
+
+[homepage]: https://www.contributor-covenant.org
+
+For answers to common questions about this code of conduct, see the FAQ at
+https://www.contributor-covenant.org/faq. Translations are available at
+https://www.contributor-covenant.org/translations.
\ No newline at end of file
diff --git a/.github/LICENSE b/.github/LICENSE
index 807a3d7..2a284e3 100644
--- a/.github/LICENSE
+++ b/.github/LICENSE
@@ -1,21 +1,21 @@
-MIT License
-
-Copyright (c) 2023 Dimas Saputra
-
-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.
+MIT License
+
+Copyright (c) 2023 Dimas Saputra
+
+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.
\ No newline at end of file
diff --git a/.github/workflows/eslint.yml b/.github/workflows/eslint.yaml
similarity index 70%
rename from .github/workflows/eslint.yml
rename to .github/workflows/eslint.yaml
index 442165c..935e830 100644
--- a/.github/workflows/eslint.yml
+++ b/.github/workflows/eslint.yaml
@@ -1,62 +1,52 @@
-# This workflow uses actions that are not certified by GitHub.
-# They are provided by a third-party and are governed by
-# separate terms of service, privacy policy, and support
-# documentation.
-# ESLint is a tool for identifying and reporting on patterns
-# found in ECMAScript/JavaScript code.
-# More details at https://github.com/eslint/eslint
-# and https://eslint.org
-
-name: ESLint
-
-on:
- push:
- branches: ["main"]
- pull_request:
- # The branches below must be a subset of the branches above
- branches: ["main"]
- schedule:
- - cron: "44 23 * * 3"
-
-jobs:
- eslint:
- name: Run eslint scanning
- runs-on: ubuntu-latest
- permissions:
- contents: read
- security-events: write
- actions: read # only required for a private repository by github/codeql-action/upload-sarif to get the Action run status
- steps:
- - name: Checkout code
- uses: actions/checkout@v3
-
- - name: Install ESLint
- run: |
- npm install eslint@8.10.0
- npm install @microsoft/eslint-formatter-sarif@2.1.7
- npm install @typescript-eslint/eslint-plugin
- npm install @typescript-eslint/parser
- npm install eslint-config-airbnb
- npm install eslint-config-next
- npm install eslint-config-prettier
- npm install eslint-plugin-import
- npm install eslint-plugin-jsdoc
- npm install eslint-plugin-jsx-a11y
- npm install eslint-plugin-prettier
- npm install eslint-plugin-promise
- npm install eslint-plugin-react
- npm install eslint-plugin-react-hooks
-
- - name: Run ESLint
- run: npx eslint .
- --config .eslintrc.json
- --ext .js,.jsx,.ts,.tsx
- --format @microsoft/eslint-formatter-sarif
- --output-file eslint-results.sarif
- continue-on-error: true
-
- - name: Upload analysis results to GitHub
- uses: github/codeql-action/upload-sarif@v2
- with:
- sarif_file: eslint-results.sarif
- wait-for-processing: true
+name: ESLint
+
+on:
+ push:
+ branches: ["main"]
+ pull_request:
+ branches: ["main"]
+ schedule:
+ - cron: "44 23 * * 3"
+
+jobs:
+ eslint:
+ name: Run eslint scanning
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ security-events: write
+ actions: read
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v3
+
+ - name: Install ESLint
+ run: |
+ npm install eslint@8.10.0
+ npm install @microsoft/eslint-formatter-sarif@2.1.7
+ npm install @typescript-eslint/eslint-plugin
+ npm install @typescript-eslint/parser
+ npm install eslint-config-airbnb
+ npm install eslint-config-next
+ npm install eslint-config-prettier
+ npm install eslint-plugin-import
+ npm install eslint-plugin-jsdoc
+ npm install eslint-plugin-jsx-a11y
+ npm install eslint-plugin-prettier
+ npm install eslint-plugin-promise
+ npm install eslint-plugin-react
+ npm install eslint-plugin-react-hooks
+
+ - name: Run ESLint
+ run: npx eslint .
+ --config .eslintrc.json
+ --ext .js,.jsx,.ts,.tsx
+ --format @microsoft/eslint-formatter-sarif
+ --output-file eslint-results.sarif
+ continue-on-error: true
+
+ - name: Upload analysis results to GitHub
+ uses: github/codeql-action/upload-sarif@v2
+ with:
+ sarif_file: eslint-results.sarif
+ wait-for-processing: true
\ No newline at end of file
diff --git a/.husky/pre-commit b/.husky/pre-commit
old mode 100644
new mode 100755
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000..f82b9c5
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,371 @@
+# Created by https://www.toptal.com/developers/gitignore/api/nextjs,vercel,react,sublimetext,visualstudiocode,node,yarn,bower,macos,powershell,windows,linux,vim,dotenv,typings
+# Edit at https://www.toptal.com/developers/gitignore?templates=nextjs,vercel,react,sublimetext,visualstudiocode,node,yarn,bower,macos,powershell,windows,linux,vim,dotenv,typings
+
+### Bower ###
+bower_components
+.bower-cache
+.bower-registry
+.bower-tmp
+
+### dotenv ###
+.env
+
+### Linux ###
+*~
+
+# temporary files which can be created if a process still has a handle open of a deleted file
+.fuse_hidden*
+
+# KDE directory preferences
+.directory
+
+# Linux trash folder which might appear on any partition or disk
+.Trash-*
+
+# .nfs files are created when an open file is removed but is still being accessed
+.nfs*
+
+### macOS ###
+# General
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+
+### macOS Patch ###
+# iCloud generated files
+*.icloud
+
+### NextJS ###
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+# misc
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+.pnpm-debug.log*
+
+# local env files
+.env*.local
+
+# vercel
+.vercel
+
+# typescript
+*.tsbuildinfo
+next-env.d.ts
+
+### Node ###
+# Logs
+logs
+*.log
+lerna-debug.log*
+
+# Diagnostic reports (https://nodejs.org/api/report.html)
+report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+*.lcov
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# Snowpack dependency directory (https://snowpack.dev/)
+web_modules/
+
+# TypeScript cache
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional stylelint cache
+.stylelintcache
+
+# Microbundle cache
+.rpt2_cache/
+.rts2_cache_cjs/
+.rts2_cache_es/
+.rts2_cache_umd/
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+.yarn
+
+# dotenv environment variable files
+.env.development.local
+.env.test.local
+.env.production.local
+.env.local
+
+# parcel-bundler cache (https://parceljs.org/)
+.cache
+.parcel-cache
+
+# Next.js build output
+.next
+out
+
+# Nuxt.js build / generate output
+.nuxt
+dist
+
+# Gatsby files
+.cache/
+# Comment in the public line in if your project uses Gatsby and not Next.js
+# https://nextjs.org/blog/next-9-1#public-directory-support
+# public
+
+# vuepress build output
+.vuepress/dist
+
+# vuepress v2.x temp and cache directory
+.temp
+
+# Docusaurus cache and generated files
+.docusaurus
+
+# Serverless directories
+.serverless/
+
+# FuseBox cache
+.fusebox/
+
+# DynamoDB Local files
+.dynamodb/
+
+# TernJS port file
+.tern-port
+
+# Stores VSCode versions used for testing VSCode extensions
+.vscode-test
+
+# yarn v2
+.yarn/cache
+.yarn/unplugged
+.yarn/build-state.yml
+.yarn/install-state.gz
+.pnp.*
+
+### Node Patch ###
+# Serverless Webpack directories
+.webpack/
+
+# Optional stylelint cache
+
+# SvelteKit build / generate output
+.svelte-kit
+
+### PowerShell ###
+# Exclude packaged modules
+*.zip
+
+# Exclude .NET assemblies from source
+*.dll
+
+### react ###
+.DS_*
+**/*.backup.*
+**/*.back.*
+
+node_modules
+
+*.sublime*
+
+psd
+thumb
+sketch
+
+### SublimeText ###
+# Cache files for Sublime Text
+*.tmlanguage.cache
+*.tmPreferences.cache
+*.stTheme.cache
+
+# Workspace files are user-specific
+*.sublime-workspace
+
+# Project files should be checked into the repository, unless a significant
+# proportion of contributors will probably not be using Sublime Text
+# *.sublime-project
+
+# SFTP configuration file
+sftp-config.json
+sftp-config-alt*.json
+
+# Package control specific files
+Package Control.last-run
+Package Control.ca-list
+Package Control.ca-bundle
+Package Control.system-ca-bundle
+Package Control.cache/
+Package Control.ca-certs/
+Package Control.merged-ca-bundle
+Package Control.user-ca-bundle
+oscrypto-ca-bundle.crt
+bh_unicode_properties.cache
+
+# Sublime-github package stores a github token in this file
+# https://packagecontrol.io/packages/sublime-github
+GitHub.sublime-settings
+
+### Typings ###
+## Ignore downloaded typings
+typings
+
+### Vercel ###
+
+### Vim ###
+# Swap
+[._]*.s[a-v][a-z]
+!*.svg # comment out if you don't need vector files
+[._]*.sw[a-p]
+[._]s[a-rt-v][a-z]
+[._]ss[a-gi-z]
+[._]sw[a-p]
+
+# Session
+Session.vim
+Sessionx.vim
+
+# Temporary
+.netrwhist
+# Auto-generated tag files
+tags
+# Persistent undo
+[._]*.un~
+
+### VisualStudioCode ###
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+!.vscode/*.code-snippets
+
+# Local History for Visual Studio Code
+.history/
+
+# Built Visual Studio Code Extensions
+*.vsix
+
+### VisualStudioCode Patch ###
+# Ignore all local history of files
+.history
+.ionide
+
+### Windows ###
+# Windows thumbnail cache files
+Thumbs.db
+Thumbs.db:encryptable
+ehthumbs.db
+ehthumbs_vista.db
+
+# Dump file
+*.stackdump
+
+# Folder config file
+[Dd]esktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Windows Installer files
+*.cab
+*.msi
+*.msix
+*.msm
+*.msp
+
+# Windows shortcuts
+*.lnk
+
+### yarn ###
+# https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored
+
+.yarn/*
+!.yarn/releases
+!.yarn/patches
+!.yarn/plugins
+!.yarn/sdks
+!.yarn/versions
+
+# if you are NOT using Zero-installs, then:
+# comment the following lines
+!.yarn/cache
+
+# and uncomment the following lines
+# .pnp.*
+
+# End of https://www.toptal.com/developers/gitignore/api/nextjs,vercel,react,sublimetext,visualstudiocode,node,yarn,bower,macos,powershell,windows,linux,vim,dotenv,typings
\ No newline at end of file
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
deleted file mode 100644
index d7df89c..0000000
--- a/.vscode/extensions.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "recommendations": ["esbenp.prettier-vscode", "dbaeumer.vscode-eslint"]
-}
diff --git a/.vscode/settings.json b/.vscode/settings.json
index eff851d..b2377e0 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,16 +1,23 @@
-{
- "typescript.tsdk": "./node_modules/typescript/lib",
- "typescript.enablePromptUseWorkspaceTsdk": true,
- "explorer.fileNesting.enabled": true,
- "explorer.fileNesting.expand": false,
- "explorer.fileNesting.patterns": {
- "Dockerfile": ".dockerignore, Dockerfile.development, Dockerfile.production, Dockerfile.testing",
- "*.ts": "${capture}.d.ts",
- "next.config.js": "next-env.d.ts",
- "tailwind.config.js": "postcss.config.js",
- "README.md": "${capture}.md",
- ".eslintrc.json": ".eslintcache, .eslintignore",
- "package.json": "package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb"
- },
- "editor.wordWrap": "on"
-}
+{
+ "typescript.tsdk": "./node_modules/typescript/lib",
+ "typescript.enablePromptUseWorkspaceTsdk": true,
+ "explorer.fileNesting.enabled": true,
+ "explorer.fileNesting.expand": false,
+ "explorer.fileNesting.patterns": {
+ "Docker*": ".dockerignore, Dockerfile.development, Dockerfile.production, Dockerfile.testing, docker-compose.*",
+ "*.ts": "${capture}.d.ts",
+ "next.config.*": "next-env.d.ts",
+ "tailwind.config.*": "postcss.config.js",
+ "README.md": "${capture}.md",
+ ".eslintrc*": ".eslintcache, .eslintignore",
+ ".prettierrc*": ".prettierignore",
+ "package.json": "package*, yarn.lock, pnpm-lock.yaml, bun.lockb, bunfig.toml, .npmrc, .nvmrc, .yarnrc"
+ },
+ "editor.wordWrap": "wordWrapColumn",
+ "files.exclude": {
+ "**/.git": false
+ },
+ "editor.codeActionsOnSave": {
+ "source.fixAll": true
+ }
+}
diff --git a/README.md b/README.md
index e523343..ecb7b0e 100644
--- a/README.md
+++ b/README.md
@@ -1,38 +1,90 @@
-# This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app)
+# Portfolio
-## Getting Started
+my personal web page
-First, run the development server:
+## Tech Stack
+
+Here's my technology i used in this project
+
+- React
+- TypeScript
+- TailwindCSS
+- Next 13
+- Framer motion
+- Dockerfile
+- Bun.js
+
+## Installation
+
+First of all Clone this project
+
+- HTTP
+
+```bash
+git clone https://github.com/infinitedim/portfolio.git
+
+cd portfolio
+```
+
+- SSH
```bash
-npm run dev
-# or
-yarn dev
-# or
-pnpm dev
+git clone git@github.com:infinitedim/portfolio.git
+
+cd portfolio
```
-Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
+- GITHUB CLI
-You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
+```bash
+gh repo clone infinitedim/portfolio
+
+cd portfolio
+```
+
+- if you want to change name the output you can use -o arguments
+
+```bash
+git clone https://github.com/infinitedim/portfolio.git -o portfolioNameHasChanged
+
+cd portfolioNameHasChanged
+```
+
+This project use bun as runtime if you not using bun i personally recommend to use yarn
+
+- Install dependencies
+
+```bash
+// use npm
+npm install
+
+// use yarn
+yarn install
+
+// use pnpm
+pnpm install
+
+// use bun
+bun install
+```
-[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`.
+## Color Reference
-The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages.
+- coming soon
-This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.
+## Demo
-## Learn More
+see [development demo](https://dev.infinitedim.site)
+or see [stable demo](https://infinitedim.site)
-To learn more about Next.js, take a look at the following resources:
+## Authors
-- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
-- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
+- [Dimas Saputra](https://www.github.com/infinitedim)
-You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
+## Contributing
-## Deploy on Vercel
+Contributions are always welcome!
-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.
+See `contributing.md` for ways to get started.
-Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
+Please adhere to this project's `code of conduct`.
diff --git a/bun.lockb b/bun.lockb
new file mode 100755
index 0000000..62b112e
Binary files /dev/null and b/bun.lockb differ
diff --git a/bunfig.toml b/bunfig.toml
index 193b0cd..13924c2 100644
--- a/bunfig.toml
+++ b/bunfig.toml
@@ -11,4 +11,4 @@ save = true
# whether to save a non-Bun lockfile alongside bun.lockb
# only "yarn" is supported
-print = "yarn"
+print = "yarn"
\ No newline at end of file
diff --git a/components.json b/components.json
deleted file mode 100644
index 97c869e..0000000
--- a/components.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "$schema": "https://ui.shadcn.com/schema.json",
- "style": "default",
- "rsc": true,
- "tsx": true,
- "tailwind": {
- "config": "tailwind.config.js",
- "css": "src/styles/globals.css",
- "baseColor": "zinc",
- "cssVariables": true
- },
- "aliases": {
- "components": "@/components",
- "utils": "@/utils"
- }
-}
diff --git a/docker-compose.yaml b/docker-compose.yaml
new file mode 100644
index 0000000..7022a3e
--- /dev/null
+++ b/docker-compose.yaml
@@ -0,0 +1,6 @@
+version: "3"
+services:
+ app:
+ build: .
+ ports:
+ - 3000:3000
diff --git a/package.json b/package.json
index c97988f..fefd041 100644
--- a/package.json
+++ b/package.json
@@ -39,18 +39,14 @@
]
},
"dependencies": {
- "@radix-ui/react-dropdown-menu": "^2.0.5",
- "@radix-ui/react-slot": "^1.0.2",
- "@types/mdx": "^2.0.7",
"@vercel/analytics": "^1.0.2",
- "class-variance-authority": "^0.6.1",
- "clsx": "^1.2.1",
- "lucide-react": "^0.272.0",
+ "clsx": "^2.0.0",
+ "framer-motion": "^10.16.4",
"next": "13.4.10",
"react": "18.2.0",
"react-dom": "18.2.0",
"tailwind-merge": "^1.14.0",
- "tailwindcss-animate": "^1.0.7"
+ "usehooks-ts": "^2.9.1"
},
"devDependencies": {
"@jridgewell/sourcemap-codec": "^1.4.15",
diff --git a/public/assets/pdf/resume.pdf b/public/assets/pdf/resume.pdf
deleted file mode 100644
index 0f15b90..0000000
Binary files a/public/assets/pdf/resume.pdf and /dev/null differ
diff --git a/public/assets/svg/hero.svg b/public/assets/svg/hero.svg
deleted file mode 100644
index 8956aca..0000000
--- a/public/assets/svg/hero.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/assets/svg/logo.svg b/public/assets/svg/logo.svg
deleted file mode 100644
index b46f105..0000000
--- a/public/assets/svg/logo.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-
\ No newline at end of file
diff --git a/public/hero.svg b/public/hero.svg
new file mode 100644
index 0000000..00edf11
--- /dev/null
+++ b/public/hero.svg
@@ -0,0 +1,42 @@
+
\ No newline at end of file
diff --git a/public/not_found.svg b/public/not_found.svg
new file mode 100644
index 0000000..f47c505
--- /dev/null
+++ b/public/not_found.svg
@@ -0,0 +1,93 @@
+
diff --git a/src/app/[...notfound]/layout.tsx b/src/app/[...notfound]/layout.tsx
index 38da053..88bc376 100644
--- a/src/app/[...notfound]/layout.tsx
+++ b/src/app/[...notfound]/layout.tsx
@@ -1,5 +1,6 @@
-import { ReactNode } from "react";
-
-export default function Layout({ children }: { children: ReactNode }) {
- return
{children}
;
-}
+import { cn } from "@/utils";
+import { ReactNode } from "react";
+
+export default function Layout({ children }: { children: ReactNode }) {
+ return
-
- About me
-
-
- {/* Hello there, my name is Dimas Saputra, i am a software developer at
- voltras international, i was born in Jakarta, Indonesia in second July
- 2004 and i start coding when i was 10th grade in vocational highscool
- named smk boedi luhur. */}
- Lorem, ipsum dolor sit amet consectetur adipisicing elit. Nesciunt
- necessitatibus alias natus beatae asperiores enim ex doloribus facere id
- eligendi tenetur laudantium labore, earum dicta quod voluptatem incidunt
- nisi. Et!
-
-
- {/* when i first write code i was create a hello world, yeah it‘s very
- common for every programmer to write the first code with hello world,
- and when i first learn to code, i was use html for the language */}
- Lorem, ipsum dolor sit amet consectetur adipisicing elit. Voluptatum
- deserunt ea ab odit in aliquid, hic quia amet autem sit unde at eveniet
- doloribus dolore. Quidem aliquid dolorem facere atque?
-
-
- {/* and after that i falling in love with code and learn without mentor,
- teacher or lecturer to teach me about code */}
-
- {/* so its about me, maybe i will update this later */}
-
- );
-}
+import { Heading } from "@/components";
+import { cn } from "@/utils";
+import { Metadata } from "next";
+
+export const metadata: Metadata = {
+ title: "Dimas Saputra - About",
+ description: "This is my about page",
+ keywords: [
+ "dimas",
+ "dimas Saputra",
+ "resume",
+ "infinitedim",
+ "portfolio",
+ "about",
+ "about page",
+ "infinitedim about",
+ ],
+ authors: [{ name: "Dimas Saputra", url: "https://infinitedim.site" }],
+ creator: "Dimas Saputra",
+ viewport: { width: "device-width", initialScale: 1 },
+};
+
+export default function Page() {
+ return (
+
+ Ini Halaman About
+
+ );
+}
diff --git a/src/app/favicon.ico b/src/app/favicon.ico
index 718d6fe..a0b7c44 100644
Binary files a/src/app/favicon.ico and b/src/app/favicon.ico differ
diff --git a/src/app/fonts.ts b/src/app/fonts.ts
new file mode 100644
index 0000000..6684074
--- /dev/null
+++ b/src/app/fonts.ts
@@ -0,0 +1,16 @@
+import { NextFont } from "next/dist/compiled/@next/font";
+import { Inter, Oswald } from "next/font/google";
+
+export const inter: NextFont = Inter({
+ weight: ["100", "200", "300", "400", "500", "600", "700", "800", "900"],
+ subsets: ["latin"],
+ display: "swap",
+ preload: true,
+});
+
+export const oswald: NextFont = Oswald({
+ weight: ["200", "300", "400", "500", "600", "700"],
+ subsets: ["latin"],
+ display: "swap",
+ preload: true,
+});
diff --git a/src/app/icon.tsx b/src/app/icon.tsx
new file mode 100644
index 0000000..83ea6b7
--- /dev/null
+++ b/src/app/icon.tsx
@@ -0,0 +1,9 @@
+export const runtime = "edge";
+
+// Image metadata
+export const size = {
+ width: 32,
+ height: 32,
+};
+
+export const contentType = "image/png";
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index d7c7e5c..30fc06b 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -1,50 +1,34 @@
-import { NextFont } from "next/dist/compiled/@next/font";
-import { Inter } from "next/font/google";
-import { Analytics } from "@vercel/analytics/react";
-import { Navbar } from "@/components";
-import { cn } from "@/utils";
-import type { ReactNode } from "react";
-import "@/styles/globals.css";
-
-const inter: NextFont = Inter({
- subsets: ["latin"],
- display: "swap",
-});
-
-/**
- * @param {ReactNode} children - The node to render the component on.
- * @returns {JSX.Element} the root node of the tree structure of the application
- * @type {JSX.Element}
- */
-export default function RootLayout({ children }: { children: ReactNode }) {
- return (
-
-
-
- Skip To Content
-
-
-
- {children}
-
-
-
-
- );
-}
+import { ReactNode } from "react";
+import { Analytics } from "@vercel/analytics/react";
+import { Header } from "@/components";
+import { cn } from "@/utils";
+import { inter } from "./fonts";
+import "@/styles/globals.css";
+
+export default function RootLayout({ children }: { children: ReactNode }) {
+ return (
+
+
+
+ Skip To Content
+
+
+
+ {children}
+
+
+
+
+ );
+}
diff --git a/src/app/loading.tsx b/src/app/loading.tsx
index 316beb9..0fd6d52 100644
--- a/src/app/loading.tsx
+++ b/src/app/loading.tsx
@@ -1,35 +1,39 @@
-export default function Loading() {
- return (
-
-
-
-
-
-
-
- );
-}
+import { cn } from "@/utils";
+
+export default function Loading() {
+ return (
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/middleware.ts b/src/app/middleware.ts
deleted file mode 100644
index 4c26974..0000000
--- a/src/app/middleware.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { NextResponse } from "next/server";
-import type { NextRequest } from "next/server";
-
-export default function middleware(req: NextRequest) {
- const path = req.nextUrl.pathname;
- const slug = path.slice(1);
-
- // Set a cookie on the response using the `ResponseCookies` API
- const response = NextResponse.next();
- response.cookies.set({
- name: "middleware-slug",
- value: slug,
- path,
- });
-
- return response;
-}
-
-export const config = {
- matcher: [
- "/disclaimer", // match a single, specific page
- "/((?!public|static).*)", // match all paths not starting with 'public' or 'static'
- ],
-};
diff --git a/src/app/not-found.tsx b/src/app/not-found.tsx
index 7c58606..48a2a62 100644
--- a/src/app/not-found.tsx
+++ b/src/app/not-found.tsx
@@ -1,15 +1,51 @@
-import { Heading } from "@/components";
-
-export default function NotFound() {
- return (
-
-
- Error
-
- 404 Page Not Found
-
- );
-}
+import Image from "next/image";
+import { cn } from "@/utils";
+import Dog from "@/public/not_found.svg";
+import { Button, Heading } from "@/components";
+import Link from "next/link";
+import { inter, oswald } from "./fonts";
+
+export default function NotFound() {
+ return (
+
+
+
+ Error
+
+
+ 404 Page Not Found
+
+
+
+ );
+}
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 8cea5d9..26a7260 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -1,106 +1,203 @@
-import Link from "next/link";
-import { Metadata } from "next";
-import Image from "next/image";
-import { Heading, Paragraph } from "@/components/atoms";
-import Sapiens from "@/public/assets/svg/hero.svg";
-
-/**
- * @description This is the main metadata in this pages
- * @type {Metadata} The type of metadata
- */
-export const metadata: Metadata = {
- title: "Dimas Saputra - Home",
- description: "This is my personal portfolio web pages",
- keywords: [
- "dimas",
- "dimas Saputra",
- "dimas Saputra resume",
- "resume dimas saputra",
- "infinitedim resume",
- "cv",
- "cv dimas saputra",
- "infinitedim cv",
- "cv infinitedim",
- "resume infinitedim",
- "infinitedim",
- "infinitedim portfolio",
- "portfolio infinitedim",
- "Dimas portfolio",
- "devixid",
- "devix",
- "devixid member",
- "devix member",
- "member devix",
- "member devixid",
- ],
- authors: [{ name: "infinitedim", url: "https://infinitedim.vercel.app" }],
- colorScheme: "light",
- publisher: "vercel",
- openGraph: {
- type: "website",
- url: "https://infinitedim.vercel.app",
- title: "Dimas Saputra - Home",
- description: "My Portfolio website",
- siteName: "My Website",
- images: [
- {
- url: "https://infinitedim.vercel.app/opengraph.png",
- },
- ],
- },
- creator: "infinitedim",
- viewport: { width: "device-width", initialScale: 1 },
-};
-
-/**
- * @description this function is create home page components
- * @returns {ReactNode}
- * @type {JSX.Element}
- */
-export default function Page() {
- return (
-
-
-
-
- What‘s going on here?
-
-
-
-
- This is my portfolio
-
-
- I am a junior front end web developer especially react.js based in
- bekasi indonesia. i am a fresh graduate from vocational high school
-
-
+
+ Who i am?
+
+
+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Explicabo,
+ ut! Nesciunt quos unde dolore ducimus, illo magni maiores
+ consequuntur, optio praesentium distinctio officia sequi, temporibus
+ magnam nihil explicabo?
+
+
-
- Project
-
-
- Lorem ipsum dolor sit amet consectetur adipisicing elit. A voluptatum
- error culpa? Ab, dolorum! Id neque laborum laudantium doloremque
- provident aut inventore eveniet, quam, tempore impedit dolorum beatae
- velit in similique quo voluptatibus voluptatem, doloribus eum voluptatum
- eligendi totam suscipit tempora! Rerum veniam quam eveniet vitae vel
- doloribus
-
-
-
-
- Miolica
-
- Lorem ipsum dolor sit amet consectetur adipisicing elit. Nostrum
- alias veritatis aliquam necessitatibus. Sint unde maiores illum
- facere est, animi a possimus, quo nulla officia eligendi porro
- reiciendis vel eos architecto obcaecati, accusantium ullam impedit
- veniam sequi! Quas doloremque at, quam nulla eum sequi tenetur.
- Odit, impedit deleniti laborum placeat id vitae alias ducimus unde
- repellat facere necessitatibus dolores eligendi. Numquam, veniam
- nostrum? Qui, quasi aspernatur nihil soluta ad magnam blanditiis
- delectus, adipisci est, cupiditate reprehenderit inventore. Quod
- enim perspiciatis natus deserunt doloremque officia iusto quae
- temporibus numquam similique tenetur, necessitatibus atque deleniti.
- Labore deserunt, iure veniam doloremque aut natus!
-
-
-
-
- );
-}
diff --git a/src/app/projects/layout.tsx b/src/app/projects/layout.tsx
new file mode 100644
index 0000000..88bc376
--- /dev/null
+++ b/src/app/projects/layout.tsx
@@ -0,0 +1,6 @@
+import { cn } from "@/utils";
+import { ReactNode } from "react";
+
+export default function Layout({ children }: { children: ReactNode }) {
+ return
{children}
;
+}
diff --git a/src/app/projects/page.tsx b/src/app/projects/page.tsx
new file mode 100644
index 0000000..7d89fd9
--- /dev/null
+++ b/src/app/projects/page.tsx
@@ -0,0 +1,19 @@
+import { Heading } from "@/components";
+import { cn } from "@/utils";
+import { inter } from "../fonts";
+
+export default function Page() {
+ return (
+
+
+ Project Page
+
+
+ );
+}
diff --git a/src/components/Header.tsx b/src/components/Header.tsx
new file mode 100644
index 0000000..e984d31
--- /dev/null
+++ b/src/components/Header.tsx
@@ -0,0 +1,71 @@
+/* eslint-disable no-nested-ternary */
+/* eslint-disable no-console */
+/* eslint-disable no-unsafe-optional-chaining */
+
+"use client";
+
+import Link from "next/link";
+import { usePathname } from "next/navigation";
+import { memo } from "react";
+import { oswald } from "@/app/fonts";
+import { cn } from "@/utils";
+import { GithubIcon, Heading } from "./atoms";
+import Navbar from "./molecules/Navbar";
+
+function Header() {
+ const pathname = usePathname();
+
+ return (
+
+
+