diff --git a/public/scripts/hover.js b/public/scripts/hover.js
index 8cc5250..609bb8d 100644
--- a/public/scripts/hover.js
+++ b/public/scripts/hover.js
@@ -1,7 +1,7 @@
/**
* Portfolio
- * Copyright (C) 2024 Maxim (https://github.com/max1mde)
- *
+ * Copyright (C) 2024 Maxim (https://github.com/max1mde/portfolio)
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation.
diff --git a/public/scripts/scroll.js b/public/scripts/scroll.js
index 9fb8655..e2e01f1 100644
--- a/public/scripts/scroll.js
+++ b/public/scripts/scroll.js
@@ -1,7 +1,7 @@
/**
* Portfolio
- * Copyright (C) 2024 Maxim (https://github.com/max1mde)
- *
+ * Copyright (C) 2024 Maxim (https://github.com/max1mde/portfolio)
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation.
diff --git a/scripts/add-headers.js b/scripts/add-headers.js
index 3472ed3..0ab3351 100644
--- a/scripts/add-headers.js
+++ b/scripts/add-headers.js
@@ -1,7 +1,7 @@
/**
* Portfolio
- * Copyright (C) 2024 Maxim (https://github.com/max1mde)
- *
+ * Copyright (C) 2024 Maxim (https://github.com/max1mde/portfolio)
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation.
@@ -11,7 +11,7 @@ const fs = require("fs").promises;
const path = require("path");
const CURRENT_YEAR = new Date().getFullYear();
-const GITHUB_LINK = "https://github.com/max1mde";
+const GITHUB_LINK = "https://github.com/max1mde/portfolio";
function createLicenseHeader(year) {
return `/**
@@ -40,7 +40,7 @@ function hasLicenseHeader(content, licenseHeader) {
};
const contentStripped = stripYear(
- content.split("\n").slice(0, 10).join("\n")
+ content.split("\n").slice(0, 10).join("\n"),
);
const headerStripped = stripYear(licenseHeader);
@@ -53,18 +53,15 @@ async function processFile(filePath) {
const existingYear = extractCopyrightYear(content);
const licenseHeader = createLicenseHeader(CURRENT_YEAR);
-
if (!hasLicenseHeader(content, licenseHeader)) {
-
if (existingYear && existingYear !== CURRENT_YEAR) {
const updatedContent = content.replace(
/Copyright \(C\) \d{4}/,
- `Copyright (C) ${CURRENT_YEAR}`
+ `Copyright (C) ${CURRENT_YEAR}`,
);
await fs.writeFile(filePath, updatedContent);
console.log(`Updated copyright year in: ${filePath}`);
} else {
-
await fs.writeFile(filePath, licenseHeader + content);
console.log(`Added license header to: ${filePath}`);
}
@@ -82,7 +79,6 @@ async function addLicenseHeaders(dir) {
const stat = await fs.stat(fullPath);
if (stat.isDirectory()) {
-
const skipDirs = ["node_modules", ".next", ".git", "dist", "build"];
if (!skipDirs.includes(file)) {
await addLicenseHeaders(fullPath);
@@ -98,7 +94,6 @@ async function addLicenseHeaders(dir) {
}
}
-
addLicenseHeaders(process.cwd())
.then(() => console.log("License header processing complete"))
.catch(console.error);
diff --git a/src/app/api/contact/route.js b/src/app/api/contact/route.js
index b90d4f8..cd5fdcf 100644
--- a/src/app/api/contact/route.js
+++ b/src/app/api/contact/route.js
@@ -1,6 +1,6 @@
/**
* Portfolio
- * Copyright (C) 2024 Maxim (https://github.com/max1mde)
+ * Copyright (C) 2024 Maxim (https://github.com/max1mde/portfolio)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
diff --git a/src/app/contact/page.js b/src/app/contact/page.js
index 6db8f15..676dcf9 100644
--- a/src/app/contact/page.js
+++ b/src/app/contact/page.js
@@ -1,7 +1,7 @@
/**
* Portfolio
- * Copyright (C) 2024 Maxim (https://github.com/max1mde)
- *
+ * Copyright (C) 2024 Maxim (https://github.com/max1mde/portfolio)
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation.
diff --git a/src/app/home/page.js b/src/app/home/page.js
index b92dc40..113e282 100644
--- a/src/app/home/page.js
+++ b/src/app/home/page.js
@@ -1,6 +1,6 @@
/**
* Portfolio
- * Copyright (C) 2024 Maxim (https://github.com/max1mde)
+ * Copyright (C) 2024 Maxim (https://github.com/max1mde/portfolio)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
diff --git a/src/app/layout.js b/src/app/layout.js
index f601b6d..8cc85c8 100644
--- a/src/app/layout.js
+++ b/src/app/layout.js
@@ -1,6 +1,6 @@
/**
* Portfolio
- * Copyright (C) 2024 Maxim (https://github.com/max1mde)
+ * Copyright (C) 2024 Maxim (https://github.com/max1mde/portfolio)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
@@ -17,7 +17,6 @@ import Script from "next/script";
import CustomCursor from "@/components/custom/cursor";
import Footer from "@/components/custom/footer";
-import Head from "next/head";
const deliusFont = localFont({
src: "./fonts/DeliusSwashCaps-Regular.ttf",
@@ -53,10 +52,6 @@ export default function RootLayout({ children }) {
return (
-
-
-
-
@@ -66,6 +61,7 @@ export default function RootLayout({ children }) {
{children}
+
);
diff --git a/src/app/privacy/page.js b/src/app/privacy/page.js
index 4272ff0..4a44568 100644
--- a/src/app/privacy/page.js
+++ b/src/app/privacy/page.js
@@ -1,7 +1,7 @@
/**
* Portfolio
- * Copyright (C) 2024 Maxim (https://github.com/max1mde)
- *
+ * Copyright (C) 2024 Maxim (https://github.com/max1mde/portfolio)
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation.
diff --git a/src/app/projects/page.js b/src/app/projects/page.js
index a89feea..f21240a 100644
--- a/src/app/projects/page.js
+++ b/src/app/projects/page.js
@@ -1,6 +1,6 @@
/**
* Portfolio
- * Copyright (C) 2024 Maxim (https://github.com/max1mde)
+ * Copyright (C) 2024 Maxim (https://github.com/max1mde/portfolio)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
@@ -8,7 +8,7 @@
*/
"use client";
-import { Card } from "@/components/custom/card";
+import { Card } from "@/components/custom/card/card";
import { useState, useEffect, useRef } from "react";
import config from "/CONFIG.json";
diff --git a/src/components/custom/action_buttons.jsx b/src/components/custom/action_buttons.jsx
index c989be9..cbc6fd1 100644
--- a/src/components/custom/action_buttons.jsx
+++ b/src/components/custom/action_buttons.jsx
@@ -1,7 +1,7 @@
/**
* Portfolio
- * Copyright (C) 2024 Maxim (https://github.com/max1mde)
- *
+ * Copyright (C) 2024 Maxim (https://github.com/max1mde/portfolio)
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation.
diff --git a/src/components/custom/card.jsx b/src/components/custom/card.jsx
deleted file mode 100644
index 85a9daa..0000000
--- a/src/components/custom/card.jsx
+++ /dev/null
@@ -1,181 +0,0 @@
-/**
- * Portfolio
- * Copyright (C) 2024 Maxim (https://github.com/max1mde)
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation.
- */
-"use client";
-
-import * as React from "react";
-import { useState, useEffect } from "react";
-import { cn } from "@/lib/utils";
-
-const Card = React.forwardRef(
- (
- {
- className,
- title,
- description,
- buttonText,
- buttonURL,
- imageSRC = "/images/projects/placeholder.png",
- setHovered,
- allHovered = false,
- badges = [],
- ...props
- },
- ref,
- ) => {
- const [loaded, setLoaded] = useState(false);
- const [isHovered, setIsHovered] = useState(false);
-
- const handleCardHover = (hovered) => {
- setIsHovered(hovered);
- if (setHovered) {
- setHovered(hovered);
- }
- };
-
- useEffect(() => {
- if (imageSRC) {
- const handleImageLoad = () => {
- setLoaded(true);
- };
-
- const img = new Image();
- img.onload = handleImageLoad;
- img.src = imageSRC;
- }
- }, [imageSRC]);
-
- const cardClassName = cn(
- "rounded-xl border bg-card text-card-foreground shadow hover-card project-card",
- !isHovered && allHovered ? "blurred" : "",
- className,
- );
-
- const imageStyle = {
- filter: loaded ? "none" : "blur(10px)",
- transition: "filter 1s ease",
- };
-
- return (
-
+ );
+ },
+);
+Card.displayName = "Card";
+
+export { Card };
diff --git a/src/components/custom/card/card_badges.jsx b/src/components/custom/card/card_badges.jsx
new file mode 100644
index 0000000..73ddc97
--- /dev/null
+++ b/src/components/custom/card/card_badges.jsx
@@ -0,0 +1,29 @@
+/**
+ * Portfolio
+ * Copyright (C) 2024 Maxim (https://github.com/max1mde/portfolio)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation.
+ */
+
+"use client";
+
+import * as React from "react";
+
+export const CardBadges = ({ badges = [] }) => {
+ return (
+
+ {badges.map((badge, index) => (
+
+ ))}
+
+ );
+};
+
+CardBadges.displayName = "CardBadges";
diff --git a/src/components/custom/card/card_image.jsx b/src/components/custom/card/card_image.jsx
new file mode 100644
index 0000000..2f2313d
--- /dev/null
+++ b/src/components/custom/card/card_image.jsx
@@ -0,0 +1,71 @@
+/**
+ * Portfolio
+ * Copyright (C) 2024 Maxim (https://github.com/max1mde/portfolio)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation.
+ */
+
+"use client";
+
+import * as React from "react";
+import { useState, useEffect } from "react";
+import { cn } from "@/lib/utils";
+
+export const CardImage = React.forwardRef(
+ (
+ {
+ imageSRC = "/images/projects/placeholder.png",
+ title,
+ className,
+ ...props
+ },
+ ref,
+ ) => {
+ const [loaded, setLoaded] = useState(false);
+
+ useEffect(() => {
+ if (imageSRC) {
+ const handleImageLoad = () => {
+ setLoaded(true);
+ };
+
+ const img = new Image();
+ img.onload = handleImageLoad;
+ img.src = imageSRC;
+ }
+ }, [imageSRC]);
+
+ const imageStyle = {
+ filter: loaded ? "none" : "blur(10px)",
+ transition: "filter 1s ease",
+ };
+
+ return (
+
+
+
+ );
+ },
+);
+
+CardImage.displayName = "CardImage";
diff --git a/src/components/custom/contact_form.jsx b/src/components/custom/contact_form.jsx
index d30a1f9..d44642f 100644
--- a/src/components/custom/contact_form.jsx
+++ b/src/components/custom/contact_form.jsx
@@ -1,7 +1,7 @@
/**
* Portfolio
- * Copyright (C) 2024 Maxim (https://github.com/max1mde)
- *
+ * Copyright (C) 2024 Maxim (https://github.com/max1mde/portfolio)
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation.
diff --git a/src/components/custom/cursor.jsx b/src/components/custom/cursor.jsx
index 08a5b8b..65e4568 100644
--- a/src/components/custom/cursor.jsx
+++ b/src/components/custom/cursor.jsx
@@ -1,6 +1,6 @@
/**
* Portfolio
- * Copyright (C) 2024 Maxim (https://github.com/max1mde)
+ * Copyright (C) 2024 Maxim (https://github.com/max1mde/portfolio)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
diff --git a/src/components/custom/footer.jsx b/src/components/custom/footer.jsx
index 177968f..771a739 100644
--- a/src/components/custom/footer.jsx
+++ b/src/components/custom/footer.jsx
@@ -1,6 +1,6 @@
/**
* Portfolio
- * Copyright (C) 2024 Maxim (https://github.com/max1mde)
+ * Copyright (C) 2024 Maxim (https://github.com/max1mde/portfolio)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
diff --git a/src/components/custom/legal_info.jsx b/src/components/custom/legal_info.jsx
index dcbf25e..d69aa93 100644
--- a/src/components/custom/legal_info.jsx
+++ b/src/components/custom/legal_info.jsx
@@ -1,7 +1,7 @@
/**
* Portfolio
- * Copyright (C) 2024 Maxim (https://github.com/max1mde)
- *
+ * Copyright (C) 2024 Maxim (https://github.com/max1mde/portfolio)
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation.
diff --git a/src/components/custom/navbar.jsx b/src/components/custom/navbar.jsx
index eb0bcec..820d314 100644
--- a/src/components/custom/navbar.jsx
+++ b/src/components/custom/navbar.jsx
@@ -1,7 +1,7 @@
/**
* Portfolio
- * Copyright (C) 2024 Maxim (https://github.com/max1mde)
- *
+ * Copyright (C) 2024 Maxim (https://github.com/max1mde/portfolio)
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation.
@@ -36,7 +36,6 @@ export default function Navbar() {
};
}, []);
-
useEffect(() => {
setIsMobileMenuOpen(false);
}, [pathname]);
@@ -84,9 +83,7 @@ export default function Navbar() {
{renderNavLinks()}
-