feat: redesign site as a modern developer portfolio

- New home page: hero, stats, about, focus areas, stack, projects, contact
- Light/dark theme with system default and persisted toggle
- Content centralised in data/profile.js
- Restyle /rates to match; remove it from nav and projects
- Afriex: log a clear error now that its API requires a device id

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jesse Egbosionu
2026-10-24 21:19:22 +02:00
co-authored by Claude Opus 5.5
parent 5c40a64c42
commit 3bb0a5e4a9
17 changed files with 1873 additions and 872 deletions
+6 -2
View File
@@ -240,7 +240,11 @@ export default async (req, res) => {
.catch((error) => reject(error));
})
.then((result) => {
const ngnRate = result.rates.EUR.NGN;
// Afriex now rejects unauthenticated requests with {"message":"Device id missing"}
const ngnRate = result?.rates?.EUR?.NGN;
if (!ngnRate) {
throw new Error(`Unexpected response: ${result?.message || JSON.stringify(result).slice(0, 200)}`);
}
return {
rate: parseFloat(ngnRate).toFixed(2),
provider: "Afriex",
@@ -250,7 +254,7 @@ export default async (req, res) => {
};
})
.catch((error) => {
console.error("Error calling Afriex:", error);
console.error("Error calling Afriex:", error.message);
return createDefaultErrorResponse("Afriex", "https://www.afriex.com/");
});