diff --git a/.env.example b/.env.example
index 040381d..6167cea 100644
--- a/.env.example
+++ b/.env.example
@@ -14,15 +14,15 @@
# NEXT_PUBLIC_CLIENTVAR="bar"
NODE_ENV=
-FIREBASE_API_KEY=
-FIREBASE_AUTH_DOMAIN=
-FIREBASE_PROJECT_ID=
-FIREBASE_STORAGE_BUCKET=
-FIREBASE_MESSAGING_SENDER_ID=
-FIREBASE_APP_ID=
-FIREBASE_MEASUREMENT_ID=
-GOOGLE_MAPS_API_KEY=
-GOOGLE_MAPS_MAP_ID=
+NEXT_PUBLIC_FIREBASE_API_KEY=
+NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=
+NEXT_PUBLIC_FIREBASE_PROJECT_ID=
+NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=
+NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=
+NEXT_PUBLIC_FIREBASE_APP_ID=
+NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID=
+NEXT_PUBLIC_GOOGLE_MAPS_API_KEY=
+NEXT_PUBLIC_GOOGLE_MAPS_API_KEY=
LIVEBLOCKS_API_KEY_PROD=
LIVEBLOCKS_API_KEY_DEV=
DISCORD_ID=
@@ -34,9 +34,9 @@ SPOTIFY_REFRESH_TOKEN=
UMAMI_API_KEY=
SENTRY_AUTH_TOKEN=
-GCP_PROJECT_ID=
-GCP_PRIVATE_KEY_ID=
-GCP_PRIVATE_KEY=
-GCP_CLIENT_EMAIL=
-GCP_CLIENT_ID=
-GCP_CLIENT_X509_CERT_URL=
+NEXT_PUBLIC_GCP_PROJECT_ID=
+NEXT_PUBLIC_GCP_PRIVATE_KEY_ID=
+NEXT_PUBLIC_GCP_PRIVATE_KEY=
+NEXT_PUBLIC_GCP_CLIENT_EMAIL=
+NEXT_PUBLIC_GCP_CLIENT_ID=
+NEXT_PUBLIC_GCP_CLIENT_X509_CERT_URL=
diff --git a/.gitignore b/.gitignore
index 39d3969..e2db108 100644
--- a/.gitignore
+++ b/.gitignore
@@ -48,3 +48,11 @@ anaylyze
.vscode
# Sentry Config File
.env.sentry-build-plugin
+
+service-worker*.js
+service-worker*.js.map
+swe-worker-development.js
+workbox-*.js
+workbox-*.js.map
+sw.js
+sw.js.*
diff --git a/components.json b/components.json
index 4a9e7e2..984aad0 100644
--- a/components.json
+++ b/components.json
@@ -6,7 +6,7 @@
"tailwind": {
"config": "tailwind.config.ts",
"css": "src/styles/globals.css",
- "baseColor": "zinc",
+ "baseColor": "neutral",
"cssVariables": true,
"prefix": ""
},
diff --git a/env.d.ts b/env.d.ts
new file mode 100644
index 0000000..2aa14e8
--- /dev/null
+++ b/env.d.ts
@@ -0,0 +1,34 @@
+declare global {
+ namespace NodeJS {
+ interface ProcessEnv {
+ NODE_ENV: 'development' | 'test' | 'production';
+ NEXT_PUBLIC_FIREBASE_API_KEY: string;
+ NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN: string;
+ NEXT_PUBLIC_FIREBASE_PROJECT_ID: string;
+ NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET: string;
+ NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID: string;
+ NEXT_PUBLIC_FIREBASE_APP_ID: string;
+ NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID: string;
+ NEXT_PUBLIC_GOOGLE_MAPS_API_KEY: string;
+ NEXT_PUBLIC_GOOGLE_MAPS_MAP_ID: string;
+ LIVEBLOCKS_API_KEY_PROD: string;
+ LIVEBLOCKS_API_KEY_DEV: string;
+ DISCORD_ID: string;
+ GITHUB_TOKEN: string;
+ WAKA_TIME_API_KEY: string;
+ SPOTIFY_CLIENT_ID: string;
+ SPOTIFY_CLIENT_SECRET: string;
+ SPOTIFY_REFRESH_TOKEN: string;
+ UMAMI_API_KEY: string;
+ SENTRY_AUTH_TOKEN: string;
+ NEXT_PUBLIC_GCP_PROJECT_ID: string;
+ NEXT_PUBLIC_GCP_PRIVATE_KEY_ID: string;
+ NEXT_PUBLIC_GCP_PRIVATE_KEY: string;
+ NEXT_PUBLIC_GCP_CLIENT_EMAIL: string;
+ NEXT_PUBLIC_GCP_CLIENT_ID: string;
+ NEXT_PUBLIC_GCP_CLIENT_X509_CERT_URL: string;
+ }
+ }
+}
+
+export {};
diff --git a/next.config.mjs b/next.config.mjs
index 1ff4194..2ed8997 100644
--- a/next.config.mjs
+++ b/next.config.mjs
@@ -1,4 +1,3 @@
-import './src/env.js';
import pwa from '@ducanh2912/next-pwa';
import MillionLint from '@million/lint';
import withBundleAnalyzer from '@next/bundle-analyzer';
@@ -17,7 +16,6 @@ const withPwa = pwa({
*/
const config = {
reactStrictMode: true,
- // Removed the compiler.removeConsole option
logging: {
fetches: {
fullUrl: true,
@@ -31,10 +29,14 @@ const config = {
{ protocol: 'https', hostname: 'encrypted-tbn0.gstatic.com' },
{ protocol: 'https', hostname: 'avatars.githubusercontent.com' },
{ protocol: 'https', hostname: 'github.com' },
+ { protocol: 'https', hostname: 'api.lanyard.rest' },
+ { protocol: 'https', hostname: 'i.scdn.co' },
+ { protocol: 'https', hostname: 'cdn.discordapp.com' },
],
},
experimental: {
optimizeCss: { preload: true },
+ swcMinify: true,
turbo: {
rules: {
'*.svg': {
diff --git a/package.json b/package.json
index 7f77900..ec45e50 100644
--- a/package.json
+++ b/package.json
@@ -9,7 +9,6 @@
"analyze:server": "cross-env BUNDLE_ANALYZE=server next build",
"build": "next build",
"dev": "next dev",
- "format": "prettier '**/*.{json,ts,tsx}' --write && git add .",
"gen": "graphql-codegen --config codegen.yml",
"lint": "bunx biome check --write ./ || true && bunx stylelint src/styles/**/*.{css,scss,sass} --fix",
"start": "next start",
@@ -46,7 +45,9 @@
"@radix-ui/react-dropdown-menu": "^2.1.1",
"@radix-ui/react-icons": "^1.3.0",
"@radix-ui/react-label": "^2.1.0",
+ "@radix-ui/react-scroll-area": "^1.1.0",
"@radix-ui/react-slot": "^1.1.0",
+ "@radix-ui/react-tabs": "^1.1.0",
"@radix-ui/react-tooltip": "^1.1.2",
"@sentry/nextjs": "8",
"@sentry/types": "^8.30.0",
diff --git a/public/assets/fonts/Kodchasan-Bold.ttf b/public/assets/fonts/Kodchasan-Bold.ttf
new file mode 100644
index 0000000..cd36ffc
Binary files /dev/null and b/public/assets/fonts/Kodchasan-Bold.ttf differ
diff --git a/public/assets/fonts/Kodchasan-BoldItalic.ttf b/public/assets/fonts/Kodchasan-BoldItalic.ttf
new file mode 100644
index 0000000..f86a715
Binary files /dev/null and b/public/assets/fonts/Kodchasan-BoldItalic.ttf differ
diff --git a/public/assets/fonts/Kodchasan-ExtraLight.ttf b/public/assets/fonts/Kodchasan-ExtraLight.ttf
new file mode 100644
index 0000000..af416d2
Binary files /dev/null and b/public/assets/fonts/Kodchasan-ExtraLight.ttf differ
diff --git a/public/assets/fonts/Kodchasan-ExtraLightItalic.ttf b/public/assets/fonts/Kodchasan-ExtraLightItalic.ttf
new file mode 100644
index 0000000..3478406
Binary files /dev/null and b/public/assets/fonts/Kodchasan-ExtraLightItalic.ttf differ
diff --git a/public/assets/fonts/Kodchasan-Italic.ttf b/public/assets/fonts/Kodchasan-Italic.ttf
new file mode 100644
index 0000000..3032d77
Binary files /dev/null and b/public/assets/fonts/Kodchasan-Italic.ttf differ
diff --git a/public/assets/fonts/Kodchasan-Light.ttf b/public/assets/fonts/Kodchasan-Light.ttf
new file mode 100644
index 0000000..b3db128
Binary files /dev/null and b/public/assets/fonts/Kodchasan-Light.ttf differ
diff --git a/public/assets/fonts/Kodchasan-LightItalic.ttf b/public/assets/fonts/Kodchasan-LightItalic.ttf
new file mode 100644
index 0000000..5acfdd5
Binary files /dev/null and b/public/assets/fonts/Kodchasan-LightItalic.ttf differ
diff --git a/public/assets/fonts/Kodchasan-Medium.ttf b/public/assets/fonts/Kodchasan-Medium.ttf
new file mode 100644
index 0000000..de8f843
Binary files /dev/null and b/public/assets/fonts/Kodchasan-Medium.ttf differ
diff --git a/public/assets/fonts/Kodchasan-MediumItalic.ttf b/public/assets/fonts/Kodchasan-MediumItalic.ttf
new file mode 100644
index 0000000..2c0cb1e
Binary files /dev/null and b/public/assets/fonts/Kodchasan-MediumItalic.ttf differ
diff --git a/public/assets/fonts/Kodchasan-Regular.ttf b/public/assets/fonts/Kodchasan-Regular.ttf
new file mode 100644
index 0000000..b6cb5d5
Binary files /dev/null and b/public/assets/fonts/Kodchasan-Regular.ttf differ
diff --git a/public/assets/fonts/Kodchasan-SemiBold.ttf b/public/assets/fonts/Kodchasan-SemiBold.ttf
new file mode 100644
index 0000000..917a988
Binary files /dev/null and b/public/assets/fonts/Kodchasan-SemiBold.ttf differ
diff --git a/public/assets/fonts/Kodchasan-SemiBoldItalic.ttf b/public/assets/fonts/Kodchasan-SemiBoldItalic.ttf
new file mode 100644
index 0000000..36d3579
Binary files /dev/null and b/public/assets/fonts/Kodchasan-SemiBoldItalic.ttf differ
diff --git a/public/assets/fonts/OFL.txt b/public/assets/fonts/OFL.txt
new file mode 100644
index 0000000..49f445a
--- /dev/null
+++ b/public/assets/fonts/OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2018 The Kodchasan Project Authors (https://github.com/cadsondemak/Kodchasan)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/public/assets/images/image.png b/public/assets/images/image.png
deleted file mode 100644
index ed38964..0000000
Binary files a/public/assets/images/image.png and /dev/null differ
diff --git a/public/sw.js.map b/public/sw.js.map
index d37c2e6..6397684 100644
--- a/public/sw.js.map
+++ b/public/sw.js.map
@@ -1 +1 @@
-{"version":3,"file":"sw.js","sources":["../../../AppData/Local/Temp/d93d44eb5f1f4cec191f976d158b5372/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from 'C:/Users/airwo/Documents/GitHub/portfolio/node_modules/workbox-routing/registerRoute.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from 'C:/Users/airwo/Documents/GitHub/portfolio/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {NetworkOnly as workbox_strategies_NetworkOnly} from 'C:/Users/airwo/Documents/GitHub/portfolio/node_modules/workbox-strategies/NetworkOnly.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from 'C:/Users/airwo/Documents/GitHub/portfolio/node_modules/workbox-core/clientsClaim.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\nimportScripts(\n \n);\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n\nworkbox_routing_registerRoute(\"/\", new workbox_strategies_NetworkFirst({ \"cacheName\":\"start-url\", plugins: [{ cacheWillUpdate: async ({ response: e })=>e && \"opaqueredirect\" === e.type ? new Response(e.body, { status: 200, statusText: \"OK\", headers: e.headers }) : e }] }), 'GET');\nworkbox_routing_registerRoute(/.*/i, new workbox_strategies_NetworkOnly({ \"cacheName\":\"dev\", plugins: [] }), 'GET');\n\n\n\n\n"],"names":["importScripts","self","skipWaiting","workbox_core_clientsClaim","workbox_routing_registerRoute","workbox_strategies_NetworkFirst","plugins","cacheWillUpdate","response","e","type","Response","body","status","statusText","headers","workbox_strategies_NetworkOnly"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAa,EAEZ,CAAA;EAQDC,CAAI,CAAA,CAAA,CAAA,CAACC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA;AAElBC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAyB,EAAE,CAAA;AAI3BC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAA6B,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAIC,oBAA+B,CAAC,CAAA;EAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;EAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,EAAE,CAAC,CAAA;GAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAe,EAAE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;EAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,EAAEC,CAAAA;AAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAGA,CAAAA,CAAAA,CAAAA,CAAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,KAAKA,CAAC,CAACC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAIC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAACF,CAAC,CAACG,IAAI,CAAE,CAAA,CAAA;EAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAM,EAAE,CAAG,CAAA,CAAA,CAAA;EAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAU,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA;QAAEC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAEN,CAAC,CAACM,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA;EAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAC,GAAGN,CAAAA;KAAG,CAAA;AAAE,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAA;AACxRL,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAA6B,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAIY,mBAA8B,CAAC,CAAA;EAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA;EAAEV,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,EAAE,CAAA,CAAA;EAAG,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA;;"}
\ No newline at end of file
+{"version":3,"file":"sw.js","sources":["../../../AppData/Local/Temp/23f127a526b596b2acf5cf10337a5ea5/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from 'C:/Users/airwo/Documents/GitHub/portfolio/node_modules/workbox-routing/registerRoute.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from 'C:/Users/airwo/Documents/GitHub/portfolio/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {NetworkOnly as workbox_strategies_NetworkOnly} from 'C:/Users/airwo/Documents/GitHub/portfolio/node_modules/workbox-strategies/NetworkOnly.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from 'C:/Users/airwo/Documents/GitHub/portfolio/node_modules/workbox-core/clientsClaim.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\nimportScripts(\n \n);\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n\nworkbox_routing_registerRoute(\"/\", new workbox_strategies_NetworkFirst({ \"cacheName\":\"start-url\", plugins: [{ cacheWillUpdate: async ({ response: e })=>e && \"opaqueredirect\" === e.type ? new Response(e.body, { status: 200, statusText: \"OK\", headers: e.headers }) : e }] }), 'GET');\nworkbox_routing_registerRoute(/.*/i, new workbox_strategies_NetworkOnly({ \"cacheName\":\"dev\", plugins: [] }), 'GET');\n\n\n\n\n"],"names":["importScripts","self","skipWaiting","workbox_core_clientsClaim","workbox_routing_registerRoute","workbox_strategies_NetworkFirst","plugins","cacheWillUpdate","response","e","type","Response","body","status","statusText","headers","workbox_strategies_NetworkOnly"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAa,EAEZ,CAAA;EAQDC,CAAI,CAAA,CAAA,CAAA,CAACC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA;AAElBC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAyB,EAAE,CAAA;AAI3BC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAA6B,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAIC,oBAA+B,CAAC,CAAA;EAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;EAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,EAAE,CAAC,CAAA;GAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAe,EAAE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;EAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,EAAEC,CAAAA;AAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAGA,CAAAA,CAAAA,CAAAA,CAAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,KAAKA,CAAC,CAACC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAIC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAACF,CAAC,CAACG,IAAI,CAAE,CAAA,CAAA;EAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAM,EAAE,CAAG,CAAA,CAAA,CAAA;EAAEC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAU,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA;QAAEC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAEN,CAAC,CAACM,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA;EAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAC,GAAGN,CAAAA;KAAG,CAAA;AAAE,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAA;AACxRL,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAA6B,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAIY,mBAA8B,CAAC,CAAA;EAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA;EAAEV,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAO,EAAE,CAAA,CAAA;EAAG,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA;;"}
\ No newline at end of file
diff --git a/src/app/(routes)/about/page.tsx b/src/app/(routes)/about/page.tsx
index 30eb8cd..3c4167b 100644
--- a/src/app/(routes)/about/page.tsx
+++ b/src/app/(routes)/about/page.tsx
@@ -1,10 +1,98 @@
+'use client';
+
import Layout from '@/components/layout/Layout';
-export default function Page() {
+import { Button } from '@/components/ui/button';
+import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
+import { Github, Linkedin, Mail } from 'lucide-react';
+import Image from 'next/image';
+
+export default function AboutPage() {
return (
- <>
-
- <>>
-
- >
+
+
+
+
+
+
+
+
Mike Odnis
+
+ I am an ambitious and driven undergraduate Computer Science student specializing
+ in web development and programming. With a solid foundation in various programming
+ languages and frameworks, I craft beautiful, user-friendly websites and
+ applications. As a quick learner and first-generation student, I take pride in my
+ achievements and aim to be a well-rounded addition to any team.
+
+
+
+
+
+
+
+
+
+
+
+ Skills
+
+
+
+
JavaScript, TypeScript, Python, Java, C++, C#
+
React, Next.js, Node.js, Express.js, Angular
+
HTML, CSS, SCSS, Tailwind CSS
+
Database Management (SQL, MongoDB)
+
DevOps (Docker, CI/CD)
+
UI/UX Design (Figma)
+
+
+
+
+
+ Education & Certifications
+
+
+
B.S. in Computer Science
+
Farmingdale State College
+
Expected: May 2026
+
+
Google Data Analytics Certification
+
Advanced Google Data Analytics
+
Google Analytics Certification
+
CodePath Advanced Web Development
+
+
+
+
+
+
+
+
);
}
diff --git a/src/app/(routes)/dashboard/page.tsx b/src/app/(routes)/dashboard/page.tsx
index 30eb8cd..c5fbde3 100644
--- a/src/app/(routes)/dashboard/page.tsx
+++ b/src/app/(routes)/dashboard/page.tsx
@@ -1,10 +1,24 @@
+import Discord from '@/components/Discord';
+import Stats from '@/components/Stats';
+import Footer from '@/components/layout/Footer';
import Layout from '@/components/layout/Layout';
-export default function Page() {
+
+export default function DashboardPage() {
return (
- <>
-
- <>>
-
- >
+
+
+
+
+
Dashboard
+
+ Random stats and stuff related to me.
+
+
+
+
+
+
+
+
);
}
diff --git a/src/app/(routes)/guesbook/page.tsx b/src/app/(routes)/guesbook/page.tsx
deleted file mode 100644
index 30eb8cd..0000000
--- a/src/app/(routes)/guesbook/page.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import Layout from '@/components/layout/Layout';
-export default function Page() {
- return (
- <>
-
- <>>
-
- >
- );
-}
diff --git a/src/app/(routes)/guestbook/page.tsx b/src/app/(routes)/guestbook/page.tsx
new file mode 100644
index 0000000..9d0d165
--- /dev/null
+++ b/src/app/(routes)/guestbook/page.tsx
@@ -0,0 +1,21 @@
+import GuestbookComponent from '@/components/Guestbook';
+import Footer from '@/components/layout/Footer';
+import Layout from '@/components/layout/Layout';
+
+export default function GuestbookPage() {
+ return (
+
+
+
+
Guestbook
+
+ Leave a message for me and other visitors here! It can be anything - appreciation,
+ criticism, or just a random message. Just be nice!
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(routes)/links/page.tsx b/src/app/(routes)/links/page.tsx
index 30eb8cd..a161df0 100644
--- a/src/app/(routes)/links/page.tsx
+++ b/src/app/(routes)/links/page.tsx
@@ -1,10 +1,57 @@
+'use client';
+
+import Footer from '@/components/layout/Footer';
import Layout from '@/components/layout/Layout';
-export default function Page() {
+import { Button } from '@/components/ui/button';
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
+import { ScrollArea } from '@/components/ui/scroll-area';
+import { links } from '@/lib/links';
+import { motion } from 'framer-motion';
+
+const MotionButton = motion(Button);
+
+export default function LinksPage() {
return (
- <>
-
- <>>
-
- >
+
+
+
+
+ My Links
+
+ Connect with me on various platforms
+
+
+
+
+
- It seems you've searched for a term that's not in our MediGlossary database yet. Don't
- worry, medical knowledge is always expanding, and so are we. Let's get you back to the
- main page where you can look up other medical terms or suggest this one for addition.
-
+ <>
+
+
+
+
+
+
+
-
+
- <>
-
- >
-
+ >
);
};
diff --git a/src/app/page.tsx b/src/app/page.tsx
index e036b70..eb5e7d4 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -1,46 +1,44 @@
+import BlurryBlob from '@/components/animation/background/blurry-blob';
import PinnedRepos from '@/components/github/PinnedRepos';
import Footer from '@/components/layout/Footer';
import Layout from '@/components/layout/Layout';
-import { getPinnedRepos } from '@/lib/repos';
-import type { Repo } from '@/lib/types';
+import { DotPattern } from '@/components/magicui';
+import getRepos from '@/lib/getRepos';
import Image from 'next/image';
-async function Home() {
- const pinnedRepos = await getPinnedRepos() as Repo[];
+export default async function Home() {
+ const pinnedRepos = await getRepos();
return (
-
-
-
-
- Mike Odnis
-
-
- Undergraduate Computer Science Student
-
-
+
+
+
+
+
+
Mike Odnis
+
Undergraduate Computer Science Student
+
Passionate about web development and open source. Currently studying at Farmingdale
State College. I enjoy exploring new technologies and sharing my knowledge with the
developer community.