diff --git a/.github/agents/code-review.agent.md b/.github/agents/code-review.agent.md
new file mode 100644
index 00000000..d4bbfd28
--- /dev/null
+++ b/.github/agents/code-review.agent.md
@@ -0,0 +1,38 @@
+---
+name: "Code Review"
+description: "Portfolio code quality reviewer. Use when reviewing TypeScript/React code, checking for duplication, validating component structure, enforcing architecture patterns, or running the portfolio quality checklist."
+tools: [read, search, todo]
+model: "Claude Sonnet 4.5 (copilot)"
+argument-hint: "File, folder, or area to review (e.g. 'components/blog', 'app/api', 'hooks')"
+---
+
+# Portfolio Code Reviewer
+
+You are a focused, systematic code quality reviewer for the ColdByDefault portfolio codebase (Next.js 16, React 19, TypeScript strict mode, App Router, Prisma 7, next-intl 4).
+
+## What You Do
+
+Run the full quality checklist from `.github/instructions/portfolio.check.instructions.md` against the requested scope. Report findings as a structured list — do **not** apply fixes. The developer applies fixes manually after review.
+
+## Review Order
+
+1. **Duplication** — identical/near-identical components, hooks, types, data structures, API logic
+2. **Architecture conformance** — folder layout, separation of concerns, barrel exports (follow `.github/instructions/portfolio.latest.instructions.md`)
+3. **TypeScript** — zero `any`, proper types, no implicit `unknown`
+4. **React patterns** — no sync `setState` in `useEffect`, no nested ``, no duplicate `id` attrs
+5. **Dead code** — unused exports, unreachable branches, commented-out blocks
+6. **i18n** — `useTranslations` used correctly, no hardcoded user-facing strings
+
+## Output Format
+
+For each finding:
+
+```
+[SEVERITY] Category: description
+ File: path/to/file.ts (line N)
+ Suggestion: one-line fix hint
+```
+
+Severities: `[HIGH]` breaks functionality or security · `[MEDIUM]` degrades quality · `[LOW]` cleanup
+
+Finish with a summary: counts per severity and overall health assessment.
diff --git a/.github/agents/security-audit.agent.md b/.github/agents/security-audit.agent.md
new file mode 100644
index 00000000..e2e568f4
--- /dev/null
+++ b/.github/agents/security-audit.agent.md
@@ -0,0 +1,87 @@
+---
+name: "Security Audit"
+description: "Portfolio security auditor. Use when auditing the codebase for OWASP Top 10 vulnerabilities, checking API route authentication, reviewing session/cookie handling, validating input sanitisation, or inspecting admin access controls."
+tools: [read, search, todo]
+model: "Claude Sonnet 4.5 (copilot)"
+argument-hint: "Scope to audit (e.g. 'app/api', 'proxy.ts', 'lib/security.ts', or 'full')"
+---
+
+# Portfolio Security Auditor
+
+You are a security-focused reviewer for the ColdByDefault portfolio. The stack is Next.js 16 App Router, TypeScript strict mode, Prisma 7 (Neon/PostgreSQL), stateless HMAC-SHA256 admin sessions stored in `PORTFOLIO_ADMIN_SESSION` cookie. Deployed on Vercel.
+
+## Scope Reference
+
+Key security-sensitive files:
+
+- `proxy.ts` — admin route protection, HMAC session verification
+- `lib/security.ts` — shared security utilities
+- `app/api/admin/**` — admin CRUD endpoints
+- `app/api/chatbot/**` — user-facing AI endpoint
+- `next.config.ts` — security headers, cache policy
+
+## Audit Checklist (OWASP Top 10)
+
+### A01 – Broken Access Control
+
+- [ ] All `/admin` routes protected by `hasValidAdminSession` in proxy
+- [ ] API routes that mutate data verify session independently (not just via proxy)
+- [ ] No sensitive data leaked in error responses
+
+### A02 – Cryptographic Failures
+
+- [ ] HMAC secret loaded from `process.env.ADMIN_SECRET` (never hardcoded)
+- [ ] `timingSafeEqual` used for HMAC comparison (no timing attacks)
+- [ ] No sensitive values logged
+
+### A03 – Injection
+
+- [ ] All Prisma queries use parameterised inputs (no raw string interpolation)
+- [ ] User-supplied slugs sanitised before DB query
+- [ ] No `eval`, `Function()`, or dynamic `require` on user input
+
+### A04 – Insecure Design
+
+- [ ] Session tokens are stateless and expire (check `expiresAt` in token)
+- [ ] No IP binding (EU compliance)
+
+### A05 – Security Misconfiguration
+
+- [ ] Security headers present: `X-Frame-Options`, `X-Content-Type-Options`, `Referrer-Policy`, `Permissions-Policy`, `Content-Security-Policy`
+- [ ] Admin and email-rewrite API routes have `no-store` cache override in `next.config.ts`
+- [ ] No `.env` values exposed to the client bundle
+
+### A06 – Vulnerable Components
+
+- [ ] Note any `npm audit` findings (run `npm audit --audit-level=moderate`)
+
+### A07 – Authentication Failures
+
+- [ ] Session cookie is `HttpOnly`, `Secure`, `SameSite=Strict`
+- [ ] Login brute-force: rate limiting on `/api/admin/` login endpoint
+
+### A08 – Software & Data Integrity
+
+- [ ] No unsigned redirects that accept arbitrary `callbackUrl` params
+
+### A09 – Logging Failures
+
+- [ ] Errors logged server-side without exposing stack traces to client
+
+### A10 – SSRF
+
+- [ ] Any outbound fetch uses a fixed base URL (not user-supplied)
+
+## Output Format
+
+```
+[CRITICAL] A0X – description
+ File: path/to/file.ts (line N)
+ Risk: what an attacker could do
+ Fix: one-line remediation hint
+
+[WARNING] ...
+[INFO] ...
+```
+
+Finish with a summary table: OWASP category → status (✅ Pass / ⚠️ Warning / ❌ Fail).
diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
new file mode 100644
index 00000000..9686da63
--- /dev/null
+++ b/.github/copilot-instructions.md
@@ -0,0 +1,47 @@
+# ColdByDefault Portfolio — Copilot Instructions
+
+## Stack
+
+| | |
+| ---------- | ------------------------------------------------------------------------------------------------------------ |
+| Framework | Next.js 16.2.4, App Router, Turbopack (`dev`), Webpack (`build`) |
+| Language | TypeScript strict mode, React 19 |
+| Styling | Tailwind CSS, Shadcn UI (`components/ui/` — do not modify) |
+| i18n | next-intl 4.11.0 · locales: `en`, `de`, `es`, `fr`, `sv` · messages in `messages/` |
+| Database | Prisma 7.8.0, WASM query engine, `@prisma/adapter-pg`, Neon PostgreSQL |
+| Auth | Stateless HMAC-SHA256 tokens in `PORTFOLIO_ADMIN_SESSION` cookie — no server-side session state, no NextAuth |
+| Proxy | `proxy.ts` at root (Next.js 16 renamed `middleware.ts` → `proxy.ts`) |
+| Deployment | Vercel · `coldbydefault.com` |
+
+## Key Rules
+
+- **No `middleware.ts`** — the proxy file is `proxy.ts`
+- **No NextAuth / `getServerSession`** — auth is `createAdminSession()` / `hasValidAdminSession()` in `proxy.ts`
+- **No IP binding in sessions** — EU privacy compliance
+- **No leaf-level `loading.tsx`** — one per route group covers all children: `(legals)`, `(live-tools)`, `(media)`, `admin`
+- **No hardcoded user-facing text** — always use `useTranslations()` from next-intl
+- **No `any` types** — use `unknown` or proper types
+- **No overengineering** — don't add abstractions for single-use logic
+
+## Real Scripts (`package.json`)
+
+```
+npm run dev # next dev --turbopack
+npm run build # next build --webpack
+npm run lint # eslint .
+npm run lint:fix # eslint . --fix
+npm run typecheck # tsc --noEmit
+npm run db:migrate # prisma migrate deploy
+npm run db:seed # tsx prisma/seed.ts
+```
+
+> `npm run test`, `npm run analyze`, `npm run type-check` do **not** exist.
+
+## Folder Conventions
+
+- `components/[Feature]/index.ts` — barrel export, always present
+- `types/` — all TypeScript types (global, never inside component folders)
+- `hooks/` — global hooks only (`use-chatbot`, `use-client`, `use-mobile`)
+- `data/` — static data, no runtime fetching
+- `lib/` — shared utilities, security helpers, blog-admin logic
+- `app/api/` — API routes; admin routes verified independently of proxy
diff --git a/.github/skills/i18n-checker/SKILL.md b/.github/skills/i18n-checker/SKILL.md
new file mode 100644
index 00000000..a1010de1
--- /dev/null
+++ b/.github/skills/i18n-checker/SKILL.md
@@ -0,0 +1,69 @@
+---
+name: i18n-checker
+description: "Portfolio i18n validator. Use when checking translation completeness, finding missing keys across locales, verifying key parity between en/de/es/fr/sv, or auditing hardcoded strings in components."
+argument-hint: "Key path to check (e.g. 'About.badge') or leave blank for full parity audit"
+---
+
+# i18n Key Checker
+
+Validates translation completeness across all 5 locales in the portfolio: `en`, `de`, `es`, `fr`, `sv`.
+
+## When to Use
+
+- After adding new translation keys to `messages/en.json`
+- Before a release, to catch missing translations
+- When a locale shows `[missing key]` at runtime
+- To find hardcoded user-facing strings in components
+
+## Locales
+
+| File | Locale |
+| ------------------ | ------------------------- |
+| `messages/en.json` | English (source of truth) |
+| `messages/de.json` | German |
+| `messages/es.json` | Spanish |
+| `messages/fr.json` | French |
+| `messages/sv.json` | Swedish |
+
+## Procedure
+
+### Full Parity Audit
+
+1. Read all 5 message files.
+2. Flatten each JSON to a list of dot-notation key paths (e.g. `About.badge`, `Nav.links.0`).
+3. Compare every key in `en.json` against the other 4 locales.
+4. Report keys present in `en` but missing from each locale.
+
+### Single Key Check
+
+1. Read all 5 message files.
+2. Look up the provided key path in each locale.
+3. Report which locales have it and which are missing.
+
+### Hardcoded String Audit
+
+1. Search `components/` and `app/` for JSX text nodes and `aria-label` / `title` / `placeholder` attributes that contain plain English strings (not `{t("...")}` calls).
+2. Report file + line for each finding.
+
+## Output Format
+
+**Missing keys report:**
+
+```
+Missing in DE (3):
+ - About.currentFocusItems
+ - Services.cta.label
+ - Blog.emptyState
+
+Missing in FR (1):
+ - Blog.emptyState
+```
+
+**Hardcoded strings report:**
+
+```
+[HARDCODED] components/hero/Hero.tsx line 42
+ "Get in touch" → should use t("Hero.cta") or similar
+```
+
+Finish with: total key count in `en.json`, parity percentage per locale.
diff --git a/.github/skills/portfolio-architecture/SKILL.md b/.github/skills/portfolio-architecture/SKILL.md
new file mode 100644
index 00000000..0c6431eb
--- /dev/null
+++ b/.github/skills/portfolio-architecture/SKILL.md
@@ -0,0 +1,64 @@
+---
+name: portfolio-architecture
+description: "Portfolio codebase explorer. Use when starting a new task and needing codebase context, understanding folder layout, finding where a feature lives, mapping data flow, or onboarding to the project structure."
+argument-hint: "Area to explore (e.g. 'blog', 'admin', 'auth', 'i18n') or leave blank for full overview"
+---
+
+# Portfolio Architecture Explorer
+
+Produces a concise structural summary of the ColdByDefault portfolio to orient work in the correct files.
+
+## When to Use
+
+- Starting a new feature and unsure where code lives
+- Tracing data flow from UI → hook → API → DB
+- Finding the right file before searching or editing
+
+## Stack Snapshot
+
+| Layer | Technology |
+| ---------- | ---------------------------------------------------------------- |
+| Framework | Next.js 16.2.4, App Router, Turbopack |
+| UI | React 19, TypeScript strict, Tailwind CSS, Shadcn UI |
+| i18n | next-intl 4.11.0 · 5 locales: `en`, `de`, `es`, `fr`, `sv` |
+| Database | Prisma 7.8.0, Neon PostgreSQL, WASM query engine |
+| Auth | Stateless HMAC-SHA256 tokens in `PORTFOLIO_ADMIN_SESSION` cookie |
+| Proxy | `proxy.ts` (Next.js 16 renamed from `middleware.ts`) |
+| Deployment | Vercel |
+
+## Folder Map
+
+```
+app/ Next.js App Router pages
+ (legals)/ Route group — legal pages (impressum, privacy)
+ (live-tools)/ Route group — interactive tools
+ (media)/ Route group — content pages (about, blog, projects, services)
+ admin/ Protected admin dashboard
+ api/ API routes (admin, blog, chatbot, github, email-rewrite, speed-insight)
+ booking-confirmed/ Post-booking confirmation page
+
+components/ All UI components
+ ui/ Shadcn UI primitives (do not modify)
+ visuals/ Motion background, loading skeletons
+ [feature]/ Each feature has its own folder with index.ts barrel
+
+data/ Static data (no runtime fetching)
+ configs/ App-level config objects
+ hubs/ Feature-specific static data
+ main/ Core data (certs, skills, etc.)
+
+hooks/ Global React hooks (use-chatbot, use-client, use-mobile)
+i18n/ next-intl request config
+lib/ Shared utilities, security, blog admin helpers
+messages/ Translation JSON files (en/de/es/fr/sv)
+prisma/ Schema, migrations, seed
+public/assets/ Static assets (images, icons, use-cases)
+types/ Global TypeScript types
+```
+
+## Procedure
+
+1. If a specific area is given, `search` for files matching that feature in `app/`, `components/`, `lib/`, `hooks/`, `data/`.
+2. Read the barrel `index.ts` for the relevant component folder.
+3. Trace the data path: `data/` or `lib/hubs/` → hook or API route → component.
+4. Return a compact summary: relevant files, their roles, and where to start editing.
diff --git a/.github/workflows/bump-version.yml b/.github/workflows/bump-version.yml
new file mode 100644
index 00000000..f28e42ba
--- /dev/null
+++ b/.github/workflows/bump-version.yml
@@ -0,0 +1,50 @@
+name: Bump Version on Merge
+
+on:
+ push:
+ branches:
+ - main
+
+permissions:
+ contents: write
+
+jobs:
+ bump-version:
+ name: Bump patch version
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ token: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: 22
+
+ - name: Configure Git
+ run: |
+ git config user.name "github-actions[bot]"
+ git config user.email "github-actions[bot]@users.noreply.github.com"
+
+ - name: Bump patch version
+ id: bump
+ run: |
+ NEW_VERSION=$(npm version patch --no-git-tag-version)
+ echo "new_version=$NEW_VERSION" >> "$GITHUB_OUTPUT"
+
+ - name: Update version in README
+ run: |
+ CLEAN_VERSION="${{ steps.bump.outputs.new_version }}"
+ CLEAN_VERSION="${CLEAN_VERSION#v}"
+ sed -i "s/# ColdByDefault Portfolio · V[0-9]\+\.[0-9]\+\.[0-9]\+/# ColdByDefault Portfolio · V${CLEAN_VERSION}/" README.md
+
+ - name: Commit and tag
+ run: |
+ git add package.json package-lock.json README.md
+ git commit -m "chore: bump version to ${{ steps.bump.outputs.new_version }} [skip ci]"
+ git tag "${{ steps.bump.outputs.new_version }}"
+ git push origin main --tags
diff --git a/.gitignore b/.gitignore
index b52e0205..dac5795c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -40,3 +40,4 @@ portfolio.latest.instructions.md
portfolio.check.instructions.md
/lib/generated/prisma
desktop.ini
+TODO.md
diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 00000000..f784206b
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,158 @@
+# ColdByDefault Portfolio — Agent Instructions
+
+This file provides context for AI coding agents working in this repository.
+See also `.github/copilot-instructions.md` for the VS Code Copilot-specific version.
+
+---
+
+## Project Overview
+
+Personal portfolio of Yazan Abo-Ayash (ColdByDefault). Deployed at `coldbydefault.com` on Vercel.
+Features: blog, projects, services, about, live tools (email rewriter, ROI calculator), admin dashboard, AI chatbot.
+
+---
+
+## Stack
+
+| Layer | Technology |
+| ---------- | ------------------------------------------------------------------------ |
+| Framework | Next.js 16.2.4, App Router, Turbopack (dev), Webpack (build) |
+| Language | TypeScript 5 strict mode, React 19 |
+| Styling | Tailwind CSS v4, Shadcn UI (`components/ui/` — never modify) |
+| i18n | next-intl 4.11.0 · 5 locales: `en`, `de`, `es`, `fr`, `sv` |
+| Database | Prisma 7.8.0, WASM query engine, `@prisma/adapter-pg`, Neon PostgreSQL |
+| Auth | Stateless HMAC-SHA256 tokens — no NextAuth, no server-side session state |
+| Proxy | `proxy.ts` (root) — Next.js 16 renamed `middleware.ts` to `proxy.ts` |
+| Deployment | Vercel |
+
+---
+
+## Folder Map
+
+```
+app/ Next.js App Router
+ (legals)/ Route group — impressum, privacy
+ (live-tools)/ Route group — polite-email, rio-calculator
+ (media)/ Route group — about, about-portfolio, blog, projects, services
+ admin/ Protected admin dashboard (blog management, chatbot config)
+ api/ API routes
+ admin/ Admin CRUD (auth-gated independently of proxy)
+ blog/ Public blog API
+ chatbot/ AI chatbot endpoint
+ email-rewrite/ Email rewriter (live tool)
+ github/ GitHub stats
+ speed-insight/ Vercel Speed Insights proxy
+ booking-confirmed/ Post-booking page
+
+components/ All UI — one folder per feature, always has index.ts barrel
+ ui/ Shadcn UI primitives (DO NOT EDIT)
+ visuals/ Motion background, loading skeletons, CentralizedLoading
+ blog/ cer/ chatbot/ ... Feature components
+
+data/ Static data only — no runtime fetching
+hooks/ Global React hooks: use-chatbot, use-client, use-mobile
+i18n/ next-intl request config
+lib/ Shared utilities, security helpers, blog-admin logic
+messages/ Translation JSON: en.json de.json es.json fr.json sv.json
+prisma/ schema.prisma, migrations/, seed.ts
+proxy.ts Route protection + locale redirect (NOT middleware.ts)
+types/ All TypeScript types — global, never inside component folders
+public/assets/ Images, icons, use-case visuals
+.github/
+ agents/ Custom VS Code Copilot agents
+ instructions/ Auto-loaded instructions for .ts/.tsx files
+ skills/ On-demand skills (i18n-checker, portfolio-architecture)
+ workflows/ GitHub Actions (bump-version, codeql, dependency-review)
+ copilot-instructions.md VS Code Copilot always-on context
+ CODEOWNERS All files owned by @ColdByDefault
+```
+
+---
+
+## Authentication
+
+- Cookie name: `PORTFOLIO_ADMIN_SESSION`
+- Format: `{randomId}.{expiresAt}.{hmacSig}`
+- Functions: `createAdminSession()` and `hasValidAdminSession(request)` in `proxy.ts`
+- `invalidateAdminSession()` is a no-op — logout is handled by cookie deletion
+- **No IP binding** — EU privacy compliance
+- Admin API routes (`app/api/admin/**`) re-verify the session independently of the proxy
+
+---
+
+## Hard Rules
+
+1. **`proxy.ts` not `middleware.ts`** — Next.js 16 renamed it; never create `middleware.ts`
+2. **No NextAuth** — do not suggest `getServerSession`, `authOptions`, or any NextAuth import
+3. **No `any`** — use `unknown` or proper types in all TypeScript
+4. **No hardcoded user-facing text** — all strings via `useTranslations()` from next-intl
+5. **No leaf `loading.tsx`** — group-level files cover all children; don't add per-page ones
+6. **No overengineering** — no abstractions, helpers, or HOCs for single-use logic
+7. **Shadcn UI is read-only** — never edit files inside `components/ui/`
+8. **Types stay global** — never define types or hooks inside component folders
+
+---
+
+## Valid Scripts
+
+```bash
+npm run dev # next dev --turbopack
+npm run build # next build --webpack
+npm run lint # eslint .
+npm run lint:fix # eslint . --fix
+npm run typecheck # tsc --noEmit
+npm run db:migrate # prisma migrate deploy
+npm run db:seed # tsx prisma/seed.ts
+npm run db:generate # prisma generate
+```
+
+**These do NOT exist:** `npm run test`, `npm run analyze`, `npm run type-check`
+
+---
+
+## Database
+
+- ORM: Prisma 7 with WASM query engine
+- Adapter: `@prisma/adapter-pg` (Neon serverless)
+- Schema: `prisma/schema.prisma`
+- Always use parameterised Prisma queries — no `$queryRaw` with string interpolation
+- `prisma generate` runs automatically via `postinstall`
+
+---
+
+## i18n
+
+- Source of truth: `messages/en.json`
+- All 5 locales must have key parity
+- Use `useTranslations("Namespace")` in client components
+- Use `getTranslations("Namespace")` in server components / route handlers
+
+---
+
+## Component Conventions
+
+```
+components/[Feature]/
+├── index.ts # Barrel export — required
+├── Feature.tsx # Main UI component
+├── Feature.logic.ts # Business logic (optional)
+├── Feature.utils.ts # Utilities (optional)
+└── Feature.constants.ts # Constants (optional)
+```
+
+- Types → `types/`
+- Hooks → `hooks/`
+- Static data → `data/`
+- Shared utilities → `lib/`
+
+---
+
+## CI / GitHub Actions
+
+| Workflow | Trigger | Purpose |
+| ----------------------- | -------------------- | ----------------------------------------------------------------- |
+| `bump-version.yml` | push to `main` | Bumps patch version in `package.json` + `README.md`, tags release |
+| `codeql.yml` | push / PR / schedule | CodeQL security analysis |
+| `dependency-review.yml` | PR | Dependency vulnerability check |
+
+The bump workflow commits with `[skip ci]` to prevent loops.
diff --git a/app/(legals)/impressum/loading.tsx b/app/(legals)/impressum/loading.tsx
deleted file mode 100644
index aede1d90..00000000
--- a/app/(legals)/impressum/loading.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
-
-import { CentralizedLoading } from "@/components/visuals";
-
-export default function ImpressumLoading() {
- return (
-
- );
-}
diff --git a/app/(legals)/impressum/page.tsx b/app/(legals)/impressum/page.tsx
index 78710486..bd07090e 100644
--- a/app/(legals)/impressum/page.tsx
+++ b/app/(legals)/impressum/page.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { Separator } from "@/components/ui/separator";
@@ -99,7 +100,9 @@ export default async function Impressum() {
{t("vat.description")}
- {t("vat.value")} Will be provided soon
+
+ {t("vat.value")} Will be provided soon
+
diff --git a/app/(legals)/layout.tsx b/app/(legals)/layout.tsx
index 432f79b0..f03e92df 100644
--- a/app/(legals)/layout.tsx
+++ b/app/(legals)/layout.tsx
@@ -1,8 +1,8 @@
/**
- * Legals Route Group Layout - Layout for legal pages (privacy, impressum, terms)
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import type { Metadata } from "next";
import { getLocale } from "next-intl/server";
diff --git a/app/(legals)/loading.tsx b/app/(legals)/loading.tsx
index a2d39379..40fe4553 100644
--- a/app/(legals)/loading.tsx
+++ b/app/(legals)/loading.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import { CentralizedLoading } from "@/components/visuals";
diff --git a/app/(legals)/privacy/loading.tsx b/app/(legals)/privacy/loading.tsx
deleted file mode 100644
index 6b3f1460..00000000
--- a/app/(legals)/privacy/loading.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
-
-import { CentralizedLoading } from "@/components/visuals";
-
-export default function PrivacyLoading() {
- return (
-
- );
-}
diff --git a/app/(legals)/privacy/page.tsx b/app/(legals)/privacy/page.tsx
index f571d380..84b5deaa 100644
--- a/app/(legals)/privacy/page.tsx
+++ b/app/(legals)/privacy/page.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
diff --git a/app/(live-tools)/layout.tsx b/app/(live-tools)/layout.tsx
index e3e95023..f03e92df 100644
--- a/app/(live-tools)/layout.tsx
+++ b/app/(live-tools)/layout.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import type { Metadata } from "next";
import { getLocale } from "next-intl/server";
diff --git a/app/(live-tools)/loading.tsx b/app/(live-tools)/loading.tsx
index c8d96a15..9910c5d3 100644
--- a/app/(live-tools)/loading.tsx
+++ b/app/(live-tools)/loading.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import { CentralizedLoading } from "@/components/visuals";
diff --git a/app/(live-tools)/polite-email/loading.tsx b/app/(live-tools)/polite-email/loading.tsx
deleted file mode 100644
index e774b34d..00000000
--- a/app/(live-tools)/polite-email/loading.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
-
-import { CentralizedLoading } from "@/components/visuals";
-
-export default function ImpressumLoading() {
- return (
-
- );
-}
diff --git a/app/(live-tools)/polite-email/page.tsx b/app/(live-tools)/polite-email/page.tsx
index f9a1f593..d5213b00 100644
--- a/app/(live-tools)/polite-email/page.tsx
+++ b/app/(live-tools)/polite-email/page.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import { EmailRewriter } from "@/components/live-tools/polite-email/email-rewriter";
diff --git a/app/(live-tools)/rio-calculator/loading.tsx b/app/(live-tools)/rio-calculator/loading.tsx
deleted file mode 100644
index 4bbeb9ff..00000000
--- a/app/(live-tools)/rio-calculator/loading.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
-
-import { CentralizedLoading } from "@/components/visuals";
-
-export default function ImpressumLoading() {
- return (
-
- );
-}
diff --git a/app/(live-tools)/rio-calculator/page.tsx b/app/(live-tools)/rio-calculator/page.tsx
index 6b51b1eb..58da1692 100644
--- a/app/(live-tools)/rio-calculator/page.tsx
+++ b/app/(live-tools)/rio-calculator/page.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/app/(media)/about-portfolio/loading.tsx b/app/(media)/about-portfolio/loading.tsx
deleted file mode 100644
index 5ee1195f..00000000
--- a/app/(media)/about-portfolio/loading.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
-
-import { CentralizedLoading } from "@/components/visuals";
-
-export default function AboutLoading() {
- return (
-
- );
-}
diff --git a/app/(media)/about-portfolio/page.tsx b/app/(media)/about-portfolio/page.tsx
index cc44a590..d555f007 100644
--- a/app/(media)/about-portfolio/page.tsx
+++ b/app/(media)/about-portfolio/page.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import { Separator } from "@/components/ui/separator";
import {
@@ -36,7 +37,6 @@ export default function PortfolioDocumentation() {
-
{/* Technical Documentation Notice */}
diff --git a/app/(media)/about/loading.tsx b/app/(media)/about/loading.tsx
deleted file mode 100644
index 8c8f06ee..00000000
--- a/app/(media)/about/loading.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
-
-import { CentralizedLoading } from "@/components/visuals";
-
-export default function AboutLoading() {
- return (
-
- );
-}
diff --git a/app/(media)/about/page.tsx b/app/(media)/about/page.tsx
index eb8ecc79..3c3e9e0a 100644
--- a/app/(media)/about/page.tsx
+++ b/app/(media)/about/page.tsx
@@ -1,35 +1,18 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
import { Badge } from "@/components/ui/badge";
import { Card } from "@/components/ui/card";
-//import { Card, CardContent } from "@/components/ui/card";
import { Background } from "@/components/visuals/motion-background";
import type { AboutTranslations } from "@/types/configs/i18n";
import Image from "next/image";
-//import { motion } from "framer-motion";
import { useTranslations } from "next-intl";
-// Animation variants
-/* const fadeInUp = {
- hidden: { opacity: 0, y: 20 },
- visible: { opacity: 1, y: 0 },
-}; */
-
-/* const staggerChildren = {
- hidden: { opacity: 0 },
- visible: {
- opacity: 1,
- transition: {
- staggerChildren: 0.1,
- },
- },
-}; */
-
export default function AboutPage() {
const t = useTranslations("About");
const light = "from-black/90 to-gray-500";
@@ -93,65 +76,6 @@ export default function AboutPage() {
-
- {/* Philosophy Section */}
- {/*
-
-
-
-
- {t("philosophy")}
-
-
- {t("myApproach")}
-
-
- {t("sections.philosophy")}
-
-
-
-
-
-
-
-
-
-
-
-
- {t("whatIDeliver")}
-
-
-
- {getCurrentFocusItems().map((focus: string, index: number) => (
-
-
- {focus}
-
-
- ))}
-
-
-
- */}
);
diff --git a/app/(media)/blog/[slug]/page.tsx b/app/(media)/blog/[slug]/page.tsx
index e223856a..4329131b 100644
--- a/app/(media)/blog/[slug]/page.tsx
+++ b/app/(media)/blog/[slug]/page.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2025 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import { notFound } from "next/navigation";
import { BlogView, BlogBreadcrumb } from "@/components/blog";
diff --git a/app/(media)/blog/loading.tsx b/app/(media)/blog/loading.tsx
deleted file mode 100644
index 00fddb03..00000000
--- a/app/(media)/blog/loading.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
-
-import { CentralizedLoading } from "@/components/visuals";
-
-export default function BlogLoading() {
- return (
-
- );
-}
diff --git a/app/(media)/blog/page.tsx b/app/(media)/blog/page.tsx
index 237541ea..bfd11706 100644
--- a/app/(media)/blog/page.tsx
+++ b/app/(media)/blog/page.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import { BlogPageClient } from "@/components/blog";
import { getBlogs } from "@/lib/hubs/blogs";
@@ -10,7 +11,7 @@ export default async function BlogsPage() {
let blogs: Awaited>["blogs"] = [];
try {
- const result = await getBlogs();
+ const result = await getBlogs({ published: true });
blogs = result.blogs;
} catch (error) {
console.error("Failed to load blogs:", error);
diff --git a/app/(media)/layout.tsx b/app/(media)/layout.tsx
index bf314ae3..e8f6b0b0 100644
--- a/app/(media)/layout.tsx
+++ b/app/(media)/layout.tsx
@@ -1,8 +1,8 @@
/**
- * Media Route Group Layout - Layout for media section pages (about, blog, projects, library)
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import type { Metadata } from "next";
import { getLocale } from "next-intl/server";
diff --git a/app/(media)/loading.tsx b/app/(media)/loading.tsx
index 5dcc5c7e..f8933edb 100644
--- a/app/(media)/loading.tsx
+++ b/app/(media)/loading.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import { CentralizedLoading } from "@/components/visuals";
diff --git a/app/(media)/projects/loading.tsx b/app/(media)/projects/loading.tsx
deleted file mode 100644
index 3087011f..00000000
--- a/app/(media)/projects/loading.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
-
-import { CentralizedLoading } from "@/components/visuals";
-
-export default function MediaLoading() {
- return (
-
- );
-}
diff --git a/app/(media)/projects/page.tsx b/app/(media)/projects/page.tsx
index bea684ec..af613a66 100644
--- a/app/(media)/projects/page.tsx
+++ b/app/(media)/projects/page.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
"use client";
diff --git a/app/(media)/services/loading.tsx b/app/(media)/services/loading.tsx
deleted file mode 100644
index 148df399..00000000
--- a/app/(media)/services/loading.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * Services Page Loading State
- * @author ColdByDefault
- * @copyright 2025 ColdByDefault. All Rights Reserved.
-*/
-
-import { CentralizedLoading } from "@/components/visuals";
-
-export default function ServicesLoading() {
- return (
-
- );
-}
diff --git a/app/(media)/services/page.tsx b/app/(media)/services/page.tsx
index e608eef4..d4f1c6af 100644
--- a/app/(media)/services/page.tsx
+++ b/app/(media)/services/page.tsx
@@ -1,8 +1,8 @@
/**
- * Services Page
- * @author ColdByDefault
- * @copyright 2025 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/app/admin/blocked/page.tsx b/app/admin/blocked/page.tsx
index ba870a89..f1e41954 100644
--- a/app/admin/blocked/page.tsx
+++ b/app/admin/blocked/page.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
import { Shield } from "lucide-react";
diff --git a/app/admin/blog/layout.tsx b/app/admin/blog/layout.tsx
index e91a6ba4..a4a51af6 100644
--- a/app/admin/blog/layout.tsx
+++ b/app/admin/blog/layout.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
import type { Metadata } from "next";
@@ -8,7 +9,7 @@ import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Blog Admin - Portfolio",
description: "Blog management dashboard",
- robots: "noindex, nofollow",
+ robots: "noindex, nofollow",
};
export default function AdminBlogLayout({
diff --git a/app/admin/blog/loading.tsx b/app/admin/blog/loading.tsx
deleted file mode 100644
index fe1bcdc4..00000000
--- a/app/admin/blog/loading.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
- */
-
-import { CentralizedLoading } from "@/components/visuals";
-
-
-export default function AdminBlogLoading() {
- return (
-
- );
-}
diff --git a/app/admin/blog/page.tsx b/app/admin/blog/page.tsx
index 39fb8bd7..b8b15bf7 100644
--- a/app/admin/blog/page.tsx
+++ b/app/admin/blog/page.tsx
@@ -1,7 +1,9 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
+
"use client";
import React from "react";
@@ -126,7 +128,7 @@ export default function AdminBlogPage() {
onDelete={(blogId: string) => void deleteBlog(blogId)}
onToggleStatus={(
blogId: string,
- action: "publish" | "unpublish" | "feature" | "unfeature"
+ action: "publish" | "unpublish" | "feature" | "unfeature",
) => void toggleBlogStatus(blogId, action)}
loading={loading}
/>
diff --git a/app/admin/chatbot/page.tsx b/app/admin/chatbot/page.tsx
index 286ad4bd..8b5df660 100644
--- a/app/admin/chatbot/page.tsx
+++ b/app/admin/chatbot/page.tsx
@@ -1,8 +1,9 @@
/**
- * Admin ChatBot Logs Page
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
+
"use client";
import React, { useState, useEffect, useCallback } from "react";
diff --git a/app/admin/loading.tsx b/app/admin/loading.tsx
index fa95a03a..a4580395 100644
--- a/app/admin/loading.tsx
+++ b/app/admin/loading.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
import { CentralizedLoading } from "@/components/visuals";
diff --git a/app/api/about/route.ts b/app/api/about/route.ts
index 847a0916..6407a241 100644
--- a/app/api/about/route.ts
+++ b/app/api/about/route.ts
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
import type { NextRequest } from "next/server";
diff --git a/app/api/admin/blog/route.ts b/app/api/admin/blog/route.ts
index 5ce5fde5..27e5761f 100644
--- a/app/api/admin/blog/route.ts
+++ b/app/api/admin/blog/route.ts
@@ -1,7 +1,7 @@
/**
- * Blog Admin API Route
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
import type { NextRequest } from "next/server";
@@ -94,16 +94,14 @@ function createAdminContext(request: NextRequest): AdminContext {
};
}
+function setAdminSessionCookie(response: NextResponse): void {
+ const sessionToken = createAdminSession();
-function setAdminSessionCookie(response: NextResponse, clientIP: string): void {
- // Create cryptographically secure session
- const sessionId = createAdminSession(clientIP);
-
- response.cookies.set("PORTFOLIO_ADMIN_SESSION", sessionId, {
+ response.cookies.set("PORTFOLIO_ADMIN_SESSION", sessionToken, {
httpOnly: true,
secure: process.env.NODE_ENV === "production",
sameSite: "strict",
- maxAge: 60 * 60 * 8,
+ maxAge: 60 * 60 * 8,
path: "/",
});
}
@@ -236,7 +234,7 @@ export async function GET(
// Set session cookie on successful authentication
if (!request.cookies.get("PORTFOLIO_ADMIN_SESSION")) {
- setAdminSessionCookie(response, clientIP);
+ setAdminSessionCookie(response);
}
return response;
diff --git a/app/api/admin/chatbot/logs/route.ts b/app/api/admin/chatbot/logs/route.ts
index d6e03acf..db18b313 100644
--- a/app/api/admin/chatbot/logs/route.ts
+++ b/app/api/admin/chatbot/logs/route.ts
@@ -1,7 +1,7 @@
/**
- * Admin API - ChatBot Logs Endpoint
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
import type { NextRequest } from "next/server";
diff --git a/app/api/blog/[slug]/route.ts b/app/api/blog/[slug]/route.ts
index 4d094d85..54fa7cad 100644
--- a/app/api/blog/[slug]/route.ts
+++ b/app/api/blog/[slug]/route.ts
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2025 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
import type { NextRequest } from "next/server";
diff --git a/app/api/blog/route.ts b/app/api/blog/route.ts
index 739dcb51..596bc9cb 100644
--- a/app/api/blog/route.ts
+++ b/app/api/blog/route.ts
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
import type { NextRequest } from "next/server";
diff --git a/app/api/chatbot/route.ts b/app/api/chatbot/route.ts
index 9da91b80..8d510aee 100644
--- a/app/api/chatbot/route.ts
+++ b/app/api/chatbot/route.ts
@@ -1,7 +1,7 @@
/**
- * ChatBot API Route with Groq AI Integration
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
import type { NextRequest } from "next/server";
diff --git a/app/api/email-rewrite/analyze/route.ts b/app/api/email-rewrite/analyze/route.ts
index 10610b05..d6eb43f6 100644
--- a/app/api/email-rewrite/analyze/route.ts
+++ b/app/api/email-rewrite/analyze/route.ts
@@ -1,7 +1,9 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
+
import type { NextRequest } from "next/server";
import { NextResponse } from "next/server";
import { z } from "zod";
diff --git a/app/api/email-rewrite/remaining/route.ts b/app/api/email-rewrite/remaining/route.ts
index bf3c66d9..e9bf2937 100644
--- a/app/api/email-rewrite/remaining/route.ts
+++ b/app/api/email-rewrite/remaining/route.ts
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
import { headers } from "next/headers";
diff --git a/app/api/email-rewrite/rewriter/route.ts b/app/api/email-rewrite/rewriter/route.ts
index af257559..1b2b96e2 100644
--- a/app/api/email-rewrite/rewriter/route.ts
+++ b/app/api/email-rewrite/rewriter/route.ts
@@ -1,7 +1,7 @@
/**
- * Email Rewriter API Route with Groq AI Integration
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
import type { NextRequest } from "next/server";
diff --git a/app/api/github/route.ts b/app/api/github/route.ts
index bc3b549b..62a20e99 100644
--- a/app/api/github/route.ts
+++ b/app/api/github/route.ts
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
import type { NextRequest } from "next/server";
diff --git a/app/api/speed-insight/route.ts b/app/api/speed-insight/route.ts
index a5509a71..7d1ed6ec 100644
--- a/app/api/speed-insight/route.ts
+++ b/app/api/speed-insight/route.ts
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
import { NextResponse } from "next/server";
diff --git a/app/booking-confirmed/loading.tsx b/app/booking-confirmed/loading.tsx
index 2cd99088..2a8f5328 100644
--- a/app/booking-confirmed/loading.tsx
+++ b/app/booking-confirmed/loading.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import { CentralizedLoading } from "@/components/visuals";
diff --git a/app/booking-confirmed/page.tsx b/app/booking-confirmed/page.tsx
index 4596874c..7c4587f4 100644
--- a/app/booking-confirmed/page.tsx
+++ b/app/booking-confirmed/page.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
@@ -19,7 +20,7 @@ const ClientBackground = dynamic(
{
loading: () => null,
ssr: false,
- }
+ },
);
export default function BookingConfirmedPage() {
diff --git a/app/global-error.tsx b/app/global-error.tsx
index 35d9b45e..6a5a1c20 100644
--- a/app/global-error.tsx
+++ b/app/global-error.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/app/globals.css b/app/globals.css
index df26ba55..8424484d 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -1,7 +1,8 @@
-/*
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+/**
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
@import "tailwindcss";
@import "tw-animate-css";
diff --git a/app/layout.tsx b/app/layout.tsx
index f0da2517..e689aacb 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -6,9 +6,9 @@
/**
* @file /app/layout.tsx
* @created 2024-12-31 23:00:00
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
- *
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*
* @see @link https://www.coldbydefault.com for the live website.
*/
diff --git a/app/loading.tsx b/app/loading.tsx
index 8c8e6697..73a91b57 100644
--- a/app/loading.tsx
+++ b/app/loading.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import { CentralizedLoading } from "@/components/visuals";
diff --git a/app/not-found.tsx b/app/not-found.tsx
index ce83c4a3..fc779ffb 100644
--- a/app/not-found.tsx
+++ b/app/not-found.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/app/page.tsx b/app/page.tsx
index 3e00213f..d3a0ccbc 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
import { HomeContent } from "@/components/hero";
diff --git a/app/robots.ts b/app/robots.ts
index ff6ad9f0..e909a49f 100644
--- a/app/robots.ts
+++ b/app/robots.ts
@@ -1,8 +1,8 @@
/**
- * Dynamic Robots.txt Generation
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import type { MetadataRoute } from "next";
@@ -13,7 +13,18 @@ export default function robots(): MetadataRoute.Robots {
rules: [
{
userAgent: "*",
- allow: ["/", "/about", "/blog", "/library", "/media", "/impressum"],
+ allow: [
+ "/",
+ "/about",
+ "/services",
+ "/projects",
+ "/blog",
+ "/about-portfolio",
+ "/rio-calculator",
+ "/polite-email",
+ "/privacy",
+ "/impressum",
+ ],
disallow: [
"/admin/",
"/api/",
@@ -46,4 +57,4 @@ export default function robots(): MetadataRoute.Robots {
],
sitemap: `${baseUrl}/sitemap.xml`,
};
-}
\ No newline at end of file
+}
diff --git a/app/sitemap.ts b/app/sitemap.ts
index d0de382a..113781ff 100644
--- a/app/sitemap.ts
+++ b/app/sitemap.ts
@@ -1,9 +1,8 @@
/**
- * Dynamic Sitemap Generation
- * Automatically generates sitemap with all static and dynamic routes
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import type { MetadataRoute } from "next";
import { getBlogs } from "@/lib/hubs/blogs";
@@ -24,6 +23,18 @@ export default async function sitemap(): Promise {
changeFrequency: "monthly",
priority: 0.8,
},
+ {
+ url: `${baseUrl}/services`,
+ lastModified: new Date(),
+ changeFrequency: "monthly",
+ priority: 0.8,
+ },
+ {
+ url: `${baseUrl}/projects`,
+ lastModified: new Date(),
+ changeFrequency: "monthly",
+ priority: 0.8,
+ },
{
url: `${baseUrl}/blog`,
lastModified: new Date(),
@@ -31,17 +42,29 @@ export default async function sitemap(): Promise {
priority: 0.8,
},
{
- url: `${baseUrl}/library`,
+ url: `${baseUrl}/about-portfolio`,
lastModified: new Date(),
changeFrequency: "monthly",
priority: 0.7,
},
{
- url: `${baseUrl}/media`,
+ url: `${baseUrl}/rio-calculator`,
lastModified: new Date(),
changeFrequency: "monthly",
priority: 0.6,
},
+ {
+ url: `${baseUrl}/polite-email`,
+ lastModified: new Date(),
+ changeFrequency: "monthly",
+ priority: 0.6,
+ },
+ {
+ url: `${baseUrl}/privacy`,
+ lastModified: new Date(),
+ changeFrequency: "yearly",
+ priority: 0.3,
+ },
{
url: `${baseUrl}/impressum`,
lastModified: new Date(),
@@ -66,7 +89,7 @@ export default async function sitemap(): Promise {
lastModified: new Date(blog.updatedAt),
changeFrequency: "monthly" as const,
priority: 0.6,
- })
+ }),
);
// Combine static and dynamic routes
diff --git a/components/NoSSR.tsx b/components/NoSSR.tsx
index 54259806..6ca02020 100644
--- a/components/NoSSR.tsx
+++ b/components/NoSSR.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/components/VersionDisplay.tsx b/components/VersionDisplay.tsx
index d1bf2524..baa3bad2 100644
--- a/components/VersionDisplay.tsx
+++ b/components/VersionDisplay.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import { getPortfolioVersion } from "@/lib/utils";
diff --git a/components/aboutPortoPage/index.ts b/components/aboutPortoPage/index.ts
index 01eaedd8..0a3008bc 100644
--- a/components/aboutPortoPage/index.ts
+++ b/components/aboutPortoPage/index.ts
@@ -1,8 +1,8 @@
/**
- * About Portfolio Page Components Barrel Exports
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
export { ArchitectureDiagram } from "./portfolio-architecture";
export { PortfolioFeatures } from "./portfolio-features";
diff --git a/components/aboutPortoPage/portfolio-architecture.tsx b/components/aboutPortoPage/portfolio-architecture.tsx
index 57126ac3..9e274b4b 100644
--- a/components/aboutPortoPage/portfolio-architecture.tsx
+++ b/components/aboutPortoPage/portfolio-architecture.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import React from "react";
import {
diff --git a/components/aboutPortoPage/portfolio-features.tsx b/components/aboutPortoPage/portfolio-features.tsx
index facaa308..fbd07303 100644
--- a/components/aboutPortoPage/portfolio-features.tsx
+++ b/components/aboutPortoPage/portfolio-features.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import React from "react";
import {
diff --git a/components/aboutPortoPage/portfolio-performance.tsx b/components/aboutPortoPage/portfolio-performance.tsx
index c6da4082..8764047f 100644
--- a/components/aboutPortoPage/portfolio-performance.tsx
+++ b/components/aboutPortoPage/portfolio-performance.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import {
Card,
diff --git a/components/aboutPortoPage/portfolio-showcase.tsx b/components/aboutPortoPage/portfolio-showcase.tsx
index 0130542e..d5c9e142 100644
--- a/components/aboutPortoPage/portfolio-showcase.tsx
+++ b/components/aboutPortoPage/portfolio-showcase.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import { Badge } from "@/components/ui/badge";
import {
diff --git a/components/aboutPortoPage/portfolio-tech.tsx b/components/aboutPortoPage/portfolio-tech.tsx
index d2831eed..c5bf3cac 100644
--- a/components/aboutPortoPage/portfolio-tech.tsx
+++ b/components/aboutPortoPage/portfolio-tech.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import { Badge } from "@/components/ui/badge";
import {
diff --git a/components/aboutPortoPage/portfolio-workflow.tsx b/components/aboutPortoPage/portfolio-workflow.tsx
index 054ec4c1..9a21ded9 100644
--- a/components/aboutPortoPage/portfolio-workflow.tsx
+++ b/components/aboutPortoPage/portfolio-workflow.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import {
Card,
diff --git a/components/blog/BlogBreadcrumb.tsx b/components/blog/BlogBreadcrumb.tsx
index 1da3a0b0..36b2467e 100644
--- a/components/blog/BlogBreadcrumb.tsx
+++ b/components/blog/BlogBreadcrumb.tsx
@@ -1,8 +1,8 @@
/**
- * Blog Breadcrumb Navigation Component
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/components/blog/BlogPageClient.tsx b/components/blog/BlogPageClient.tsx
index 71e906ae..ccb97b06 100644
--- a/components/blog/BlogPageClient.tsx
+++ b/components/blog/BlogPageClient.tsx
@@ -1,8 +1,8 @@
/**
- * Client-side Blog Page with Language Filtering
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/components/blog/BlogView.tsx b/components/blog/BlogView.tsx
index ff730485..728340ad 100644
--- a/components/blog/BlogView.tsx
+++ b/components/blog/BlogView.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
"use client";
diff --git a/components/blog/BlogsList.tsx b/components/blog/BlogsList.tsx
index 37783ba5..fc8ff793 100644
--- a/components/blog/BlogsList.tsx
+++ b/components/blog/BlogsList.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/components/blog/LanguageBadge.tsx b/components/blog/LanguageBadge.tsx
index 4029a0c4..15796d6e 100644
--- a/components/blog/LanguageBadge.tsx
+++ b/components/blog/LanguageBadge.tsx
@@ -1,8 +1,8 @@
/**
- * Language Badge Component for Blog Posts
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/components/blog/LanguageFilter.tsx b/components/blog/LanguageFilter.tsx
index 002a0932..61084bf4 100644
--- a/components/blog/LanguageFilter.tsx
+++ b/components/blog/LanguageFilter.tsx
@@ -1,8 +1,8 @@
/**
- * Language Filter Component for Blog Posts
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/components/blog/dashboard/Authentication.tsx b/components/blog/dashboard/Authentication.tsx
index 0b30f165..ba31dfbb 100644
--- a/components/blog/dashboard/Authentication.tsx
+++ b/components/blog/dashboard/Authentication.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/components/blog/dashboard/BlogFilters.tsx b/components/blog/dashboard/BlogFilters.tsx
index 5dd16909..2f2ff933 100644
--- a/components/blog/dashboard/BlogFilters.tsx
+++ b/components/blog/dashboard/BlogFilters.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/components/blog/dashboard/BlogFormDialog.tsx b/components/blog/dashboard/BlogFormDialog.tsx
index 1f0c2570..ff0072dd 100644
--- a/components/blog/dashboard/BlogFormDialog.tsx
+++ b/components/blog/dashboard/BlogFormDialog.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/components/blog/dashboard/BlogsList.tsx b/components/blog/dashboard/BlogsList.tsx
index cc425580..af1e3c84 100644
--- a/components/blog/dashboard/BlogsList.tsx
+++ b/components/blog/dashboard/BlogsList.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/components/blog/dashboard/StatsOverview.tsx b/components/blog/dashboard/StatsOverview.tsx
index 41d15424..33cea24f 100644
--- a/components/blog/dashboard/StatsOverview.tsx
+++ b/components/blog/dashboard/StatsOverview.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/components/blog/dashboard/index.ts b/components/blog/dashboard/index.ts
index 6a77ae35..0e509d14 100644
--- a/components/blog/dashboard/index.ts
+++ b/components/blog/dashboard/index.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
export { StatsOverview } from "./StatsOverview";
export { BlogFilters } from "./BlogFilters";
diff --git a/components/blog/dashboard/useBlogAdmin.ts b/components/blog/dashboard/useBlogAdmin.ts
index d56364d8..aef999ce 100644
--- a/components/blog/dashboard/useBlogAdmin.ts
+++ b/components/blog/dashboard/useBlogAdmin.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
@@ -105,7 +106,7 @@ export function useBlogAdmin() {
}
return defaultMessage;
},
- []
+ [],
);
// API functions
@@ -222,7 +223,8 @@ export function useBlogAdmin() {
if (data.success) {
setIsAuthenticated(true);
setMessage("Authenticated successfully!");
- await loadData();
+ setLastRefresh(new Date());
+ // Data loading is handled by useEffects that react to isAuthenticated
}
} else {
const errorData = (await response
@@ -235,7 +237,7 @@ export function useBlogAdmin() {
} finally {
setLoading(false);
}
- }, [token, handleError, loadData, getErrorMessage]);
+ }, [token, handleError, getErrorMessage]);
const handleKeyPress = useCallback(
(event: React.KeyboardEvent): void => {
@@ -243,7 +245,7 @@ export function useBlogAdmin() {
void authenticate();
}
},
- [authenticate, loading]
+ [authenticate, loading],
);
// Form utilities
@@ -259,7 +261,7 @@ export function useBlogAdmin() {
const handleFormChange = (
field: keyof BlogFormData,
- value: string | boolean
+ value: string | boolean,
) => {
setFormData((prev) => {
const newData = { ...prev, [field]: value };
@@ -275,7 +277,7 @@ export function useBlogAdmin() {
const handleCreditsChange = (
field: keyof NonNullable,
- value: string
+ value: string,
) => {
setFormData((prev) => ({
...prev,
@@ -365,7 +367,7 @@ export function useBlogAdmin() {
if (response.ok) {
setMessage(
- `Blog ${action === "create" ? "created" : "updated"} successfully!`
+ `Blog ${action === "create" ? "created" : "updated"} successfully!`,
);
setIsCreateDialogOpen(false);
setFormData(initialFormData);
@@ -380,7 +382,7 @@ export function useBlogAdmin() {
} catch (error) {
handleError(
error,
- `Error ${action === "create" ? "creating" : "updating"} blog`
+ `Error ${action === "create" ? "creating" : "updating"} blog`,
);
} finally {
setLoading(false);
@@ -395,7 +397,7 @@ export function useBlogAdmin() {
loadData,
getFormErrorMessage,
validateForm,
- ]
+ ],
);
const deleteBlog = useCallback(
@@ -432,13 +434,13 @@ export function useBlogAdmin() {
setLoading(false);
}
},
- [isAuthenticated, token, handleError, loadData, getErrorMessage]
+ [isAuthenticated, token, handleError, loadData, getErrorMessage],
);
const toggleBlogStatus = useCallback(
async (
blogId: string,
- action: "publish" | "unpublish" | "feature" | "unfeature"
+ action: "publish" | "unpublish" | "feature" | "unfeature",
): Promise => {
if (!isAuthenticated || !token) return;
@@ -471,7 +473,7 @@ export function useBlogAdmin() {
setLoading(false);
}
},
- [isAuthenticated, token, handleError, loadData, getErrorMessage]
+ [isAuthenticated, token, handleError, loadData, getErrorMessage],
);
// Dialog handlers
@@ -521,6 +523,13 @@ export function useBlogAdmin() {
};
// Effects
+ useEffect(() => {
+ if (isAuthenticated && token) {
+ void loadStats();
+ void loadCategories();
+ }
+ }, [isAuthenticated, token, loadStats, loadCategories]);
+
useEffect(() => {
if (isAuthenticated && token) {
void loadBlogs();
diff --git a/components/blog/index.ts b/components/blog/index.ts
index c67616f6..fc4318c5 100644
--- a/components/blog/index.ts
+++ b/components/blog/index.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
export { BlogsList } from "./BlogsList";
export { BlogView } from "./BlogView";
diff --git a/components/cer/CertificationShowCase.tsx b/components/cer/CertificationShowCase.tsx
index e14f0f19..e695b894 100644
--- a/components/cer/CertificationShowCase.tsx
+++ b/components/cer/CertificationShowCase.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/components/cer/CertificationShowcase.logic.ts b/components/cer/CertificationShowcase.logic.ts
index 85120b2d..6d64b943 100644
--- a/components/cer/CertificationShowcase.logic.ts
+++ b/components/cer/CertificationShowcase.logic.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import { useState, useEffect } from "react";
import { useIsMobile } from "@/hooks/use-mobile";
diff --git a/components/cer/CertificationShowcaseDesktop.tsx b/components/cer/CertificationShowcaseDesktop.tsx
index 538a4f94..1c516cbd 100644
--- a/components/cer/CertificationShowcaseDesktop.tsx
+++ b/components/cer/CertificationShowcaseDesktop.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
import { useTranslations } from "next-intl";
diff --git a/components/cer/CertificationShowcaseMobile.tsx b/components/cer/CertificationShowcaseMobile.tsx
index e1e8abb9..48a2fe51 100644
--- a/components/cer/CertificationShowcaseMobile.tsx
+++ b/components/cer/CertificationShowcaseMobile.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
import { useTranslations } from "next-intl";
diff --git a/components/cer/index.ts b/components/cer/index.ts
index 7b8ce776..0028a4b0 100644
--- a/components/cer/index.ts
+++ b/components/cer/index.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
// Main component (orchestrator)
export { default as CertificationShowcase } from "./CertificationShowCase";
diff --git a/components/chatbot/ChatBot.constants.ts b/components/chatbot/ChatBot.constants.ts
index c5f56288..715fe8bf 100644
--- a/components/chatbot/ChatBot.constants.ts
+++ b/components/chatbot/ChatBot.constants.ts
@@ -1,7 +1,7 @@
/**
- * ChatBot Constants and Configuration
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
export const CHATBOT_CONFIG = {
diff --git a/components/chatbot/ChatBot.tsx b/components/chatbot/ChatBot.tsx
index 970dd689..16d34aff 100644
--- a/components/chatbot/ChatBot.tsx
+++ b/components/chatbot/ChatBot.tsx
@@ -1,7 +1,7 @@
/**
- * Professional Floating ChatBot Component
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
"use client";
diff --git a/components/chatbot/ChatHeader.tsx b/components/chatbot/ChatHeader.tsx
index 49e9842c..4bccf6a0 100644
--- a/components/chatbot/ChatHeader.tsx
+++ b/components/chatbot/ChatHeader.tsx
@@ -1,8 +1,8 @@
/**
- * ChatHeader Component - Chat window header with title and controls
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/components/chatbot/ChatInput.tsx b/components/chatbot/ChatInput.tsx
index de4eb682..1bb8fd2c 100644
--- a/components/chatbot/ChatInput.tsx
+++ b/components/chatbot/ChatInput.tsx
@@ -1,7 +1,7 @@
/**
- * ChatInput Component - Message input form with validation
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
"use client";
diff --git a/components/chatbot/ChatMessage.tsx b/components/chatbot/ChatMessage.tsx
index 64cfae5f..92c72519 100644
--- a/components/chatbot/ChatMessage.tsx
+++ b/components/chatbot/ChatMessage.tsx
@@ -1,8 +1,8 @@
/**
- * ChatMessage Component - Individual message display
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/components/chatbot/TypingIndicator.tsx b/components/chatbot/TypingIndicator.tsx
index 0d3cbe13..8951a701 100644
--- a/components/chatbot/TypingIndicator.tsx
+++ b/components/chatbot/TypingIndicator.tsx
@@ -1,8 +1,8 @@
/**
- * TypingIndicator Component - Shows AI thinking animation
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/components/chatbot/index.ts b/components/chatbot/index.ts
index 1614ae82..acb3f757 100644
--- a/components/chatbot/index.ts
+++ b/components/chatbot/index.ts
@@ -1,8 +1,8 @@
/**
- * ChatBot Components Barrel Exports
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
export { default as ChatBot } from "./ChatBot";
export { ChatHeader } from "./ChatHeader";
diff --git a/components/companies/CompanyBanner.tsx b/components/companies/CompanyBanner.tsx
index be7d7c3c..4ffcaedf 100644
--- a/components/companies/CompanyBanner.tsx
+++ b/components/companies/CompanyBanner.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
"use client";
diff --git a/components/companies/index.ts b/components/companies/index.ts
index a10d4a7d..fd4b2338 100644
--- a/components/companies/index.ts
+++ b/components/companies/index.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
export {
CompanyBanner,
diff --git a/components/contact/ContactSheet.tsx b/components/contact/ContactSheet.tsx
index 2071d27c..144b5009 100644
--- a/components/contact/ContactSheet.tsx
+++ b/components/contact/ContactSheet.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/components/contact/index.ts b/components/contact/index.ts
index cc1207c6..83c720d7 100644
--- a/components/contact/index.ts
+++ b/components/contact/index.ts
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
export { default as ContactSheet } from "./ContactSheet";
diff --git a/components/cookies/cookies-banner.tsx b/components/cookies/cookies-banner.tsx
index ef725e0d..ec5a1698 100644
--- a/components/cookies/cookies-banner.tsx
+++ b/components/cookies/cookies-banner.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
"use client";
diff --git a/components/cookies/index.ts b/components/cookies/index.ts
index 631bb249..ff5fc958 100644
--- a/components/cookies/index.ts
+++ b/components/cookies/index.ts
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
export { CookiesBanner } from "./cookies-banner";
diff --git a/components/footer/Footer.tsx b/components/footer/Footer.tsx
index ebc471c1..7a3a22d9 100644
--- a/components/footer/Footer.tsx
+++ b/components/footer/Footer.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
import { Links } from "@/components/footer";
diff --git a/components/footer/Links.tsx b/components/footer/Links.tsx
index b247c223..44eca162 100644
--- a/components/footer/Links.tsx
+++ b/components/footer/Links.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import Link from "next/link";
import type { ReactNode } from "react";
diff --git a/components/footer/index.ts b/components/footer/index.ts
index 5bd2ca88..b19936ca 100644
--- a/components/footer/index.ts
+++ b/components/footer/index.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
export { default as Footer } from "./Footer";
export { default as Links } from "./Links";
diff --git a/components/github/GitHubProfile.tsx b/components/github/GitHubProfile.tsx
index 289f4127..562af34f 100644
--- a/components/github/GitHubProfile.tsx
+++ b/components/github/GitHubProfile.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
"use client";
diff --git a/components/github/GitHubRepositories.tsx b/components/github/GitHubRepositories.tsx
index b6b9e928..7d1d354f 100644
--- a/components/github/GitHubRepositories.tsx
+++ b/components/github/GitHubRepositories.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/components/github/GitHubShowcase.tsx b/components/github/GitHubShowcase.tsx
index 72baf7ee..762a7df4 100644
--- a/components/github/GitHubShowcase.tsx
+++ b/components/github/GitHubShowcase.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
"use client";
diff --git a/components/github/index.ts b/components/github/index.ts
index d2851a01..5d7e5ee1 100644
--- a/components/github/index.ts
+++ b/components/github/index.ts
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
export { default as GitHubShowcase } from "./GitHubShowcase";
diff --git a/components/hero/Hero.tsx b/components/hero/Hero.tsx
index 884dcdd8..9e8c0788 100644
--- a/components/hero/Hero.tsx
+++ b/components/hero/Hero.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
@@ -16,10 +17,9 @@ function Hero() {
const light = "from-black/90 to-gray-500";
return (
-
@@ -85,7 +85,7 @@ function Hero() {
-
+
);
}
diff --git a/components/hero/HomeContent.tsx b/components/hero/HomeContent.tsx
index 8f863666..a2561169 100644
--- a/components/hero/HomeContent.tsx
+++ b/components/hero/HomeContent.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
"use client";
@@ -94,7 +95,7 @@ export default function HomeContent() {
{/* Main content section */}
-
+
{/* Content Container */}
{/* PageSpeed Insights Section */}
diff --git a/components/hero/HomeTranslatedSections.tsx b/components/hero/HomeTranslatedSections.tsx
index aabf4729..cf994881 100644
--- a/components/hero/HomeTranslatedSections.tsx
+++ b/components/hero/HomeTranslatedSections.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
"use client";
diff --git a/components/hero/index.ts b/components/hero/index.ts
index eea4bbc5..072390cd 100644
--- a/components/hero/index.ts
+++ b/components/hero/index.ts
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
export { default as Hero } from "./Hero";
diff --git a/components/languages/index.ts b/components/languages/index.ts
index c4872b70..a97f1995 100644
--- a/components/languages/index.ts
+++ b/components/languages/index.ts
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
export { default as LanguageSwitcher } from "./language-switcher";
diff --git a/components/languages/language-switcher.tsx b/components/languages/language-switcher.tsx
index a69dad68..ff6c84fd 100644
--- a/components/languages/language-switcher.tsx
+++ b/components/languages/language-switcher.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
"use client";
diff --git a/components/languages/locale-auto-detect.tsx b/components/languages/locale-auto-detect.tsx
index 698c9c78..24b8969d 100644
--- a/components/languages/locale-auto-detect.tsx
+++ b/components/languages/locale-auto-detect.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
"use client";
diff --git a/components/live-tools/polite-email/analysis-result.tsx b/components/live-tools/polite-email/analysis-result.tsx
index ffc03861..793baf30 100644
--- a/components/live-tools/polite-email/analysis-result.tsx
+++ b/components/live-tools/polite-email/analysis-result.tsx
@@ -1,7 +1,9 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
+
"use client";
import { Button } from "@/components/ui/button";
diff --git a/components/live-tools/polite-email/context-input.tsx b/components/live-tools/polite-email/context-input.tsx
index f46052eb..9462a274 100644
--- a/components/live-tools/polite-email/context-input.tsx
+++ b/components/live-tools/polite-email/context-input.tsx
@@ -1,7 +1,9 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
+
"use client";
import { Textarea } from "@/components/ui/textarea";
import { MAX_CONTEXT_LENGTH } from "@/data/live-tools/email-rewriter";
diff --git a/components/live-tools/polite-email/email-result.tsx b/components/live-tools/polite-email/email-result.tsx
index bd1ece1e..912b5791 100644
--- a/components/live-tools/polite-email/email-result.tsx
+++ b/components/live-tools/polite-email/email-result.tsx
@@ -1,7 +1,9 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
+
"use client";
import { Button } from "@/components/ui/button";
diff --git a/components/live-tools/polite-email/email-rewriter.tsx b/components/live-tools/polite-email/email-rewriter.tsx
index 61281023..fd837775 100644
--- a/components/live-tools/polite-email/email-rewriter.tsx
+++ b/components/live-tools/polite-email/email-rewriter.tsx
@@ -1,7 +1,9 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
+
"use client";
import { useState, useEffect } from "react";
diff --git a/components/live-tools/polite-email/index.ts b/components/live-tools/polite-email/index.ts
index 6785ddb1..eded051b 100644
--- a/components/live-tools/polite-email/index.ts
+++ b/components/live-tools/polite-email/index.ts
@@ -1,4 +1,6 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
+
diff --git a/components/live-tools/polite-email/mode-selector.tsx b/components/live-tools/polite-email/mode-selector.tsx
index 4e04ae93..f2705280 100644
--- a/components/live-tools/polite-email/mode-selector.tsx
+++ b/components/live-tools/polite-email/mode-selector.tsx
@@ -1,7 +1,9 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
+
"use client";
import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs";
diff --git a/components/live-tools/polite-email/tone-selector.tsx b/components/live-tools/polite-email/tone-selector.tsx
index ab416623..72b43b1c 100644
--- a/components/live-tools/polite-email/tone-selector.tsx
+++ b/components/live-tools/polite-email/tone-selector.tsx
@@ -1,7 +1,9 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
+
"use client";
import { Label } from "@/components/ui/label";
diff --git a/components/live-tools/rio/calculator-logic.ts b/components/live-tools/rio/calculator-logic.ts
index ca3a251e..a8dadc4b 100644
--- a/components/live-tools/rio/calculator-logic.ts
+++ b/components/live-tools/rio/calculator-logic.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import type {
CalculatorInputs,
diff --git a/components/live-tools/rio/calculator.tsx b/components/live-tools/rio/calculator.tsx
index 3bff0244..535d84c3 100644
--- a/components/live-tools/rio/calculator.tsx
+++ b/components/live-tools/rio/calculator.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
import type React from "react";
diff --git a/components/live-tools/rio/index.ts b/components/live-tools/rio/index.ts
index 1fc33049..caee838f 100644
--- a/components/live-tools/rio/index.ts
+++ b/components/live-tools/rio/index.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
export { default as ROICalculator } from "./calculator";
export { calculateROI, formatCurrency } from "./calculator-logic";
diff --git a/components/nav/Navbar.tsx b/components/nav/Navbar.tsx
index ed5c4679..bd56234b 100644
--- a/components/nav/Navbar.tsx
+++ b/components/nav/Navbar.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/components/nav/index.ts b/components/nav/index.ts
index b8ce7fc4..0571fcdb 100644
--- a/components/nav/index.ts
+++ b/components/nav/index.ts
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
export { default as Navbar } from "./Navbar";
diff --git a/components/nav/navbarItems.tsx b/components/nav/navbarItems.tsx
index 08f3cf96..f2f6240b 100644
--- a/components/nav/navbarItems.tsx
+++ b/components/nav/navbarItems.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
"use client";
diff --git a/components/projects/ProjectCard.tsx b/components/projects/ProjectCard.tsx
index 694077a0..20d61832 100644
--- a/components/projects/ProjectCard.tsx
+++ b/components/projects/ProjectCard.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
"use client";
diff --git a/components/projects/ProjectsFilter.tsx b/components/projects/ProjectsFilter.tsx
index b1a4df53..a4b1841f 100644
--- a/components/projects/ProjectsFilter.tsx
+++ b/components/projects/ProjectsFilter.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
"use client";
diff --git a/components/projects/ProjectsHomeShowcase.tsx b/components/projects/ProjectsHomeShowcase.tsx
index 3b341e5c..14d1c13b 100644
--- a/components/projects/ProjectsHomeShowcase.tsx
+++ b/components/projects/ProjectsHomeShowcase.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
"use client";
diff --git a/components/projects/ProjectsShowcase.tsx b/components/projects/ProjectsShowcase.tsx
index b143c4a7..fec0cde1 100644
--- a/components/projects/ProjectsShowcase.tsx
+++ b/components/projects/ProjectsShowcase.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
"use client";
diff --git a/components/projects/index.ts b/components/projects/index.ts
index 7bdd1936..6953454b 100644
--- a/components/projects/index.ts
+++ b/components/projects/index.ts
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
export { default as ProjectsShowcase } from "./ProjectsShowcase";
diff --git a/components/projects/projects-showcase.utils.ts b/components/projects/projects-showcase.utils.ts
index bdf4a7ce..8a51a085 100644
--- a/components/projects/projects-showcase.utils.ts
+++ b/components/projects/projects-showcase.utils.ts
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
import { useState, useEffect, useCallback, useRef } from "react";
diff --git a/components/services/PackageCard.tsx b/components/services/PackageCard.tsx
index a40c5d91..5b347ef0 100644
--- a/components/services/PackageCard.tsx
+++ b/components/services/PackageCard.tsx
@@ -1,7 +1,7 @@
/**
- * Package Card Component
- * @author ColdByDefault
- * @copyright 2025 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
"use client";
diff --git a/components/services/index.ts b/components/services/index.ts
index e0c6aff2..082ff97c 100644
--- a/components/services/index.ts
+++ b/components/services/index.ts
@@ -1,7 +1,7 @@
/**
- * Services Components Exports
- * @author ColdByDefault
- * @copyright 2025 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
export { PackageCard } from "./PackageCard";
diff --git a/components/speed-insight/SpeedInsight.constants.ts b/components/speed-insight/SpeedInsight.constants.ts
index ac7da080..4bf1bb44 100644
--- a/components/speed-insight/SpeedInsight.constants.ts
+++ b/components/speed-insight/SpeedInsight.constants.ts
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
/** Score threshold boundaries for color coding */
diff --git a/components/speed-insight/SpeedInsight.logic.ts b/components/speed-insight/SpeedInsight.logic.ts
index 248c4556..61085ad1 100644
--- a/components/speed-insight/SpeedInsight.logic.ts
+++ b/components/speed-insight/SpeedInsight.logic.ts
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
import { useState, useEffect, useCallback, useRef } from "react";
diff --git a/components/speed-insight/SpeedInsight.tsx b/components/speed-insight/SpeedInsight.tsx
index 0e6dbfc4..85aedf78 100644
--- a/components/speed-insight/SpeedInsight.tsx
+++ b/components/speed-insight/SpeedInsight.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
"use client";
diff --git a/components/speed-insight/index.ts b/components/speed-insight/index.ts
index 04db8bd4..e1c2f594 100644
--- a/components/speed-insight/index.ts
+++ b/components/speed-insight/index.ts
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
export { default as SpeedInsight } from "./SpeedInsight";
diff --git a/components/tech/Capabilities.tsx b/components/tech/Capabilities.tsx
index 6a43c6c2..f9985886 100644
--- a/components/tech/Capabilities.tsx
+++ b/components/tech/Capabilities.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2025 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/components/tech/Technologies.logic.ts b/components/tech/Technologies.logic.ts
index c6003c12..373843da 100644
--- a/components/tech/Technologies.logic.ts
+++ b/components/tech/Technologies.logic.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import { techGroups } from "@/data/main/tech";
import type { KeyboardEvent } from "react";
diff --git a/components/tech/index.ts b/components/tech/index.ts
index 877c55c7..fffa30bd 100644
--- a/components/tech/index.ts
+++ b/components/tech/index.ts
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
export { default as Capabilities } from "./Capabilities";
diff --git a/components/theme/theme-config-initializer.tsx b/components/theme/theme-config-initializer.tsx
index 500050df..aa430e9a 100644
--- a/components/theme/theme-config-initializer.tsx
+++ b/components/theme/theme-config-initializer.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/components/theme/theme-config-validator.tsx b/components/theme/theme-config-validator.tsx
index b7b44d53..92c389b1 100644
--- a/components/theme/theme-config-validator.tsx
+++ b/components/theme/theme-config-validator.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
import React from "react";
diff --git a/components/theme/viewport-renderer.tsx b/components/theme/viewport-renderer.tsx
index 37f9b10a..65491a7c 100644
--- a/components/theme/viewport-renderer.tsx
+++ b/components/theme/viewport-renderer.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
"use client";
diff --git a/components/use-cases/implementation-areas.tsx b/components/use-cases/implementation-areas.tsx
index 4cbc3678..8891853c 100644
--- a/components/use-cases/implementation-areas.tsx
+++ b/components/use-cases/implementation-areas.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/components/use-cases/index.ts b/components/use-cases/index.ts
index b038ac11..989162a1 100644
--- a/components/use-cases/index.ts
+++ b/components/use-cases/index.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
export { ShowcaseSection } from "./showcase-section";
export { ProjectCard } from "./project-card";
diff --git a/components/use-cases/project-card.tsx b/components/use-cases/project-card.tsx
index 6c8f4f30..08d79d55 100644
--- a/components/use-cases/project-card.tsx
+++ b/components/use-cases/project-card.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/components/use-cases/project-links.tsx b/components/use-cases/project-links.tsx
index 2536320b..01f11ee3 100644
--- a/components/use-cases/project-links.tsx
+++ b/components/use-cases/project-links.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/components/use-cases/screenshot-gallery.tsx b/components/use-cases/screenshot-gallery.tsx
index 94063e38..9e49cd40 100644
--- a/components/use-cases/screenshot-gallery.tsx
+++ b/components/use-cases/screenshot-gallery.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
"use client";
diff --git a/components/use-cases/showcase-section.tsx b/components/use-cases/showcase-section.tsx
index f7569e1f..97696700 100644
--- a/components/use-cases/showcase-section.tsx
+++ b/components/use-cases/showcase-section.tsx
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
"use client";
diff --git a/components/use-cases/tech-stack-grid.tsx b/components/use-cases/tech-stack-grid.tsx
index 8223c6bc..6a9010f2 100644
--- a/components/use-cases/tech-stack-grid.tsx
+++ b/components/use-cases/tech-stack-grid.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/components/visuals/CentralizedLoading.tsx b/components/visuals/CentralizedLoading.tsx
index 02888bf5..fb9d3079 100644
--- a/components/visuals/CentralizedLoading.tsx
+++ b/components/visuals/CentralizedLoading.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import React from "react";
import {LoadingSkeleton} from "@/components/visuals";
diff --git a/components/visuals/ClientBackground.tsx b/components/visuals/ClientBackground.tsx
index d671766b..709a2cd8 100644
--- a/components/visuals/ClientBackground.tsx
+++ b/components/visuals/ClientBackground.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/components/visuals/LoadingScreen.tsx b/components/visuals/LoadingScreen.tsx
deleted file mode 100644
index b336159f..00000000
--- a/components/visuals/LoadingScreen.tsx
+++ /dev/null
@@ -1,112 +0,0 @@
-/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
-
-"use client";
-import React, { useEffect, useState, useSyncExternalStore } from "react";
-import "@/styles/glitchEffect.css";
-
-const chars = "-sd_sdf~`gdf!@#dfg$g%gh^&qwe*fdg()+sdf=[]{fg}|sad;:,.<>?";
-
-const emptySubscribe = () => () => {};
-
-interface TextEncryptedProps {
- text: string;
- interval?: number;
-}
-
-const TextEncrypted: React.FC
= ({
- text,
- interval = 30, // Reduced from 50 for faster animation
-}) => {
- const [outputText, setOutputText] = useState("");
- const [randomChars, setRandomChars] = useState("");
-
- const isMounted = useSyncExternalStore(
- emptySubscribe,
- () => true,
- () => false
- );
-
- useEffect(() => {
- let timer: NodeJS.Timeout;
-
- if (outputText !== text) {
- timer = setInterval(() => {
- if (outputText.length < text.length) {
- setOutputText((prev) => prev + text[prev.length]);
- // Generate random chars for the remainder on each update
- const remainingLength = text.length - outputText.length - 1;
- if (remainingLength > 0) {
- const newRandomChars = Array.from(
- { length: remainingLength },
- () => chars[Math.floor(Math.random() * chars.length)]
- ).join("");
- setRandomChars(newRandomChars);
- }
- } else {
- setRandomChars("");
- clearInterval(timer);
- }
- }, interval);
- }
-
- return () => clearInterval(timer);
- }, [text, interval, outputText]);
-
- if (!isMounted) {
- return ;
- }
-
- return (
-
- {outputText}
- {randomChars}
-
- );
-};
-
-interface LoadingScreenProps {
- onComplete: () => void;
- text?: string;
-}
-
-const LoadingScreen: React.FC = ({
- onComplete,
- text = "Loading...",
-}) => {
- const [isFading, setIsFading] = useState(false);
-
- useEffect(() => {
- const timer = setTimeout(() => {
- setIsFading(true);
- setTimeout(() => {
- onComplete();
- }, 800); // Reduced from 1100
- }, 1500); // Reduced from 2200
- return () => clearTimeout(timer);
- }, [onComplete]);
-
- return (
-
-
-
-
- Loading portfolio, please wait...
-
- );
-};
-
-export default LoadingScreen;
diff --git a/components/visuals/LoadingSkeleton.tsx b/components/visuals/LoadingSkeleton.tsx
index 84d0aa0f..a2594e1c 100644
--- a/components/visuals/LoadingSkeleton.tsx
+++ b/components/visuals/LoadingSkeleton.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import React from "react";
import { Skeleton } from "@/components/ui/skeleton";
diff --git a/components/visuals/card-animations.ts b/components/visuals/card-animations.ts
index 9d1a68d8..b6b75a82 100644
--- a/components/visuals/card-animations.ts
+++ b/components/visuals/card-animations.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
// Shared card hover styles
export const cardHoverStyles = {
diff --git a/components/visuals/index.ts b/components/visuals/index.ts
index 093153f8..9b4cbae9 100644
--- a/components/visuals/index.ts
+++ b/components/visuals/index.ts
@@ -1,10 +1,10 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
// Visual effects and loading components
-export { default as LoadingScreen } from "./LoadingScreen";
export { default as LoadingSkeleton } from "./LoadingSkeleton";
export { default as CentralizedLoading } from "./CentralizedLoading";
export { Background } from "./motion-background";
diff --git a/components/visuals/motion-background.tsx b/components/visuals/motion-background.tsx
index 8b1f95f7..c6cb863c 100644
--- a/components/visuals/motion-background.tsx
+++ b/components/visuals/motion-background.tsx
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
"use client";
diff --git a/data/configs/githubAchievements.ts b/data/configs/githubAchievements.ts
index b4ca5ac6..6fe1a38f 100644
--- a/data/configs/githubAchievements.ts
+++ b/data/configs/githubAchievements.ts
@@ -1,9 +1,7 @@
/**
- * Manual GitHub achievements/badges
- * These are not available via the GitHub REST API, so they are defined here.
- * Update this list when you earn new GitHub achievements.
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
import type { GitHubAchievement } from "@/types/configs/github";
diff --git a/data/configs/seo.ts b/data/configs/seo.ts
index f0c7978c..8f59fcf5 100644
--- a/data/configs/seo.ts
+++ b/data/configs/seo.ts
@@ -1,8 +1,8 @@
/**
- * SEO configuration data and static objects
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import type { TwitterCardType } from "@/types/configs/metadata";
import type {
diff --git a/data/hubs/portfolio-section.data.ts b/data/hubs/portfolio-section.data.ts
index 6e374928..55dd9e81 100644
--- a/data/hubs/portfolio-section.data.ts
+++ b/data/hubs/portfolio-section.data.ts
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
import {
diff --git a/data/hubs/projectsData.ts b/data/hubs/projectsData.ts
index 1e379482..97ed9ff3 100644
--- a/data/hubs/projectsData.ts
+++ b/data/hubs/projectsData.ts
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
export interface Project {
diff --git a/data/hubs/servicesData.ts b/data/hubs/servicesData.ts
index 1e8bdad4..81636c6f 100644
--- a/data/hubs/servicesData.ts
+++ b/data/hubs/servicesData.ts
@@ -1,8 +1,8 @@
/**
- * Services Page Static Data
- * @author ColdByDefault
- * @copyright 2025 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import type {
ServicePackage,
diff --git a/data/hubs/use-cases.ts b/data/hubs/use-cases.ts
index 55a7d4e9..56fb8493 100644
--- a/data/hubs/use-cases.ts
+++ b/data/hubs/use-cases.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import type { UseCaseProject } from "@/types/hubs/use-cases";
diff --git a/data/live-tools/email-rewriter.ts b/data/live-tools/email-rewriter.ts
index 2ecf0c38..516f5137 100644
--- a/data/live-tools/email-rewriter.ts
+++ b/data/live-tools/email-rewriter.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import type { ToneOption } from "@/types/live-tools/email-rewriter";
diff --git a/data/main/aboutData.ts b/data/main/aboutData.ts
index 65781bd6..137a8eba 100644
--- a/data/main/aboutData.ts
+++ b/data/main/aboutData.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
export interface AboutSection {
id: string;
diff --git a/data/main/capabilitiesData.ts b/data/main/capabilitiesData.ts
index 6211e120..218c5eed 100644
--- a/data/main/capabilitiesData.ts
+++ b/data/main/capabilitiesData.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2025 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import type { Capability, CapabilitiesData } from "@/types/main/capabilities";
diff --git a/data/main/certificationsData.ts b/data/main/certificationsData.ts
index 3ec02a3b..e4607ef9 100644
--- a/data/main/certificationsData.ts
+++ b/data/main/certificationsData.ts
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
export const certifications = [
diff --git a/data/main/chatbot-system-prompt.ts b/data/main/chatbot-system-prompt.ts
index 89f07bfc..b244aa34 100644
--- a/data/main/chatbot-system-prompt.ts
+++ b/data/main/chatbot-system-prompt.ts
@@ -1,7 +1,7 @@
/**
- * Reem AI Sales Assistant System Prompt Configuration
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
/**
diff --git a/data/main/companiesData.ts b/data/main/companiesData.ts
index 0d8b09a6..9e7ed0d7 100644
--- a/data/main/companiesData.ts
+++ b/data/main/companiesData.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
export interface CompanyLogo {
id: string;
diff --git a/data/main/footerLinks.ts b/data/main/footerLinks.ts
index 8552adaa..9ffd0fd7 100644
--- a/data/main/footerLinks.ts
+++ b/data/main/footerLinks.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
export interface LinkItem {
href: string;
diff --git a/data/main/tech.ts b/data/main/tech.ts
index 89e187c5..eab92419 100644
--- a/data/main/tech.ts
+++ b/data/main/tech.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import {
SiReact,
diff --git a/hooks/use-chatbot.ts b/hooks/use-chatbot.ts
index 43cd1743..ef5e8be4 100644
--- a/hooks/use-chatbot.ts
+++ b/hooks/use-chatbot.ts
@@ -1,7 +1,7 @@
/**
- * ChatBot Custom Hook - Manages state and API communication
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
"use client";
diff --git a/hooks/use-client.ts b/hooks/use-client.ts
index ee74d8b8..9665d61e 100644
--- a/hooks/use-client.ts
+++ b/hooks/use-client.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import { useSyncExternalStore } from "react";
diff --git a/hooks/use-language.ts b/hooks/use-language.ts
deleted file mode 100644
index d3e111bd..00000000
--- a/hooks/use-language.ts
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * Hook for language detection and management
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
-
-"use client";
-
-import { useState, useEffect, useSyncExternalStore } from "react";
-
-export type Language = "en" | "de";
-
-const emptySubscribe = () => () => {};
-
-function getInitialLanguage(): Language {
- if (typeof window === "undefined") return "en";
-
- // Check URL params first
- const urlParams = new URLSearchParams(window.location.search);
- const langParam = urlParams.get("lang") as Language;
- if (langParam && ["en", "de"].includes(langParam)) {
- return langParam;
- }
-
- // Check localStorage
- const savedLang = localStorage.getItem("preferred-language") as Language;
- if (savedLang && ["en", "de"].includes(savedLang)) {
- return savedLang;
- }
-
- // Detect browser language
- const browserLang = navigator.language.toLowerCase();
- return browserLang.startsWith("de") ? "de" : "en";
-}
-
-export function useLanguage() {
- const isClient = useSyncExternalStore(
- emptySubscribe,
- () => true,
- () => false
- );
-
- const [language, setLanguage] = useState("en");
- const [isLoading, setIsLoading] = useState(true);
- const [initialized, setInitialized] = useState(false);
-
- useEffect(() => {
- if (!isClient || initialized) return;
-
- const initLanguage = () => {
- const detectedLang = getInitialLanguage();
- setLanguage(detectedLang);
- localStorage.setItem("preferred-language", detectedLang);
- setIsLoading(false);
- setInitialized(true);
- };
-
- initLanguage();
- }, [isClient, initialized]);
-
- const changeLanguage = (newLang: Language) => {
- setLanguage(newLang);
- localStorage.setItem("preferred-language", newLang);
-
- // Update URL without reload
- const url = new URL(window.location.href);
- url.searchParams.set("lang", newLang);
- window.history.replaceState({}, "", url.toString());
- };
-
- return {
- language,
- changeLanguage,
- isLoading,
- isGerman: language === "de",
- isEnglish: language === "en",
- };
-}
diff --git a/hooks/use-loading.ts b/hooks/use-loading.ts
deleted file mode 100644
index 9e44057a..00000000
--- a/hooks/use-loading.ts
+++ /dev/null
@@ -1,71 +0,0 @@
-/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
-
-"use client";
-import { useState, useCallback } from "react";
-
-interface LoadingState {
- isLoading: boolean;
- message?: string;
- variant?: "page" | "card" | "list" | "profile" | "blog" | "dashboard";
-}
-
-interface UseLoadingReturn {
- loadingState: LoadingState;
- startLoading: (message?: string, variant?: LoadingState["variant"]) => void;
- stopLoading: () => void;
- setLoadingMessage: (message: string) => void;
- setLoadingVariant: (variant: LoadingState["variant"]) => void;
-}
-
-/**
- * Custom hook for managing loading states throughout the application
- * Provides centralized loading state management with customizable messages and variants
- */
-export const useLoading = (
- initialState: LoadingState = { isLoading: false }
-): UseLoadingReturn => {
- const [loadingState, setLoadingState] = useState(initialState);
-
- const startLoading = useCallback(
- (message?: string, variant?: LoadingState["variant"]) => {
- setLoadingState({
- isLoading: true,
- ...(message && { message }),
- variant: variant || "page",
- });
- },
- []
- );
-
- const stopLoading = useCallback(() => {
- setLoadingState((prev) => ({
- ...prev,
- isLoading: false,
- }));
- }, []);
-
- const setLoadingMessage = useCallback((message: string) => {
- setLoadingState((prev) => ({
- ...prev,
- message,
- }));
- }, []);
-
- const setLoadingVariant = useCallback((variant: LoadingState["variant"]) => {
- setLoadingState((prev) => ({
- ...prev,
- ...(variant && { variant }),
- }));
- }, []);
-
- return {
- loadingState,
- startLoading,
- stopLoading,
- setLoadingMessage,
- setLoadingVariant,
- };
-};
\ No newline at end of file
diff --git a/i18n/request.ts b/i18n/request.ts
index 1ec121f9..395fc502 100644
--- a/i18n/request.ts
+++ b/i18n/request.ts
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
import { getRequestConfig } from "next-intl/server";
diff --git a/lib/blog-admin/BlogAdminService.ts b/lib/blog-admin/BlogAdminService.ts
index 376d58af..fdcd1945 100644
--- a/lib/blog-admin/BlogAdminService.ts
+++ b/lib/blog-admin/BlogAdminService.ts
@@ -1,8 +1,8 @@
/**
- * Blog Admin Service - Main orchestrator
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import type {
Blog,
diff --git a/lib/blog-admin/BlogQueryService.ts b/lib/blog-admin/BlogQueryService.ts
index b459211b..512dd204 100644
--- a/lib/blog-admin/BlogQueryService.ts
+++ b/lib/blog-admin/BlogQueryService.ts
@@ -1,8 +1,8 @@
/**
- * Blog Query Service
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import { prisma } from "@/lib/configs/prisma";
import type { Prisma } from "@/lib/generated/prisma/client";
diff --git a/lib/blog-admin/BlogUtilityService.ts b/lib/blog-admin/BlogUtilityService.ts
index 7c494e4f..eb864738 100644
--- a/lib/blog-admin/BlogUtilityService.ts
+++ b/lib/blog-admin/BlogUtilityService.ts
@@ -1,8 +1,8 @@
/**
- * Blog Utility Service
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import { prisma } from "@/lib/configs/prisma";
import type {
diff --git a/lib/blog-admin/BlogValidationService.ts b/lib/blog-admin/BlogValidationService.ts
index cd544a79..61916a0d 100644
--- a/lib/blog-admin/BlogValidationService.ts
+++ b/lib/blog-admin/BlogValidationService.ts
@@ -1,8 +1,8 @@
/**
- * Blog Validation Service
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import type { CreateBlogRequest, UpdateBlogRequest } from "@/types/hubs/blogs";
import { BLOG_CONSTANTS } from "@/types/hubs/blogs";
diff --git a/lib/blog-admin/blog-admin.ts b/lib/blog-admin/blog-admin.ts
index 92fe1da1..edfc4b70 100644
--- a/lib/blog-admin/blog-admin.ts
+++ b/lib/blog-admin/blog-admin.ts
@@ -1,8 +1,8 @@
/**
- * Blog Administration Service - Orchestrator
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import type {
Blog,
diff --git a/lib/blog-admin/index.ts b/lib/blog-admin/index.ts
index da07d3f9..2f0e4b3b 100644
--- a/lib/blog-admin/index.ts
+++ b/lib/blog-admin/index.ts
@@ -1,8 +1,8 @@
/**
- * Blog Admin Services - Individual services for direct use
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
// Individual services (for direct use if needed)
export { BlogAdminService } from "./BlogAdminService";
diff --git a/lib/chatbot-logging.ts b/lib/chatbot-logging.ts
index bd2883f0..b136f05d 100644
--- a/lib/chatbot-logging.ts
+++ b/lib/chatbot-logging.ts
@@ -1,7 +1,7 @@
/**
- * ChatBot Logging Utilities
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
import type { GeoIPInfo } from "@/types/configs/chatbot";
diff --git a/lib/configs/prisma.ts b/lib/configs/prisma.ts
index 8d4481d6..13e90a01 100644
--- a/lib/configs/prisma.ts
+++ b/lib/configs/prisma.ts
@@ -1,8 +1,8 @@
/**
- * Prisma Database Client (Prisma ORM 7)
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import { PrismaClient } from "@/lib/generated/prisma/client";
import { PrismaPg } from "@prisma/adapter-pg";
diff --git a/lib/configs/seo.ts b/lib/configs/seo.ts
index 21430282..375149cb 100644
--- a/lib/configs/seo.ts
+++ b/lib/configs/seo.ts
@@ -1,8 +1,8 @@
/**
- * SEO configuration and metadata generation utilities (Business Logic Only)
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import type { Blog, BlogSEO, BlogStructuredData } from "@/types/hubs/blogs";
import type {
diff --git a/lib/hubs/blogs.ts b/lib/hubs/blogs.ts
index 01e00a96..07fca6fc 100644
--- a/lib/hubs/blogs.ts
+++ b/lib/hubs/blogs.ts
@@ -1,8 +1,8 @@
/**
- * Blog API Functions
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import type { Blog, BlogListQuery, BlogListResponse } from "@/types/hubs/blogs";
import { prisma } from "@/lib/configs/prisma";
@@ -13,7 +13,7 @@ import { sanitizeInput } from "@/lib/security";
* Get all published blogs
*/
export async function getBlogs(
- query?: BlogListQuery
+ query?: BlogListQuery,
): Promise {
const {
page = 1,
@@ -128,6 +128,7 @@ export async function getBlogBySlug(slug: string): Promise {
const blog = await prisma.blog.findFirst({
where: {
slug: sanitizedSlug,
+ isPublished: true,
},
include: {
category: true,
diff --git a/lib/live-tools/rewriter-rate-limit.ts b/lib/live-tools/rewriter-rate-limit.ts
index f80a574d..bc1c54f8 100644
--- a/lib/live-tools/rewriter-rate-limit.ts
+++ b/lib/live-tools/rewriter-rate-limit.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import { MAX_USES_PER_IP } from "@/data/live-tools/email-rewriter";
diff --git a/lib/live-tools/security.ts b/lib/live-tools/security.ts
index 5d3066c6..87078079 100644
--- a/lib/live-tools/security.ts
+++ b/lib/live-tools/security.ts
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
/**
diff --git a/lib/security.ts b/lib/security.ts
index a8d8f391..cd32cc17 100644
--- a/lib/security.ts
+++ b/lib/security.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
/**
* Validates GitHub API data type parameter
diff --git a/next.config.ts b/next.config.ts
index eaaa9cc7..078b4d15 100644
--- a/next.config.ts
+++ b/next.config.ts
@@ -6,14 +6,12 @@ const nextConfig: NextConfig = {
allowedDevOrigins: process.env.ALLOWED_DEV_ORIGINS?.split(",") || [],
// Performance optimizations
- compress: true,
poweredByHeader: false,
- // Prisma 7 compatibility - bundle Prisma for serverless/edge
- serverExternalPackages: [],
+ // Prisma 7 compatibility - include Prisma client in output tracing
outputFileTracingIncludes: {
"/api/**/*": ["./node_modules/@prisma/client/**/*"],
- "/app/**/*": ["./node_modules/@prisma/client/**/*"],
+ "/**": ["./node_modules/@prisma/client/**/*"],
},
// Image optimization with modern formats
@@ -145,8 +143,8 @@ const nextConfig: NextConfig = {
],
},
{
- // Enhanced security for ChatBot API
- source: "/api/chatbot",
+ // Admin API routes
+ source: "/api/admin/(.*)",
headers: [
{
key: "Cache-Control",
@@ -156,13 +154,33 @@ const nextConfig: NextConfig = {
key: "X-Robots-Tag",
value: "noindex, nofollow, nosnippet, noarchive",
},
+ ],
+ },
+ {
+ // Email-rewrite routes contain per-user state — never cache publicly
+ source: "/api/email-rewrite/(.*)",
+ headers: [
{
- key: "X-Content-Type-Options",
- value: "nosniff",
+ key: "Cache-Control",
+ value: "no-cache, no-store, must-revalidate",
},
{
- key: "X-Frame-Options",
- value: "DENY",
+ key: "X-Robots-Tag",
+ value: "noindex, nofollow, nosnippet, noarchive",
+ },
+ ],
+ },
+ {
+ // Enhanced security for ChatBot API
+ source: "/api/chatbot",
+ headers: [
+ {
+ key: "Cache-Control",
+ value: "no-cache, no-store, must-revalidate",
+ },
+ {
+ key: "X-Robots-Tag",
+ value: "noindex, nofollow, nosnippet, noarchive",
},
],
},
diff --git a/prisma/seed.ts b/prisma/seed.ts
index 4ace4f0a..ffd6aef9 100644
--- a/prisma/seed.ts
+++ b/prisma/seed.ts
@@ -1,8 +1,8 @@
/**
- * Database Seed Script
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import "dotenv/config";
import { PrismaClient } from "../lib/generated/prisma/client";
diff --git a/proxy.ts b/proxy.ts
index 7cdd0782..b2b6ea6b 100644
--- a/proxy.ts
+++ b/proxy.ts
@@ -1,11 +1,12 @@
/**
- * Proxy (Middleware => deprecated) for handling redirects and locale management
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
+import { createHmac, timingSafeEqual } from "crypto";
// Supported locales
const supportedLocales = ["en", "de", "es", "fr", "sv"];
@@ -15,17 +16,15 @@ const blockedIPs = new Map();
const BLOCK_DURATION = 15 * 60 * 1000;
const MAX_ATTEMPTS = 2;
-// Session validation: Store valid sessions with metadata
-interface SessionData {
- createdAt: number;
- expiresAt: number;
- ip: string;
- signature: string;
-}
-
-const validSessions = new Map();
+const ADMIN_TOKEN = process.env.ADMIN_TOKEN;
const SESSION_DURATION = 8 * 60 * 60 * 1000; // 8 hours
+function signToken(payload: string): string {
+ return createHmac("sha256", ADMIN_TOKEN || "")
+ .update(payload)
+ .digest("hex");
+}
+
function getClientIP(request: NextRequest): string {
const forwarded = request.headers.get("x-forwarded-for");
if (forwarded) return forwarded.split(",")[0]?.trim() || "unknown";
@@ -56,70 +55,49 @@ function recordFailedAttempt(ip: string): void {
}
function hasValidAdminSession(request: NextRequest): boolean {
+ if (!ADMIN_TOKEN) return false;
+
const sessionCookie = request.cookies.get("PORTFOLIO_ADMIN_SESSION");
if (!sessionCookie?.value) return false;
- const sessionId = sessionCookie.value;
- const sessionData = validSessions.get(sessionId);
+ const parts = sessionCookie.value.split(".");
+ if (parts.length !== 3) return false;
- if (!sessionData) return false;
+ const [sessionId, expiresAtStr, sig] = parts;
+ if (!sessionId || !expiresAtStr || !sig) return false;
- const now = Date.now();
+ // Verify HMAC signature
+ const payload = `${sessionId}.${expiresAtStr}`;
+ const expectedSig = signToken(payload);
+ const sigBuf = Buffer.from(sig, "hex");
+ const expectedBuf = Buffer.from(expectedSig, "hex");
+ if (sigBuf.length !== expectedBuf.length) return false;
+ if (!timingSafeEqual(sigBuf, expectedBuf)) return false;
// Check expiration
- if (now > sessionData.expiresAt) {
- validSessions.delete(sessionId);
- return false;
- }
-
- const currentIP = getClientIP(request);
- if (sessionData.ip !== currentIP) {
- validSessions.delete(sessionId);
- return false;
- }
+ const expiresAt = parseInt(expiresAtStr, 10);
+ if (isNaN(expiresAt) || Date.now() > expiresAt) return false;
return true;
}
-export function createAdminSession(ip: string): string {
+export function createAdminSession(): string {
const randomBytes = new Uint8Array(32);
crypto.getRandomValues(randomBytes);
const sessionId = Array.from(randomBytes)
.map((b) => b.toString(16).padStart(2, "0"))
.join("");
- const now = Date.now();
- const expiresAt = now + SESSION_DURATION;
-
- const signature = `${sessionId}:${ip}:${expiresAt}`;
+ const expiresAt = Date.now() + SESSION_DURATION;
+ const payload = `${sessionId}.${expiresAt}`;
+ const sig = signToken(payload);
- const sessionData: SessionData = {
- createdAt: now,
- expiresAt,
- ip,
- signature,
- };
-
- validSessions.set(sessionId, sessionData);
-
- if (validSessions.size % 10 === 0) {
- cleanupExpiredSessions();
- }
-
- return sessionId;
-}
-
-export function invalidateAdminSession(sessionId: string): void {
- validSessions.delete(sessionId);
+ return `${payload}.${sig}`;
}
-function cleanupExpiredSessions(): void {
- const now = Date.now();
- for (const [sessionId, data] of validSessions.entries()) {
- if (now > data.expiresAt) {
- validSessions.delete(sessionId);
- }
- }
+export function invalidateAdminSession(_sessionId: string): void {
+ // Stateless tokens cannot be server-side invalidated.
+ // Logout is handled by deleting the session cookie in the API route.
}
/**
@@ -252,34 +230,6 @@ export function proxy(request: NextRequest) {
failedAttempts.delete(clientIP);
}
- // Enhanced security for ChatBot API
- if (pathname.startsWith("/api/chatbot")) {
- // Check for basic bot patterns
- const userAgent = request.headers.get("user-agent") || "";
- const botPatterns = [
- /bot/i,
- /crawler/i,
- /spider/i,
- /scraper/i,
- /python/i,
- /curl/i,
- /wget/i,
- /postman/i,
- ];
-
- for (const pattern of botPatterns) {
- if (pattern.test(userAgent)) {
- return NextResponse.json({ error: "Access denied" }, { status: 403 });
- }
- }
-
- // Require referer for chatbot requests
- const referer = request.headers.get("referer");
- if (request.method === "POST" && !referer) {
- return NextResponse.json({ error: "Invalid request" }, { status: 400 });
- }
- }
-
// Handle automatic locale detection for first-time visitors
const response = handleLocaleDetection(request);
if (response) return response;
diff --git a/public/assets/icons/github.png b/public/assets/icons/github.png
deleted file mode 100644
index 969124f6..00000000
Binary files a/public/assets/icons/github.png and /dev/null differ
diff --git a/public/assets/icons/githubContact.png b/public/assets/icons/githubContact.png
deleted file mode 100644
index 969124f6..00000000
Binary files a/public/assets/icons/githubContact.png and /dev/null differ
diff --git a/public/assets/use-cases/default.png b/public/assets/use-cases/default.png
deleted file mode 100644
index d984970f..00000000
Binary files a/public/assets/use-cases/default.png and /dev/null differ
diff --git a/styles/company-banner.css b/styles/company-banner.css
index 3aeb5bda..0713281b 100644
--- a/styles/company-banner.css
+++ b/styles/company-banner.css
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2025 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
/* Company banner scroll animations - Seamless infinite loop */
@keyframes scroll-seamless {
diff --git a/styles/glitchEffect.css b/styles/glitchEffect.css
index 3e02899f..39f5f9be 100644
--- a/styles/glitchEffect.css
+++ b/styles/glitchEffect.css
@@ -1,7 +1,8 @@
-/*
- * @author ColdByDefault
- * @copyright 2025 ColdByDefault. All Rights Reserved.
-*/
+/**
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
.glitch-effect {
position: relative;
diff --git a/types/configs/api.ts b/types/configs/api.ts
index 4e9d43c7..1203106c 100644
--- a/types/configs/api.ts
+++ b/types/configs/api.ts
@@ -1,8 +1,8 @@
/**
- * API Interface Types
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
export interface ApiResponse {
success?: boolean;
diff --git a/types/configs/chatbot.ts b/types/configs/chatbot.ts
index f66a3a90..52b6f66e 100644
--- a/types/configs/chatbot.ts
+++ b/types/configs/chatbot.ts
@@ -1,7 +1,7 @@
/**
- * ChatBot Interface Types
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
export interface ChatMessage {
diff --git a/types/configs/github.ts b/types/configs/github.ts
index 772d8461..e916cabf 100644
--- a/types/configs/github.ts
+++ b/types/configs/github.ts
@@ -1,7 +1,7 @@
/**
- * GitHub API Type Definitions
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
export interface GitHubUser {
diff --git a/types/configs/i18n.ts b/types/configs/i18n.ts
index e3d80633..efa8be83 100644
--- a/types/configs/i18n.ts
+++ b/types/configs/i18n.ts
@@ -1,8 +1,8 @@
/**
- * Internationalization Types
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
export interface Achievement {
title: string;
diff --git a/types/configs/metadata.ts b/types/configs/metadata.ts
index d66ecf11..ffcf1145 100644
--- a/types/configs/metadata.ts
+++ b/types/configs/metadata.ts
@@ -1,8 +1,8 @@
/**
- * Next.js Metadata Types
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
export type TwitterCardType =
| "summary"
diff --git a/types/configs/seo.ts b/types/configs/seo.ts
index 04b7c948..066daf9b 100644
--- a/types/configs/seo.ts
+++ b/types/configs/seo.ts
@@ -1,8 +1,8 @@
/**
- * SEO-related TypeScript types and interfaces
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import type { TwitterCardType } from "@/types/configs/metadata";
diff --git a/types/configs/speed-insight.ts b/types/configs/speed-insight.ts
index d81a550a..7d67dc22 100644
--- a/types/configs/speed-insight.ts
+++ b/types/configs/speed-insight.ts
@@ -1,6 +1,7 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
/** Individual Lighthouse audit category */
diff --git a/types/global.d.ts b/types/global.d.ts
index 60914002..73c3b348 100644
--- a/types/global.d.ts
+++ b/types/global.d.ts
@@ -1,10 +1,8 @@
/**
- * @file /types/global.d.ts
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
- *
- * Global type declarations for CSS imports and other module types
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
// CSS module declarations
declare module "*.css" {
diff --git a/types/hubs/aboutPorto.ts b/types/hubs/aboutPorto.ts
index 38101705..69139dee 100644
--- a/types/hubs/aboutPorto.ts
+++ b/types/hubs/aboutPorto.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import type React from "react";
diff --git a/types/hubs/blogs.ts b/types/hubs/blogs.ts
index aff5e9c4..d848fa8e 100644
--- a/types/hubs/blogs.ts
+++ b/types/hubs/blogs.ts
@@ -1,8 +1,8 @@
/**
- * Blog System Types
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
// Core Blog Types
export interface Blog {
diff --git a/types/hubs/library.ts b/types/hubs/library.ts
index 23d2e358..a4a2f7dd 100644
--- a/types/hubs/library.ts
+++ b/types/hubs/library.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
export interface BaseMediaItem {
id: string;
diff --git a/types/hubs/portfolio-section.types.ts b/types/hubs/portfolio-section.types.ts
index c96d1a44..a03dd5e4 100644
--- a/types/hubs/portfolio-section.types.ts
+++ b/types/hubs/portfolio-section.types.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import type React from "react";
diff --git a/types/hubs/projects.ts b/types/hubs/projects.ts
index e8937bbc..e8ba3273 100644
--- a/types/hubs/projects.ts
+++ b/types/hubs/projects.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
import type { Project } from "@/data/hubs/projectsData";
diff --git a/types/hubs/services.ts b/types/hubs/services.ts
index 628b5010..f8d2947a 100644
--- a/types/hubs/services.ts
+++ b/types/hubs/services.ts
@@ -1,8 +1,8 @@
/**
- * Services Page Type Definitions
- * @author ColdByDefault
- * @copyright 2025 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
/**
* Service package tier/type
diff --git a/types/hubs/use-cases.ts b/types/hubs/use-cases.ts
index ab14e471..2164d12d 100644
--- a/types/hubs/use-cases.ts
+++ b/types/hubs/use-cases.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
export interface TechStack {
name: string;
diff --git a/types/live-tools/email-rewriter.ts b/types/live-tools/email-rewriter.ts
index 21ed2f04..2612f2ab 100644
--- a/types/live-tools/email-rewriter.ts
+++ b/types/live-tools/email-rewriter.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
export type ToneType = "professional" | "empathetic" | "assertive";
diff --git a/types/live-tools/live-tools.ts b/types/live-tools/live-tools.ts
index eb827db4..d9883bd8 100644
--- a/types/live-tools/live-tools.ts
+++ b/types/live-tools/live-tools.ts
@@ -1,7 +1,8 @@
/**
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
-*/
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
+ */
export interface CalculatorInputs {
hoursPerWeek: number;
diff --git a/types/main/admin.ts b/types/main/admin.ts
index 3f64e597..1b769391 100644
--- a/types/main/admin.ts
+++ b/types/main/admin.ts
@@ -1,7 +1,7 @@
/**
- * Admin Interface Types
- * @author ColdByDefault
- * @copyright 2026 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
export interface AdminStats {
diff --git a/types/main/capabilities.ts b/types/main/capabilities.ts
index 571a12b4..e7e7d847 100644
--- a/types/main/capabilities.ts
+++ b/types/main/capabilities.ts
@@ -1,8 +1,7 @@
/**
- * Capabilities Section Type Definitions
- * Business-outcome focused capabilities (replaces tech-focused Technologies)
- * @author ColdByDefault
- * @copyright 2025 ColdByDefault. All Rights Reserved.
+ * @author © ColdByDefault
+ * @license Copyright (c) 2026 ColdByDefault. All rights reserved.
+ * @version 6.x.x
*/
/**